跳转至

P3.A26.F3-log-module-double-click-config-dialog · log_module 双击 = 落盘类型选择 Dialog(audioLog + textLog 双区 · 不展示分析 UI)

Worker:ClaudeA + ClaudeB(跨栈协作)· 部门:前端 P3-xilink + 后端 P5 · 预计:1.5d · 优先级:P0 · 状态:dispatched · isolation:🧵 file(同 worktree 同 branch · 与 F1-1/F2-1 文件正交并行)

🔍 触发与解锁链

触发:用户 2026-06-18 16:50 accept ADR-AIOS-26 + 16:55 三连 start · 与 F1-1/F2-1 文件正交并行起手 · 跨栈协作(前端 Dialog + 后端 PUT/GET /log-module/{id}/config)。

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

"关于交互 C 双击 module 出来的是音频 log 数据类型的落盘选择 · 并不会显示具体的界面 · 这个 module 主要的功能就是音频 log 或者文字 log 的落盘"

架构契约(ADR-26 §3.5 log_module 双击 = 落盘类型选择 · 业务契约 5 必填段): - 契约 A · LogModuleConfig schema:{ audioLog: { enabled, format: 'wav-pcm16'|'wav-pcm24'|'wav-float32', sampleRate, channels, fileNameTemplate }, textLog: { enabled, format: 'csv'|'json', fields: string[], fileNameTemplate } } - 契约 B · 双击行为:LogModuleNode.vue @dblclick → 弹 LogModuleConfigDialog.vue(audioLog + textLog 双区)· 不弹分析 popup(不弹 FFT/RMS/Phase/Scope/Transfer) - 契约 C · API 端点:PUT /api/log-module/{id}/config { config: LogModuleConfig } → 200 OK + GET /api/log-module/{id}/config → LogModuleConfig + 持久化到 workspace state - 契约 D · 默认值合理:audioLog format=wav-pcm16 + sampleRate 继承链路 + channels 继承链路 · textLog 默认 disabled · fileNameTemplate 含 ${timestamp} ${moduleId} - 契约 E · 文件名模板:支持 ${timestamp} / ${moduleId} 变量替换 · 防覆盖加 -1/-2 后缀 - 5 类失败回退(ADR-26 §3.5 ③):磁盘满 → toast + 自动停 / 文件名冲突 → 加后缀 / 采样率不匹配 → 自动重采样 + warning / fields 错 → Dialog 校验 + 红字 / 实例已删 → Dialog 自动关

解锁链(本任务 zombie 后): - ✅ log_module 双击行为变更(原分析 popup → 落盘配置 Dialog) - ✅ LogModuleConfig schema 锁定(供 F3-2 Meter Dock 追踪器消费 wav 路径用) - ✅ F3-2 P3.A26.F3-meter-dock-log-module-tracker(ClaudeA 1.5d · 5 Meter Dock 内部追踪 + GET /chain/log-modules 后端协作)解锁 - ⏳ F4-1 P_e2e.A26.F4-truth-e2e-meter-dual-link(ClaudeC 1.5d · blocked-by-F1-1+F1-2+F2-1+F3-1+F3-2 五齐)→ ADR-26 整体闭环 🏆

任务定义(基于 ADR-26 §3.5 + §4.1 F3-1)

子任务 ① · grep 现有 log_module 真值 + 评估双击行为现状(0.2d · Step 0)

Step 1.1:grep LogModule frontend_vue3/src/ + backend_csharp/ + dsp_algo/ · 列出所有现有 log_module 相关文件 · 重点确认: - 前端 LogModuleNode.vue(双击行为 · 推测当前可能弹 FFT popup 或无行为) - 后端 LogModuleService / LogModuleRoutes(若已存在则 read · 不存在则新建) - dsp_algo log_module C 实现(typeId 推测 · 与 wav 落盘逻辑)

Step 1.2:grep LogModuleConfig 全 repo · 若已有 schema 定义则复用 · 否则按 ADR-26 §3.5 ① 新建。

子任务 ② · 后端 LogModuleService + Routes(ClaudeB · 0.5d)

Step 2.1:在 backend_csharp/Services/LogModule/LogModuleService.cs(若不存在则新建)实现 LogModuleConfig schema POCO:

public record LogModuleConfig(
    AudioLogConfig AudioLog,
    TextLogConfig TextLog
);
public record AudioLogConfig(
    bool Enabled,
    string Format,         // wav-pcm16 / wav-pcm24 / wav-float32
    int SampleRate,
    int Channels,
    string FileNameTemplate
);
public record TextLogConfig(
    bool Enabled,
    string Format,         // csv / json
    string[] Fields,
    string FileNameTemplate
);
+ GetConfig(string id) / SetConfig(string id, LogModuleConfig config) + workspace 持久化(复用 ADR-15 协议 · data/xilink/log-modules/<id>.json)+ 文件名模板渲染 helper(${timestamp} ${moduleId} 替换 + 防冲突后缀)。

Step 2.2:backend_csharp/Routes/LogModuleRoutes.cs(若不存在则新建) - GET /api/log-module/{id}/config → LogModuleConfig - PUT /api/log-module/{id}/config body: LogModuleConfig → 200 OK - 200 OK 后通过现有 WS 频道(若有)广播配置变更(可选 · 不强制)

Step 2.3:新建 Services/LogModule/Tests/LogModuleServiceTests.cs ≥ 4 case: - T1 LogModuleConfig schema POCO 序列化/反序列化 round-trip - T2 GetConfig 默认值(audioLog=disabled / wav-pcm16 + 链路 sampleRate/channels) - T3 SetConfig 持久化 + 再 GetConfig 一致 - T4 文件名模板 \({timestamp}/\) 渲染正确

子任务 ③ · 前端 LogModuleConfigDialog.vue 新建(ClaudeA · 0.4d)

Step 3.1:新建 frontend_vue3/src/components/LogModuleConfigDialog.vue: - 双区布局:☑ Audio Log(format/sampleRate/channels/fileNameTemplate)+ ☐ Text Log(format/fields[]/fileNameTemplate) - 默认值:audioLog enabled + wav-pcm16 + 链路 sampleRate/channels + log_${timestamp}_${moduleId}.wav · textLog disabled - 校验:fileNameTemplate 必填 + sampleRate 整数 + channels 1-8 + textLog fields 非空(若 enabled) - 确认按钮 → PUT /api/log-module/{id}/config → toast 成功

子任务 ④ · LogModuleNode.vue 双击行为变更(ClaudeA · 0.2d)

Step 4.1:在 LogModuleNode.vue(具体路径 Step 0 grep)修改 @dblclick 处理: - 原行为(若是分析 popup)→ 移除 - 新行为:onDoubleClick 触发 floating.openDialog(LogModuleConfigDialog, { moduleId: node.id }) - 调用 GET /api/log-module/{id}/config 加载现有配置 · Dialog 内消费

Step 4.2:确保单击行为不变(若有单击高亮等)· 仅改双击。

子任务 ⑤ · 测试 + 全测试基线零回归(0.2d)

Step 5.1:LogModuleConfigDialog.vitest 加 ≥ 4 case: - T1 Dialog 渲染含 audioLog + textLog 双区 - T2 默认值 audioLog enabled + wav-pcm16 - T3 校验 fileNameTemplate 必填(空 → 红字) - T4 确认按钮触发 PUT /api/log-module/{id}/config

Step 5.2:LogModuleNode.vue 双击行为测试 ≥ 2 case: - T5 双击触发 floating.openDialog LogModuleConfigDialog - T6 双击不触发任何 FFT/RMS popup(确保无分析 UI)

Step 5.3:vue-tsc --noEmit 0 errors · npm run build 0 errors · npm run test 全测试基线零回归(前端 356/3 → 362/3 · 后端 237 → 241+) · dotnet build + dotnet test 全绿。

子任务 ⑥ · 浏览器实测 + commit(含在 1.5d 内)

Step 6.1:启动 backend + frontend · 拖 log_module 到链路中 · 双击 → 验证弹出 LogModuleConfigDialog(无 FFT popup) · 配置 audioLog 后注入 1kHz @ -10dBFS 2s · 验证 output/log_*.wav 落盘。

完整 prompt(直接复制粘贴 ClaudeA + ClaudeB 协作终端)

[U-thread] P3.A26.F3-log-module-double-click-config-dialog · ADR-26 §3.5 + §4.1 F3-1
[部门] 前端 P3-xilink(ClaudeA · Dialog + LogModuleNode 双击)+ 后端 P5(ClaudeB · LogModuleService + Routes + Tests)
[Worker CWD] d:/work/25_claude/workspace/AlgoDepartment/04_development/
[Occupies] P3.K-shared-log-module-node + P5.K-shared-log-module-routes
[优先级] P0(1.5d · 跨栈协作 · 与 F1-1/F2-1 文件正交并行 max=1.5d)
[ADR] docs/08-implementation/40-aios/ADR/ADR-AIOS-26-meter-dual-link-runtime-target-tri-stage.md(必读 §3.5 完整 5 必填段 + §4.1 F3-1 + §1.3 #6 log_module grep 真值 + §5 风险表第 4 行)
[isolation] file(同 worktree 同 branch · 跨栈 5 文件:前端 2(改 + 新建)+ 后端 3(改/新建 Service/Routes/Tests))

[参考文档绝对路径]
  - 业务契约:ADR-26 §3.5 完整 5 必填段(① TS LogModuleConfig schema / ② 5 行收敛判据 / ③ 5 类失败回退 / ④ 5 步操作流 / ⑤ playwright e2e 双击 = Dialog · 不弹分析)
  - 用户 2026-06-18 15:45 verbatim 第 2 轮 第 1 段(ADR-26 §1.1):"双击 module 出来的是音频 log 数据类型的落盘选择 · 并不会显示具体的界面"
  - 用户 2026-06-18 16:50 拍板 accept ADR-AIOS-26 + 16:55 三连 start
  - 教训承接标本(必读避坑 · ADR-26 §9):
    * §9.2 ADR-23→25→25-R1 三连教训严格执行(本 prompt Step 0 强制 grep log_module 现有组件)
  - 范式 commits(worker 必读 · 强制 read 全文对齐格式):
    * P3.UA25R1.F1--0bb4422(2026-06-18 v3.0 标本 · ClaudeA combo hotfix · 8 段格式 + 七元组完美对齐)
    * P5.A22.F2--eac5b69(P5 后端 ClaudeB · realtime persistence service · POCO + Routes + audit + Tests 4-in-1 模式参考)

[现有组件 grep 真值(.clinerules v3.0 ADR-23→25→25-R1 三连教训铁律 · 派发前部分锚定 · Step 0 强制 grep 完整核查)]
  ① log_module 现有组件(用户原话名词 · Step 0 强制 grep 锁定具体文件):
     - 前端:grep "log_module\|LogModule" frontend_vue3/src/ · 找 LogModuleNode.vue / 相关 composable / 现有双击行为
     - 后端:grep "LogModule" backend_csharp/ · 找 LogModuleService.cs / LogModuleRoutes.cs(若已存在则改 · 否则新建)
     - dsp_algo:grep "log_module" dsp_algo/modules/ · 确认 C 实现 + typeId(本 fork 不动 dsp_algo · 仅消费其落盘文件路径约定)
  ② LogModuleConfig schema(若已存在则 read 复用 · 否则按 ADR-26 §3.5 ① 新建):
     - grep "LogModuleConfig\|AudioLogConfig\|TextLogConfig" 全 repo
  ③ floating.openDialog 现有用法(前端弹 Dialog 模式参考):
     - grep "floating.openDialog\|useFloating" frontend_vue3/src/ · 找 1-2 个标本(可能是 PhaseModulePopup / TransferModulePopup 用 floating.openDialog)
  ④ workspace 持久化 ADR-15:复用 workspace state · log_module config 存 data/xilink/log-modules/<id>.json
  ⑤ ADR-26 §3.6 Meter Dock 横切追踪(F3-2 范围)消费本 fork LogModuleConfig schema · F3-2 后续起手时 GET /chain/log-modules 端点由 F3-2 实现(本 fork 不实现 · 但 schema 锁定)

[文件正交策略](.clinerules v3.0 §UID 命名铁律 + §isolation):
  isolation: file · 跨栈 5 文件(前端 LogModuleNode.vue 改 + LogModuleConfigDialog.vue 新建 · 后端 LogModuleService.cs 改/新建 + LogModuleRoutes.cs 改/新建 + LogModuleServiceTests.cs 新建)
  与 F1-1(backend_csharp/Services/Runtime/*)+ F2-1(frontend_vue3/composables/useChainNodeMetadata + RightDock*.vue)文件 100% 正交 · 三 worker 同时跑零冲突
  ClaudeA + ClaudeB 跨栈分工:ClaudeB 先做后端(子任务 ②)· ClaudeA 做前端(子任务 ③+④)· 测试 ClaudeB 后端 + ClaudeA 前端各自跑(子任务 ⑤)

【背景】
  用户 2026-06-18 15:45 verbatim 修正了 ADR-26 框图 v0.1 的交互 C(原"双击看 wav 离线分析" → 现"双击 = 落盘类型选择 Dialog · 不展示分析 UI")· log_module 真职责是落盘配置而非分析。
  分析能力下放到 §3.6 Meter Dock 内部横切追踪能力(F3-2 后续起手 · 5 Meter Dock 内下拉选 log_module → sidecar 分析其 wav)· 本 fork 锁定 LogModuleConfig schema + Dialog UI + 双击行为。
  与 F1-1 后端(RuntimeTarget NativeSubKind)+ F2-1 前端(RightDock 4 类)文件 100% 正交 · 三并行 max=1.5d。
  教训承接(ADR-26 §9.2):用户原话名词 log_module 必须 grep 找具体文件名 · Step 0 强制 grep frontend + backend + dsp_algo 三处。

【架构关键约束】
  ⚡ 严守 .clinerules v3.0 ADR-23→25→25-R1 三连教训铁律:Step 0 强制 grep log_module / LogModule / LogModuleConfig 全 repo 找真值
  🎨 双击行为唯一明确:弹 LogModuleConfigDialog(audioLog + textLog 双区)· 严禁弹任何分析 popup(FFT/RMS/Phase/Scope/Transfer)
  📋 LogModuleConfig schema 锁定(本 fork 范围):audioLog { enabled/format/sampleRate/channels/fileNameTemplate } + textLog { enabled/format/fields/fileNameTemplate } · 供 F3-2 Meter Dock 追踪器消费
  📋 默认值合理:audioLog enabled + wav-pcm16 + 链路 sampleRate/channels · textLog disabled · fileNameTemplate 含 ${timestamp}/${moduleId}
  📋 文件名模板防冲突:支持 ${timestamp} ${moduleId} 替换 · 自动加 -1/-2 后缀避免覆盖
  📋 持久化复用 ADR-15:data/xilink/log-modules/<id>.json
  📋 三层分工(ADR-07 §1.3.4):L3 前端 Dialog UI · L1/L2 后端 Service/Routes/POCO · 不动 dsp_algo C 实现(L0)
  🚫 严禁动 dsp_algo/modules/log_module/* 任何 C 文件(不是本 fork 范围 · 用户已自处理子仓污染)
  🚫 严禁双击触发任何分析 popup(FFT/RMS/Phase/Scope/Transfer · 那是 §3.6 由 F3-2 实施)
  🚫 严禁动 RuntimeTarget* 后端(F1-1 范围)
  🚫 严禁动 useChainNodeMetadata / RightDock*.vue(F2-1 范围)
  🚫 严禁实现 GET /chain/log-modules 端点(F3-2 范围 · 本 fork 仅 PUT/GET /log-module/{id}/config 单实例端点)

【执行步骤】
  Step 0 · 文件注入真值核查(强制门槛 · ADR-26 §9.2 三连教训承接 · ClaudeA + ClaudeB 共同执行)
    - grep "log_module\|LogModule" frontend_vue3/src/ · 列出所有命中文件(LogModuleNode.vue 主目标)
    - grep "LogModule" backend_csharp/ · 列出所有命中文件(若有 LogModuleService/Routes 则 read · 否则确认新建路径)
    - grep "log_module" dsp_algo/modules/ · 确认 C 实现存在(本 fork 不动 · 仅消费其 wav 落盘路径约定)
    - grep "LogModuleConfig\|AudioLogConfig" 全 04_development · 若已存在则评估复用 · 否则按 ADR-26 §3.5 ① 新建
    - grep "floating.openDialog\|useFloating" frontend_vue3/src/ · 找 1-2 个标本(确认 Dialog 弹出模式 · 推测 PhaseModulePopup/TransferModulePopup 用此模式)
    - read 1 个 LogModule 前端文件 + 1 个 backend 文件(若已存在)· 确认现有双击行为 + Service 实现细节
    - 留 commit log:Step 0 六层核查记录 + log_module 现有组件清单结论(完善 vs 新建)

  Step 1 · 后端 LogModuleService + POCO + 持久化 · ClaudeB 0.3d(子任务 ②)
    - 创建/改 backend_csharp/Services/LogModule/LogModuleService.cs:
      * record LogModuleConfig / AudioLogConfig / TextLogConfig POCO(ADR-26 §3.5 ① 完整字段)
      * GetConfig(string id) / SetConfig(string id, config)
      * 持久化:data/xilink/log-modules/<id>.json(ADR-15 持久化协议复用)
      * 文件名模板渲染 helper:${timestamp}/${moduleId} 替换 + 防冲突 -1/-2 后缀
    - 默认值生成 helper:DefaultConfig(int sampleRate, int channels) → audioLog enabled + wav-pcm16 + 继承 sr/ch · textLog disabled

  Step 2 · 后端 Routes API · ClaudeB 0.1d(子任务 ②)
    - 创建/改 backend_csharp/Routes/LogModuleRoutes.cs:
      * GET /api/log-module/{id}/config → LogModuleConfig(若不存在则返回 DefaultConfig)
      * PUT /api/log-module/{id}/config body: LogModuleConfig → 200 OK + 持久化
      * 校验:format 在枚举内(wav-pcm16/wav-pcm24/wav-float32 · csv/json)· sampleRate > 0 · channels 1-8 · fileNameTemplate 非空 · 失败 400 + reason_code

  Step 3 · 后端 Tests · ClaudeB 0.1d(子任务 ②)
    - 新建 backend_csharp/Services/LogModule/Tests/LogModuleServiceTests.cs ≥ 4 case(T1-T4 见任务定义子任务 ②)
    - dotnet build 0 errors · dotnet test 全绿(基线 237 → 241+)

  Step 4 · 前端 LogModuleConfigDialog.vue 新建 · ClaudeA 0.4d(子任务 ③)
    - 新建 frontend_vue3/src/components/LogModuleConfigDialog.vue
    - props: { moduleId: string · sampleRate?: number · channels?: number }
    - mounted: GET /api/log-module/{moduleId}/config · 加载到本地 reactive state
    - 模板:
      * ☑ Audio Log 区:format 下拉 / sampleRate input / channels input / fileNameTemplate input
      * ☐ Text Log 区:format 下拉(csv/json)/ fields textarea(逗号分隔)/ fileNameTemplate input
    - 校验:fileNameTemplate 必填 · sampleRate > 0 · channels 1-8 · textLog enabled 时 fields 非空
    - 确认按钮 → PUT /api/log-module/{moduleId}/config · toast 成功 + 关闭 Dialog · 失败 toast 错误

  Step 5 · 前端 LogModuleNode.vue 双击行为变更 · ClaudeA 0.2d(子任务 ④)
    - 修 LogModuleNode.vue(Step 0 grep 锁定具体路径)@dblclick:
      原行为(若是分析 popup 或 console.log)→ 移除
      新行为:onDoubleClick → floating.openDialog(LogModuleConfigDialog, { moduleId: node.id, sampleRate: chainSampleRate, channels: chainChannels })
    - 单击行为不变(若有高亮或选中等)

  Step 6 · 前端 Tests · ClaudeA 0.2d(子任务 ⑤)
    - 新建/改 LogModuleConfigDialog.spec.ts 加 ≥ 4 case(T1-T4 见任务定义子任务 ⑤)
    - LogModuleNode.spec.ts 加 ≥ 2 case(T5 双击触发 Dialog · T6 双击不触发任何分析 popup)
    - vue-tsc --noEmit 0 errors · npm run build 0 errors · npm run test 全绿(基线 356/3 → 362/3)

  Step 7 · 浏览器实测 + commit · 0.1d(子任务 ⑥)
    - 启动 backend + frontend · 拖 log_module 到链路中
    - 验收点:
      ☐ 双击 log_module → 弹 LogModuleConfigDialog(audioLog + textLog 双区)· 不弹任何 FFT/RMS popup
      ☐ Dialog 默认值:audioLog enabled + wav-pcm16 + 链路 sr/ch · textLog disabled · fileNameTemplate 含 ${timestamp}/${moduleId}
      ☐ 勾选 audioLog + 确认 → toast 成功 + 注入 1kHz @ -10dBFS 2s → output/log_*.wav 落盘存在
      ☐ 单击行为零回归(高亮/选中等)
    - git add . && git commit -m "feat(xilink/log-module): P3.A26.F3 双击 = 落盘配置 Dialog(audioLog + textLog 双区 · 无分析 UI)

      用户 2026-06-18 16:50 拍板 accept ADR-AIOS-26 + 16:55 三连 start(F1-1+F2-1+F3-1 文件正交 max=1.5d)。
      F3-1 本 fork 跨栈协作(ADR-26 §3.5 + §4.1 · ClaudeA 前端 + ClaudeB 后端):
      ① 后端 LogModuleService.cs:LogModuleConfig POCO(audioLog + textLog 双区)+ GetConfig/SetConfig + workspace 持久化(data/xilink/log-modules/<id>.json · ADR-15 复用)+ 文件名模板渲染
      ② 后端 LogModuleRoutes.cs:GET/PUT /api/log-module/{id}/config + format/sr/ch/template 校验 · 失败 400 + reason_code
      ③ 前端 LogModuleConfigDialog.vue 新建:双区布局 + 默认值 + 校验 + PUT 提交
      ④ 前端 LogModuleNode.vue @dblclick 改:onDoubleClick → floating.openDialog(LogModuleConfigDialog, { moduleId, sampleRate, channels })
      ⑤ 后端 LogModuleServiceTests +4 case · 前端 vitest +4+2 case 全过 · vue-tsc + dotnet build + 全测试基线零回归
      ⑥ 严禁双击触发任何分析 popup(FFT/RMS/Phase/Scope/Transfer 由 §3.6 F3-2 后续覆盖)

      解锁 F3-2 P3.A26.F3-meter-dock-log-module-tracker(ClaudeA 1.5d · 5 Meter Dock 内追踪 + GET /chain/log-modules 后端协作)
      LogModuleConfig schema 锁定(供 F3-2 Meter Dock 追踪器消费 wav 路径)
      ADR-23→25→25-R1 三连教训承接:用户原话 log_module 名词 grep 真值锚定(Step 0 三处 grep:frontend + backend + dsp_algo)

      [step=7/7] [pid=P3+P5] [uid=P3.A26.F3-log-module-double-click-config-dialog] [type=fork] [isolation=file]
      [occupies=P3.K-shared-log-module-node+P5.K-shared-log-module-routes] [files=5(2-3M+2-3N)] [ipc=rest]
      [adr=ADR-AIOS-26 §3.5 + §4.1 F3-1 + §1.3 #6 grep 真值 + 用户 2026-06-18 15:45 第 2 轮 第 1 段 verbatim + 16:50 accept]"

【验收】
  ☐ Step 0 文件注入真值核查通过(grep frontend + backend + dsp_algo 三处 · read 现有组件 · commit log 留痕)
  ☐ Step 1-3 后端 LogModuleService + Routes + Tests 完成(POCO 序列化 + GET/PUT API + 4 case 全过)
  ☐ Step 4 前端 LogModuleConfigDialog.vue 新建(双区 + 默认值 + 校验 + PUT 提交)
  ☐ Step 5 LogModuleNode.vue @dblclick 改 floating.openDialog · 严禁触发分析 popup
  ☐ Step 6 前端 vitest +4+2 case 全过 · vue-tsc + build 0 errors · 全测试基线零回归(356/3 → 362/3)
  ☐ Step 7 浏览器实测 4 验收点全过(Dialog 弹 + 无分析 popup + 默认值 + 落盘 wav 真值 + 单击零回归)
  ☐ commit message 含 7 元组 trailer + ADR-26 §3.5 + §4.1 + 用户 verbatim 引用

【禁止】
  ❌ 禁止跳过 Step 0 文件注入真值核查(ADR-26 §9.2 教训 · 三处 grep + read 现有组件)
  ❌ 禁止双击触发任何分析 popup(FFT/RMS/Phase/Scope/Transfer · 那是 §3.6 由 F3-2 后续实施 · 严守 ADR-26 §3.5 用户 verbatim "并不会显示具体的界面")
  ❌ 禁止动 dsp_algo/modules/log_module/* 任何 C 文件(用户已自处理子仓污染)
  ❌ 禁止动 RuntimeTarget* 后端(F1-1 范围)
  ❌ 禁止动 useChainNodeMetadata / RightDock*.vue(F2-1 范围)
  ❌ 禁止实现 GET /chain/log-modules 多实例端点(F3-2 范围 · 本 fork 仅单实例 PUT/GET)
  ❌ 禁止破坏 LogModuleNode.vue 单击行为(仅改双击)
  ❌ 禁止跳过校验(format 枚举 / sampleRate / channels / fileNameTemplate 必填 / textLog fields 非空 5 项)
  ❌ 禁止跳过测试(后端 4 case + 前端 4+2 case · 验收硬门槛)
  ❌ 禁止 commit 缺七元组 trailer(.clinerules v3.0 铁律)
  ❌ 禁止嵌入完整 Vue SFC > 60 行 / TS interface > 5 行 / C# class > 10 行(.clinerules v3.0 · 用 diff 模式提交)

解锁链(本任务 zombie 后)

  • ✅ log_module 双击行为变更(原分析 popup → 落盘配置 Dialog · audioLog + textLog 双区)
  • ✅ 后端 LogModuleConfig schema POCO + GET/PUT API + workspace 持久化(data/xilink/log-modules/.json)
  • ✅ LogModuleConfigDialog.vue 新建 · 默认值合理(audioLog enabled + wav-pcm16 + 链路 sr/ch)
  • ✅ F3-2 P3.A26.F3-meter-dock-log-module-tracker ready(ClaudeA 1.5d · 5 Meter Dock 内追踪 · 消费本 fork LogModuleConfig schema · GET /chain/log-modules 端点由 F3-2 后端配合实现)
  • ⏳ F4-1 P_e2e.A26.F4-truth-e2e-meter-dual-link 部分解锁(还需 F1-1+F1-2+F2-1+F3-2 全 zombie · 五齐后 ready · ClaudeC 1.5d → ADR-26 整体闭环 🏆)

风险评估

风险 缓解
log_module 现有组件文件名未确定(prompt 中标 TBD by Step 0 grep) Step 0 强制 grep frontend + backend + dsp_algo 三处 · 不允许凭推测起草改动 · 标本参考 P5.A22.F2 跨栈 service+routes+tests 模式(ADR-26 §5 风险表第 4 行)
log_module 双击原行为(可能是分析 popup 或 console.log)被破坏 Step 0 read LogModuleNode.vue 现有 @dblclick · 列出所有调用点 · 用户操作流明确"原分析 UI 移到 §3.6 Meter Dock 追踪"(F3-2 后续覆盖)+ Dialog 含"了解更多"链接(可选)
LogModuleConfig schema 与现有 dsp_algo log_module C 实现配置不兼容 Step 0 grep dsp_algo/modules/log_module 确认 C 实现接收的配置字段 · 若不一致则 schema 字段对齐 C 实现 + 在 commit message 标明字段映射
ClaudeA + ClaudeB 跨栈协作 git 锁冲突(同 04_development worktree) isolation file · ClaudeB 后端先做(Step 1-3 · 0.5d)+ 提交 → ClaudeA 拉最新做前端(Step 4-7 · 1.0d)· 串行 1.5d 实际
floating.openDialog 现有用法不确定(可能是 PhaseModulePopup/TransferModulePopup 模式) Step 0 read 1-2 个现有 popup 标本(PhaseModulePopup 57474b0 / TransferModulePopup 5d69270)· 仿写 props/emit/Dialog 弹出模式
文件名模板防冲突逻辑不严(高频落盘可能仍冲突) 加文件锁 + 原子 rename · 极端情况 fallback 时间戳到毫秒级 ${timestamp_ms}(可选 · 不强制本 fork)
校验失败 reason_code 与前端 toast 文案不一致 后端固定 reason_code 集合(invalid_format/invalid_sample_rate/invalid_channels/empty_file_name_template/empty_text_log_fields)· 前端 i18n key 一一对应
dsp_algo log_module C 实现真实落盘路径约定与本 fork 假设(output/log_*.wav)不一致 Step 0 grep dsp_algo/modules/log_module/* 确认 C 实现真实落盘路径 · 若不一致则改 fileNameTemplate 默认值 · 严禁动 C 实现
F3-2 后续起手时 GET /chain/log-modules 端点缺失(F3-2 范围) 本 fork 仅锁定 LogModuleConfig schema · GET /chain/log-modules 端点由 F3-2 后端配合实现 · commit message + ADR-26 §7 状态流转明确说明
ClaudeA 排队膨胀(本 1.0d 前端 + F8 ADR-15 0.5d 收尾 + 后续 F1-2 2.0d + F3-2 1.5d) 本 fork 与 F1-1/F2-1 三并行 max=1.5d 已优化 · 前端 1.0d + 后端 0.5d 跨栈 · F1-2 等 F1-1 zombie 后接 · F3-2 等本 fork zombie 后接

历史

时间 事件 hash
2026-06-18 17:00 dispatched(用户 16:50 accept ADR-AIOS-26 + 16:55 三连 start · 跨栈协作 ClaudeA+ClaudeB 1.5d · 与 F1-1/F2-1 文件正交并行 · 解锁 F3-2 Meter Dock 追踪)