Commit 556c0c8786bf1a082f12b4b08555eb014e1a0c4d

Authored by yibo
1 parent 9ce9dad2

docs(27-p3-p4): 真实验证按需 hire 路径,四条硬规矩欠账只剩本质限制

隔离 worktree + 真 Claude CLI 探针:CompanyService.create() 建一家有真实
company.json 但从未雇过 workgraph-planning 的公司,建最小 subgraph 节点
work graph 并驱动一步。resolvePlanningAgentName 的按需 hire 真实触发并成功
(区别于 27-P3B §六quater 那次因公司无 company.json 而降级回裸名的反例),
随后按公司作用域名正确寻址、workgraph-planning 真实规划出子 work graph。

四条硬规矩第 2 条现在只剩 (a) 真 LLM 进不了 CI 这条本质限制,(b)(c) 均已还清。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JnCKUFSGvdz4SY7BvYWdMU
docs/README.md
... ... @@ -60,7 +60,7 @@ Graph Agent 架构重构(27 系列)。**已完成的阶段文档已移入 `d
60 60 | [27-naming-conventions.md](./todo/system-design/27-naming-conventions.md) | **命名规范**。`{作用域}-{职能}`;图节点按层级轴命名;节点名 ≠ 本体名;三种 benchmark 消歧;OKR 正名。新增 agent id / 表名 / 字段名前必读 |
61 61 | [27-e2e-task-execution-flow.md](./todo/system-design/27-e2e-task-execution-flow.md) | 端到端流程总览:建公司 → 下达任务 → org graph 逐节点执行 → work graph 规划与循环 → 验收收敛。含与 DevLoop 既有实现的对应关系分析 |
62 62 | [27-example-dev-company-walkthrough.md](./todo/system-design/27-example-dev-company-walkthrough.md) | 参考场景走查(虚构的「配图工厂」),把架构跑一遍具体的数:各阶段 JSON 形态、成本估算、断点清单 |
63   -| [27-p3-p4-work-graph-console.md](./todo/system-design/27-p3-p4-work-graph-console.md) | P3+P4(原 P4 回退+Loop-Validator 已并入)图执行引擎与执行控制台 — ✅ 已实现(`c3abf4a`)。**仍留 todo 的原因**:§十 末「四条硬规矩」第 2 条那笔欠账**已基本还清**(2026-09-08)——`graph-real-chain-smoke.test.js`(零注入、只换掉真 CLI 子进程)已进 CI,覆盖 `agent_call`/`subgraph` 两支 + 多节点/回退边/双层熔断三种形状。剩下的只有真 LLM(本质限制,进不了 CI)与按需 hire 那一段未走过这条链路 |
  63 +| [27-p3-p4-work-graph-console.md](./todo/system-design/27-p3-p4-work-graph-console.md) | P3+P4(原 P4 回退+Loop-Validator 已并入)图执行引擎与执行控制台 — ✅ 已实现(`c3abf4a`)。**仍留 todo 的原因**:§十 末「四条硬规矩」第 2 条那笔欠账**已基本还清**(2026-09-08)——`graph-real-chain-smoke.test.js`(零注入、只换掉真 CLI 子进程)已进 CI,覆盖 `agent_call`/`subgraph` 两支 + 多节点/回退边/双层熔断三种形状;按需 hire(`resolvePlanningAgentName`)2026-09-09 用隔离 worktree + 真 Claude CLI 探针跑通,`workgraph-planning` 真的被按需雇进了一家没预雇过它的真实公司。剩下的只有真 LLM 本身进不了 CI 这一条本质限制(要额度、分钟级、输出不确定,只能靠隔一段时间人工真跑核实,不会有"还清"的一天) |
64 64 | [27-goal-contract-format.md](./todo/system-design/27-goal-contract-format.md) | 验收契约格式(`goal-benchmark` / `goal-test-data` / `goal-test-script` 的产物形态与跨节点传递) |
65 65 | [28-followups.md](./todo/system-design/28-followups.md) | 28 号(Agent 注册表统一)的遗留清单 — 主文档已在 `done/`,这份装没做完的:dream 机制(设计见 29 号,已实现,见下)、`source_kind`(✅已删)/`legacy_path`(不能删)删列、三项「已实施未验证」。任务态清理(✅已实现,见下)。§五 是**已立起来的守卫清单**(别重复造,也别删) |
66 66 | [30-task-delegation-reliability-gaps.md](./todo/system-design/30-task-delegation-reliability-gaps.md) | **任务委派可靠性现状**— 📝 调研记录,非设计方案。DevLoop `runUnit`、Company 招聘装配、Graph 执行三条链路核对结论一致:都是「失败预算耗尽 → 停等人工」,没有「卡住了主动通知人」这一层;DevLoop 当前还默认走 mock,真实 CLI 成功率无实证数据。2026-08-23 追加真实实例并已修:`infra_flake` 原地重跑没有熔断线,真撞上过一次确定性死循环(节点把诊断结论误判成自己的执行结果,反复重跑却从不路由到诊断建议的目标节点);已加 `infra_flake_count` 列 + 硬顶 3 次熔断,连续判 infra_flake 超过硬顶就改判 blocked 交给人工 |
... ...
docs/todo/system-design/27-p3-p4-work-graph-console.md
... ... @@ -1069,8 +1069,25 @@ agent 默认**只挂载 `meta-research` 一个元技能**,必须主动呼叫 `
1069 1069 > `company-hire-org-layer.test.js` 盯着。
1070 1070 >
1071 1071 > **还没还的部分,别当成还清了**:(a) 真 LLM 仍然进不了 CI(要额度、分钟级、输出不确定),
1072   - > `scripts/real-pm-smoke.js` 仍是人工跑(这条是本质限制,不是欠账,不会有"还清"的一天);
1073   - > (c) 按需 hire 那一段没在这条链路里走过。
  1072 + > `scripts/real-pm-smoke.js` 仍是人工跑(这条是本质限制,不是欠账,不会有"还清"的一天,
  1073 + > 只能靠隔一段时间人工真跑一次核实,见下一条)。
  1074 + >
  1075 + > **2026-09-09:(c) 已还上**——隔离 worktree、真 Claude CLI(不是 mock)跑了一次专门探针:
  1076 + > `CompanyService.create()` 建一家有真实 `company.json` 但**从未雇过 `workgraph-planning`**
  1077 + > 的公司(`ondemand-hire-mttqdwqh`),建一张只有一个 `subgraph` 节点的最小 work graph 并驱动
  1078 + > 一步。日志实测:`[Company] ✅ ondemand-hire-mttqdwqh 招聘 workgraph-planning(引用本体
  1079 + > system/agents/workgraph-planning)`——`resolvePlanningAgentName` 的按需 hire 真的触发了、
  1080 + > 真的成功了;随后的 `AgentManager` session key 里 agent 名是 `ondemand-hire-mttqdwqh:
  1081 + > workgraph-planning`(带公司前缀的作用域名,不是裸名),证明 hire 之后走的是正确的寻址路径。
  1082 + > `workgraph-planning` 真实规划出一张子 work graph(引用 `coder`,落库为 `wg_0cc5bbb6a660`),
  1083 + > 子 run 正确创建(`run_9fcf09d9b946`,`parent_run_id`/`parent_node_run_id` 都指对)。
  1084 + > 顺带核实了 `company_agents` 表事后确实是 `[workgraph-planning, coder]`,`org_graph` 里只有
  1085 + > `coder`、没有 `workgraph-planning` 混进去(W7 判据①的豁免生效:`workgraph-planning` 的
  1086 + > `config.type='meta-planning'` 不写 org 节点)。此前 27-P3B §六quater 那次真跑(`accept9-*`)
  1087 + > 里同一条按需 hire 路径其实也被撞到过,但当时公司是用裸 DB insert 造的、没有 `company.json`,
  1088 + > hire 因此**失败**并降级回裸名(日志「公司不存在」)——那次只证明了「hire 失败时优雅降级」,
  1089 + > 没证明「hire 真的能成功」;这次是补的正例。跑完即删(worktree + `scripts/real-ondemand-hire-run.js`
  1090 + > 均未提交,一次性探针脚本)。
1074 1091 >
1075 1092 > **2026-09-08:(b) 已还上**——`graph-real-chain-smoke.test.js` 新增 ⑥⑦⑧ 三例:
1076 1093 > ⑥ 非法契约真的判 fail(不是 success)且判词/归因落库;⑦ 两节点图 + 一条 backward
... ...