P_e2e.A25R1.F4-truth-e2e-subgraph-r1 · ADR-25-R1 整合真值 e2e 🏆 ADR-25-R1 fulfilled 收尾
worker:ClaudeC 部门:测试编排+前端 预计:0.5d 优先级:P0 状态:dispatched(并行起手 · F2-R1 仍 running · spec §3.2 部分先 stub fixture 占位 · F2-R1 zombie 后切真断言 · 实际跑 spec 时序与 F2-R1 文件正交)
🔍 触发与解锁链
- 触发:用户 2026-06-18 18:39 拍板
start P_e2e.A25R1.F4-truth-e2e-subgraph-r1· F3-R1 zombie(713f64d+6240ba5)+ F1.1-R1 zombie(0bb4422) · F2-R1 running ClaudeA 1.0d · 提前并行 dispatch ClaudeC e2e 节省 0.3d - 前置 zombie 状态:
- F1.1-R1 P3.UA25R1.F1-mini-bar-click-no-response-on-subgraph(
0bb4422)· isSubgraph 提早 return + SubgraphsDock 4 文件清理 - F3-R1 P3.UA25R1.F3-doc-tabs-multi-tab-routing(
713f64d主 +6240ba5修复)· useSubgraphTabs composable + buildDocTabs 扩展 + currentTabModules computed + onMiniNodeDblclick → openSubgraphTab + 6240ba5 修复 currentTabModules scope - F2-R1 running 提示:ClaudeA 1.0d · FlowReadonlyDock.vue SVG 子图示意图 + 双击 openSubgraphTab(可消费真实 useSubgraphTabs 静态 import · 不再 stub)· 本 fork §3.2 部分 spec 选择器先用 stub fixture 占位(
[data-is-subgraph]flow-subgraph-mainflow-subgraph-nestedflow-subgraph-label)· F2-R1 zombie 后由 ClaudeC 自己核对真选择器 + 切真断言 - 解锁:无下游 fork(F4-R1 zombie → ADR-25-R1 fulfilled 🏆 · ADR-25 整体闭环 · 用户三件套盲区在 xitune 真闭环)
- 隔离:
isolation: file· spec 文件 + fixture 文件 NEW · 与 F2-R1 ClaudeA 文件正交并行(ClaudeA 改 FlowReadonlyDock.vue / xitune/index.vue · ClaudeC 写 e2e/scenarios/ + e2e/fixtures/ · 路径正交)
任务定义(基于 ADR-AIOS-25-R1 §3.1-R1 ⑤ + §3.2-R1 ⑤ + §3.3-R1 ⑤ + §3.4-R1 整合)
playwright integration spec 4 test + fixture 创建 + DSP 真值断言:
- §3.1-R1 主链路单击子图节点不响应(F1.1-R1 zombie 验收 · onMiniNodeClickWithDelay isSubgraph 提早 return)
- §3.2-R1 FlowReadonlyDock 子图示意图 SVG 渲染(F2-R1 验收 · 主框 200×80 + 嵌套小矩形 N×网格 max 5×5 + 蓝紫色 fill
rgba(157,78,221,0.15)+ 📦 emoji 顶部 + 双击 → openSubgraphTab) - §3.3-R1 doc tabs 多 tab 路由 + chain-mini-bar 复用(F3-R1 zombie 验收 · 双击 mini-node → openSubgraphTab + 主 tab 永居 [0] + 子图 tab 关闭按钮 + 子图 tab 主页 chain-mini-bar 显示子图内部 modules)
- §3.4-R1 真值断言:子图 tab 内 peq 调音影响实际 audio 输出(注入 1kHz @ -10dBFS · 进入 EQ_A 子图 tab · 调 peq +6dB @ 1kHz · 断言 sink 输出 -4dBFS ± 0.5dB)
fixture 创建:e2e/fixtures/subgraph-eq-a-with-3-modules.xitune(EQ_A 子图含 peq + gain + delay 三 module · 主链路 source → EQ_A → sink)
完整 prompt(直接复制粘贴 ClaudeC 终端)
你是 ClaudeC 测试编排 worker · 当前任务 P_e2e.A25R1.F4-truth-e2e-subgraph-r1(0.5d · 测试编排+前端 · P0 🏆 ADR-25-R1 fulfilled 收尾)
【U-thread】 P_e2e.A25R1.F4-truth-e2e-subgraph-r1
【部门 + 推荐 skill】 测试编排+前端 + vuejs-typescript-best-practices(playwright e2e)
【Worker CWD】 d:/work/25_claude/workspace/AlgoDepartment/04_development/
【Occupies】 P_e2e.K-shared-xitune-subgraph-r1-e2e(独占 · 与 F2-R1 ClaudeA 文件正交并行)
【ADR】 docs/08-implementation/40-aios/ADR/ADR-AIOS-25-R1-flow-readonly-subgraph-and-doc-tabs.md §3.1-R1 ⑤ + §3.2-R1 ⑤ + §3.3-R1 ⑤ + §3.4-R1
【参考文档 绝对路径】
- d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-25-R1-flow-readonly-subgraph-and-doc-tabs.md(本任务 ADR · 必读 §3.1-§3.3 ⑤ 端到端真值 e2e)
- d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/prompts/done/ADR-AIOS-25/P3.UA25R1.F1-mini-bar-click-no-response-on-subgraph--0bb4422.md(F1.1-R1 zombie · 验收对象 §3.1)
- d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/prompts/done/ADR-AIOS-25/P3.UA25R1.F3-doc-tabs-multi-tab-routing--6240ba5.md(F3-R1 zombie · 验收对象 §3.3)
【现有组件 grep 真值】(Step 0 必读 · v1.6 业务实现核查铁律承接)
- 04_development/frontend_vue3/src/stages/xitune/composables/useSubgraphTabs.ts (F3-R1 落地 73 行 · openSubgraphTab/closeSubgraphTab/activeTabId/subgraphTabs API)
- 04_development/frontend_vue3/src/stages/xitune/composables/__tests__/useSubgraphTabs.spec.ts (F3-R1 落地 143 行 · vitest +8 case 已通过 15/15)
- 04_development/frontend_vue3/src/stages/xitune/index.vue (F3-R1 落地 buildDocTabs L221-228 + currentTabModules computed + onMiniNodeDblclick 子图分支 → openSubgraphTab + 6240ba5 修复 watch + v-if 改 currentTabModules)
- 04_development/frontend_vue3/src/stages/xitune/drawers/FlowReadonlyDock.vue (F2-R1 改造目标 · L54-83 SVG 流图节点 · ClaudeA running · spec §3.2 选择器先 stub 占位)
- 04_development/frontend_vue3/e2e/(playwright 现有 e2e 目录 · 看现有 scenarios 子目录范式 + playwright.config 选择器约定)
- 04_development/frontend_vue3/e2e/fixtures/(现有 fixture 目录 · 看 .xitune 文件格式范式)
Step 0 · 前置就位核查(必跑 · 不通过 stop)
1. read 04_development/frontend_vue3/src/stages/xitune/composables/useSubgraphTabs.ts → 必须存在(F3-R1 落地 73 行 · 暴露 openSubgraphTab/closeSubgraphTab/activeTabId/subgraphTabs)
2. read 04_development/frontend_vue3/src/stages/xitune/index.vue L221-310 → 必须含 buildDocTabs 扩展 + currentTabModules computed + onMiniNodeDblclick 子图分支调 openSubgraphTab + watch(currentTabModules) + v-if="currentTabModules.length"(6240ba5 修复版本)
3. grep -r "FlowReadonlyDock" 04_development/frontend_vue3/src/stages/xitune/ → 找到主文件 + 看 F2-R1 当前进度(若 ClaudeA 已落地 isSubgraph 分支 · 则 spec §3.2 用真选择器;若仍是 v5 单层 · 则 §3.2 spec 先 stub 占位 + 加 test.skip 等 F2-R1 zombie 后再启用)
4. read 04_development/frontend_vue3/e2e/playwright.config.ts → 看 baseURL / fixture 路径约定 / project 分组
5. list 04_development/frontend_vue3/e2e/scenarios/ → 看现有 scenarios 子目录命名规范(如 xitune-* / xilink-* / realtime-*)+ 现有 spec 结构范式
6. list 04_development/frontend_vue3/e2e/fixtures/ → 看现有 .xitune fixture 格式(JSON Schema · linkStore 持久化结构 · 含 modules + connections + subgraphDefs)
不通过 → 立即 stop · 反馈 Cline-AIOS
Step 1 · 创建 fixture 文件(基础前置 · 1 fixture)
位置:04_development/frontend_vue3/e2e/fixtures/subgraph-eq-a-with-3-modules.xitune
内容(JSON 格式 · 对齐现有 .xitune fixture schema):
- linkStore.modules:含 source(typeId source · instanceId source-001)+ EQ_A 子图实例(typeId 0x100E_xxxx subgraph · instanceId eq-a-001 · subgraphDefId='eq-a-def')+ sink(typeId sink · instanceId sink-001)
- linkStore.connections:source-001 → eq-a-001 → sink-001
- linkStore.subgraphDefs['eq-a-def']:nodes 含 peq(instanceId peq-001 · typeId peq)+ gain(instanceId gain-001 · typeId gain)+ delay(instanceId delay-001 · typeId delay) · connections 含 peq-001 → gain-001 → delay-001 · dirty=false
- 顶层 metadata:工程名 "EQ_A_Project" · version v1
Step 2 · §3.1-R1 主链路单击子图节点不响应 e2e(1 case)
位置:04_development/frontend_vue3/e2e/scenarios/xitune-subgraph-r1/integration.spec.ts(test 1)
- 加载 fixture · goto /xitune
- 单击 chain-mini-bar 中 EQ_A 子图 mini-node(`.mini-node--subgraph[data-instance-id="eq-a-001"]`)
- 等 250ms(超过 onMiniNodeClickWithDelay 防抖窗口)
- 断言:活跃 module 仍是初始默认(activeInstanceId 不变)+ 主区不切到 EQ_A 调音页 + 无悬浮窗弹出
- F1.1-R1 zombie 0bb4422 落地核心:isSubgraph 提早 return
Step 3 · §3.2-R1 FlowReadonlyDock 子图示意图 SVG 渲染 e2e(1 case · F2-R1 stub 兼容)
位置:integration.spec.ts(test 2)
- 加载 fixture · goto /xitune · click `[data-dock-key="xt-flow"]`(LEFT_DOCK 第 2 项 xt-flow 链路流图)
- 断言子图主框存在:`.flow-node[data-is-subgraph="true"][data-def-id="eq-a-def"] rect.flow-subgraph-main` 可见
- 断言 fill 含 rgba(157,78,221) 蓝紫色
- 断言嵌套小矩形:`.flow-node[data-is-subgraph="true"] rect.flow-subgraph-nested` toHaveCount(3)(peq+gain+delay 三 module)
- 断言顶部 📦 EQ_A label:`.flow-node[data-is-subgraph="true"] text.flow-subgraph-label` 含 "📦 EQ_A"
- 双击主框:`page.dblclick('.flow-node[data-is-subgraph="true"]')` → 断言 doc tab 出现 `.doc-tab[data-tab-key^="subgraph-eq-a-def"]` 可见
- ⚠️ F2-R1 stub 兼容策略:若 Step 0.3 grep 发现 ClaudeA F2-R1 仍 running(FlowReadonlyDock.vue 未落 isSubgraph 分支)· 本 test 用 `test.skip()` 标记 + 加注释 "等 F2-R1 zombie 后由 ClaudeC 自己启用 + 核对真选择器" · F2-R1 zombie 后通过 git diff 拿真选择器 · 切真断言
Step 4 · §3.3-R1 doc tabs 多 tab 路由 + chain-mini-bar 复用 e2e(1 case · F3-R1 已 zombie 真断言)
位置:integration.spec.ts(test 3)
- 加载 fixture · goto /xitune
- 双击 mini-node:`page.dblclick('.mini-node--subgraph[data-instance-id="eq-a-001"]')` → openSubgraphTab('eq-a-def')
- 断言 doc tabs:`.doc-tab` toHaveCount(2)
- nth(0) 含 ".xitune"(主 tab 永居首位 · key='main' · closeable=false)
- nth(1) 含 "EQ_A.subgraph"(子图 tab · closeable=true · 自动 active)
- nth(1) toHaveClass /active/
- 断言子图 tab 主页 chain-mini-bar 显示子图内部 modules:
- `.mini-node[data-module-id^="peq"]` 可见
- `.mini-node[data-module-id^="gain"]` 可见
- `.mini-node[data-module-id^="delay"]` 可见
- 单击 peq:`page.click('.mini-node[data-module-id^="peq"]')` → 断言 `.tuning-dialog-peq` 可见(activeInstanceId 切到子图内 peq-001)
- 关闭子图 tab:`page.click('.doc-tab[data-tab-key^="subgraph-eq-a"] .doc-tab-close')` → 断言 `.doc-tab` toHaveCount(1) + 主 tab active
- 已开则跳转(idempotent):再双击同 mini-node → toHaveCount(2)(不重开 · 切 active)+ 再点别的子图 tab 关闭 → 不切回
Step 5 · §3.4-R1 真值断言:子图 tab 内 peq 调音影响实际 audio 输出 e2e(1 case · DSP 真值)
位置:integration.spec.ts(test 4)
- 加载 fixture · 启动 generator sine 1kHz @ -10dBFS 注入 source
- 双击进入 EQ_A 子图 tab
- 单击 peq mini-node → 调音页加载
- 调 peq band 1:freqHz=1000 · gainDb=+6 · Q=2 · 应用
- 切回主 tab(`page.click('.doc-tab').nth(0)`)
- 抓 sink-pre tap WS frame · 断言 RMS @ 1kHz ≈ -4dBFS ± 0.5dB(注入 -10 + peq +6 = -4)
- 真值断言核心:子图 tab 内调音确实影响 linkStore.subgraphDefs['eq-a-def'].nodes[peq-001].params · 经 SubgraphRuntime 路径作用于实际 audio chain
Step 6 · 自检 + commit
- npx playwright test e2e/scenarios/xitune-subgraph-r1/integration.spec.ts --reporter=list · 全部 4 case 通过(F2-R1 stub 时 test 2 skip · F2-R1 zombie 后 ClaudeC 启用 · 仍可视为本 fork zombie 完结)
- 全测试基线零回归:`npm run test:unit` + `npm run test:e2e` 不破已 zombie 的 vitest 15/15(F3-R1)+ 7/7(F1.1-R1)
- commit message:
```
test(xitune/subgraph-r1/e2e): P_e2e.A25R1.F4 ADR-25-R1 整合真值 e2e 4 test + fixture 🏆
F4-R1 测试编排 ClaudeC 0.5d:
① §3.1-R1 主链路单击子图节点不响应(F1.1-R1 zombie 0bb4422 验收)
② §3.2-R1 FlowReadonlyDock SVG 子图示意图(F2-R1 验收 · stub 兼容若 F2-R1 仍 running)
③ §3.3-R1 doc tabs 多 tab 路由 + chain-mini-bar 复用(F3-R1 zombie 713f64d+6240ba5 验收)
④ §3.4-R1 真值断言:子图 tab 内 peq +6dB @ 1kHz → sink RMS -4dBFS ± 0.5dB
fixture:e2e/fixtures/subgraph-eq-a-with-3-modules.xitune(EQ_A 含 peq+gain+delay)
全测试基线零回归 · ADR-25-R1 fulfilled 路径完结 🏆 · ADR-25 整体闭环
[step=6/6] [pid=P_e2e] [uid=P_e2e.A25R1.F4-truth-e2e-subgraph-r1] [type=test] [isolation=file]
[occupies=P_e2e.K-shared-xitune-subgraph-r1-e2e] [files=2(2A)] [ipc=none]
[adr=ADR-AIOS-25-R1 §3.1-R1 ⑤ + §3.2-R1 ⑤ + §3.3-R1 ⑤ + §3.4-R1 + §4.2 F4-R1]
[🟢 claude-c]
```
约束 / 禁止(11 项):
- ❌ 禁止动 ADR-25-R1 任何已 zombie fork 落地代码(F1.1-R1 onMiniNodeClickWithDelay / F3-R1 useSubgraphTabs / xitune/index.vue 等)· 仅写 e2e spec + fixture 文件
- ❌ 禁止动 F2-R1 ClaudeA 改造中的 FlowReadonlyDock.vue(ClaudeA running · 文件正交保护)
- ❌ 禁止动 contracts/ frozen 文件 / backend_csharp/ 业务代码 / dsp_algo/ 业务代码(测试编排只写 e2e + fixture)
- ❌ 禁止重复测 ADR-25-R1 之外的功能(ADR-21-R1 dock / ADR-26 RuntimeTarget 等不在本 fork 范围)
- ❌ 禁止跳过 Step 0 前置就位核查(F2-R1 stub 兼容策略依赖 grep 真值)
- ❌ 禁止凭印象写选择器(`.flow-subgraph-main` 等必须 grep FlowReadonlyDock.vue 取真选择器 · 若 F2-R1 未落地则用 `test.skip` 占位)
- ❌ 禁止改 playwright.config.ts(全局配置 · 可能影响其他 spec)
- ❌ 禁止用 `--no-snapshots` 或类似跳过断言的 flag
- ❌ 禁止把 Step 5 真值断言改为弱断言(如 RMS toBeGreaterThan(-10))· 必须 ± 0.5dB 严格容差
- ❌ 禁止动其他 stage e2e(xilink / xitest / realtime 等不在本范围)
- ❌ 禁止 commit 前不跑 `npm run test:unit` + `playwright test` 全套(基线零回归是验收硬约束)
业务契约引用(全部走 ADR-25-R1 ⑤ e2e 真值已锁):
- §3.1-R1 ⑤ → 单击子图节点 highlight 但不切 active(line 167 ADR · F1.1-R1 onMiniNodeClickWithDelay isSubgraph 提早 return)
- §3.2-R1 ⑤ → SVG 子图示意图主框 + 嵌套小矩形 + 📦 + 双击 → openSubgraphTab(line 245-266 ADR)
- §3.3-R1 ⑤ → doc tabs 多 tab + chain-mini-bar 复用 + 关闭按钮 + idempotent(line 353-379 ADR)
- §3.4-R1 → 真值断言:1kHz @ -10dBFS · peq +6dB @ 1kHz → sink RMS -4dBFS ± 0.5dB(line 392-394 ADR)
完工后 commit hash 反馈 Cline-AIOS · stop F4-R1 → ADR-25-R1 fulfilled 🏆 · ADR-25 整体闭环
解锁链(本任务 zombie 后)
- ADR-25-R1 整体 fulfilled 🏆(F1.1-R1 + F3-R1 + F2-R1 + F4-R1 共 4 fork 全 zombie · 用户三件套盲区 在 xitune 真闭环)
- ADR-25 整体闭环(R1 修订完成 + ADR-23→25→25-R1 三连 supersede 链落幕)
- 后续候选:ClaudeC 闲置 → ADR-22 e2e P_e2e.A22.F15(等 ADR-22 F1-F14 全 zombie · 当前 F1 dispatched · F10/F14 ready 等接力)
风险评估
| 风险 | 缓解 |
|---|---|
| F2-R1 ClaudeA running 期间 spec §3.2 选择器未定 | Step 0.3 grep FlowReadonlyDock.vue 当前状态 · 未落地则 test 2 用 test.skip() + 注释 + F2-R1 zombie 后由 ClaudeC 自己核对真选择器切真断言 · 不阻断本 fork zombie |
| fixture .xitune 格式与 linkStore schema 偏差 | Step 0.6 list e2e/fixtures/ 取现有范式 · 不凭 ADR §3.2 ① 类型定义自创 · grep linkStore.subgraphDefs 真签名 |
| §3.4 DSP 真值断言 RMS ± 0.5dB 容差超标 | 业务契约 §3.4 已锁 · 若实际 > 0.5dB 暴露 SubgraphRuntime 调音路径分歧 → stop · 反馈 Cline-AIOS 升级 ADR-25-R1 R2 修订(不在本 fork 范围内自行降低容差) |
| §3.3 doc tab 关闭事件竞态(快速双击关闭按钮) | 同 ADR §5 R3 风险 · useSubgraphTabs idempotent + shellSlots.setDocTabs 原子操作已落地 · spec 中 await page.click() 自带 wait 防竞态 |
| 子图内 peq 调音 inline 加载等待时长 > 5s | playwright 默认 timeout 30s 足够 · 若 inline 加载延迟过长 → stop · 反馈优化点(不在本 fork 范围调整) |
| ClaudeC 排队竞争(本 F4-R1 + 后续 ADR-22 F15) | 本 fork 与 ADR-22 F15 时序串行(ADR-25-R1 fulfilled 后才考虑 ADR-22 e2e)· 不冲突 |
| F3-R1 6240ba5 修复后 watch + v-if 改 currentTabModules · spec §3.3 切回主 tab 后 activeInstanceId 恢复行为细节 | Step 0.2 read xitune/index.vue 真实落地 · 不凭 ADR §3.3 ④ "自动恢复主 tab 之前选择" 自创断言 · spec 实现以现有代码行为为准 |
历史
| 时间 | 事件 | hash |
|---|---|---|
| 2026-06-18 18:39 | 用户拍板 start P_e2e.A25R1.F4-truth-e2e-subgraph-r1 |
- |
| 2026-06-18 18:50 | dispatched(Cline-AIOS · F2-R1 仍 running 并行起手 · stub 兼容策略 · 节省 0.3d 串行) | - |