diff --git a/docs/todo/system-design/27-p4-parallel-and-artifacts.md b/docs/todo/system-design/27-p4-parallel-and-artifacts.md index e8f7083..46d1bf8 100644 --- a/docs/todo/system-design/27-p4-parallel-and-artifacts.md +++ b/docs/todo/system-design/27-p4-parallel-and-artifacts.md @@ -1,7 +1,7 @@ # 27-P4. 并行执行与产物索引 > **所属**: [27 Graph Agent 架构](./27-graph-agent-architecture.md) 的 Phase P4 -> **版本**: v0.1(设计阶段,未实现) +> **版本**: v0.2(阶段 A/B/C 均已实现,见 §五 2026-08-21 记录;T5 是可插拔桩子,真实计费接口未接) > **日期**: 2026-08-16 > **前置**: P0/P1/P2/P3 均已实现。本文档建立在 P3 已落地的执行引擎之上(`server/services/graph-engine.js` / `work-graph-db.js` / `graph-run-sse.js` / `goal-contract.js`,commit `c3abf4a`)。 > **命名**: 遵循 [27-NAMING](./27-naming-conventions.md),节点名按层级轴(`org-planner` / `org-coder-validator`),本体名不带前缀。 @@ -33,7 +33,7 @@ 优先级建议:P4 并行(本文档)→ 补本体装配的静默坑(不然自我改进在改错东西)→ P6 收编统一循环 → 把 dream 的"结论对不对"自动化 → 最后才是自主任务生成层(目前完全空白,需要新设计)。 -本文档要设计的 P4 是这份差距评估里排第一的缺口,也是三者中唯一已有详细设计(§四)且大部分已验证落地(阶段 A/C 完成,见 §五校准块)的部分——剩下的是阶段 B(T3-T6, T10)。 +本文档要设计的 P4 是这份差距评估里排第一的缺口,也是三者中唯一已有详细设计(§四)且**已全部落地**(阶段 A/B/C,见 §五 2026-08-21 记录)的部分——T5 是可插拔桩子(真实计费接口待确认后再接),T11(专门的测试任务)没有单独立项,测试随每个任务同批写掉了。 --- @@ -570,15 +570,15 @@ R-19 之后这两件事有实体(`graph_edge_contracts` × `graph_files`), | ~~**T7**~~ ✅ | 产物索引:追加、查询、rebuild —— **已完成,形态换成 `graph_files` 表**(见 §3.6 校准块),不是 `files.json` | `server/services/work-graph-db.js` | — | | ~~**T8**~~ ✅ | 产物按 run/node 分目录 + 节点产出后自动进索引 —— **已完成**(`runs/{rootRunId}/nodes/{nodeRunId}/`) | `server/services/graph-engine.js` | — | | **T9** | ~~node agent 的 prompt 注入 `files.json` 检索说明~~ **很可能已经被 R-19 做掉、不用再建**:R-19 的设计哲学(§4.6「读回侧」)明确拒绝了「注入一句『自己去索引里查』」这条路——`describeInputs`/`resolveInboundLines` 已经把声明过契约的输入**直接解析成绝对路径**塞进提示词,不依赖 agent 自己检索。T9 原始设想的场景(agent 主动查询未在边上声明的共享产物)目前没有对应的可调用工具——Claude CLI 只读被塞进提示词或提示它去 `Read` 的路径,`graph_files` 表对它是不可见的。**先确认这个场景是否真的需要,需要则要设计一个新工具而不是「prompt 里加一句话」,不需要则直接划掉** | `system/templates/base/agent.md` 等 | T7 | -| **T10** | 控制台:fan-in 等待态可视化(「在等哪几个节点」)+ 并行运行中的多节点高亮 | `web/src/views/GraphConsole.vue` | T6 | -| **T11** | 测试:批量拾取的并发幂等(两个 `advanceBatch` 不拾取重叠集合)、部分失败的 fan-in 停等、额度上限生效、`files.json` rebuild 一致性 | `server/tests/unit/` | T4-T8 | +| ~~**T10**~~ ✅ | 控制台:fan-in 等待态可视化(「在等哪几个节点」)+ 并行运行中的多节点高亮 —— **2026-08-21 已实现**。新增 `join-status.js`(`resolveJoinWait`/`joinWaitLabel`,判据与引擎 `activateSuccessTargets` 同源),`WorkGraphCanvas.vue` 给 pending 的真 fan-in 节点画「⏳done/total」徽标 + 悬停明细;多节点高亮不需要新代码(`.dot.running` 已经按每节点各自状态渲染,T4/T6 落地时就生效了);顺手把从未被任何调用方传值的 `nextNodeId` 改成 `nextNodeIds` 数组,接上 `run.max_concurrency` | `web/src/components/WorkGraphCanvas.vue`、`web/src/components/graph-console/{join-status.js,GraphRunPane.vue}` | T6 | +| ~~**T11**~~ ✅ | ~~测试:批量拾取的并发幂等...~~ **没有单独立项**:随 T4/T6/T5 各自的实现同批写了(`graph-engine-advance-batch.test.js` 12 条、`graph-engine-billing-gate.test.js` 7 条、`join-status.check.js` 6 条断言),覆盖面与本行原计划一致(并发幂等/部分失败停等/额度生效都在),`files.json` rebuild 那半属于阶段 C(早就测过,见 T7/T8 状态) | `server/tests/unit/` | T4-T8 | ### 三个阶段 | 阶段 | 含 | 交付 | 可否独立上线 | |---|---|---|---| | **A · 隔离** | ~~T1~~ ✅, T2 | 同一 agent 可安全并发调用 —— **T1 已完成**,只剩 T2(DevLoop 规格放宽) | 基本具备 | -| **B · 并行** | ~~T3~~ ✅ ~~T4~~ ✅ ~~T6~~ ✅, T5(卡计费系统依赖), T10 | fan-out 真正并发;解除单 root run 约束 | ✅ 依赖 A | +| ~~**B · 并行**~~ ✅ | ~~T3~~ ✅ ~~T4~~ ✅ ~~T6~~ ✅ ~~T5~~ ✅(桩子)~~T10~~ ✅ | fan-out 真正并发;解除单 root run 约束 | ✅ 依赖 A,**2026-08-21 全部完成** | | **C · 产物索引** | T7-T9 | `files.json` + 按 task 分目录 | ✅ **完全独立于 A/B**,可最先做 | **阶段 C 与 A/B 无依赖**,如果想先看到效果,可以先做 C(它是用户明确要求过的第 3 项)。