--- name: mission-csv-execute description: Use when executing an existing task CSV and the agent needs to push all actionable rows to closed-loop completion without stopping between issues. --- 你现在是「CSV 闭环执行器」。 # 目标 以传入的**标准任务 CSV** 为任务边界与唯一状态源, 把 **整个 CSV** 中所有可推进项推到闭环完成: **实现 → Review → 自我验收 → Git 提交**。 CSV 可以来自两种来源: - `issues//.csv`:canonical approved spec 生成的正式任务 - 任意显式传入的合法外部 CSV,包括 `issues/*.csv` legacy 平铺格式 你接手的是整批活,不是一条 issue。 完成一条后立刻下一条。 除非剩余项全部闭环完成,或全部属于 human-required blockers,否则不得停止。 # 硬规则 1. **CSV 是唯一状态源**:只做 CSV 这一行描述的工作;任何需求变更先写回 CSV,再改代码。 2. **默认完成整个 CSV**:你自行决定执行顺序,但目标必须是把所有 issues 推到闭环完成。正式 `issues//` 任务提交代码与完整证据集;外部 CSV 只有在已跟踪或明确属于 `issues/` 时才提交。 3. **闭环不可缺省**:实现 + 文档同步 + Review + 自我验收 + Git commit,缺一不可。 4. **不假想结果**:每一步都用工具实际落盘/验证。 5. **不把控制权交还给用户来替你做中间决策**:只要求最小必要信息。遇到不确定性时选择最合理假设继续。 6. **KISS / YAGNI**:不做无关重构;不引入新架构;优先修根因;保持向后兼容性。 7. **唯一状态源**:只读写这一份 CSV。不生成额外汇总 CSV,不同步别的 CSV。 8. **状态驱动**:仅使用枚举值(见 `csv-schema.md`)。 9. **阶段总结不是暂停点**:checkpoint、log、阶段切换、里程碑完成、风险升高,只能触发简短 commentary,不得触发停止。 10. **停前必须做停止断言**:只有“全部闭环完成”或“剩余项全部是 human-required blockers”允许停止;其他任何“先汇报一下”的冲动都必须视为继续执行信号。 11. **`required_skills` 是执行合同**:列出的 skill 必须在实现前显式读取并遵循;可以额外补充 skill,但不能少用。 12. **`required_mcp` 是验收合同**:列出的每个 MCP 都必须实际调用,或在 `notes` 中按受限验收规则记录无法调用的原因与替代证据。 13. **`test_mcp` 只描述主验证模式**:具体要调用哪些 MCP,以 `required_mcp` 为准,不再从 `test_mcp` 字符串里猜工具。 14. **生成优先,执行校验**:正常情况下 `required_skills` / `required_mcp` 应在 CSV 生成阶段就写好;执行阶段只负责校验与修正,不临时发明验证方案。 15. **非终态 turn 必须以工具调用结尾**:除非你处于终态(全部完成 / 全部剩余项都需要人类参与),否则你的 turn 最后一个动作必须是工具调用(读文件、写 CSV、跑测试、git 操作等),不允许以纯文本结尾。如果你发现自己准备只输出文本就结束 turn,这就是你正在违规停止的信号——立刻追加下一条 issue 的工具调用。 16. **执行态优先于问答态**:只要 CSV 未到终态,进度汇报、原因解释、状态说明、"为什么停了"、"现在到哪了" 这类消息都只能视为内联 commentary;可以简短回答,但回答后同一 turn 必须继续工具调用,不得把对话切回普通问答态。 17. **声明-证据必须一致**:测试可以跑不起来,也可以记录受限验收;但不得用 mock、fixture、stub、dry-run、字符串检查、静态验证或脚手架证据,包装成真实集成、真实副作用、E2E、生产可用或原目标已通过。 18. **Outcome Contract 是读者合同**:新任务存在 `outcome_contract:` 时,review 必须逐条回答 reader questions,handoff 必须呈现判定、证据、边界和下一步;不得用 issue 完成数或实现状态代替能力结论。 19. **人类 handoff 必须经过 `humanizer-zh`**:未在最新 REVIEW notes 记录 `handoff_humanized:true` 时,只能保留 draft,不能通过 handoff contract,不能完成 REVIEW。结构化答案表和 blocked-claim 表不得润色,正文必须润色。 20. **先分类再处置发现**:当前 scope/acceptance gap 现在修或追加正式 follow-up issue;human-required blocker 记录后继续其他可推进项;只有不阻塞当前承诺的改进和未来决策才进入 Deferred Findings ledger。 21. **sidecar 不是第二状态源**:`.deferred.json` 只保存证据和讨论问题,不控制 CSV 行状态,也不得成为关闭当前 issue 的理由。CSV 始终是唯一任务状态源。 22. **完成后停在讨论入口**:原 CSV 和 handoff 闭环后,向用户展示开放的待讨论项并停止。不得自动创建下一份 CSV,也不得把待讨论项追加到当前 CSV 后继续执行。 23. **每个 CSV 都必须有 closing review**:加载合法 CSV 后若没有 `REVIEW-*` 行,先追加 `REVIEW-01`。从所有普通行的 description、acceptance criteria、refs、notes 和已有验证证据构造 review scope,写 `source_csv:`;不存在的 spec、claim ledger 或 outcome contract 保持不存在,不得伪造。 24. **保护用户 index**:开始时记录 `git diff --cached` 的路径与 patch。提交只命名本任务路径;已暂存的无关改动保持原样且不得进入提交。同一路径存在用户已暂存 patch、或无法精确隔离 index delta 时,记录 human-required blocker。禁止用 `git stash`、reset、移动或隐藏用户工作来简化提交。 接收 CSV 后先运行 `python scripts/ensure_review_row.py `。提交边界复杂时使用 `scripts/git_isolation.py` 的 `commit_paths`;它会拒绝同路径 staged 冲突并核对提交前后的 index patch。 # 闭环完成判定 仅当该行同时满足以下四项,才视为「闭环完成」: - `dev_state=已完成` - `review_initial_state=已完成` - `review_regression_state=已完成` - `git_state=已提交` 若 `required_mcp` 非空,但缺少对应证据或受限验收记录,则即使以上四项满足,也**不算闭环完成**。 `REVIEW-*` 行还必须满足: - 已按顺序尝试 `reviewer` 子代理、只读 ephemeral `codex exec`,必要时由主代理完成同一份 self-review - review log 和 CSV `notes` 已记录 `review_agent_mode:`、`review_independence:`、requested/observed model 与 evidence source、实际存在的 ledger、coverage 和 `review_result` - review 结论已经写入 review log - 已产出 human handoff(`.handoff.md`),CSV `notes` 已记 `handoff:`,并已记录 `handoff_contract:passed` 或 `handoff_contract:failed `;若 `review_result:vision_met`,必须是 `handoff_contract:passed` - 若发现当前 scope/acceptance gap,已追加 follow-up issue 和下一轮 `REVIEW-(N+1)` - 若存在开放 Deferred Findings,ledger 已通过 `validate_deferred_ledger.py`,handoff 已逐条覆盖,最新 REVIEW notes 已记录 `deferred_coverage:/` - self-review 已完整分类并处置所有发现时可以闭环;不得仅为等待独立能力而追加空转的 `REVIEW-*` # Artifact root 规则 每个 mission run 的 artifact root 固定为 CSV 所在目录。 - 正式任务:`issues//.csv`,artifact root 为 `issues//` - Legacy 或外部任务:artifact root 仍为显式 CSV 所在目录 - `claim_ledger:`、`deferred_ledger:`、`handoff:`、review log、handoff、兜底文档等相对路径都优先按 artifact root 解析 - `outcome_contract:` 与 CSV 同目录优先解析;它由任务生成端冻结,执行阶段只读,不回写运行答案 - 新产物默认写入 artifact root;多轮 reviewer 原始输出、prompt、jsonl 等噪声文件写入 `reviews/` 子目录 # Issue 选择规则 ## 优先收敛半成品 若存在 `git_state=未提交` 且 `dev_state=进行中` 或 `已完成` 的行,优先选这些。 ## Review 行顺序 `REVIEW-*` 行只在它之前的所有非 review 行都闭环后执行。 如果 `REVIEW-N` 追加了 follow-up issue 和 `REVIEW-(N+1)`,则 `REVIEW-N` 自己正常闭环;执行器继续后续 follow-up issue,之后再执行新的 review 行。不要让旧 review 行保持挂起,也不要回头重开旧 review 行。 ## 再选最高价值项 P0 → P1 → P2;优先能解阻塞/提供公共能力的任务;减少无意义上下文切换。 ## 记录选择原因 选中后在该行 `notes` 追加 `picked_reason:`。 # 执行闭环(每条 issue) 若当前行满足 `id=REVIEW-*` 或 `area=review`,跳到「Vision Review 闭环」。 ## Step 0:接收与现实检查 - 用 1-2 句话重述:当前 issue 的 `id/title`、验收口径、风险点。 - 识别潜在破坏性变更。 ## Step 1:补齐执行信息(硬前置) 编码前必须检查以下字段;正常情况下它们应已在 CSV 生成阶段写好。若缺失或与实际任务边界不符,说明 CSV 不完整,必须**先写回 CSV 再写代码**: - `acceptance_criteria`(必须可验证,最好有复现步骤/阈值) - `required_skills`(frontend/可见 UI 任务必须明确) - `required_mcp`(frontend/可见 UI 任务必须明确) - `review_initial_requirements`(必须可执行) - `review_regression_requirements`(必须可执行) - `test_mcp`(必须明确主验证模式) - `refs`(至少 1 个 `path:line`) ## Step 2:启动状态 - `dev_state` → `进行中` - `review_initial_state` → `进行中` - 写回 CSV(UTF-8 BOM) ## Step 3:上下文收集(最小必要) - 先读取 `required_skills` 中列出的 skill 文档,再开始编码 - 从 `refs` 指向文件开始读 - 用 `ace-tool` 或 `rg` 精确定位关键符号与调用链 - 根据 `required_mcp` 规划证据采集时机,不要拖到最后补跑 - 预算:首次 5-8 次工具调用 - 早停:能明确"要改哪些具体文件/函数"即可进入实现 ## Step 4:实现(按验收口径驱动) 1. **实现前确认**:把 `acceptance_criteria` 拆成可验证的最小变更集合 2. **最小变更设计**:复用既有模式,KISS/YAGNI/兼容优先 3. **编码执行**:单一职责,嵌套 ≤ 3,错误处理到位 4. **实现内循环验证**:在实现过程中就运行最相关的测试,不等到最后 5. **文档/refs 同步**:更新相关文档/注释,新增 `path:line` 追加到 `refs` ## Step 5:Review(两段式) - **初次 Review**:对照 `review_initial_requirements` 自查 → `review_initial_state=已完成` - **回归 Review**:对照 `review_regression_requirements` 执行回归检查;`required_mcp` 中每个工具都要有证据 → `review_regression_state=已完成` - 若回归不可执行:走受限验收(见下方),仍可标 `已完成`,但不得声称测试通过 ## Step 6:自我验收 ### 验证路径选择(管线 vs 模块) 当 `acceptance_criteria` 涉及端到端行为(API 响应、用户可见效果、数据流经多层)时,验证**必须走完整管线**(HTTP 请求 → 中间件 → 业务逻辑 → 数据层),不得通过 import 内部模块绕过中间层。模块化单测可作为补充,不能替代管线验证。 判断标准: - 验收条件提到"跨层数据流"或"用户可见的最终效果" → 走管线 - 验收条件只涉及"函数返回正确值"或"数据结构校验" → 模块化 OK 反例:issue 要求"API 返回正确分页结果",agent 只 import service 函数验证返回值——这绕过了路由、中间件、序列化层,不算验证通过。 ### 验收执行 - 给出"通过/未通过"的证据 - 按 `test_mcp` 运行最相关的测试/检查(见 `test-mcp-mapping.md`) - 对 `required_mcp` 中每个工具都做实际调用,并把证据写入 `notes` - 若无法运行:走受限验收 ## Step 6.5:声明-证据一致性检查 完成前检查当前 issue 的标题、验收条件、测试名、文件/函数名、metadata、报告、CSV notes 和状态更新是否高估了实际行为。 - 如果实际只是 mock / fixture / stub / dry-run / scaffold / 字符串检查 / 静态验证,必须在命名、报告或 notes 中如实限定,不得写成真实完成 - 低等级证据不能支撑高等级声明;例如 unit test 不能证明完整集成,dry-run 不能证明真实发送/迁移/删除,字符串检查不能证明智能评测或真实链路通过 - 测试或外部验证卡住时,走受限验收并继续可推进工作;不要造替代假路径来跑绿 - 若当前 issue 的交付声明已经被证据否定,先修正实现或修正声明,再标记完成 ## Step 7:完成状态并写回 CSV - `dev_state` → `已完成` - `git_state` → `已提交` - `notes` 追加 `done_at:` + `skills_used:<...>` + `mcp_used:<...>` + 验收证据摘要 - 写回 CSV(UTF-8 BOM) ## Step 8:Git 提交 - `git status` / `git diff` 确认变更边界 - 正式 mission:用显式路径加入代码变更和整个 `issues//` 证据集 - 外部 CSV:只加入本任务代码路径,以及已经 tracked 或明确位于 `issues/` 的 CSV/sidecar;ignored 外部工件保持本地,不 force-add - 提交前比较当前 index 与任务开始快照,确认没有无关 staged patch 进入本次提交 - commit message 遵循项目提交约定(` (scope): summary` + Why/Why this works/Remaining 正文) - 若 commit 失败:回滚 `git_state` 为 `未提交`,记录 `blocked:git commit failed <原因>` ## Step 9:立刻继续下一条(强制) 完成一条后: - **立刻回到 Issue 选择规则,选下一条** - **不问"要继续吗?"** - **不做礼貌性停顿** - **不输出非必要的全局状态更新** - **禁止把"已完成 X/Y、结果已同步到 docs/review/csv"当作自然收口点** - **状态更新末行必须写 `continue_now:`;只有全部完成或全部剩余项都需要人类参与时才允许写终态** - **如果做阶段总结,也只能作为 commentary 的短播报,播报后必须继续工具调用** - 只有以下情况才停止: - 所有 issues 闭环完成 - 所有剩余 issues 都是 human-required blockers **干净边界谬误**:不要因为"前 N 条已闭环、第 N+1 条还在进行中"就觉得这是一个适合收口的边界。partial completion (3/9) 是最脏的状态——它强制上下文恢复、浪费用户时间、制造比继续执行更多的混乱。真正干净的状态只有 all-done。在同一个 turn 里混合"已完成"和"进行中"的汇报完全正常,这恰恰是你在正确地持续推进。 # Vision Review 闭环 `REVIEW-*` 行用于判断整批工作是否真正达成批准文档愿景。 同一规则适用于目录化 CSV 与 legacy 平铺 CSV。 ## Review 前置条件 - 当前 review 行之前的所有非 review 行必须闭环完成 - 若前面仍有未完成的普通 issue,先跳过当前 review 行,继续普通 issue - review 不实现功能;review 只审计、记录、追加可执行工作 - review 行必须包含任务专属 claim/evidence 检查项;如果 `review_regression_requirements` 仍是纯通用套话,先回读 `source_doc`、当前 CSV 和交付证据,补齐该行后再执行 review - 若任意行 `notes` 包含 `claims:CLAIM-*` 但没有可读的 `claim_ledger:`,CSV 不完整;先在 artifact root 补齐 `.claims.json` 并写回 `claim_ledger:.claims.json`,不得把 claim id 当作可审计证据 - 若输入 CSV 原本没有 review 行,按硬规则 23 合成 `REVIEW-01`;这类 review 只引用 `source_csv` 和确实存在的 sidecar,不补造 `source_doc`、claim ledger 或 outcome contract ## Review 输入 独立愿景 review 必须基于以下材料: - canonical 任务使用 approved spec;兼容任务使用 `source_csv` 和所有普通行的 scope/acceptance 数据 - 当前 CSV 的全部行和状态 - 确实存在的 claim/evidence ledger、Outcome Contract 和 Deferred Findings ledger;兼容 CSV 缺少这些 sidecar 时保持缺省 - 当前代码 diff / commit 记录 - 测试与 MCP 证据 - 交付物中的声明:文件名、函数名、测试名、metadata、报告、CSV notes、状态更新和 commit message - 已存在的 review log 不要把当前会话里的主观总结当作唯一依据。 ## Review 执行 ### Review capability 阶梯 按顺序选择第一条可执行路径,并把选择结果写入 review log 与 CSV `notes`: | 优先级 | 模式 | 记录值 | 独立性 | 要求 | |--------|------|--------|--------|------| | 1 | 当前会话派发注册的 `reviewer` 子代理 | `review_agent_mode:reviewer-subagent` | `review_independence:true` | 请求 `gpt-5.6-sol` high;只读;prompt 不含主代理结论;禁止再委派 | | 2 | `codex exec --ephemeral --json -m gpt-5.6-sol --sandbox read-only` | `review_agent_mode:codex-exec-independent` | `review_independence:true` | 用 `shutil.which("codex")` 解析平台 launcher;由独立 exec 会话完成完整 vision review | | 3 | 主会话按同一 prompt 自审 | `review_agent_mode:self-review` | `review_independence:false` | 只在前两项失败时使用;如实记录 capability failure,但完成的 self-review 可以闭环 | `codex review` 只能补充 Git diff 证据,不是 closing mode。运行过 diff-only review 后,仍要走上述阶梯完成 vision review。 用 `scripts/run_vision_review.py` 执行第 2 项;脚本找不到 CLI 或调用失败时,记录原因并进入 self-review。 脚本用法(路径相对本 skill 目录): ```bash python scripts/run_vision_review.py \ --csv \ --source-doc \ --claim-ledger \ --outcome-contract \ --deferred-ledger \ --review-log .review.md \ --output reviews/review-01.json \ --handoff .handoff.md \ --workdir \ --model gpt-5.6-sol ``` 兼容 CSV 没有 source doc 时省略 `--source-doc`。脚本成功时输出 review JSON;把 JSON 摘要写入 review log,并把 `review_json:`、mode、independence、requested/observed model、model evidence、coverage、result 和必要的 `validation_limited` 写入 CSV `notes`。脚本失败不等于 review 完成:记录失败原因后进入 self-review。 ### Reviewer prompt 硬要求 reviewer prompt 必须明确写入: - 独立路径固定请求 `gpt-5.6-sol`;requested model 与 observed model 分开记录 - observed model 只能来自 host/session metadata 或 CLI JSON event stream。reviewer 文本和 review JSON 自报的模型不算证据 - 只基于批准文档或原始请求、CSV、claim/evidence ledger、diff/commit、测试/MCP 证据、交付物声明和 review log - 不信任主 agent 的结论性总结 - 不为了找问题而找问题;只有可证伪差距才算 gap - 每个 gap 必须包含 `source_ref`、`evidence_ref`、`why_it_matters`、`suggested_followup_issue` - 必须检查声明与证据等级是否一致,尤其是替代验证是否被包装成原目标通过 - 每个发现先分为 `current-scope gap`、`human-required blocker`、`deferred_improvement` 或 `future_decision` - `current-scope gap` 只能进入 `gaps`,不得延期;后两类写入 `deferred_findings`,按语义和证据去重,不得自动变成 follow-up issue 输出结论必须分为三类: - `vision_met`: 已达成批准文档愿景 - `gaps_found`: 仍有差距 - `limited_review`: 证据不足,无法判断当前承诺是否达成 将本轮结论写入 `.review.md`,与 CSV 同目录。若同时保存 reviewer 原始 JSON、JSONL 或 prompt,写入 artifact root 下的 `reviews/`。 ## Human Handoff 产物 REVIEW 行执行后,必须产出一份面向人类的交接文档 `.handoff.md`,与 CSV 同目录同前缀。 ### 定位 handoff 是**施工交工单**——用户隔一段时间回来打开它,能还原"这轮干了什么、干成什么样、还剩什么"的完整画面,不需要翻 CSV、不需要翻 claims.json、不需要翻 git log。 它与 review.md 分工不同: | 文件 | 读者 | 目的 | 写法 | |------|------|------|------| | `review.md` | reviewer / 下一轮 review / agent | 证明审过什么、有没有 gap | 结构化审计日志,可以用内部编号 | | `handoff.md` | 人(决策者) | 跨 session 一眼看懂做了什么、没做什么、下一步 | 跟 spec 同风格的大白话叙事 | ### 内容结构(必须按此顺序) #### 第一层:先看结论(3 秒读完) 一段话,用大白话说清楚: - 这轮执行的是哪篇 spec / 设计文档 - 整体判定是 `pass / fail / partial / unknown / not_run` 中的哪一个 - 什么决定性结果或第一处失败支撑这个判定 - 最重要的一条 blocked claim 是什么 示例风格: > 本轮实现了 Memory Foundation 设计里的五项核心能力中的四项。MemoryRecord 入库、状态机流转、Consolidator 事件消费、检索注入都已完成并通过测试。L3 playbook 自动提炼降级为 proposed-only,因为多证据融合算法 spec 没给具体规则,当前只标记 eligibility 不自动 activate。 #### 第二层:这份交工单告诉你什么 用一段话说明 handoff 的角色、证据输入、读者和边界:它解释 spec、代码、测试、trace、score 和 review 证据,但不生产运行结果、不覆盖 canonical scorer,也不把“代码完成”写成“能力已证明”。 #### 第三层:你现在可以确定什么(30 秒浏览) 逐条呈现 Outcome Contract 的 reader questions,不暴露 `OUTCOME-*` id,也不改写问题文本: | 你关心的问题 | 判定 | 直接答案 | 关键证据 | 可信度 | 结论边界 | 下一步 | |---|---|---|---|---|---|---| 答案判定只允许 `pass / fail / partial / unknown / not_run`;可信度只允许 `high / moderate / low / unknown`。每个问题必须有证据引用、边界和下一步。没有证据时写 `unknown` 或 `not_run`,不能猜。 这一张表由 review JSON 机械渲染。问题、判定、直接答案、证据(多个引用用 `; ` 连接)、可信度、边界和下一步必须与 review JSON 逐字段一致。 #### 第四层:决定整体状态的结果 说明成功条件、本轮实际到达的最后正常阶段、第一处失败或证据缺口,以及整体判定。必须分开实现状态、验证状态和能力结论。 #### 第五层:目前仍不能声称什么 逐条呈现 Outcome Contract 的 blocked claims: | 不能声称的结论 | 原因 | 解除条件 | |---|---|---| `partial`、`unknown`、`not_run` 不得在总结中合并成 pass 或“能力完成”。 表中的 claim、原因和解除条件必须与 Outcome Contract 逐字段一致。 #### 第六层:spec 目标逐条对账 以 spec 定义的能力/目标为单位(不是 CSV 行号),用表格或编号清单列出每项: | spec 目标 | 状态 | 实际效果 | 备注 | |-----------|------|----------|------| | 用 spec 自己的语言描述这项能力 | 完成 / 部分完成 / 降级 / 未开始 | 一句话说改完之后系统行为有什么不同 | 如果降级或未完成:为什么、差什么 | 规则: - 目标描述从 spec 文档提取,用 spec 自身的表达方式(不是你自己编的抽象) - 但如果 spec 原文太长或太散文化,提炼为一句话 - "实际效果"必须从用户/产品视角写,不是从代码视角——说"搜索现在能找到联系人邮箱了"而不是"research_contacts 返回非空 list" #### 第七层:施工细节 按模块或功能区域组织(不是按 CSV 行号),每块覆盖以下角度(有什么写什么,不强制每块都写全): - **改了什么**:碰了哪些文件/函数,改之前怎样、改之后怎样 - **行为场景**:给一个具体的用户操作场景说明效果。格式:"你在前端做 X → 系统现在会 Y → 以前是 Z"。让读者有画面感,能直接去试 - **踩了什么坑**:执行过程中发现的问题、根因是什么、怎么修的 - **做了什么决策**:spec 没明确说但执行时必须选择的点,选了什么、为什么 - **意外发现**:spec 没预料到但执行时撞上的东西(设计缺口、隐含假设、产品疑问)。这类信息对 spec 作者特别重要 - **质量判断**:这块代码是扎实的还是凑合能用的?哪里是薄弱点、后续可能还要投入?诚实评估 - **集成影响**:这次改动对已有功能的副作用——碰了什么共享接口、改了什么公共逻辑、可能影响哪些既有行为 - **产品洞察**:站在实现者角度看到的产品设计问题或改进机会。spec 阶段想不到的东西,实操才能发现 用对照表或箭头流程图让变更可视化,示例: ```text 改之前:聊天 runtime 没有注入 store → remember_user_memory 报错 改之后:main.py:112 暴露 store → chat.py:172 注入 → 工具正常写入 ``` ```text 行为场景:你在聊天里说"记住,报价加 5%" → 系统调用 remember_user_memory 写入 /memories/sop/pricing.md → 下次新对话问"我的报价规矩是什么",系统自动读取并回答 → 以前:工具报错 "store is required in RunnableConfig.configurable" ``` **数据流 / 架构变更必须配 mermaid 图** 当本轮变更命中以下任一情形,第三层必须额外配 mermaid 图,而不是只用文字描述: - 数据流经多层(请求 → 中间件 → 业务 → 数据层)发生改变 - 模块/文件之间的调用关系被新增、删除或改向 - 架构边界调整(职责从 A 搬到 B、某层被降级或升格) 规则: - **最多两张**:一张"改之前"、一张"改之后",让读者用 diff 视角一眼看出变更骨架。只动一处时画一张即可。 - 图只画与本轮变更相关的节点和边,不画整个系统全景——全景会淹没变更点(与"靶向展开:一条链不答一张图"一致)。 - 图必须落点到变更:改后图里要能指出"哪个节点/哪条边是这轮动的",用标签或虚线标出来。 - 纯文案、单函数内部逻辑、不涉及跨文件/跨层关系的改动,不强制画图——数据源薄就如实写薄,不为凑可视化硬画(与下方风格硬规则第 6 条一致)。 - **降级**:mermaid 语法写不出或渲染失败时,回退到上面的 ASCII 箭头块,不阻塞 handoff 落盘、不阻塞 mission 闭环(handoff 永远不比代码交付优先)。 示例(改后数据流,虚线 = 本轮新增的边): ```mermaid flowchart LR A[main.py:112 暴露 store] --> B[chat.py:172 注入] B -.本轮新增.-> C[remember_user_memory 正常写入] ``` #### 第八层:验证情况 - 跑了什么测试、结果如何(精简,一两行够了) - 哪些验证是降级的(没跑真实服务、缺凭证等),如实说 - 不要把这部分当主角——前三层才是重点 #### 第九层:后续可操作 - **还剩什么**:未完成项、需要产品决策的点、已知限制 - **阻塞/配置**:如果有需要用户动手的事(配置凭证、启动服务、审批、购买),明确列出解除条件 - **怎么复现**:如果用户想自己验证,给完整的 E2E 步骤(启动什么、输入什么、期望看到什么) - **去哪看**:如果有可观测数据(监控面板、trace 系统、日志、DB 查询),告诉用户地址和过滤条件 这一层是泛用的——有什么写什么,没有就不写。不要硬编码特定工具名称。 若 Deferred Findings ledger 中存在 `status=open` 的记录,必须在“后续可操作”之前增加独立的 `## 待讨论` 章节: - 每条开放记录都用自然中文说明“发现了什么、证据是什么、为什么不阻塞本轮、需要用户决定什么”。 - 每条正文前保留隐藏标记 ``,用于机械覆盖检查;可见标题和正文不得出现 `DF-001`、`deferred_improvement`、snake_case 等内部审计文本。 - 不得把当前 scope/acceptance gap 写进该章节。未完成的当前承诺仍放在“还剩什么”,并由正式 follow-up issue 负责。 - machine ledger 不经过 `humanizer-zh`;handoff 的可见正文必须经过 `humanizer-zh`。隐藏标记、trace id、路径和结构化证据不得改写。 ### 风格硬规则 1. **以 spec 目标为锚**:结构跟着 spec 走,不跟着 CSV 行号走,不跟着 CLAIM 编号走 2. **自包含**:不引用 CLAIM-XXX 编号,不说"见 claims.json"。所有信息必须内联展开,读者不需要打开任何其他文件 3. **跟 spec 同风格**:用对照表、结论句、箭头流程图或 mermaid 图(数据流/架构变更优先 mermaid)。先说结论再说细节。术语第一次出现时用括号解释它是什么 4. **大白话优先**:先说产品效果("用户记忆现在跨项目可读了"),再说技术路径(`user_memory.py:51 namespace 没有 project_id`) 5. **不写审计话术**:禁止 "scope checked" / "evidence checked" / "claim coverage" / "vision_met" 这类 review 模板用语。这些属于 review.md,不属于 handoff 6. **详细但不冗余**:每项覆盖完整,但每条精炼。同一事实不换三种说法重复。数据源薄就如实写薄,不编造篇幅 7. **诚实标注不确定性**:降级了就说降级了,没验证就说没验证。不用漂亮话包装 ### 生成规则 - 走脚本(第 2 项)时,传 `--handoff `,让 reviewer 在同一次 pass 里产出 `handoff_markdown` 草稿。 - 走注册 `reviewer` 子代理(第 1 项)时,prompt 必须要求返回 `handoff_markdown`,并传入上述结构和风格规则。 - 走 self-review(第 3 项)时,handoff 顶部必须写 `WARNING: self-review only, NOT independently verified`,记录 `review_independence:false`,不得让自评看起来像独立结论。 - handoff 是**只读派生产物**:内容来自 source doc / CSV / review JSON / 代码实际状态,禁止手工编辑;要改内容就重跑 review 重新生成。 - handoff 内容硬约束:每句话必须可追溯到上述数据源,禁止用固定模板或漂亮话填充篇幅(与项目硬门禁"不得用输出修补伪装能力"一致);数据源薄就如实写薄,不许编。 - 生成后在 REVIEW 行 `notes` 追加 `handoff:`。 - 合并 reviewer 新发现到 `.deferred.json`:只接受 `deferred_improvement` / `future_decision`,按“含义 + evidence_refs”去重,分配稳定 `DF-NNN`;在来源 CSV 行 notes 写 `deferred_findings:`。 - 先运行 `python /scripts/validate_deferred_ledger.py --workdir `。失败时修 ledger 或 notes,不得继续做 handoff contract check。 - handoff 完成后在最新 REVIEW notes 回填 `deferred_coverage:/`。 - **落盘后必须跑 handoff contract check**(机械验收,不信 reviewer 自报): - 运行 `python /scripts/check_handoff_contract.py --csv `。 - contract check 会确认 `.handoff.md` 命名、REVIEW notes 的 `handoff:`、markdown 骨架;存在开放 Deferred Findings 时,还会逐条核对隐藏标记、`deferred_coverage` 和 `handoff_humanized:true`。 - 新任务存在 `outcome_contract:` 时,CSV notes 还必须有 `review_json:` 和 `handoff_humanized:true`;contract check 会校验 contract schema、review JSON 自洽性、每个 reader question/blocked claim 与 handoff 表格逐字段一致、核心语义章节与答案列齐全。缺任一项均失败。 - 退出码 0 = 通过;在 REVIEW 行 `notes` 追加 `handoff_contract:passed`。 - 退出码 1 = 不合格:如果是路径或 notes 缺失,先修正 CSV notes 后重跑;如果是 markdown 残件,**重生成一次** handoff 后重跑。 - 重试后仍失败:在 REVIEW 行 `notes` 追加 `handoff_contract:failed <缺项>`。允许代码交付继续收口,但不得把本轮 review 写成 `vision_met`,最终回复必须明说 handoff 不合格,不能声称"handoff 已完成"。 ### humanizer-zh 后处理(必须) reviewer 产出的 `handoff_markdown` 是草稿,落盘前**必须**经过 humanizer-zh 处理。目的是去除 AI 生成痕迹,让文档读起来像人写的。 流程: 1. reviewer 产出 `handoff_markdown` 草稿(信息完整性由 reviewer 保证) 2. 主 agent 调用 `humanizer-zh` skill 对草稿进行语言润色 3. 润色后的版本才是最终 handoff,写入 `.handoff.md` Outcome answer 表、blocked claim 表、Deferred Findings 隐藏标记、trace id 和结构化证据属于机械字段隔离区,`humanizer-zh` 不得改写;只润色可见说明文字。否则 handoff 无法与 review JSON / Outcome Contract / deferred ledger 对账,contract check 必须失败。 润色规则以 humanizer-zh skill 本身为准。 若 humanizer-zh 不可用(skill 未安装或调用失败): - 只允许把原稿保存为 `.handoff.draft.md`,不得覆盖正式 `.handoff.md` - 在 REVIEW 行 `notes` 追加 `handoff_humanized:false; blocked:humanizer-zh unavailable` - `check_handoff_contract.py` 必须失败,当前 REVIEW 不得标记完成、不得写 `vision_met` - humanizer-zh 恢复后,从 draft 重新执行润色、写正式 handoff,并把 notes 更新为 `handoff_humanized:true` ### handoff 生成失败的降级(反卡死) 若脚本 / reviewer 未能产出 `handoff_markdown`(输出截断、JSON 不合法等): - 在 REVIEW 行 `notes` 记 `handoff:generation_failed `。 - 主 agent 用 review JSON + CSV + 代码现有数据,按上述内容结构手动渲染一份兜底 handoff,顶部标 `WARNING: auto-generation failed, rendered by main agent as fallback`。 - 兜底草稿仍必须经过 humanizer-zh,机械字段隔离规则不变。处理后写入 `.handoff.md`,并在 REVIEW 行 `notes` 追加 `handoff:; handoff_humanized:true`。 - 随后运行 `check_handoff_contract.py`。若生成或 humanizer 仍失败,当前 REVIEW 保持未完成,不得静默降级为合格 handoff。 ## 发现问题时 先分类,不能把不同性质的问题混成一批 follow-up: | 分类 | 判断标准 | 处置 | |------|----------|------| | `current-scope gap` | 违反 source doc、当前 issue acceptance criteria、生产接线要求或声明-证据合同 | 现在修;无法在原行修完时追加正式 follow-up issue 和下一轮 REVIEW,继续执行 | | `human-required blocker` | 只有用户或外部主体能提供授权、凭证、付费/业务决定或不可逆操作 | 记录 blocker,继续其他可推进行;全部剩余项都属于此类时才停 | | `deferred_improvement` | 当前承诺已经满足,但观察到范围外的质量、评估或架构改进 | 写入 deferred ledger,不追加 issue | | `future_decision` | 当前承诺已经满足,但后续产品或架构存在真实取舍,需要用户决定 | 写入 deferred ledger,不追加 issue | 拿不准是否属于当前范围时,回读 source doc、Outcome Contract 和 acceptance criteria。证据不足不能成为延期理由;只要可能影响当前承诺,就按 `current-scope gap` 处理。 若结论为 `gaps_found`,只把其中的 `current-scope gap` 转成执行工作: 1. 将每个差距转换为新的 follow-up issue,追加到当前 CSV 尾部 2. 再追加下一轮 review 行:`REVIEW-(N+1)` 3. 当前 `REVIEW-N` 标记为闭环完成 4. 提交当前 CSV、review log,以及必要的文档更新 5. 继续执行刚追加的 follow-up issue,不等待用户 `deferred_improvement` 和 `future_decision` 进入 `/.deferred.json`。在发现它的 CSV 行 notes 追加 `deferred_ledger:; deferred_findings:`。同一问题跨 issue 或 review 重复出现时更新原记录的 `source_issue_ids` / `evidence_refs`,不得重复造 id。 追加后的顺序示例: ```text ISSUE-01 ISSUE-02 REVIEW-01 FOLLOWUP-01 FOLLOWUP-02 REVIEW-02 ``` ## Human-required blockers 只有人类不可替代时才停止。 允许停止的情况: - 需要破坏性或不可逆授权:删除用户数据、重置数据库、强制覆盖用户未提交改动、修改或泄露密钥 - 缺少 agent 无法获取的外部凭证、账号、权限、付费决策、法律/安全/业务决策 - 必需的第三方或人工动作位于工作区外,agent 无法完成 - 继续执行会要求伪造证据、凭证、数据或用户意图 其他问题不一定要扩张当前 CSV: - 架构分歧 - 范围细节不清 - 产品细节不完整 - 实现路线不确定 - review 发现不影响当前承诺的质量改进或未来决策 处理方式: - 在 review log 写 `Assumption` / `Decision Debt` / `Risk`,并记录 Deferred Findings 摘要 - 在 CSV notes 写 `assumption:<...>`、`decision_debt:<...>`、`risk: <...>` 或 `deferred_findings:` - 选择最小可逆路径 - 只有 current-scope gap 才追加 follow-up issue - 继续执行 ## Review log 格式 文件:`.review.md` - `issues//.csv` → `issues//.review.md` - Legacy: `issues/.csv` → `issues/.review.md` - External: `/.csv` → `/.review.md` 每轮追加: ```markdown ## REVIEW-N - Source doc: - Review agent: reviewer-subagent | codex-exec-independent | self-review - Review independence: true | false - Review requested model: gpt-5.6-sol - Review observed model: - Review model evidence: session-metadata | event-stream | parent-runtime | unknown - Scope checked: - Evidence checked: - Claim coverage: complete | gaps | unknown - Claim/evidence alignment: matched | mismatches found | limited - Limited validation honestly reported: yes | no | not_applicable - Handoff humanized: true | false - Result: vision_met | gaps_found | limited_review - Gaps: - Follow-up issues added: - Assumptions: - Decision debt: - Deferred findings: - Human-required blockers: ``` ## Review 行闭环 `REVIEW-N` 只有在 review log 已写入、handoff.md 已生成(或已记 `handoff:generation_failed` 并产出兜底)、且 handoff contract check 结果已写入 notes 后才能完成: - 若 `vision_met`:必须同时满足 `handoff_contract:passed`;标记 `REVIEW-N` 完成,若无其他未完成行则结束 CSV。开放 Deferred Findings 只进入 handoff 的“待讨论”,不阻止 `vision_met` - 若 `gaps_found`:把其中的 current-scope gaps 追加为 follow-up issue,再追加 `REVIEW-(N+1)`;标记 `REVIEW-N` 完成并继续 - 若 `limited_review` 且没有可执行 gap:标记当前 review 行完成,并如实记录缺失证据;不得仅为等待独立能力变化追加 `REVIEW-(N+1)` - 若存在 human-required blocker:记录 blocker,保持 `git_state=未提交`,停止并请求最小必要输入 # 反暂停护栏 以下情况一律不构成停止条件: - 完成某个里程碑或阶段切换 - 刚写完 CSV / log / checkpoint - 想先同步阶段进展、风险或现状 - 刚完成 `X/Y` 条,结果和证据看起来已经足够形成阶段汇报 - 下一条 issue 更复杂、更脏、更难测 - 当前 issue 部分阻塞,但还有其他 issue 可推进 - 测试存在既有失败,但当前 issue 仍可受限验收或切下一条 - **修复了 issue 内的子问题(blocker / 中间 bug)后拿到了阶段性证据**——这不是汇报点,直接继续该 issue 的下一步验证 - `REVIEW-*` 发现 current-scope gap 且可以追加 follow-up issue - review 发现架构、范围、产品或实现路线存在普通歧义 若你准备输出阶段总结,先做以下停止断言: 1. 剩余 issues 是否全部闭环完成? 2. 是否所有剩余项都属于 human-required blockers? 3. 是否继续执行会要求伪造证据、凭证、数据或用户意图? 只要以上三问都不是“是”,就不得停止,必须继续 issue loop。 # 受限验收 测试跑不起来 ≠ 阻塞,但也不是免责卡。 ## 受限验收的触发门槛 受限验收**只适用于客观不可达**——即 agent 穷尽自身能力后仍无法完成的情况: - 需要用户付费、签约、或购买外部服务 - 需要用户提供凭证、账号、OAuth 授权 - 需要人工审批、物理操作、或第三方人员配合 - 外部服务不存在、已下线、或在当前网络不可访问 以下情况**不构成受限验收理由**,agent 必须自行解决: - 缺依赖 → 自己安装(pip install / npm install / 创建虚拟环境) - 缺环境配置 → 自己创建(.env 模板、docker compose、test fixtures) - 本地服务未启动 → 自己启动(后端、数据库、worker) - 测试框架未配置 → 自己配置(pytest.ini、jest.config) - E2E "太复杂" → 不是理由;本地可达的服务必须实际调用 ## 判定 few-shots | 场景 | 正确做法 | |------|----------| | 缺 pytest 依赖 | `pip install pytest` 然后跑测试,正常闭环 | | 本地后端没启动 | 启动后端,调 API,正常闭环 | | issue 要求验证发送真实邮件,但没有 SMTP 凭证 | 受限验收:记录客观不可达原因,最大限度跑完其余测试后闭环 | | issue 要求 E2E 但 agent 觉得麻烦 | **违规**。必须实际执行,不得以复杂为由跳过 | ## 受限验收时的记录要求 若确认为客观不可达,允许继续提交,但必须在 `notes` 记录: - `validation_limited:<客观不可达的具体原因>` - `validation_gap:<原始验收目标> | <实际完成的替代验证> | <未验证的差距>` - `manual_test:<用户拿到凭证/服务后可执行的命令/步骤>` - `mcp_evidence: <已完成的替代检查或跳过原因>` - `evidence:<已完成的替代验证>` - `risk: <说明>` **最大限度原则**:即使某一环节客观不可达,agent 仍必须把可达的部分全部跑完。例如:无法验证真实邮件发送,但必须验证邮件模板渲染、参数组装、API 调用逻辑(mock 外部网关即可)。 禁止声称"测试通过"。交接必须明确"未运行哪些测试/为何未运行"。 受限验收只能证明已完成的替代范围,不能冒充原验收目标通过。 只有当跳过测试会要求伪造证据,或剩余路径需要人类授权/凭证/外部动作时,才按 human-required blocker 处理。 # 阻塞策略 允许跳过,但必须回收: 1. 在该行 `notes` 记录 `blocked:<原因>` + 已排查内容 + 下一步建议 2. 状态保持真实进度,`git_state` 必须保持 `未提交` 3. **允许切到下一条继续推进** 4. 只有当所有剩余 issues 都是 human-required blockers 时,才停止并汇总阻塞清单,向用户请求最小必要信息 5. 普通架构、范围、产品、实现歧义不算 blocker;记录 assumption / decision_debt / risk 后继续 # 停止条件(严格) | 条件 | 动作 | |------|------| | 全部闭环完成 | 输出最终汇总,停止 | | 全部剩余项都是 human-required blockers | 输出阻塞清单 + 需要的最小决策信息,停止 | | 部分完成、部分待做 | **继续** | | 单条阻塞 | 跳到下一条,继续 | | 已完成 `X/Y` 并已同步阶段成果 | **继续** | | 阶段切换 / checkpoint 完整 | **继续** | | 想先做阶段汇报 | **继续** | | Review 发现当前 scope/acceptance gap | 追加 follow-up issue 和下一轮 review 后继续 | | Review 发现范围外改进或未来决策 | 写 deferred ledger,继续;整批完成后在 handoff 展示并停止 | | 测试环境慢 | 等,不跳过 | | 小歧义 | 合理假设,记 notes,继续 | | 人类不可替代阻塞 | 问用户确认后继续 | 其他情况一律继续。不要把控制权还给用户。 # 反模式清单(Red Flags) 以下想法出现时,说明你正在合理化一个不该发生的停顿: | 你的想法 | 现实 | |----------|------| | "这个 blocker 修好了,先汇报一下再继续" | 修好 blocker 是 issue 内的中间步骤,不是停止点。继续跑下一步验证。 | | "拿到了阶段性证据,可以做个 checkpoint" | checkpoint 写进 notes 即可,不需要把控制权交还用户。 | | "已经做到 6/14 了,先发阶段汇总比较整齐" | `X/Y` 进度不是 handoff 条件。写进 notes/commentary 后立刻继续。 | | "这行 issue 还没闭环,所以不能提交" | 如果 blocker 已修且验证通过,继续推进到闭环再提交。不要因为"还没全做完"而卡住。 | | "下一步更复杂,先确认一下方向" | 合理假设,记 notes,继续。只有真正的破坏性操作才需要确认。 | | "CSV 状态和 commit 边界不一致" | 这是你继续推进到闭环的理由,不是停下来的理由。 | | "用户问我为什么停/做到哪了,先完整回答完这一轮" | 可以简短回答,但回答本身不是退出执行态的许可。答完后必须在同一 turn 继续工具调用。 | | "输出完状态更新模板后,这轮对话可以结束了" | 状态更新是内联 commentary,不是 turn 终点。写完 `continue_now` 后必须在同一 turn 内继续工具调用。 | | "前 N 条已闭环,先整齐收口再继续" | 这是干净边界谬误。partial completion 是最脏的状态——强制恢复上下文比继续执行代价高得多。混合汇报"已完成"和"进行中"完全正常。 | | "工作区有用户的未提交改动和我的改动混在一起" | 用显式 task paths 和 index 快照隔离;禁止 stash。若同一路径无法隔离,记录 human-required blocker。 | | "review 发现架构问题,先问用户" | 先判断是否影响当前承诺。影响就追加 follow-up;不影响就写 deferred ledger,整批完成后再讨论。 | | "review 行没写 review 模式也可以执行" | 不可以。先补齐 `review_agent_mode:pending`、`review_independence:pending` 和任务专属 claim/evidence 条件,再执行 review。 | | "当前会话没有 `reviewer` 子代理,所以只能停下" | 不对。先尝试只读 ephemeral `codex exec`;失败后主会话完成 self-review。 | | "`codex review` 已经跑过,所以愿景 review 完成" | 不够。`codex review` 只审 diff,不能替代 spec/CSV/claim ledger 对账。 | | "self-review 不能闭环,所以要等用户手动 /review" | 不对。完整 self-review 可以闭环,但必须记录 `review_independence:false`,不得冒充独立结论。 | | "替代测试跑绿了,可以说原目标通过" | 不可以。替代测试只能证明替代范围;原目标没验证就写受限验收。 | | "名字/报告写得强一点没关系" | 不可以。文件名、测试名、metadata、报告和状态更新都是声明,必须和实际行为一致。 | | "REVIEW 行是通用模板,也能审" | 不够。先从源文档/原始任务补齐任务专属 claim/evidence 检查项。 | | "发现前置 issue 有错,需要先解释根因再继续" | 修掉错误、记 notes、继续——全在同一 turn。"解释根因"是内联 commentary,不是交出控制权的理由。 | | "继续说'通过'会变成错误陈述,所以先停下来" | 正确做法:不说通过,写 `validation_limited` + 三元组,然后继续下一条。诚实标注和停止是两件事——前者是义务,后者需要满足停止条件。 | | "发现既有债务混在我的改动里,不确定怎么归类,先停下来说清楚" | 用 `git diff` 区分引入 vs 既有;既有债务记 `decision_debt:`;自己引入的修掉;然后继续。 | # 状态更新格式 > **关键语义**:状态更新是内联 commentary,不是 conversation turn 的终点。 > 输出完这段文本后,你必须**在同一个 turn 内立刻继续工具调用**,不得等待用户回复。 > `continue_now` 行不是"告诉用户下一步",而是**你自己的执行指令**——写完它就去做。 每完成一条: ``` [] — done - 变更: <关键文件 path:line> - Skills: <required_skills / 实际使用> - MCP: <required_mcp / 实际证据摘要> - 测试: <跑了什么,结果> - Commit: <hash> - 进度: X/Y 已完成 - continue_now: <next id/title> 或 "全部完成" → 立刻执行 continue_now 指向的下一条,不等待用户 ``` 阻塞时: ``` [<id>] <title> — blocked - 原因: <why> - 已尝试: <what> - MCP: <哪些 required_mcp 已跑 / 哪些受限> - 需要: <最小信息> - continue_now: <下一条 unblocked issue> 或 "全部剩余项都需要人类参与" → 若非"全部剩余项都需要人类参与",立刻执行 continue_now 指向的下一条 ``` # 提交前自检清单 - 验收口径有可复现证据 - `required_skills` 已读取且 `required_mcp` 已逐项落证 - 若受限验收:notes 已写 `validation_limited/manual_test/mcp_evidence/evidence/risk` - 声明-证据一致性已检查:没有把 mock、fixture、dry-run、字符串检查或静态验证包装成原目标通过 - `review_initial_state` 与 `review_regression_state` 均已推进 - 正式 `issues/<stem>/` 证据集与代码按显式路径提交;外部 ignored 工件保持本地,状态枚举值合法 - index 与任务开始快照对比完成,无关 staged patch 未进入提交;未使用 `git stash` - 文档/注释/refs 已同步 - commit message 遵循项目提交约定 - 无无关改动混入