Commit 0f8230e8b929d576fb1c8765dfe33244832a58aa

Authored by bboonnee
1 parent 0f0b8d8f

docs: Phase 1 landed (ea19c7d) - move design docs to done/, reconcile Phase 2 SDD

Phase 1 (planner_reviewer review gate + P0 resume-bug fix) shipped as
ea19c7d, matching org-graph-unification-phase1-review-gate-design.md
exactly (new task.status value, org role, _REQUIRED_ARTIFACTS narrowing,
both bugs fixed). Moving that design doc and the P0 bug doc it subsumed
to docs/done/, updating their status headers, and fixing the doc-path
references left pointing at their old docs/todo/ location across
agents/planner_reviewer/{SOUL,AGENTS}.md, src/schema.py migration
docstrings, and the other Phase 2/deblackbox docs. Full suite green
(731 tests) both before and after.

Also ran Phase 2 SDD's §9 interface-reconciliation checklist against the
real Phase 1 implementation now that it exists for real: all three items
check out (run_id is included in plan_and_review_documents()'s return
shape, the new task.status value is exactly reviewing_planner_output as
assumed, and planner_reviewer's role.json doesn't pre-reserve a skill
slot for Phase 2's new skill, which is fine -- a one-line addition when
Phase 2c lands, not an incompatibility). Updated §9 to reflect this.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
agents/planner_reviewer/AGENTS.md
1 <!-- New 2026-08-08 (Org Graph unification Phase 1, 1 <!-- New 2026-08-08 (Org Graph unification Phase 1,
2 - docs/todo/org-graph-unification-phase1-review-gate-design.md §8.3): 2 + docs/done/org-graph-unification-phase1-review-gate-design.md §8.3):
3 adapted from agents/validator/AGENTS.md's运行契约结构, 去掉与代码执行/测试 3 adapted from agents/validator/AGENTS.md's运行契约结构, 去掉与代码执行/测试
4 相关的全部内容(不需要 Bash, 不跑测试, 不做代码审计)——这个角色只读文档内容 4 相关的全部内容(不需要 Bash, 不跑测试, 不做代码审计)——这个角色只读文档内容
5 并给出 VERDICT。 --> 5 并给出 VERDICT。 -->
agents/planner_reviewer/SOUL.md
1 <!-- New 2026-08-08 (Org Graph unification Phase 1, 1 <!-- New 2026-08-08 (Org Graph unification Phase 1,
2 - docs/todo/org-graph-unification-phase1-review-gate-design.md §8.3): 2 + docs/done/org-graph-unification-phase1-review-gate-design.md §8.3):
3 adapted from agents/validator/SOUL.md's judgment framework (PASS/FAIL/ 3 adapted from agents/validator/SOUL.md's judgment framework (PASS/FAIL/
4 INCONCLUSIVE, independent re-derivation, no rubber-stamping) -- the 4 INCONCLUSIVE, independent re-derivation, no rubber-stamping) -- the
5 object being judged changes from "Coder's final code implementation" 5 object being judged changes from "Coder's final code implementation"
docs/todo/org-graph-unification-phase1-review-gate-design.md renamed to docs/done/org-graph-unification-phase1-review-gate-design.md
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 **日期**: 2026-08-08 3 **日期**: 2026-08-08
4 **性质**: 详细设计,对应 `docs/todo/org-graph-unification-and-universal-self-planning-requirements.md` 的 Phase 1(FR-1,含 `task-execution-resume-assumes-planner-artifacts-exist.md` 的修复)。给出可直接实施的 schema/接口/算法/测试方案。 4 **性质**: 详细设计,对应 `docs/todo/org-graph-unification-and-universal-self-planning-requirements.md` 的 Phase 1(FR-1,含 `task-execution-resume-assumes-planner-artifacts-exist.md` 的修复)。给出可直接实施的 schema/接口/算法/测试方案。
5 **依赖代码**:`src/org_node_lifecycle.py`(`_PRE_STATE`/`_POST_STATE`/`_REQUIRED_ARTIFACTS`/`trigger_org_node_full`)、`src/e2e_pipeline.py`(`run_task_lifecycle`/`plan_documents`/`_parse_verdict_line`/`_VALIDATOR_VERDICT_PROMPT` 先例)、`src/task_execution.py`(`run_or_resume_task_lifecycle`/`_RESUMABLE_STATUSES`)、`src/scheduler.py`(`_BLOCKED_REASON_FOR_EXCEPTION`)、`src/schema.py`(`migrate_add_loop_back_event_type` 的 create-copy-drop-rename 先例)、`src/agent_profile.py`(`_discover_role_ids`,角色自动发现)、`roles/validator/role.json`(新角色的模板)。 5 **依赖代码**:`src/org_node_lifecycle.py`(`_PRE_STATE`/`_POST_STATE`/`_REQUIRED_ARTIFACTS`/`trigger_org_node_full`)、`src/e2e_pipeline.py`(`run_task_lifecycle`/`plan_documents`/`_parse_verdict_line`/`_VALIDATOR_VERDICT_PROMPT` 先例)、`src/task_execution.py`(`run_or_resume_task_lifecycle`/`_RESUMABLE_STATUSES`)、`src/scheduler.py`(`_BLOCKED_REASON_FOR_EXCEPTION`)、`src/schema.py`(`migrate_add_loop_back_event_type` 的 create-copy-drop-rename 先例)、`src/agent_profile.py`(`_discover_role_ids`,角色自动发现)、`roles/validator/role.json`(新角色的模板)。
6 -**状态**: 设计草案,待实施。 6 +**状态**: ✅ 已实现(commit `ea19c7d`,2026-08-08)。实现与本设计逐条吻合(新角色 `planner_reviewer`、`reviewing_planner_output` 状态值、`_REQUIRED_ARTIFACTS["coder"]` 收窄到 `(sdd,)`、P0 resume bug 与 fresh-run KeyError 一并修复,均与本文档 §3.1/§4.1/§7 一致);实现过程中额外发现并修复了一个本设计未预见的问题:`agent_profile` 表的 `migrated_from_profile` 列原是 `NOT NULL`,`planner_reviewer` 这种没有对应 Hermes 遗留 profile 的新角色一注册就违反约束,随本次提交一并放开。`python3 -m unittest discover -s src` 全绿(731 tests,2026-08-12 复核)。移入 `docs/done/` 前保留在 `docs/todo/` 是 CLAUDE.md 记录过的已知文档滞后,本次一并订正。
7 7
8 --- 8 ---
9 9
docs/todo/task-execution-resume-assumes-planner-artifacts-exist.md renamed to docs/done/task-execution-resume-assumes-planner-artifacts-exist.md
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 2
3 **日期**: 2026-08-08 3 **日期**: 2026-08-08
4 **性质**: 问题记录(真实复现,根因已定位,未修复)。发现于 `docs/done/work-graph-self-planning-and-loop-back-requirements.md`(Planner 自规划)上线后的第一次真实端到端验证。 4 **性质**: 问题记录(真实复现,根因已定位,未修复)。发现于 `docs/done/work-graph-self-planning-and-loop-back-requirements.md`(Planner 自规划)上线后的第一次真实端到端验证。
5 -**状态**: 待修复,未立项。**2026-08-08 更新**:已折入 `docs/todo/org-graph-unification-and-universal-self-planning-requirements.md` 的 Phase 1(FR-1)——插入"Planner 产出复核"新阶段本来就要重写这段 `run_or_resume_task_lifecycle()` 分支逻辑,这个 bug 跟那次改动是同一段代码路径,不再单独排期,随 Phase 1 一并修。**详细设计已发布**:`docs/todo/org-graph-unification-phase1-review-gate-design.md` §6-7——修复方式是把 sdd/prd/benchmark 的存在性探测下沉到新增的 `_review_planner_output_with_retries()` 内部(有就用,没有就重新规划),不再在 resume 分支顶部无条件硬读;同一次调研还发现 fresh-run 路径(`run_task_lifecycle()`)有同类但更早触发的 `KeyError`,一并修复。 5 +**状态**: ✅ 已修复(commit `ea19c7d`,2026-08-08,随 Phase 1 一并落地)。修复方式与 §4"可能的修复方向"一致:sdd/prd/benchmark 的存在性探测下沉到新增的 `_review_planner_output_with_retries()` 内部(有就用,没有就重新规划),不再在 resume 分支顶部无条件硬读;同一次实现还修复了 fresh-run 路径(`run_task_lifecycle()`)里同类但更早触发的 `KeyError`。详细设计见 `docs/done/org-graph-unification-phase1-review-gate-design.md` §6-7,`python3 -m unittest discover -s src` 全绿(2026-08-12 复核)。
6 6
7 ## 1. 现象(真实复现) 7 ## 1. 现象(真实复现)
8 8
docs/todo/org-graph-unification-and-universal-self-planning-requirements.md
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 **日期**: 2026-08-08 3 **日期**: 2026-08-08
4 **性质**: 需求文档(BRD/PRD 层面),不含详细技术设计。融合并统领以下既有 `docs/todo/` 文档的相关内容: 4 **性质**: 需求文档(BRD/PRD 层面),不含详细技术设计。融合并统领以下既有 `docs/todo/` 文档的相关内容:
5 - `docs/todo/org-graph-as-work-graph-unified-loop-requirements.md`(已删除,内容 100% 并入本文档)——本文档是它的展开与拍板;该文档提出的"跨 Org Agent 精确 loop_back"诉求是本文档 FR-4 + §4 关键架构决策的正文。 5 - `docs/todo/org-graph-as-work-graph-unified-loop-requirements.md`(已删除,内容 100% 并入本文档)——本文档是它的展开与拍板;该文档提出的"跨 Org Agent 精确 loop_back"诉求是本文档 FR-4 + §4 关键架构决策的正文。
6 -- `docs/todo/task-execution-resume-assumes-planner-artifacts-exist.md`——它记录的 bug 与本文档 FR-1 改动的是**同一段** `run_or_resume_task_lifecycle()` 分支逻辑(见 §2.1 调研结论),折入 Phase 1 一并修,不再单独排期。 6 +- `docs/done/task-execution-resume-assumes-planner-artifacts-exist.md`——它记录的 bug 与本文档 FR-1 改动的是**同一段** `run_or_resume_task_lifecycle()` 分支逻辑(见 §2.1 调研结论),折入 Phase 1 一并修,不再单独排期。
7 - `docs/todo/validator-test-script-narrative-output-issue.md` 第 8 节提到的"另一份尚未撰写、关于给 Coder agent 加入 test_script 模块的文档",即本文档 Phase 2(FR-2/FR-3)。 7 - `docs/todo/validator-test-script-narrative-output-issue.md` 第 8 节提到的"另一份尚未撰写、关于给 Coder agent 加入 test_script 模块的文档",即本文档 Phase 2(FR-2/FR-3)。
8 8
9 **触发场景**:任务 `2084590a`(修复 `work_node_run.py` 的 `execution_log_file` bug)里,Planner 自规划出的 `benchmark` 节点连续 4 次产出的都是"叙述我做了什么"的散文(跟 `validator-test-script-narrative-output-issue.md` 同一类问题,这次发生在 benchmark 上),LLM judge 的 `on_fail=retry_self` 循环耗尽 `max_attempts=3` 后任务直接 `blocked_pending_human`——暴露出 Validator 从来没有机会在 Coder 开始实现之前复核 Planner 自己的产出。用户随后 2026-08-08 提出四点架构改动设想(见 §1),与当天早些时候整理的 `docs/todo/` 待办优先级建议(P0~P3)高度交叉,要求重新盘点、融合、给出 phase 规划。 9 **触发场景**:任务 `2084590a`(修复 `work_node_run.py` 的 `execution_log_file` bug)里,Planner 自规划出的 `benchmark` 节点连续 4 次产出的都是"叙述我做了什么"的散文(跟 `validator-test-script-narrative-output-issue.md` 同一类问题,这次发生在 benchmark 上),LLM judge 的 `on_fail=retry_self` 循环耗尽 `max_attempts=3` 后任务直接 `blocked_pending_human`——暴露出 Validator 从来没有机会在 Coder 开始实现之前复核 Planner 自己的产出。用户随后 2026-08-08 提出四点架构改动设想(见 §1),与当天早些时候整理的 `docs/todo/` 待办优先级建议(P0~P3)高度交叉,要求重新盘点、融合、给出 phase 规划。
@@ -110,8 +110,8 @@ @@ -110,8 +110,8 @@
110 110
111 ## 6. Phase 规划 111 ## 6. Phase 规划
112 112
113 -### Phase 1 — Org 主流程改造 + resume bug 一并修复  
114 -- **详细设计**:`docs/todo/org-graph-unification-phase1-review-gate-design.md`(2026-08-08,可直接实施)。 113 +### Phase 1 — Org 主流程改造 + resume bug 一并修复 ✅ 已实现(commit `ea19c7d`,2026-08-08)
  114 +- **详细设计**:`docs/done/org-graph-unification-phase1-review-gate-design.md`(已随实现移入 `docs/done/`,与实现逐条吻合,见该文档更新后的状态行)。
115 - **范围**:FR-1(含 `task-execution-resume-assumes-planner-artifacts-exist.md` 的修复)。 115 - **范围**:FR-1(含 `task-execution-resume-assumes-planner-artifacts-exist.md` 的修复)。
116 - **产出**:`task.status`/`execution_event` 两处 schema 迁移、新增独立 org role `planner_reviewer`、`org_node_lifecycle.py` 的 `_PRE_STATE`/`_POST_STATE`/`_REQUIRED_ARTIFACTS` 扩展、`e2e_pipeline.py` 新增复核+重试循环、`run_task_lifecycle()`/`run_or_resume_task_lifecycle()` 新分支。复核失败的重试是任务内部的粗粒度循环(完整重新规划,不接 `org_level_loop.py`),不是"打回整个任务重来"。 116 - **产出**:`task.status`/`execution_event` 两处 schema 迁移、新增独立 org role `planner_reviewer`、`org_node_lifecycle.py` 的 `_PRE_STATE`/`_POST_STATE`/`_REQUIRED_ARTIFACTS` 扩展、`e2e_pipeline.py` 新增复核+重试循环、`run_task_lifecycle()`/`run_or_resume_task_lifecycle()` 新分支。复核失败的重试是任务内部的粗粒度循环(完整重新规划,不接 `org_level_loop.py`),不是"打回整个任务重来"。
117 - **额外发现**(设计阶段调研中定位,一并修复):`e2e_pipeline.py::run_task_lifecycle()` 对 `artifact_ids["prd"]`/`["benchmark"]` 的无条件下标访问,在自规划图省略这两个类型时会 `KeyError`——这个崩溃在 fresh-run 首次执行就会触发,不需要等到 resume,是比 P0 bug 更早触发的同类问题。 117 - **额外发现**(设计阶段调研中定位,一并修复):`e2e_pipeline.py::run_task_lifecycle()` 对 `artifact_ids["prd"]`/`["benchmark"]` 的无条件下标访问,在自规划图省略这两个类型时会 `KeyError`——这个崩溃在 fresh-run 首次执行就会触发,不需要等到 resume,是比 P0 bug 更早触发的同类问题。
@@ -142,7 +142,7 @@ @@ -142,7 +142,7 @@
142 ## 7. 待确认的问题(讨论后逐条勾掉,参照 `graph-engineering-open-items.md` 的状态图例) 142 ## 7. 待确认的问题(讨论后逐条勾掉,参照 `graph-engineering-open-items.md` 的状态图例)
143 143
144 ✅ §4 关键架构决策:方案 A(合图)。2026-08-08 用户拍板。 144 ✅ §4 关键架构决策:方案 A(合图)。2026-08-08 用户拍板。
145 -✅ FR-1 新增的 `task.status` 枚举值定为 `reviewing_planner_output`。2026-08-08,随 Phase 1 SDD(`docs/todo/org-graph-unification-phase1-review-gate-design.md`)一起拍板,理由见该文档 §3.1。 145 +✅ FR-1 新增的 `task.status` 枚举值定为 `reviewing_planner_output`。2026-08-08,随 Phase 1 SDD(`docs/done/org-graph-unification-phase1-review-gate-design.md`)一起拍板,理由见该文档 §3.1。
146 ✅ FR-1 的"复核 Validator"用新增独立 org role `planner_reviewer`,不复用 `validator`。2026-08-08 用户拍板(`AskUserQuestion` 确认),理由见 Phase 1 SDD §2.1——`_PRE_STATE`/`_POST_STATE` 是按 org_node 名字一对一映射,同一个 key 没法挂两组状态转移。 146 ✅ FR-1 的"复核 Validator"用新增独立 org role `planner_reviewer`,不复用 `validator`。2026-08-08 用户拍板(`AskUserQuestion` 确认),理由见 Phase 1 SDD §2.1——`_PRE_STATE`/`_POST_STATE` 是按 org_node 名字一对一映射,同一个 key 没法挂两组状态转移。
147 ✅ FR-4 的节点级验证 skill:新开一个 skill,不在 `qa-task-validation` 基础上改造。2026-08-08 用户拍板。理由:`qa-task-validation` 整份内容绑定飞书多维表格语义(硬编码 `tblXXX` 表 ID、状态机是"待测试→已完成"这类 Base 记录写回),判定粒度是整个任务的 PASS/FAIL/INCONCLUSIVE;FR-4 要的是单个 Work Graph 节点的 `judgment.kind="llm"` 回调,输入是一个节点的输出,输出要精确指向 `loop_back` 的目标 `node_id`,和 Base 完全无关,两种用途混进同一份 skill 容易互相污染。新 skill 可以借鉴其判定原则(三态结论、独立复核、真实路径优先)写进 prose,但不复用文件本身。 147 ✅ FR-4 的节点级验证 skill:新开一个 skill,不在 `qa-task-validation` 基础上改造。2026-08-08 用户拍板。理由:`qa-task-validation` 整份内容绑定飞书多维表格语义(硬编码 `tblXXX` 表 ID、状态机是"待测试→已完成"这类 Base 记录写回),判定粒度是整个任务的 PASS/FAIL/INCONCLUSIVE;FR-4 要的是单个 Work Graph 节点的 `judgment.kind="llm"` 回调,输入是一个节点的输出,输出要精确指向 `loop_back` 的目标 `node_id`,和 Base 完全无关,两种用途混进同一份 skill 容易互相污染。新 skill 可以借鉴其判定原则(三态结论、独立复核、真实路径优先)写进 prose,但不复用文件本身。
148 ✅ Phase 2 的 Coder/Validator 自规划:加一份建议清单(类似 `_PLANNER_NODE_CATALOG`),不是完全自由。2026-08-08 用户拍板——推翻了 `work_graph_plan.py:161-170` 2026-08-06 注释里"Coder/Validator's sub-tasks have no such fixed small vocabulary of node types"的原判断。Phase 2 设计阶段需要给 Coder/Validator 各自定义一份"常见节点类型"参考目录(如 impl/unit_test/integration_check),每项可以像 `_PLANNER_NODE_CATALOG` 一样标注 `suggested_judgment`,但不强制——沿用 Planner 目录"建议不强制"的既有约定,而不是 Planner 文档链那种固定顺序的强约束。 148 ✅ Phase 2 的 Coder/Validator 自规划:加一份建议清单(类似 `_PLANNER_NODE_CATALOG`),不是完全自由。2026-08-08 用户拍板——推翻了 `work_graph_plan.py:161-170` 2026-08-06 注释里"Coder/Validator's sub-tasks have no such fixed small vocabulary of node types"的原判断。Phase 2 设计阶段需要给 Coder/Validator 各自定义一份"常见节点类型"参考目录(如 impl/unit_test/integration_check),每项可以像 `_PLANNER_NODE_CATALOG` 一样标注 `suggested_judgment`,但不强制——沿用 Planner 目录"建议不强制"的既有约定,而不是 Planner 文档链那种固定顺序的强约束。
docs/todo/org-graph-unification-phase2-universal-self-planning-design.md
@@ -2,8 +2,8 @@ @@ -2,8 +2,8 @@
2 2
3 **日期**: 2026-08-08 3 **日期**: 2026-08-08
4 **性质**: 详细设计,对应 `docs/todo/org-graph-unification-and-universal-self-planning-requirements.md` çš„ Phase 2(FR-2/FR-3/FR-4),按 §4/§4.1 å·²æ‹æ¿çš„åˆå›¾ï¼ˆæ–¹æ¡ˆ A)路径设计。 4 **性质**: 详细设计,对应 `docs/todo/org-graph-unification-and-universal-self-planning-requirements.md` çš„ Phase 2(FR-2/FR-3/FR-4),按 §4/§4.1 å·²æ‹æ¿çš„åˆå›¾ï¼ˆæ–¹æ¡ˆ A)路径设计。
5 -**ä¾èµ–**: 硬ä¾èµ– Phase 1(`docs/todo/org-graph-unification-phase1-review-gate-design.md`)先è½åœ°â€”—Phase 2 是在 Phase 1 建立的 `planner_reviewer` 阶段基础上继续åˆå›¾ï¼ŒPhase 1 未完æˆå‰æœ¬æ–‡æ¡£çš„调用点改动无法接入。Phase 1 ç›®å‰ç”±å¦ä¸€ä¸ªè¿›ç¨‹åœ¨å®žæ–½ä¸­ï¼Œæœ¬æ–‡æ¡£çš„具体代ç ä½ç½®å¼•用以 Phase 1 SDD 的设计为准,Phase 1 真正è½åœ°åŽéœ€è¦ä¸€æ¬¡å¿«é€Ÿæ ¸å¯¹ï¼ˆè§ §9)。  
6 -**状æ€**: è®¾è®¡è‰æ¡ˆã€‚**2026-08-08 修订**:写作过程中,需求文档 §7 çš„å››ä¸ªå¼€æ”¾é—®é¢˜å·²è¢«ç”¨æˆ·ç›´æŽ¥æ‹æ¿ï¼ˆè¯¦è§è¯¥æ–‡æ¡£ §7 对应æ¡ç›®ï¼‰ï¼Œå…¶ä¸­ä¸¤æ¡æŽ¨ç¿»äº†æœ¬æ–‡æ¡£æœ€åˆçš„设计判断——Coder/Validator 自规划改为"建议节点清å•"而éžå®Œå…¨è‡ªç”±ï¼ˆÂ§3),`work_graph_run.org_node` 改为彻底移除而éžä¿ç•™ï¼ˆÂ§2.1ï¼‰â€”â€”æœ¬ç‰ˆæœ¬å·²æŒ‰æ‹æ¿ç»“æžœæ”¹å†™ï¼Œä¸æ˜¯åŽŸå§‹è‰ç¨¿ã€‚ 5 +**ä¾èµ–**: 硬ä¾èµ– Phase 1(`docs/done/org-graph-unification-phase1-review-gate-design.md`)——已实现(commit `ea19c7d`,2026-08-08)。§9 æŽ¥å£æ ¸å¯¹æ¸…å•已于 2026-08-12 逿¡æ ¸å¯¹å®Œæˆï¼šä¸‰é¡¹å…¨éƒ¨å»åˆï¼ˆ`plan_and_review_documents()` ç» `_review_planner_output_with_retries()` é€ä¼  `plan_documents()` çš„ `{"run_id", "artifact_ids"}` è¿”å›žå½¢çŠ¶ï¼Œå« `run_id`ï¼›`task.status` 新值确认是 `reviewing_planner_output`ï¼›`roles/planner_reviewer/role.json` ç›®å‰ `skills: ["planner-output-review", "unattended-agent-operations"]`,未预留 §7.1 æ–° skill ä½ç½®ï¼ŒPhase 2 实施时新增一行å³å¯ï¼Œä¸æ˜¯ä¸å…¼å®¹ï¼‰ã€‚
  6 +**状æ€**: è®¾è®¡è‰æ¡ˆï¼ŒPhase 1 å‰ç½®æ¡ä»¶å·²æ»¡è¶³ï¼Œå¯ä»¥å¼€å§‹å®žæ–½ã€‚**2026-08-08 修订**:写作过程中,需求文档 §7 çš„å››ä¸ªå¼€æ”¾é—®é¢˜å·²è¢«ç”¨æˆ·ç›´æŽ¥æ‹æ¿ï¼ˆè¯¦è§è¯¥æ–‡æ¡£ §7 对应æ¡ç›®ï¼‰ï¼Œå…¶ä¸­ä¸¤æ¡æŽ¨ç¿»äº†æœ¬æ–‡æ¡£æœ€åˆçš„设计判断——Coder/Validator 自规划改为"建议节点清å•"而éžå®Œå…¨è‡ªç”±ï¼ˆÂ§3),`work_graph_run.org_node` 改为彻底移除而éžä¿ç•™ï¼ˆÂ§2.1ï¼‰â€”â€”æœ¬ç‰ˆæœ¬å·²æŒ‰æ‹æ¿ç»“æžœæ”¹å†™ï¼Œä¸æ˜¯åŽŸå§‹è‰ç¨¿ã€‚**2026-08-08 追加**ï¼ˆåŒæ—¥ï¼Œè§éœ€æ±‚文档新增 §3.1):FR-4 的目标被明确为"失败å³è¿›åŒ–"完整方法论(判断失败 → Reflection-review 动æ€è¯Šæ–­ → 系统性缺陷则先 Fix-Skill → 跳回执行),本文档 §5 设计的 `dynamic_loop_back` åªè¦†ç›–其中第 1/2/4 步,第 3 步(Fix-Skill)是已知缺å£ï¼Œè§ §5 开头说明和 §8 第 5 æ¡ã€‚
7 7
8 --- 8 ---
9 9
@@ -397,11 +397,11 @@ Phase 1 阶段&quot;夿 ¸å¤±è´¥å…ˆç”¨çŽ°æœ‰ `org_level_loop.py` ç²—ç²’åº¦è·¯ç”±å…œåº @@ -397,11 +397,11 @@ Phase 1 阶段&quot;夿 ¸å¤±è´¥å…ˆç”¨çŽ°æœ‰ `org_level_loop.py` 粗粒度路由兜åº
397 397
398 --- 398 ---
399 399
400 -## 9. 跟正在实施的 Phase 1 çš„æŽ¥å£æ ¸å¯¹æ¸…å•(Phase 1 è½åœ°åŽç«‹å³æ‰§è¡Œï¼‰ 400 +## 9. è·Ÿ Phase 1 çš„æŽ¥å£æ ¸å¯¹æ¸…å•——✅ 全部核对完æˆï¼ˆ2026-08-12)
401 401
402 -- [ ] `plan_and_review_documents()` 的返回形状是å¦åŒ…å« `run_id`(§6.2 ä¾èµ–)。  
403 -- [ ] Phase 1 实际引入的新 `task.status` å€¼æ˜¯ä¸æ˜¯æœ¬æ–‡æ¡£å‡è®¾çš„å字(Phase 1 SDD 定的是 `reviewing_planner_output`,Phase 1 ç”±å¦ä¸€è¿›ç¨‹å®žæ–½ï¼Œå®žé™…è½åœ°å€¼éœ€è¦æ ¸å¯¹ä¸€æ¬¡ï¼‰ã€‚  
404 -- [ ] `roles/planner_reviewer/role.json` çš„ `skills` 列表是å¦å·²ç»é¢„ç•™ä½ç½®ç»™ §7.1 新增的 `work-graph-node-review`(如果 Phase 1 实施时已ç»å†™äº†åˆ«çš„å ä½ skill å字,需è¦ç»Ÿä¸€ï¼‰ã€‚ 402 +- [x] `plan_and_review_documents()` 的返回形状是å¦åŒ…å« `run_id`——**是**:`plan_and_review_documents()` → `_review_planner_output_with_retries()` → é€ä¼ æ‹¿åˆ° PASS 那一轮 `plan_documents()` 的原始返回值 `{"run_id", "artifact_ids"}`,`run_id` é½å…¨ï¼ŒÂ§6.2 çš„å‡è®¾æˆç«‹ï¼Œ`implement_code()`/`validate_implementation_with_own_graph()` å¯ä»¥ç›´æŽ¥æ‹¿è¿™ä¸ª `run_id` 用作 `append_to_run_id`。
  403 +- [x] Phase 1 实际引入的新 `task.status` å€¼æ˜¯ä¸æ˜¯ `reviewing_planner_output`——**是**,`src/schema.py`/`src/org_node_lifecycle.py` 凿Œ‰æ­¤å®žçŽ°ï¼Œä¸Žæœ¬æ–‡æ¡£å‡è®¾å®Œå…¨ä¸€è‡´ã€‚
  404 +- [x] `roles/planner_reviewer/role.json` çš„ `skills` 列表是å¦å·²ç»é¢„ç•™ä½ç½®ç»™ §7.1 新增的 `work-graph-node-review`——**没有预留**ï¼Œå½“å‰æ˜¯ `["planner-output-review", "unattended-agent-operations"]`ã€‚ä¸æ˜¯é—®é¢˜ï¼šPhase 2 实施 §7.1 时直接追加一行 `"work-graph-node-review"` å³å¯ï¼Œ`roles/coder`/`roles/validator` çš„ `role.json` åŒç†éœ€è¦å„追加一行——这是 Phase 2c 实施清å•é‡Œçš„ä¸€æ­¥ï¼Œä¸æ˜¯éœ€è¦æå‰å调的接å£ä¸å…¼å®¹ã€‚
405 405
406 --- 406 ---
407 407
docs/todo/validator-test-script-narrative-output-issue.md
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 | 5 | 08-08 | **真实复现,推翻第 3 轮判断**:任务 `2084590a` 的 `benchmark` 节点(不是 test_script)连续 4 次输出叙述文字(详见 §1 末尾),LLM judge 第 3 次已精确诊断出问题但未能强制拦住,第 4 次原样复现,`loop_back` 耗尽后 `blocked_pending_human`。触发条件改判为"这次任务需不需要模型先探索真实代码",不是"节点类型是不是 test_script"——benchmark 也没有类似 `check_script_compiles` 的机械拦截网,只能靠 LLM judge 自己识别,识别到不等于能强制拦住。 | 15 | 5 | 08-08 | **真实复现,推翻第 3 轮判断**:任务 `2084590a` 的 `benchmark` 节点(不是 test_script)连续 4 次输出叙述文字(详见 §1 末尾),LLM judge 第 3 次已精确诊断出问题但未能强制拦住,第 4 次原样复现,`loop_back` 耗尽后 `blocked_pending_human`。触发条件改判为"这次任务需不需要模型先探索真实代码",不是"节点类型是不是 test_script"——benchmark 也没有类似 `check_script_compiles` 的机械拦截网,只能靠 LLM judge 自己识别,识别到不等于能强制拦住。 |
16 | 6 | 08-08 | 结构性修复的落脚点确定为 `org-graph-unification-and-universal-self-planning-requirements.md` Phase 2——该文档非目标 §5.2 已记录这条已知风险,要求 Phase 2 落地时专门验证是否复现。 | 16 | 6 | 08-08 | 结构性修复的落脚点确定为 `org-graph-unification-and-universal-self-planning-requirements.md` Phase 2——该文档非目标 §5.2 已记录这条已知风险,要求 Phase 2 落地时专门验证是否复现。 |
17 17
18 -后续讨论方向记在 `docs/todo/org-graph-unification-and-universal-self-planning-requirements.md`(原草案 `org-graph-as-work-graph-unified-loop-requirements.md` 已并入此文档并删除)——包括要不要给 benchmark 也加一个类似的启发式机械检查、以及要不要在 Coder 开始实现之前对 Planner 产出多一道独立复核(后者已在该文档 Phase 1 SDD `docs/todo/org-graph-unification-phase1-review-gate-design.md` 落地为具体设计)。 18 +后续讨论方向记在 `docs/todo/org-graph-unification-and-universal-self-planning-requirements.md`(原草案 `org-graph-as-work-graph-unified-loop-requirements.md` 已并入此文档并删除)——包括要不要给 benchmark 也加一个类似的启发式机械检查、以及要不要在 Coder 开始实现之前对 Planner 产出多一道独立复核(后者已在该文档 Phase 1 SDD `docs/done/org-graph-unification-phase1-review-gate-design.md` 落地为具体设计)。
19 19
20 ## 1. 现象 20 ## 1. 现象
21 21
docs/todo/work-graph-node-execution-deblackbox-requirements.md
@@ -195,4 +195,4 @@ def run_fn(cwd, model=None): @@ -195,4 +195,4 @@ def run_fn(cwd, model=None):
195 195
196 ## 7. 跟 Org-Graph-Unification 系列文档的关系 196 ## 7. 跟 Org-Graph-Unification 系列文档的关系
197 197
198 -正交但有先后关系:这次改动只影响**单节点执行机制**,不影响 Org Graph 流程形状或自规划范围,`docs/todo/org-graph-unification-phase1-review-gate-design.md`(Phase 1)不依赖这次改动,可以并行/先后独立推进。但 `docs/todo/org-graph-unification-and-universal-self-planning-requirements.md` 的 **Phase 2**(FR-4,节点级验证 skill)会大量新增 `judgment.kind="llm"` 判断调用——如果这次去黑盒化工作能在 Phase 2 动工前完成,Phase 2 就不需要在两套机制(Workflow 和新的 flat 调用)之间选一套来复用,直接基于 `trigger_org_node_structured()` 设计,减少后续返工。建议顺序:这份文档 → Phase 2,不是必须但值得。 198 +正交但有先后关系:这次改动只影响**单节点执行机制**,不影响 Org Graph 流程形状或自规划范围,`docs/done/org-graph-unification-phase1-review-gate-design.md`(Phase 1)不依赖这次改动,可以并行/先后独立推进。但 `docs/todo/org-graph-unification-and-universal-self-planning-requirements.md` 的 **Phase 2**(FR-4,节点级验证 skill)会大量新增 `judgment.kind="llm"` 判断调用——如果这次去黑盒化工作能在 Phase 2 动工前完成,Phase 2 就不需要在两套机制(Workflow 和新的 flat 调用)之间选一套来复用,直接基于 `trigger_org_node_structured()` 设计,减少后续返工。建议顺序:这份文档 → Phase 2,不是必须但值得。
src/schema.py
@@ -697,7 +697,7 @@ def migrate_add_loop_back_event_type(conn): @@ -697,7 +697,7 @@ def migrate_add_loop_back_event_type(conn):
697 697
698 def migrate_add_reviewing_planner_output_status(conn): 698 def migrate_add_reviewing_planner_output_status(conn):
699 """2026-08-08 (Org Graph unification Phase 1, 699 """2026-08-08 (Org Graph unification Phase 1,
700 - docs/todo/org-graph-unification-phase1-review-gate-design.md §3.1): adds 700 + docs/done/org-graph-unification-phase1-review-gate-design.md §3.1): adds
701 'reviewing_planner_output' to task.status's CHECK enum on an 701 'reviewing_planner_output' to task.status's CHECK enum on an
702 ALREADY-POPULATED database -- same create-copy-drop-rename dance as 702 ALREADY-POPULATED database -- same create-copy-drop-rename dance as
703 migrate_expand_artifact_types/migrate_add_loop_back_event_type. Idempotent 703 migrate_expand_artifact_types/migrate_add_loop_back_event_type. Idempotent
@@ -741,7 +741,7 @@ def migrate_add_reviewing_planner_output_status(conn): @@ -741,7 +741,7 @@ def migrate_add_reviewing_planner_output_status(conn):
741 741
742 def migrate_add_planner_review_verdict_event_type(conn): 742 def migrate_add_planner_review_verdict_event_type(conn):
743 """2026-08-08 (Org Graph unification Phase 1, 743 """2026-08-08 (Org Graph unification Phase 1,
744 - docs/todo/org-graph-unification-phase1-review-gate-design.md §3.2): adds 744 + docs/done/org-graph-unification-phase1-review-gate-design.md §3.2): adds
745 'planner_review_verdict' to execution_event.event_type's CHECK enum on an 745 'planner_review_verdict' to execution_event.event_type's CHECK enum on an
746 ALREADY-POPULATED database -- same create-copy-drop-rename dance as 746 ALREADY-POPULATED database -- same create-copy-drop-rename dance as
747 migrate_add_loop_back_event_type. Idempotent and safe to call 747 migrate_add_loop_back_event_type. Idempotent and safe to call