-
■ 关于编号 原「P4 回退 + Loop-Validator」已并入 P3 实现完毕(c3abf4a:双层熔断、五项结构 校验含 fail-fallback-edge、三层暂停级联、contract_hash 重试判据)。本文档回收 这个空出来的编号,装 P3 明确排除、现在成为最大能力缺口的内容。 ■ 核心:fan-out 并行 P3 把图结构和 join 语义都做好了,唯独没做并行本身: - graph-engine.js:1078 出边评估「所有入边满足才置 ready」——fan-in join 正确 - graph-engine.js:908 拾取 SQL 是 LIMIT 1——三个并行分支只会一个个串行跑掉 设计为 advanceBatch(runId, {maxConcurrency}),不新增第二个推进原语: 手动模式 maxConcurrency=1 时行为与今天的 advanceOne 完全一致,P3 已有调用方 和测试不用改;自动模式一次拾取整批。批量拾取必须在一个事务里一次性置 running, 否则两个并发 advanceBatch 会拾取到重叠集合。 ■ 走查发现的关键事实:隔离挂载点已经存在 session-pool.js:29 的 getKey(agentName, agentConfig, workDir, scope) 签名里 早就预留了 scope 参数,但第 45 行实际调用时没传。所以「同一 agent 多实例隔离」 这个并行前置条件的改动量比预想小得多——用 graph_run_nodes.id 作 scope 即可。 连带要放宽 CONVENTIONS §12 第一条不变量:(pid, agent) → (pid, agent, scope)。 这是 P4 里唯一要动 DevLoop 规格的地方,且 _spec/ 是生成物,必须改 HTML 后跑 npm run spec:extract。该放宽同时是 P6 的前置——DevLoop runProject 波内串行 (loop-controller.js:609 注释「串行跑」)正是被同一条不变量挡住的。 ■ 产物统一目录 + files.json 这是此前提出但一直未实现的需求。按 task 分目录 data/companies/{cid}/tasks/{taskId}/,根目录 files.json 作统一检索索引, 由引擎在产物落盘后自动追加(不靠 agent 自觉写,否则索引必然漂移), 并支持从 graph_run_nodes 行 rebuild。与 output_ref 不重复:后者是节点级指针, 前者是公司级聚合视图,由前者派生。 ■ 三个阶段,C 完全独立 A 隔离(T1-T2) → B 并行(T3-T6,T10);C 产物索引(T7-T9) 与 A/B 无依赖,可最先做。 并发上限对齐 plan-cost-concurrency.md §④ 的既有数字(run≤5 / 公司≤3 / 单机≤20 session),不另立一套。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>