P5.UH-perf-real-data-fix · 性能监控真数据采集 hotfix(ADR-08 §议题③ 验收失败修复)
Worker:ClaudeB · 后端 (backend-csharp) / 预计:1.0d / 优先级:P1 / 状态:dispatched 隔离:🧵 文件隔离(同 worktree 同 branch · 与 P5.UH-runtime-target-data-fix 文件正交 · Services/Metrics vs Services/Runtime)
🔍 触发与解锁链
| 触发 | 状态 | 影响 |
|---|---|---|
| 用户验收 ADR-08 议题③ 失败 | ✅ 2026-05-31 11:01 | 原话"有显示但是不是帧数据 · Per-Module 也没有显示当前链路里面的内容" |
| parent zombie P5.U-perf-service | ✅ 41ad8d9 | ⚠️ commit message 已警示"并发 frontend 合并提交 · trailer P6 跟进" · 后端数据可能 stub |
| P1.UA8-perf-monitor-frontend zombie | ✅ 834f86a | 前端 DrawerMetrics 已实装 · 等本 fork 后端真数据 |
→ 后端独立(纯 .NET) · 不修改 contract-v1.0 · 走 dev-api /ws/perf + /api/perf/per-module(parent zombie 已落路由 · 本 fork 仅修数据真实性)
任务定义
⚠️ 本 fork 性质从「修 stub」升级为「从零实装」(2026-05-31 12:03 v1.5 铁律真值核查后):
DASHBOARD 历史标注的 P5.U-perf-service zombie hash 41ad8d9 实际是 ADR-12 #5 P0.U-measurement-rms-fft-phase 前端 widget commit(RMS/FFT/Phase 三组件)· 后端 PerformanceService.cs / MetricsAggregator.cs / PerfController.cs 文件可能根本不存在。
用户 2026-05-31 12:03 原话拍板:"我直接将没有执行的内容再执行一遍不就可以了么" → 本 fork 直接按 ADR-AIOS-08 §2.3 + §4.2 fork P5.U-perf-service 完整实装 · 不假定 parent zombie。
核心范围(从零实装):
1. 新建 backend_csharp/Models/Metrics/PerfSnapshot.cs + ModuleMetrics.cs(record schema)
2. 新建 backend_csharp/Services/Metrics/PerformanceService.cs(Process/GC/Stopwatch 真采集)+ MetricsAggregator.cs(遍历 chainBuilder 当前链路 module)
3. 新建 backend_csharp/Controllers/Perf/PerfController.cs(REST GET /api/perf/per-module + GET /api/perf/snapshot)
4. 新建 WS /ws/perf 1Hz broadcaster(在 Program.cs DI 注册 + WebSocket handler)
5. 新建 xunit 测试 Tests/Services/Metrics/* + Tests/Controllers/Perf/*
6. dsp_algo dll C ABI getModuleMetrics(moduleId) 若未暴露 → 用估算 + commit trailer [need:P6] 备案
完整 prompt(直接复制粘贴 worker 终端)
[U-thread] P5.UH-perf-real-data-fix(alias: P5.U-perf-real-data-fix · ⚠️ 从零实装 · 不是修 stub)
[部门] 后端 (backend-csharp) · 推荐 skill: dotnet-realtime-communication
[Worker CWD] d:/work/25_claude/workspace/AlgoDepartment/04_development/
[Occupies] P5.K-services-metrics(写 · 全新建) + P5.K-api-routes(写 · 全新建 PerfController) + P5.K-ws-broadcast(写 · 全新建 /ws/perf broadcaster)
[隔离] 🧵 文件隔离 · 全新建文件:
- backend_csharp/Models/Metrics/PerfSnapshot.cs(全新)
- backend_csharp/Models/Metrics/ModuleMetrics.cs(全新)
- backend_csharp/Services/Metrics/PerformanceService.cs(全新 · Process/GC/Stopwatch)
- backend_csharp/Services/Metrics/MetricsAggregator.cs(全新 · 遍历 chainBuilder)
- backend_csharp/Controllers/Perf/PerfController.cs(全新)
- backend_csharp/Tests/Services/Metrics/*(全新)
- backend_csharp/Tests/Controllers/Perf/*(全新)
- backend_csharp/Program.cs(扩 DI + WS handler 注册)
与 P5.UH-runtime-target-data-fix 完全正交(Services/Runtime vs Services/Metrics)
[优先级] P1 · 1.5d ⚠️ 从零实装(不是 1.0d 修 stub) · ADR-08 议题③ 用户验收失败修复
[ADR] d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-08-xilink-stage-ux.md(必读 §2.3 性能监控双层界面 + ModuleMetrics record 完整字段)
[业务行为契约引用] ADR-08 §2.3 + §4.2 fork P5.U-perf-service + 验收清单 C3-1~C3-6 · 用户原话"不是帧数据 · Per-Module 也没有显示当前链路"
[参考文档](绝对路径)
- ADR-08:d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-08-xilink-stage-ux.md(§2.3 全文 · 含 PerfSnapshot + ModuleMetrics record 完整 schema · §4.2 fork P5.U-perf-service 实施清单)
- 验收清单:d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-08-acceptance-checklist.md(议题③ C3-1~C3-6)
- 前端配套(已 zombie):d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/prompts/done/P1.UA8-perf-monitor-frontend--834f86a.md(看前端期望的 PerfFrame JSON schema · 字段对齐 · ⚠️ 前端已对接但后端 stub · 本 fork 从零补齐)
- 同部门后端标本(必读 · 4 维度对齐):d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/prompts/done/P5.U-runtime-mode-refactor--b43c35a.md(同 ClaudeB · 同 ADR-08 · REST + DI + WS handler 模式参考 · 文件结构对齐 Models/Services/Controllers/Tests)
- 现状必读(grep 验证从零状态):
· ls backend_csharp/Services/Metrics/(预期空 / 不存在)
· ls backend_csharp/Models/Metrics/(预期空 / 不存在)
· ls backend_csharp/Controllers/Perf/(预期空 / 不存在)
· 若以上 3 个目录已含 .cs 文件 → 可能是其他 ADR 的零散实装 · 看清是否能复用 / 必须重写 · commit trailer 报告
· backend_csharp/Services/AudioEngine/AudioEngineChainBuilder.cs(看怎么拿当前链路 module 列表 · 本 fork 用其 GetActiveModules 或类似方法 · 若无 · 加 ChainBuilder 暴露 IReadOnlyList<string> ActiveModuleIds)
· backend_csharp/Program.cs(看现有 DI 注册风格 · 仿 RuntimeTargetService 的 AddSingleton + WS handler 注册)
· dsp_algo/dll/dspalgo_dll.c(grep getModuleMetrics · 看 C ABI 是否暴露 · 若没暴露则本 fork 用估算 + commit trailer [need:P6])
【背景】
🚨 **v1.5 主仓真值核查铁律首次抓到历史错账**(2026-05-31 12:00 AIOS 用 git -C verify):
DASHBOARD 历史标注 P5.U-perf-service zombie hash `41ad8d9` · 但实际 git show 显示该 commit 是 **ADR-12 #5 P0.U-measurement-rms-fft-phase 前端 widget**(RMS/FFT/Phase 三组件)· 改的是 `stages/xitest/dashboard/widgets/{rms,fft,phase}/*` · 全是前端文件。
**真相**:ADR-08 §2.3 后端 PerformanceService 从未真实落地 · 用户 C3 验收失败"不是帧数据"是因为后端**根本没有这个服务**(前端 P1.UA8-perf-monitor-frontend `834f86a` 已对接但拿不到后端数据)。
用户 2026-05-31 12:03 原话拍板:**"我直接将没有执行的内容再执行一遍不就可以了么"** → 本 fork 性质升级:
- ❌ 不是修 stub
- ✅ **从零实装**:全部从无到有建文件 · 严格按 ADR-AIOS-08 §2.3 + §4.2 fork P5.U-perf-service 描述
- ✅ 工作量:**1.0d → 1.5d**(从零实装比修 stub 多 0.5d)
**本任务核心**(1.5d · 全新建):
- ✅ Models/Metrics/{PerfSnapshot,ModuleMetrics}.cs(record schema · 字段对齐 P1.UA8-perf-monitor-frontend 834f86a 已实装的前端 PerfFrame schema)
- ✅ Services/Metrics/PerformanceService.cs(Process.GetCurrentProcess() CPU% TotalProcessorTime 差分 · GC.GetTotalMemory · Stopwatch 测 P/Invoke 延时)
- ✅ Services/Metrics/MetricsAggregator.cs(注入 IAudioEngineChainBuilder · 遍历当前链路 module · 调 dsp_algo dll getModuleMetrics 或估算)
- ✅ Controllers/Perf/PerfController.cs(REST `GET /api/perf/snapshot` + `GET /api/perf/per-module`)
- ✅ Program.cs DI 注册:`AddSingleton<IPerformanceService>` + `AddSingleton<IMetricsAggregator>` + 1Hz 后台 BroadcastService 推 `/ws/perf`
- ✅ Tests/Services/Metrics/* + Tests/Controllers/Perf/*(基线 +6 case 起步)
- ✅ 若 dsp_algo C ABI 未暴露 getModuleMetrics → 估算 + commit trailer `[need:P6]` 备案
【执行步骤】
Step 1 · 真值核查(必跑 · 0.15d)
- git status / git pull origin xistudio --no-rebase
- ls backend_csharp/Services/Metrics/(预期空 / 不存在 — v1.5 铁律核查后端从零)
- ls backend_csharp/Models/Metrics/(预期空 / 不存在)
- ls backend_csharp/Controllers/Perf/(预期空 / 不存在)
- 若 3 目录之一已含 .cs 文件 → cat 看内容 · 报告到 commit message body(可能是其他 ADR 零散实装 · 决定复用 / 重写)
- grep "GetActiveModules\|ActiveModules\|ChainModules\|ActiveModuleIds" backend_csharp/Services/AudioEngine/AudioEngineChainBuilder.cs(看怎么拿当前链路)
- grep "getModuleMetrics\|GetModuleMetrics" dsp_algo/dll/dspalgo_dll.c(看 C ABI 是否暴露)
- read 同部门标本 P5.U-runtime-mode-refactor--b43c35a.md(对齐 Models/Services/Controllers/Tests + Program.cs DI 文件结构)
- read 前端配套 P1.UA8-perf-monitor-frontend--834f86a.md(对齐 PerfFrame JSON schema 字段)
- 输出真值核查到 commit message body:
· 后端 PerformanceService 文件状态:不存在 / 部分存在
· ChainBuilder 有 / 无 ActiveModuleIds 暴露
· dsp_algo getModuleMetrics 已暴露 / 未暴露
· 前端 PerfFrame JSON 字段(用于本 fork schema 对齐)
Step 2 · 新建 Models/Metrics record schema(0.15d)
- 新建 backend_csharp/Models/Metrics/PerfSnapshot.cs:
```csharp
public record PerfSnapshot(
double CpuPercent, // 0~100*Cores
long MemoryMB,
int LinkLatencyMs,
double BufferRatio, // 0~1.0
int TickRateHz,
DateTime Timestamp
);
```
- 新建 backend_csharp/Models/Metrics/ModuleMetrics.cs:
```csharp
public record ModuleMetrics(
string ModuleId,
double PeakCpuPercent,
double AvgCpuPercent,
long PeakMemoryBytes,
long TotalProcessedSamples,
int TickRateHz
);
```
- 字段必须与前端 P1.UA8-perf-monitor-frontend 834f86a 已实装的 PerfFrame TypeScript interface 字段一对一(参考 step 1 真值核查报告)
Step 3 · 新建 PerformanceService(0.3d)
- 新建 backend_csharp/Services/Metrics/IPerformanceService.cs(interface):
· `PerfSnapshot GetCurrentSnapshot();`
· `IObservable<PerfSnapshot> SubscribePerfStream();`(供 WS broadcaster 订阅 1Hz)
- 新建 backend_csharp/Services/Metrics/PerformanceService.cs(impl):
· 字段:`_lastCpuTime`(TimeSpan)+ `_lastSampleTime`(DateTime)+ `_subject = new Subject<PerfSnapshot>()`
· 构造函数预热:首次拿 Process.GetCurrentProcess().TotalProcessorTime 作为基线
· GetCurrentSnapshot:
- proc = Process.GetCurrentProcess()
- now = DateTime.UtcNow
- elapsed = (now - _lastSampleTime).TotalMilliseconds
- cpuDelta = (proc.TotalProcessorTime - _lastCpuTime).TotalMilliseconds
- cpuPercent = (cpuDelta / elapsed) / Environment.ProcessorCount * 100
- memoryMB = proc.WorkingSet64 / 1024 / 1024
- linkLatencyMs = stub 0(留 P/Invoke Stopwatch 实测扩展)
- bufferRatio = 0.5(stub · 留 AudioEngineService 暴露后接)
- tickRateHz = 1000(配置值)
- 更新 _lastCpuTime / _lastSampleTime
- return new PerfSnapshot(...)
· 启动后台 Timer 每 1s 调 GetCurrentSnapshot + _subject.OnNext(供 WS broadcaster)
Step 4 · 新建 MetricsAggregator(0.2d)
- 新建 backend_csharp/Services/Metrics/IMetricsAggregator.cs(interface):
· `Dictionary<string, ModuleMetrics> GetPerModuleMetrics();`
- 新建 backend_csharp/Services/Metrics/MetricsAggregator.cs(impl):
· 注入 IAudioEngineChainBuilder(若现有不暴露 ActiveModuleIds · 在 ChainBuilder 加该方法)
· 注入 IPerformanceService(用于估算 fallback)
· GetPerModuleMetrics:
- var modules = chainBuilder.ActiveModuleIds ?? new List<string>()
- if (modules.Count == 0) return new Dictionary<string, ModuleMetrics>()
- foreach moduleId in modules:
· 若 dsp_algo P/Invoke getModuleMetrics 已暴露 → 调拿真数据
· 否则 → 估算(总 CPU% / count;总 Mem / count + log warning · trailer [need:P6])
- return dictionary
Step 5 · 新建 PerfController + WS broadcaster(0.2d)
- 新建 backend_csharp/Controllers/Perf/PerfController.cs:
· [Route("api/perf")]
· GET /api/perf/snapshot → 返 IPerformanceService.GetCurrentSnapshot()
· GET /api/perf/per-module → 返 IMetricsAggregator.GetPerModuleMetrics()
- 新建 backend_csharp/Services/Metrics/PerfBroadcastService.cs(BackgroundService 或类似)· 1Hz 订阅 IPerformanceService._subject · 通过 WsBroadcastService 推 `error_event` 风格的 perf 帧到 `/ws/perf`(JSON: { type: 'perf', snapshot: PerfSnapshot, modules: ModuleMetrics[] })
- 在 Program.cs:
· AddSingleton<IPerformanceService, PerformanceService>()
· AddSingleton<IMetricsAggregator, MetricsAggregator>()
· AddHostedService<PerfBroadcastService>()
· WS handler 注册 /ws/perf 路由
Step 6 · xunit 单测(0.2d)
- 新建 backend_csharp/Tests/Services/Metrics/PerformanceServiceTests.cs:
· case `GetCurrentSnapshot_AfterDelay_CpuPercent_GreaterThanZero`(调两次间隔 100ms · 第二次 CPU% > 0)
· case `GetCurrentSnapshot_MemoryMB_GreaterThanTen`(.NET runtime 至少 10MB)
· case `GetCurrentSnapshot_CpuPercent_InValidRange`(0~100*Cores)
- 新建 backend_csharp/Tests/Services/Metrics/MetricsAggregatorTests.cs:
· case `GetPerModuleMetrics_WithMockChain_ReturnsAllModules`(mock chainBuilder 返 3 module · 应返 3 项)
· case `GetPerModuleMetrics_EmptyChain_ReturnsEmpty`(mock 返 [] · 应返空)
· case `GetPerModuleMetrics_AllModuleIds_AreInDictionary`(key 全匹配)
- 新建 backend_csharp/Tests/Controllers/Perf/PerfControllerTests.cs:
· case `GetSnapshot_Returns200_WithPerfSnapshot`
· case `GetPerModule_Returns200_WithDictionary`
- 至少 8 case · 基线 +8
Step 7 · build + test + 手动 e2e(0.15d)
- cd backend_csharp
- dotnet build(零错误零警告)
- dotnet test(基线 +8 用例)
- 手动 e2e:
· dotnet run
· curl http://localhost:5000/api/perf/snapshot → 返 PerfSnapshot JSON · CPU% > 0 · MemoryMB > 10
· curl http://localhost:5000/api/perf/per-module → 返 Dictionary JSON · 含当前链路 N module
· 浏览器 DevTools 看 /ws/perf 帧 · 1Hz 推送 · CPU% 数据每秒变化
Step 8 · commit + push(0.05d)
- git add backend_csharp/Models/Metrics/ \
backend_csharp/Services/Metrics/ \
backend_csharp/Controllers/Perf/ \
backend_csharp/Tests/Services/Metrics/ \
backend_csharp/Tests/Controllers/Perf/ \
backend_csharp/Program.cs
- git commit subject + trailer 见下
- git push origin xistudio
【验收】
形式合规:
- [ ] dotnet build 零错误零警告
- [ ] dotnet test 全绿(基线 +8 用例)
- [ ] 8-10 文件全新建(Models/Metrics ×2 + Services/Metrics ×3-4 + Controllers/Perf ×1 + Tests ×3 + Program.cs DI 改动)
- [ ] 不动前端代码(P1.UA8-perf-monitor-frontend 834f86a 已对齐 schema · 等本 fork zombie 后切真接口)
- [ ] schema 与前端 PerfFrame TypeScript interface 字段一对一(step 1 真值核查报告)
业务行为契约(端到端真值 · 必跑):
- [ ] curl `GET /api/perf/per-module` → 200 OK · 含当前链路所有 module(链路有 N module → 返 N 项)
- [ ] /ws/perf 帧每秒推送 · CPU% 数据**每次不同**(不是写死)· 在 0%~100*Cores% 范围
- [ ] MemoryMB 真实(>10 · 不是 0 / 写死)
- [ ] Per-Module 表格行数 = 当前链路 module 数 · key 与画布 module ID 一一对应
- [ ] 用户回测 ADR-08 验收清单 C3-1~C3-6(本 fork zombie 后由用户执行)
【commit】
subject:`feat(P5.UH-perf-real-data-fix): from-zero implement PerformanceService + MetricsAggregator + PerfController + /ws/perf · ADR-08 §2.3 fork(v1.5 truth-check fix · was never actually built)`
trailer(必须精确):
[step=8/8] [pid=P5] [uid=UH-perf-real-data-fix] [occupies=P5.K-services-metrics+P5.K-api-routes+P5.K-ws-broadcast]
[files=backend_csharp/Models/Metrics/PerfSnapshot.cs, backend_csharp/Models/Metrics/ModuleMetrics.cs, backend_csharp/Services/Metrics/IPerformanceService.cs, backend_csharp/Services/Metrics/PerformanceService.cs, backend_csharp/Services/Metrics/IMetricsAggregator.cs, backend_csharp/Services/Metrics/MetricsAggregator.cs, backend_csharp/Services/Metrics/PerfBroadcastService.cs, backend_csharp/Controllers/Perf/PerfController.cs, backend_csharp/Tests/Services/Metrics/PerformanceServiceTests.cs, backend_csharp/Tests/Services/Metrics/MetricsAggregatorTests.cs, backend_csharp/Tests/Controllers/Perf/PerfControllerTests.cs, backend_csharp/Program.cs]
[ipc=api/perf/snapshot, api/perf/per-module, ws/perf(1Hz)]
[isolation] file(同 worktree 同 branch · 与 P5.UH-runtime-target-data-fix 文件正交)
[derived_from] ADR-AIOS-08 §2.3 + §4.2 fork P5.U-perf-service · v1.5 truth-check 发现历史标注 41ad8d9 错位(实际是 ADR-12 #5 前端)· 后端从零实装
[truth-check] 后端 Services/Metrics + Models/Metrics + Controllers/Perf 三目录现状=<all-empty / partial> · ChainBuilder ActiveModuleIds=<暴露/未暴露 · 若未暴露则本 fork 顺手加>
[need-p6] dsp_algo getModuleMetrics C ABI <已暴露/未暴露 · 若未暴露则估算 + P6 跟进>
[acceptance] curl /api/perf/snapshot 返真 CPU%>0 + /api/perf/per-module 返当前链路 N module + /ws/perf 1Hz 真推 · 用户重跑 C3-1~C3-6
【禁止】
1. ❌ 不动前端代码(P1.UA8-perf-monitor-frontend 834f86a 已对齐 PerfFrame schema · 本 fork schema 字段必须一对一)
2. ❌ 不引入新的 metrics 数学库(System.Diagnostics.Process / GC / Stopwatch 已够)
3. ❌ 不在本 fork 改 dsp_algo dll(若 C ABI 未暴露 · 用估算 + [need:P6] trailer)
4. ❌ 不跳手动 e2e curl 验证(必须看到真数据 · CPU% 不是写死 · 必须 > 0)
5. ❌ 不动 P5.UH-runtime-target-data-fix 的文件区域(Services/Runtime 是它的)
6. ❌ 不省略三元组 trailer + truth-check 报告(包括三目录现状 + ChainBuilder 现状 + dsp_algo 现状)
7. ❌ 不删 [Obsolete] 注释 · 不动同期 P5.UH-runtime-target-data-fix
8. ❌ 不绑写错的"修 stub"心智模型 · 本 fork 是从零实装 · 若 step 1 发现部分文件已存在 · 优先复用而非重写 · 但绝不假定 parent zombie 41ad8d9 落了 8 后端文件
9. ❌ 不跳 step 1 真值核查(必须先 ls + grep · 报告三目录现状 · 否则 commit 拒收)
10. ❌ 不写 schema 与前端 PerfFrame 字段不一致(step 1 必须先 read 前端 schema 对齐)
解锁链(本任务 zombie 后)
- ✅ 用户重跑 ADR-08 验收清单 §议题③ C3-1~C3-6(应全过)
- ✅ DrawerMetrics 显示真 CPU%/内存/延时(不再固定值)+ Per-Module 列出当前链路所有 module
- ✅ 若 dsp_algo getModuleMetrics 未暴露 → 触发 P6 fork 跟进(commit trailer [need:P6])
风险评估
| 风险 | 缓解 |
|---|---|
| ⚠️ dsp_algo C ABI getModuleMetrics 未暴露 → Per-Module 数据是估算不是真 | step 1 grep 后若发现未暴露 · 用 Process.WorkingSet/Modules.Count 估算 + commit [need:P6] · 用户验收时若不接受估算 · 起 P6 fork |
| ⚠️ Process.GetCurrentProcess CPU% 第一次调用返 0(无前次基准) | 构造函数预先调一次初始化 _lastCpuTime / _lastSampleTime · 第一次 GetCurrentSnapshot 至少能给出 100ms 间隔差 |
| ⚠️ 多核机器 CPU% > 100% · 前端可能不接受 | ADR §2.3 没明确单核归一 · 本 fork 实装多核累计(0~100*Cores%)· 若前端要 0~100% · 后续 fork 改 |
| ⚠️ 与 P5.UH-runtime-target-data-fix commit 冲突 | 文件完全正交(Services/Metrics vs Services/Runtime)· 串行 push 即可 |
| ⚠️ ChainBuilder 不暴露 ActiveModuleIds → MetricsAggregator 拿不到当前链路 | step 4 顺手在 ChainBuilder 加 IReadOnlyList |
| ⚠️ 部分 Models/Metrics 或 Services/Metrics 文件已被其他 ADR 零散建过 | step 1 ls 检测 · 若有 · cat 看是否能复用 · 不能则用新名(eg. PerfSnapshotV2)+ commit message 报告 |
| ⚠️ schema 与前端 PerfFrame 字段不一致 → 前端解析失败 | step 1 必须 read 前端 834f86a 文档 / types · 字段一对一(eg. cpuPercent / memoryMB / 不是 cpuPct / mem) |
历史
| 时间 | 事件 | hash |
|---|---|---|
| 2026-05-31 11:08 | dispatched · 用户验收 ADR-08 议题③ 失败 "不是帧数据 + Per-Module 空" → 拍板派 5 hotfix 方案 A · 本 fork 原 P1 · 1.0d ClaudeB · 假定修 parent zombie 41ad8d9 stub | — |
| 2026-05-31 12:05 | rewrite · v1.5 主仓真值核查铁律首抓历史错账:DASHBOARD 标注的 41ad8d9 实际是 ADR-12 #5 前端 · 后端 PerformanceService 从未真实落地 · 用户拍板"直接将没有执行的内容再执行一遍" · 本 fork 升级为从零实装(8-10 全新文件 · 1.0d → 1.5d) | — |