跳转至

P3.A26.F3-meter-dock-log-module-tracker · 5 Meter Dock 内顶部 log_module 追踪下拉 + Transfer 双选 + 后端端点

Worker:ClaudeA · 部门:前端 P1-xilink + P5 后端 · 预计:1.5d · 优先级:P0 · 状态:dispatched · isolation:🧵 file(同 worktree 同 branch · 与 F1-2 文件正交并行)

🔍 触发与解锁链

触发:用户 2026-06-18 17:55 三连 stop F1-1+F2-1+F3-1 → 18:00 v5.2.4 同步完成 → 18:10 用户拍板双连 start P3.A26.F1 + start P3.A26.F3-meter-dock(F3-1 zombie 8a44ea1 解锁本 fork)。

用户原话(verbatim · ADR-26 §1.1 第 2 轮 第 2 段):

"右侧 dock 不会有专门的 log moudle 而是在不同的 dock 中可以追踪 link 中的所有 log module · 来在对应的 dock 中显示这个 log module 的 wav 文件 · 来进行 rms 或者 fft 等显示"

架构契约(ADR-26 §3.6 log_module 横切追踪 · 业务契约 5 必填段): - 契约 A · 5 Meter Dock 统一新增 tracker:Fft/Rms/Phase/Scope/Transfer 5 个 Dock 顶部新增"追踪 log_module ▼" 下拉(ref + computed 响应式) - 契约 B · GET /chain/log-modules 后端端点:返回 LogModuleSummary[](id/name/filePath/sampleRate/channels/durationSec)· 从当前链路 grep 所有 log_module 实例 + 各自最近落盘 wav - 契约 C · 切换重渲染:选某个 log_module → POST /analyze/{type}?file=output/log_xxx.wav → Dock 内绘图重渲染(< 500ms) - 契约 D · Transfer Dock 双 selector:ref + measure 双 log_module 下拉(其他 4 Dock 单 selector)· /analyze/transfer 接收 ref+measure 双文件 - 契约 E · 链路无 log_module fallback:下拉显示"无 log_module · 在链路中拖入 log_module 后追踪"引导文案 · 不破坏 useDockMeterFrame 现有 WS 数据流 - 5 类失败回退(ADR-26 §3.6 ③):wav 文件不存在→红字提示 / sidecar 分析失败→loading / 链路无 log_module→引导文案 / 落盘格式不兼容→toast / Transfer 单选→提示需双通道

解锁链(本任务 zombie 后): - ✅ 5 Meter Dock 横切追踪能力闭环(用户 verbatim 落地) - ✅ F3-1+F3-2 完整闭环(log_module 双击 Dialog + Meter Dock 追踪) - ⏳ F4-1 P_e2e.A26.F4-truth-e2e-meter-dual-link 全解锁(F1-1+F1-2+F2-1+F3-1+F3-2 五齐 · ClaudeC 1.5d → ADR-26 整体闭环 🏆)

任务定义(基于 ADR-26 §3.6 + §4.1 F3-2)

子任务 ① · grep 5 Drawer Dock + F3-1 落地 LogModule 体系真值(0.2d · Step 0)

Step 0 强制门槛 · 必须 grep 5 Drawer Dock 文件结构 + read F3-1 8a44ea1 落地的 LogModule 端点 schema + read ADR-21-R1 d453822 useDockMeterFrame composable(资产保留)。

子任务 ② · useLogModuleTracker composable 新建(0.3d)

新建 frontend_vue3/src/composables/useLogModuleTracker.ts: - listChainLogModules() → GET /chain/log-modules → LogModuleSummary[] - analyzeLogWav(id, type, refId?) → POST /analyze/{type}?file=... - 响应式 ref selectedLogModuleId + selectedRefId(Transfer 用) - 链路无 log_module 时返回空数组 + 引导文案

子任务 ③ · GET /chain/log-modules 后端端点(0.3d)

backend_csharp/Routes/ChainRoutes.csLogModuleRoutes.cs(F3-1 8a44ea1 已建)新增 GET /chain/log-modules: - 从当前链路 grep 所有 log_module 实例 - 返回 LogModuleSummary - 含最近落盘 wav 文件路径(filePath / sampleRate / channels / durationSec)

子任务 ④ · 5 Drawer Dock 顶部加 tracker 下拉(0.4d · 5 子步骤)

每个 Dock 独立 commit: - DrawerDockFft.vue:顶部加 <el-select v-model="selectedLogModuleId"> + 切换调用 analyzeLogWav('fft') - DrawerDockRms.vue:同上 type='rms' - DrawerDockPhase.vue:同上 type='phase'(双通道时启用) - DrawerDockScope.vue:同上 type='scope' - DrawerDockTransfer.vue:双 selector(ref + measure)+ analyzeLogWav('transfer', refId)

ADR-21-R1 useDockMeterFrame WS 数据流不动 · 仅在顶部新增 tracker 区域 · 选 log_module 时切换数据源(从 WS frame → sidecar wav 分析结果)。

子任务 ⑤ · 测试 + 浏览器实测 + 全测试基线零回归(0.3d)

vitest +8 case + playwright +2 case · vue-tsc + build 0 errors · 全测试基线零回归(F1-2 zombie 后基线 371/3 → +8+2 = 381)。

完整 prompt(直接复制粘贴 ClaudeA 终端)

[U-thread] P3.A26.F3-meter-dock-log-module-tracker · ADR-26 §3.6 + §4.1 F3-2
[部门] 前端 P1-xilink + P5 后端
[Worker CWD] d:/work/25_claude/workspace/AlgoDepartment/04_development/
[Occupies] P1.K-shared-xilink-meter-docks + P1.K-shared-log-module-tracker
[优先级] P0(1.5d · 与 F1-2 文件正交并行 max=2.0d)
[ADR] docs/08-implementation/40-aios/ADR/ADR-AIOS-26-meter-dual-link-runtime-target-tri-stage.md(必读 §3.6 log_module 横切追踪 + §4.1 F3-2 + §4.3 文件正交矩阵第 5 行 + §5 风险表第 5 行 + §9.2 grep 真值教训)
[isolation] file(同 worktree 同 branch · frontend_vue3 范围内改 5 Drawer Dock + useLogModuleTracker · 后端 ChainRoutes 增 1 端点 · 与 F1-2 文件 100% 正交)

[参考文档绝对路径]
  - 业务契约:ADR-26 §3.6 完整 5 必填段(① TS LogModuleSummary + LogModuleTracker / ② 5 Dock 追踪能力矩阵 / ③ 5 类失败回退 / ④ 5 步操作流 / ⑤ playwright e2e 切换重渲染)
  - 用户 2026-06-18 15:45 verbatim 第 2 轮 第 2 段(ADR-26 §1.1):
    "右侧 dock 不会有专门的 log moudle 而是在不同的 dock 中可以追踪 link 中的所有 log module · 来在对应的 dock 中显示这个 log module 的 wav 文件 · 来进行 rms 或者 fft 等显示"
  - 用户 2026-06-18 17:55 三连 stop + 18:10 双连 start
  - 教训承接标本(必读避坑 · ADR-26 §9 + §5):
    * §9.2 ADR-23→25→25-R1 三连教训严格执行 · grep 5 Drawer Dock 文件 + F3-1 LogModule 端点 schema 真值
    * §5 风险表第 5 行:F3-2 5 Meter Dock 同步加 tracker · 改动面广 · 拆 5 子步骤(每个 Dock 独立 commit)+ vitest 每 Dock 独立 case · 渐进 commit
  - 范式 commits(worker 必读 · 强制 read 全文对齐格式):
    * P3.A26.F3--8a44ea1(F3-1 同 ClaudeA 同 ADR-26 标本 · LogModuleService + GET/PUT API + LogModuleConfigDialog · 本 fork 复用端点体系)
    * P1.UA21R1.F2--d453822(同 ClaudeA · ADR-21-R1 useDockMeterFrame composable + 5 Drawer 薄壳化标本 · 本 fork 严禁重构 · 仅顶部新增 tracker)

[现有组件 grep 真值(.clinerules v3.0 ADR-23→25→25-R1 三连教训铁律 · Step 0 强制完整核查 · 不允许凭文件名推测起草)]
  ① F3-1 后端 8a44ea1 落地范围(Step 0 强制 git show 8a44ea1 --stat 完整 read):
     - LogModuleService.cs POCO 字段(id/name/filePath/sampleRate/channels · 复用到 LogModuleSummary)
     - Routes/LogModuleRoutes.cs GET/PUT /log-module/{id}/config 端点路径(本 fork 在同一控制器加 GET /chain/log-modules)
     - 文件名模板渲染逻辑(${timestamp}/${moduleId})
  ② frontend_vue3/src/stages/xilink/drawers/(Step 0 强制 grep "DrawerDock" 列出 5 个 Dock 真值文件名):
     - DrawerDockFft.vue / DrawerDockRms.vue / DrawerDockPhase.vue / DrawerDockScope.vue / DrawerDockTransfer.vue(确认存在)
     - 每个 Dock 现有顶部结构(找插入 tracker 下拉的位置 · 不破坏 ADR-21-R1 d453822 薄壳化结构)
  ③ frontend_vue3/src/composables/useDockMeterFrame.ts(ADR-21-R1 d453822 资产 · 严禁重构):
     - read 全文 · 确认 5 Dock 共享数据流 + WS frame 订阅
     - 本 fork 在 useLogModuleTracker 中"切换数据源"时 · 不动 useDockMeterFrame · 仅 Dock 渲染层 v-if 切换(WS frame vs wav 分析结果)
  ④ frontend_vue3/src/composables/__tests__/(若 useDockMeterFrame.spec.ts 存在则参考):
     - 测试现有 5 Dock 数据流 · 本 fork +8 case 不破坏现有 case
  ⑤ pysidecar /analyze/{fft,rms,phase,scope,transfer} 端点(已有 · 本 fork 仅消费):
     - POST /analyze/fft?file=output/log_xxx.wav → FftAnalysisResult(ADR-26 §3.3 ① 已锚定)
     - POST /analyze/transfer 接收 ref+measure 双文件参数(Transfer Dock 双 selector 用)
  ⑥ ADR-26 §4.3 文件正交矩阵(L678-682):本 fork 改 5 DrawerDock + useLogModuleTracker · 与 F1-2 改 ResourceMonitorDock + ConnectionDock + useRuntimeTarget 100% 正交

[文件正交策略](.clinerules v3.0 §UID 命名铁律 + §isolation):
  isolation: file · frontend_vue3 范围内改 5 DrawerDock(改 5 文件 · 顶部新增 tracker 下拉)+ useLogModuleTracker(新建)+ spec + e2e · 后端 1 端点
  与 F1-2(改 ResourceMonitorDock + ConnectionDock + useRuntimeTarget · 不动 5 DrawerDock)文件 100% 正交 · 双 fork(ClaudeA 自管串行 max=2.0d)同时跑零冲突
  严禁动 backend_csharp 除 ChainRoutes/LogModuleRoutes 1 个端点外 / 严禁动 RightDock*(F2-1 资产)/ 严禁动 LogModuleNode + LogModuleConfigDialog(F3-1 资产)/ 严禁重构 useDockMeterFrame(ADR-21-R1 d453822 资产)

【背景】
  用户 2026-06-18 15:45 verbatim 第 2 轮 第 2 段明确 log_module 横切追踪能力("不同的 dock 中可以追踪 link 中的所有 log module · 来在对应的 dock 中显示这个 log module 的 wav 文件")。
  F3-1 后端 8a44ea1 已落地 LogModuleService POCO + GET/PUT /log-module/{id}/config 端点 + 文件名模板(2026-06-18 18:00 zombie · ClaudeA+ClaudeB 1.5d 跨栈)。本 fork 复用 LogModuleSummary POCO + 新增 GET /chain/log-modules 列表端点。
  F2-1 f555661 已校正右侧 selector 4 类(log_module 移出独立节点)· 用户原话"右侧 dock 不会有专门的 log moudle"严格落地。本 fork 是 log_module 真正的展现路径(在 5 Meter Dock 内追踪)。
  与 F1-2(同 ClaudeA · 2.0d · runtime-target-frontend-ui)文件 100% 正交可并行 · 用户 18:10 拍板双连 start · ClaudeA 自管串行 max=2.0d。
  教训承接(ADR-26 §5 风险表第 5 行):5 Meter Dock 同步加 tracker · 改动面广 · 拆 5 子步骤(每 Dock 独立 commit)+ vitest 每 Dock 独立 case · 渐进 commit。
  教训承接:严禁重构 ADR-21-R1 d453822 useDockMeterFrame composable(资产保留 · 仅在 Dock 顶部新增 tracker 区域)。

【架构关键约束】
  ⚡ 严守 .clinerules v3.0 ADR-23→25→25-R1 三连教训铁律:Step 0 必须 grep "DrawerDock" 5 文件 + git show 8a44ea1 LogModule 端点 schema + read useDockMeterFrame.ts 全文
  ⚡ 严守 ADR-26 §5 风险表第 5 行:5 Dock 渐进改 + 每 Dock 独立 commit + vitest 每 Dock 独立 case(避免一次大改回滚成本高)
  🎨 useLogModuleTracker composable 新建 · 不破坏 useDockMeterFrame(ADR-21-R1 d453822 资产)· 5 Dock 共享 tracker · 但选中 ID 各自 ref 独立(用户切换 FFT 看 log_pre_eq · RMS 看 log_post_eq)
  🎨 5 Dock 顶部 tracker 下拉布局统一(中文标签"追踪 log_module ▼")· UI 一致性
  📋 切换数据源:WS frame(useDockMeterFrame 现有 · log_module=null 时显示)vs sidecar wav 分析结果(选 log_module 时显示)· v-if 渲染层切换 · 不污染数据层
  📋 Transfer Dock 双 selector:ref + measure 两个 log_module 下拉(用户原话"可以追踪 link 中的所有 log module"· Transfer 需两个)
  📋 GET /chain/log-modules 端点:从当前 chain 状态 grep 所有 log_module 实例 · 返回 LogModuleSummary[](复用 F3-1 POCO)
  📋 链路无 log_module fallback:下拉显示"无 log_module · 拖入 log_module 后追踪"引导文案 · 用户引导明确
  📋 三层分工(ADR-07 §1.3.4):L3 前端纯 UI 行为 · 不做 DSP 数学 · 不动 useDockMeterFrame WS 数据流
  🚫 严禁重构 useDockMeterFrame.ts(ADR-21-R1 d453822 资产保留)
  🚫 严禁动 backend_csharp 除 ChainRoutes/LogModuleRoutes 1 个端点外其他文件
  🚫 严禁动 RightDock*.vue / useChainNodeMetadata.ts(F2-1 f555661 资产)
  🚫 严禁动 LogModuleNode.vue / LogModuleConfigDialog.vue(F3-1 8a44ea1 资产)
  🚫 严禁动 ResourceMonitorDock.vue / ConnectionDock.vue / useRuntimeTarget.ts(F1-2 范围 · 文件正交并行)
  🚫 严禁一次大改 5 Dock(必须 5 子步骤渐进 commit · 每 Dock 独立可 revert)
  🚫 严禁 Transfer Dock 单 selector(用户原话双通道 · ref + measure 必须双下拉)
  🚫 严禁嵌入完整 Vue SFC > 60 行 / TS interface > 5 行(.clinerules v3.0)

【执行步骤】
  Step 0 · 文件注入真值核查(强制门槛 · ADR-26 §9.2 + §5 教训承接)
    - git show 8a44ea1 --stat 完整列表 · git show 8a44ea1 -- backend_csharp/Services/LogModule*.cs · 完整 read LogModuleService POCO 字段(id/name/filePath/sampleRate/channels)
    - git show 8a44ea1 -- backend_csharp/Routes/LogModuleRoutes.cs · 完整 read 已有 GET/PUT 端点结构(本 fork 在同一控制器加 GET /chain/log-modules)
    - grep "DrawerDock" frontend_vue3/src/stages/xilink/drawers/ · 列出 5 Drawer Dock 文件(Fft/Rms/Phase/Scope/Transfer · 严格列出真值文件路径)
    - read 5 Drawer Dock 各自顶部结构(找插入 tracker 区域的位置 · 不破坏 ADR-21-R1 d453822 薄壳化结构)
    - read frontend_vue3/src/composables/useDockMeterFrame.ts 全文(ADR-21-R1 d453822 资产 · 严禁重构 · 但必须了解共享数据流接口)
    - grep "/analyze/" frontend_vue3/src/composables/ · 确认 sidecar /analyze/{fft,rms,phase,scope,transfer} 调用方式
    - 留 commit log:Step 0 六层核查记录 + 5 Drawer Dock 真值路径 + F3-1 LogModuleService POCO 字段摘要 + useDockMeterFrame 共享数据流接口

  Step 1 · useLogModuleTracker composable 新建 0.3d(子任务 ②)
    - 新建 frontend_vue3/src/composables/useLogModuleTracker.ts
    - 函数:listChainLogModules() → GET /chain/log-modules → Promise<LogModuleSummary[]>
    - 函数:analyzeLogWav(id, type, refId?) → POST /analyze/{type}?file=output/log_${id}.wav → Promise<AnalysisResult>
    - 响应式 ref:selectedLogModuleId(各 Dock 独立 · 通过参数 dockKey 隔离)+ selectedRefId(Transfer 专用)
    - 链路无 log_module 时返回空数组 + isEmpty 标志
    - 错误处理:wav 不存在 → toast / sidecar 504 → loading + 30s 超时 / 网络错 → 重试

  Step 2 · GET /chain/log-modules 后端端点 0.3d(子任务 ③)
    - 修 backend_csharp/Routes/LogModuleRoutes.cs(F3-1 已建)或 ChainRoutes.cs · 新增 GET /chain/log-modules
    - 从 IChainStateService 当前链路 grep 所有 log_module 实例 + 各自最近落盘 wav 路径
    - 返回 LogModuleSummary[](复用 F3-1 POCO · 字段 id/name/filePath/sampleRate/channels/durationSec)
    - 端点测试(后端 xunit 1 case · 复用 F3-1 测试体系)

  Step 3.1 · DrawerDockFft.vue 加 tracker 下拉 0.08d(子任务 ④ Dock 1)
    - 顶部新增 `<el-select v-model="selectedLogModuleId">` + tooltip "追踪 log_module"
    - 选择时调用 analyzeLogWav(id, 'fft') → 切换 v-if 渲染层(WS frame vs sidecar wav FFT)
    - 链路无 log_module 时下拉显示"无 log_module · 拖入 log_module 后追踪"
    - 独立 commit · 渐进 PR

  Step 3.2 · DrawerDockRms.vue 加 tracker 下拉 0.08d(同上 type='rms')
  Step 3.3 · DrawerDockPhase.vue 加 tracker 下拉 0.08d(同上 type='phase' · 双通道时启用)
  Step 3.4 · DrawerDockScope.vue 加 tracker 下拉 0.08d(同上 type='scope')
  Step 3.5 · DrawerDockTransfer.vue 加 **双 selector**(ref + measure)0.1d
    - 顶部新增 2 个 el-select(ref/measure)+ analyzeLogWav(measureId, 'transfer', refId) → 切换 v-if 渲染层(WS frame vs sidecar wav Transfer)
    - 单选时提示"需选 ref + measure 双通道"

  Step 4 · 测试 + e2e + 全测试基线零回归 0.3d(子任务 ⑤)
    - useLogModuleTracker.spec.ts ≥ 8 case:
      T1 listChainLogModules 返回非空数组(mock fetch)
      T2 listChainLogModules 链路无 log_module → 空数组 + isEmpty=true
      T3 analyzeLogWav('fft', id) 触发 POST 正确 URL(mock)
      T4 analyzeLogWav('transfer', measureId, refId) 含 ref+measure 双参数(mock)
      T5 analyzeLogWav 失败时 toast(mock 504)
      T6 selectedLogModuleId 各 Dock 独立(参数 dockKey 隔离)
      T7 wav 文件不存在时下拉旁红字提示
      T8 切换 log_module < 500ms(mock + computed 响应)
    - playwright e2e ≥ 2 case(adr-26-meter-dock-tracker/log-module-tracker.spec.ts):
      E1 ADR-26 §3.6 ⑤:链路 2 log_module + 配置落盘 + 注入 1kHz · FFT Dock 选 log_pre_eq · 峰值 1000Hz / 切 log_post_eq 重渲染
      E2 Transfer Dock 双 selector:ref=log_input + measure=log_output · 显示 H(f) magDb/phaseDeg
    - vue-tsc --noEmit 0 errors
    - npm run build 0 errors
    - npm run test 全测试基线零回归(F1-2 zombie 后基线 371/3 → +8+2 = 381/3)

  Step 5 · 浏览器实测 0.2d
    - 启动 backend(F3-1+F1-1 已 zombie · 真端点联调)+ frontend(npm run dev)
    - 用户操作流(ADR-26 §3.6 ④)端到端 5 步验收:
      ☐ 用户在链路中拖入 2 个 log_module(log_pre_eq + log_post_eq)+ 配置落盘 wav(F3-1 LogModuleConfigDialog)
      ☐ 用户开 FFT Dock(右键链路 / 或菜单)· 顶部下拉显示 [追踪 log_module ▼ log_pre_eq | log_post_eq]
      ☐ 用户选 log_pre_eq → sidecar /analyze/fft → FFT 绘图(WS frame v-if 隐藏 · sidecar 结果 v-if 显示)
      ☐ 用户切 log_post_eq → 同节点切换分析 < 500ms · 实时对比 EQ 前后频谱
      ☐ Transfer Dock 双 selector ref=log_input + measure=log_output · 显示 H(f)
      ☐ 链路无 log_module 时下拉显示引导文案
      ☐ ADR-21-R1 d453822 useDockMeterFrame WS 数据流零回归(log_module=null 时仍显示 WS frame)
    - git add . && git commit -m "feat(xilink/meter-dock): P3.A26.F3-tracker 5 Meter Dock 顶部新增 log_module 追踪下拉

      用户 2026-06-18 17:55 三连 stop + 18:10 双连 start。F3-1 zombie 8a44ea1 解锁本 fork。
      F3-2 本 fork(ADR-26 §3.6 + §4.1):
      ① useLogModuleTracker.ts 新建 · listChainLogModules + analyzeLogWav + 各 Dock 独立 selectedLogModuleId
      ② GET /chain/log-modules 后端端点(LogModuleRoutes.cs · 复用 F3-1 LogModuleSummary POCO)
      ③ 5 Drawer Dock 顶部加 tracker 下拉(Fft/Rms/Phase/Scope · 单 selector · Transfer · 双 selector ref+measure)
      ④ 切换数据源 v-if 渲染层(WS frame · log_module=null 时 / sidecar wav 分析 · 选 log_module 时)
      ⑤ 链路无 log_module fallback 引导文案 · 不破坏 ADR-21-R1 d453822 useDockMeterFrame
      ⑥ vitest +8 case + playwright +2 case 全过 · vue-tsc + build 全绿 · 全测试基线零回归

      消费 F3-1 后端 8a44ea1:LogModuleService POCO + GET /chain/log-modules 端点(本 fork 新增)
      消费 sidecar 已有:POST /analyze/{fft,rms,phase,scope,transfer}?file=output/log_xxx.wav
      文件正交:与 F1-2(runtime-target-frontend-ui)100% 正交 · ClaudeA 自管串行 max=2.0d
      ADR-23→25→25-R1 三连教训承接:Step 0 grep 5 DrawerDock 真值 · F3-1 端点 schema · useDockMeterFrame 共享数据流接口
      ADR-21-R1 d453822 useDockMeterFrame 资产保留:仅顶部新增 tracker · 不重构数据流

      [step=5/5] [pid=P3] [uid=P3.A26.F3-meter-dock-log-module-tracker] [type=fork] [isolation=file]
      [occupies=P1.K-shared-xilink-meter-docks+log-module-tracker] [files=8(5M+1N+1S+1E+1B)] [ipc=rest]
      [adr=ADR-AIOS-26 §3.6 + §4.1 F3-2 + §4.3 文件正交矩阵 + 用户 2026-06-18 15:45 第 2 轮 第 2 段 verbatim + 17:55 三连 stop + 18:10 双连 start]"

【验收】
  ☐ Step 0 文件注入真值核查通过(git show 8a44ea1 LogModule + grep 5 DrawerDock + read useDockMeterFrame · commit log 留痕 ≥ 5 真值路径)
  ☐ Step 1 useLogModuleTracker composable 新建 · listChainLogModules + analyzeLogWav + 各 Dock 独立 selectedLogModuleId · 错误处理完整
  ☐ Step 2 GET /chain/log-modules 后端端点 · 复用 F3-1 POCO · 后端 1 case 测试通过
  ☐ Step 3.1-3.5 5 Drawer Dock 顶部加 tracker 下拉(每 Dock 独立 commit · 渐进 PR)· Transfer 双 selector
  ☐ Step 4 vitest +8 case 全过(T1-T8)+ playwright +2 case 全过(E1-E2)· vue-tsc + build 0 errors · 全测试基线零回归
  ☐ Step 5 浏览器实测 7 验收点全过(2 log_module + FFT 切换 + Transfer 双选 + < 500ms + 链路无 fallback + WS frame 零回归)
  ☐ commit message 含 7 元组 trailer + ADR-26 §3.6 + §4.1 + §4.3 + 用户 verbatim 引用 + F3-1 zombie 联调说明
  ☐ ADR-21-R1 d453822 useDockMeterFrame 零回归(本 fork 严禁重构 · 仅顶部新增 tracker)

【禁止】
  ❌ 禁止跳过 Step 0 文件注入真值核查(ADR-26 §9.2 教训 · grep 5 DrawerDock + git show 8a44ea1)
  ❌ 禁止重构 useDockMeterFrame.ts(ADR-21-R1 d453822 资产 · 仅顶部新增 tracker)
  ❌ 禁止动 backend_csharp 除 ChainRoutes/LogModuleRoutes 1 个端点外的任何文件
  ❌ 禁止动 RightDock*.vue / useChainNodeMetadata.ts(F2-1 f555661 资产)
  ❌ 禁止动 LogModuleNode.vue / LogModuleConfigDialog.vue(F3-1 8a44ea1 资产)
  ❌ 禁止动 ResourceMonitorDock.vue / ConnectionDock.vue / useRuntimeTarget.ts(F1-2 范围 · 文件正交并行)
  ❌ 禁止一次大改 5 Dock(必须 5 子步骤渐进 commit · 每 Dock 独立可 revert · ADR-26 §5 风险表第 5 行)
  ❌ 禁止 Transfer Dock 单 selector(用户原话双通道 · ref + measure 必须双下拉)
  ❌ 禁止跳过 vitest +8 case(T1-T8 验收硬门槛)/ 跳过 playwright +2 case(E1-E2)
  ❌ 禁止 commit 缺七元组 trailer(.clinerules v3.0 铁律)
  ❌ 禁止嵌入完整 Vue SFC > 60 行 / TS interface > 5 行(.clinerules v3.0 · 用 diff 模式提交)

解锁链(本任务 zombie 后)

  • ✅ 5 Meter Dock 横切追踪能力闭环(用户 verbatim 落地)
  • ✅ F3-1+F3-2 完整闭环(log_module 双击 Dialog 落盘 + Meter Dock 内追踪 wav 分析)
  • ✅ ADR-21-R1 d453822 useDockMeterFrame 零回归
  • ⏳ F4-1 P_e2e.A26.F4-truth-e2e-meter-dual-link 全解锁(F1-1+F1-2+F2-1+F3-1+F3-2 五齐 · ClaudeC 1.5d → ADR-26 整体闭环 🏆 v5.0+ 第 N 个 ADR 闭环)

风险评估

风险 缓解
5 Drawer Dock 文件名不确定(prompt 中 Step 0 grep 强制定位) Step 0 grep "DrawerDock" 强制列出 5 真值文件 · 不允许凭推测起草改动
ADR-21-R1 d453822 useDockMeterFrame 误重构(现有 5 Dock WS 数据流破坏) 禁止段明确"严禁重构 useDockMeterFrame" · 仅 Dock 顶部新增 tracker 区域 + v-if 渲染层切换 · vitest 验证 WS frame 零回归
F3-1 LogModule POCO 字段名错配(本 fork GET /chain/log-modules 复用) Step 0 强制 git show 8a44ea1 -- backend_csharp/Services/LogModule*.cs 完整 read · 字段名严格按 F3-1 真值 · 不重新定义
5 Dock 一次大改回滚成本高(ADR-26 §5 风险表第 5 行) 拆 5 子步骤(Step 3.1-3.5 每 Dock 独立 commit)+ vitest 每 Dock 独立 case · 渐进 PR · 任一 Dock 出错独立 revert
Transfer Dock 双 selector 用户混淆(ref vs measure) 中文标签明确"参考(ref)"+"测量(measure)" · 单选时提示"需选双通道" · vitest E2 验证双选行为
链路无 log_module 时用户困惑 下拉显示引导文案"无 log_module · 拖入 log_module 后追踪"+ 跳转 F3-1 Dialog 引导链接
GET /chain/log-modules 后端从 chain 状态 grep 实例性能问题(链路大时) 简单数组遍历 · O(N) · 链路通常 ≤ 50 节点 · 不引入缓存复杂度
切换 log_module 时 useDockMeterFrame WS 数据流冲突(同时显示) v-if 严格切换:log_module=null → 显示 WS frame / 选 log_module → 显示 sidecar wav 结果 · 两路渲染不重叠
ClaudeA 排队膨胀(本 1.5d + F1-2 2.0d 并行 · 自管节奏) 文件 100% 正交 · ClaudeA 自管串行节奏(用户拍板信任)· 实际跨度 max=2.0d(F1-2 控速)· 不影响 F4-1 e2e 准备

历史

时间 事件 hash
2026-06-18 18:10 dispatched(用户 17:55 三连 stop F1-1+F2-1+F3-1 + 18:10 双连 start P3.A26.F1 + P3.A26.F3-meter-dock · 与 F1-2 文件正交并行 1.5d · F3-1 zombie 8a44ea1 解锁本 fork · ADR-21-R1 d453822 资产保留)