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-trackerready(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 追踪) | — |