From 3bebe3ba775c6a5ca3a21e54b7dd8a6e8a90cc75 Mon Sep 17 00:00:00 2001 From: graphlemon Date: Tue, 4 Aug 2026 00:20:42 +0800 Subject: [PATCH] graphlemon: auto-commit uncommitted changes for 45aaac1b-5299-48ca-bd6f-1783326368d4 --- docs/development-plan.md | 31 +++++++++++++++++++++++++++++++ docs/sdd/unit_matrix.json | 31 ++++++++++++++++++++----------- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/docs/development-plan.md b/docs/development-plan.md index c885085..28a091e 100644 --- a/docs/development-plan.md +++ b/docs/development-plan.md @@ -487,3 +487,34 @@ PH0-PH5(45 个 Unit)全部完成、U-042 真实自举压测进行中期间ï¼ **实现**:新增 `src/task_execution.py`——`run_or_resume_task_lifecycle()` 按 `task.status`(`queued`/`planning_brd_prd_sdd`/`coding`)跳过已经真实产出 artifact 的阶段,只重新触发还没跑的阶段;`start_task_execution_in_background()` 起一个独立 daemon 线程、开自己的 sqlite 连接(复用 `scheduler.run_goal_to_completion` 同样的"每线程一个连接"理由)跑到底,成功/失败都走 `scheduler.finish_task_lifecycle` 收尾,跟被调度器正常调度的任务落到同样的终态;`request_pause()` 只允许从 `planning_brd_prd_sdd`/`coding`(真的有阶段在飞)转 `blocked_pending_human`。HTTP 新增 `POST /api/tasks/:id/execute`、`/pause`、`/stop`,并把 `/route` 的 `manual_resume` 分支扩展成:如果暂停/停止前的 `blocked_reason` 是 `user_paused`/`user_stopped`,状态一旦被还原到 `queued`/`planning_brd_prd_sdd`/`coding`,就自动重新 spawn 后台执行线程,而不只是把状态字段翻回去——否则用户点"继续"以为任务会继续跑,实际上还要再点一次"开始",体验上等于没修。系统级阻塞(`loop_limit_reached`/`budget_exceeded`)的 `manual_resume` 行为不变,仍然只翻状态。`v_task_detail` 按 `task.status` 三选一显示"开始"/"暂停+停止"/"继续执行"按钮;`v_dashboard` 只加了一个轻量"开始"(不需要 Pause/Stop 的状态判断)。 - **实现过程中发现并修复一个真 gap**:`backend_server.create_server()` 本身从未把 `db_path` 存到 `server` 对象上——之前所有请求处理器共用 `server.conn` 一条连接即可,这次新增的后台执行线程需要开自己独立的连接(不能跨线程共享 `server.conn`),发现这个字段根本不存在。补上 `server.db_path = resolved_db_path`。 - **验证方式**:`src/test_task_execution.py`(14 个用例,覆盖 resume-from-每个可恢复状态、暂停信号的时序竞争、`request_pause` 的状态校验)、`src/test_backend_server.py` 新增 `TaskExecutionRouteTest`(8 个真实 HTTP 路由用例,`start_task_execution_in_background` 用 mock 隔离——它会真的开线程、真的对 `:memory:` 测试库开一条独立连接从而连到另一个空库,这类更底层的时序机制已经在 `test_task_execution.py` 里用真实临时文件库验证过,HTTP 层只验证接线:调用参数、状态码、`manual_resume` 是否按 `blocked_reason` 正确决定要不要自动续跑)。对着真实运行的服务器用 `curl` 走了一遍 `/execute`(非 `queued` 任务返回 409 `TASK_NOT_QUEUED`)、`/pause`(`queued` 任务返回 409 `TASK_NOT_PAUSABLE`;`coding` 任务成功转 `blocked_pending_human`/`user_paused`;重复 pause 返回 409),以及 `frontend/app.js` 实际下发的按钮 HTML。`src/` 全量 496 个测试全绿(新增 22 个:14 + 8)。 + +--- + +## 6. 文档一致性核查记录(2026-08-04):development-plan.md / unit_matrix.json / git log 三方核对 + +**任务背景**:本文档从 2026-07-31 起积累了大量事后补记的"实现补充"/"真实 bug"段落(按日期戳记录真实进展),但机器可读的 `docs/sdd/unit_matrix.json` 的结构化 `meta.revisions`/`units[].done`/`classification_summary` 字段没有随之同步更新——本文档的叙述性文本才是真相来源之一,`unit_matrix.json` 是它的镜像,两者一度出现了漂移。本节是一次纯文档核查任务的记录,**不修改本文档前面任何既有章节的叙述**(append-only),核查结论已同步落到 `docs/sdd/unit_matrix.json`(version v1.0→v1.1)。 + +### 6.1 核对方法 + +以 `git log --oneline`(135 条提交,覆盖 U-001~U-043 全部 Unit 提交、多条 `U-0XX fix:`/`U-0XX follow-up:` 真实 bug 修复提交、以及第 5/5.1 节两项控制台功能扩展提交)为最终事实来源,逐条核对: +1. `unit_matrix.json` 的 `meta.revisions` 数组是否完整记录了本文档每一轮事后补记; +2. `unit_matrix.json` 每个 Unit 的 `done` 字段是否准确反映本文档同一 Unit 最新一次"实现补充"/"真实 bug"段落记录的真实状态; +3. 本文档中已经完整交付、但从未在 `unit_matrix.json` 里获得 Unit 编号的功能是否存在。 + +### 6.2 发现并订正的 6 处不一致 + +1. **`meta.revisions` 缺失 4 轮事后补记**:`unit_matrix.json` 原本只有 2026-07-30 一条 revision 记录,但本文档 2026-07-31/2026-08-01/2026-08-02/2026-08-03 四轮日期戳明确的补充内容(分散在几乎每个 Unit 的"实现补充"/"真实 bug"段落里)从未在 `revisions` 数组里留痕——**已订正**:新增 4 条对应日期的 revision 记录(外加一条 2026-08-04 记录本次核查本身),`meta.version` 由 v1.0 提升至 v1.1。 +2. **U-013 的 `done` 字段遗漏第三层真实 bug**:本文档 U-013 段落(见上文 2026-08-03 段)记录了三层递进的真实 worktree/主仓库隔离 bug——① Coder 不 commit 导致 `merge_worktree` 空操作、② `memory:project` 写入落在主仓库检出目录导致下一节点合并失败、③ 修复②新增的显式排除 pathspec 与同批新增的 `.gitignore` 规则冲突导致 `git add -A` 报错——但 `unit_matrix.json` U-013 的 `done` 字段只记录了前两层。**已订正**:补上第三层记录。 +3. **U-014 的 `done` 字段用词过时**:`unit_matrix.json` U-014 原文写"Coder/Validator 全流程真实跑通待用户确认后执行",但自 2026-08-02 起用户已多次明确授权真实运行(U-031/U-032 的真实验证、U-042 累计 13 次真实自举压测、git log 中大量 `graphlemon: code_diff/test_report artifact` 提交),这句话已经是一年前的悬空状态描述。**已订正**。 +4. **U-042 的 `done` 字段未反映 2026-08-03 的 13 次真实压测**:本文档 U-042 段落记录了"累计 13 次真实尝试"发现并修复 9 个真实缺口、第 13 次已真正走完 task→...→真实 cutover 全链路,但 `unit_matrix.json` U-042 的 `done` 字段仍停留在 U-042 刚建成时"编排层已建好、真实场景默认不跑"的静态描述。**已订正**。 +5. **U-009/U-011/U-012/U-013 推迟的 happy 用例从未被标记为已兑现**:这四个 Unit 当时(2026-07-31)都因为"Done 标准过头"被订正为"boundary/failure 先通过,happy 用例随后续 Unit 累计满足",但 U-014(端到端验收)和 U-031(REQ-01~14 全量回归)实际已经真实兑现了这些推迟项,`unit_matrix.json` 里这四个 Unit 的 `done` 字段却从未更新去确认"累计满足"这句承诺真的兑现了,读起来像是永远悬而未决。**已订正**:四处均补充复核说明,引用 U-014/U-031 的实际兑现记录。 +6. **两项已交付的控制台功能扩展在 `unit_matrix.json` 里没有对应 Unit**:本文档第 5 节(`v_project_list`/`v_goal_list` CRUD,`git log` 7c720ab)与第 5.1 节(`v_task_detail`/`v_dashboard` 开始/暂停/停止任务执行控制,`git log` add263a)都是 2026-08-03 用户直接向 Claude Code 提出、已经真实交付且有完整测试覆盖的功能,但当时没有同步在 `unit_matrix.json` 里建对应条目。**已订正**:新增 `U-044`(对应第 5 节)、`U-045`(对应第 5.1 节),`classification_summary.Value Path` 由 17 修正为 19,Unit 总数由 45 变为 47。 + +### 6.3 未订正的已知遗留问题(记录但不在本次任务范围内处理) + +- `docs/development-plan.md`/`docs/sdd/unit_matrix.json` 的顶层"版本"标注(本文档头部 `**版本**: v1.0`)与 `unit_matrix.json.meta.source_sdd_version: "v1.6.0"` 均早于仓库当前实际的 SDD 版本(`git log` 首个提交信息写"Initial baseline: SDD v1.7.0")——这是另一处独立的版本号漂移,超出本次"development-plan.md 与 unit_matrix.json 完成状态核对"的任务范围,留待专门的 SDD 版本号核查任务处理,本次不顺手改动。 +- CLAUDE.md 已经明确指出 `development-plan.md`/`unit_matrix.json` 的"完成状态"叙述本身会随着真实自举运行持续过时,本节核查覆盖的是截至 2026-08-04 的已知真实提交历史;后续如果 git log 继续增长,应当重复本节 6.1 的核对方法,而不是假设本次核查结果长期有效。 + +### 6.4 与 `unit_matrix.json` 的交叉引用 + +`docs/sdd/unit_matrix.json` 的 `meta.revisions` 数组是本节 6.2 六处订正的机器可读版本,二者应保持一致;如果后续再发现新的漂移,应同时更新本节和 `unit_matrix.json.meta.revisions`(追加新记录,不覆盖已有记录),保持两份文档"谁在什么时候订正了什么"这条审计轨迹完整可查。 diff --git a/docs/sdd/unit_matrix.json b/docs/sdd/unit_matrix.json index 8a2d692..e27b167 100644 --- a/docs/sdd/unit_matrix.json +++ b/docs/sdd/unit_matrix.json @@ -1,13 +1,18 @@ { "meta": { "project": "graphlemon", - "version": "v1.0", + "version": "v1.1", "generated_from": "docs/development-plan.md", "source_sdd_version": "v1.6.0", "methodology": "project-unit-decomposition + engineering-work-planning (local Hermes planning profile)", "date": "2026-07-29", "revisions": [ - {"date": "2026-07-30", "note": "计划评审追加 U-004.5(RUN_REAL_AGENT_E2E harness 归属)与 U-024.5(U-024 依赖分级后的 REQ-12 完整验收);U-024 依赖从 U-009~U-021 收窄为 U-012/U-013;U-035 done 标准追加 REQ-03 回归要求"} + {"date": "2026-07-30", "note": "计划评审追加 U-004.5(RUN_REAL_AGENT_E2E harness 归属)与 U-024.5(U-024 依赖分级后的 REQ-12 完整验收);U-024 依赖从 U-009~U-021 收窄为 U-012/U-013;U-035 done 标准追加 REQ-03 回归要求"}, + {"date": "2026-07-31", "note": "(2026-08-04 补记)development-plan.md 同批订正/补充:U-002 引用订正(架构文档 §7.3→§13.2);U-009/U-011/U-012/U-013 的 Done 标准过头问题各自订正为 boundary/failure 先行、happy 用例推迟累计满足;U-014 端到端验收落地(补 c_artifact_write);U-016~U-030 大量原文档缺失的 Done/覆盖行补齐。改动内容当时已直接写入对应 units[].done/name 字段文本,但未同步在本 revisions 数组留痕,本条为补记"}, + {"date": "2026-08-01", "note": "(2026-08-04 补记)U-024.5/U-031 相关记录:U-031 回归审计发现 REQ-12 boundary(断线重连拉快照)此前从未真正实现,已修复;U-031 发现 c_work_graph_plan/c_work_graph_execute/c_work_node_run 三层架构彼此隔离测试通过但从未被生产代码真正串联,新增 src/work_graph_orchestrate.py 补上集成。行内文本已记录,本条为补记"}, + {"date": "2026-08-02", "note": "(2026-08-04 补记)U-032~U-043(PH5 全部 10 个 Unit)落地:U-031 REQ-01~14 逐条复核修复 5 处缺口;U-032 补建此前假设存在但从未建过的 src/scheduler.py;U-033 A-2 假设收口(维持部分成立);U-034~U-043 完整 Deploy Supervisor(stage/health_check/cutover/monitor/rollback)+ 自举闭环编排层 + 控制台 v_deployment_status。行内文本已记录,本条为补记"}, + {"date": "2026-08-03", "note": "(2026-08-04 补记)U-042 累计 13 次真实自举压测,依次发现并修复 9 个此前完全未知的真实缺口(worktree 提交兜底及其两层加深修复、prod db 引导期空库、_check_prd_consistency worktree 隔离、graph_manifest 归一化应对完全无 depends_on/edges、http_health 轮询等待端口就绪、rollback_path_a 清理候选 worktree 等),分散记录在 U-011/U-013/U-031/U-037/U-038/U-041 各自 done 字段中。同日还追加了 development-plan.md 第 5/5.1 节两项用户直接请求的控制台功能扩展(v_project_list/v_goal_list CRUD、任务 execute/pause/stop 控制),当时未在 unit_matrix.json 建对应条目。行内文本已记录,本条为补记"}, + {"date": "2026-08-04", "note": "文档一致性核查任务(本次):系统核对 development-plan.md 事后补记(07-31/08-01/08-02/08-03 各段)、unit_matrix.json 结构化字段与 git log 三方一致性。修正 U-009/U-011/U-012/U-013/U-014/U-042 六处 done 字段使其准确反映真实完成状态(U-013 额外补上此前遗漏的第三层 worktree 隔离真实 bug);新增 U-044(v_project_list/v_goal_list CRUD)、U-045(task execute/pause/stop 控制台功能)两个此前无 Unit 认领但已交付的控制台功能;version 由 v1.0 升至 v1.1;classification_summary 计数同步更新(Value Path 17→19)。纯文档订正,未改动 src/ 下任何业务代码或测试"} ] }, "units": [ @@ -21,12 +26,12 @@ {"id": "U-007", "phase": "PH0", "sub_phase": "PH0-S3", "name": "本地后端骨架 + c_pick_folder macOS 实现", "classification": "Enabler", "depends_on": [], "coverage": {"model": [], "view": [], "controller": ["c_pick_folder"], "process": [], "requirement": []}, "done": "后端可启停;macOS 上原生对话框返回真实路径"}, {"id": "U-008", "phase": "PH0", "sub_phase": "PH0-S3", "name": "前端骨架", "classification": "Enabler", "depends_on": ["U-007"], "coverage": {"model": [], "view": [], "controller": [], "process": [], "requirement": []}, "done": "本地 web 应用路由跳转正常"}, - {"id": "U-009", "phase": "PH1", "sub_phase": "PH1-S1", "name": "c_task_create + task 状态机(c_project_create 已在 U-002 完成)", "classification": "Value Path", "depends_on": ["U-001", "U-002"], "coverage": {"model": ["task"], "view": [], "controller": ["c_task_create"], "process": ["p_org_task_lifecycle"], "requirement": ["REQ-01"]}, "done": "REQ-01 boundary/failure 通过;happy 用例需要 c_org_node_trigger 完整实现,随 U-010 累计满足(2026-07-31 订正)"}, + {"id": "U-009", "phase": "PH1", "sub_phase": "PH1-S1", "name": "c_task_create + task 状态机(c_project_create 已在 U-002 完成)", "classification": "Value Path", "depends_on": ["U-001", "U-002"], "coverage": {"model": ["task"], "view": [], "controller": ["c_task_create"], "process": ["p_org_task_lifecycle"], "requirement": ["REQ-01"]}, "done": "REQ-01 boundary/failure 通过;happy 用例需要 c_org_node_trigger 完整实现,随 U-010 累计满足(2026-07-31 订正)。**2026-08-04 复核**:happy 用例已随 U-010/U-014/U-031 累计兑现——U-014 完整跑通端到端验收时三段 Org Graph 状态迁移首次真实串联,U-031 REQ-01~14 全量回归再次确认——不再是待兑现的推迟项,见 development-plan.md U-014/U-031 实现补充"}, {"id": "U-010", "phase": "PH1", "sub_phase": "PH1-S1", "name": "c_org_node_trigger 完整实现(三段前向状态迁移,见 development-plan.md 2026-07-31 范围说明)", "classification": "Value Path", "depends_on": ["U-005", "U-009"], "coverage": {"model": [], "view": [], "controller": ["c_org_node_trigger"], "process": [], "requirement": []}, "done": "三个 Org Agent 分别可被触发(真实 claude --agent 调用),task.status 按 queued→planning_brd_prd_sdd→coding→validating 正确流转;重试/路由/blocked_pending_human 不在本 Unit 范围"}, - {"id": "U-011", "phase": "PH1", "sub_phase": "PH1-S2", "name": "c_work_graph_plan 实现(只规划不执行,见 development-plan.md 2026-07-31/2026-08-03 订正)", "classification": "Value Path", "depends_on": ["U-004", "U-010"], "coverage": {"model": ["artifact", "work_graph_run"], "view": [], "controller": ["c_work_graph_plan"], "process": [], "requirement": ["REQ-02"]}, "done": "graph_manifest 通过结构校验(brd/prd/sdd/benchmark 四节点+依赖链),work_graph_run(status=planning) 落地;REQ-02 happy 用例整体随 U-012/U-013 累计满足。c_artifact_write(03-C §3.7)目前没有任何 Unit 认领,是已知缺口。2026-08-03:U-042 第六次真实自举压测发现真实 LLM 输出可能完全不给 depends_on/edges(比此前已知的\"字段名不对\"更彻底),_normalize_graph_manifest 现在对 brd/prd/sdd/benchmark 四个规范 artifact_type 齐全时强制按已知的固定线性链补 depends_on,不再完全依赖 LLM 自己给对"}, - {"id": "U-012", "phase": "PH1", "sub_phase": "PH1-S2", "name": "c_work_graph_execute 完整实现(见 development-plan.md 2026-07-31 范围说明)", "classification": "Value Path", "depends_on": ["U-006", "U-011"], "coverage": {"model": [], "view": [], "controller": ["c_work_graph_execute"], "process": ["p_work_graph_execution", "p_usage_limit_wait"], "requirement": ["REQ-07", "REQ-14"]}, "done": "REQ-07 boundary/failure 通过(happy 需 PH2 REQ-04/05/06 就绪后累计满足);REQ-14 happy 通过。退避重试是整图级别,非逐节点;CLASSIFIER_BLOCKED 用单次调用 permission_denials≥3 近似判定"}, - {"id": "U-013", "phase": "PH1", "sub_phase": "PH1-S2", "name": "c_work_node_run + git worktree 隔离(见 development-plan.md 2026-07-31 订正、2026-08-02/03 真实 bug 修复)", "classification": "Value Path", "depends_on": ["U-012"], "coverage": {"model": ["work_node_execution"], "view": [], "controller": ["c_work_node_run"], "process": [], "requirement": ["REQ-03"]}, "done": "REQ-03 boundary 通过(真实 git worktree 隔离+merge,无冲突);happy 需 c_artifact_write 落地后累计满足。2026-08-02/03:U-042 第一次真实自举压测发现 Coder 编辑 worktree 后从不 commit、merge_worktree 空操作、真实改动被 remove_worktree 静默吞掉的真实 bug,新增 ensure_worktree_committed() 兜底自动提交;第八/九次压测又发现更深一层——worktree 和主仓库共享项目身份,memory:project 写入可能直接落在主仓库检出目录而非 worktree,导致下一个节点 merge 失败,已扩展 ensure_worktree_committed() 同时兜底主仓库自身、并把 .graphlemon-worktrees/ 加入 .gitignore,全部补了真实回归测试"}, - {"id": "U-014", "phase": "PH1", "sub_phase": "PH1-S3", "name": "贪吃蛇场景端到端验收(含补建 c_artifact_write,见 development-plan.md 2026-07-31 实现补充)", "classification": "Value Path", "depends_on": ["U-011", "U-012", "U-013"], "coverage": {"model": ["artifact"], "view": [], "controller": ["c_artifact_write"], "process": [], "requirement": []}, "done": "架构文档 §11 验收标准第 1-3 条全部达成;plan_documents(Planner 四件套+血缘)真实验证过,Coder/Validator 全流程真实跑通待用户确认后执行"}, + {"id": "U-011", "phase": "PH1", "sub_phase": "PH1-S2", "name": "c_work_graph_plan 实现(只规划不执行,见 development-plan.md 2026-07-31/2026-08-03 订正)", "classification": "Value Path", "depends_on": ["U-004", "U-010"], "coverage": {"model": ["artifact", "work_graph_run"], "view": [], "controller": ["c_work_graph_plan"], "process": [], "requirement": ["REQ-02"]}, "done": "graph_manifest 通过结构校验(brd/prd/sdd/benchmark 四节点+依赖链),work_graph_run(status=planning) 落地;REQ-02 happy 用例整体随 U-012/U-013 累计满足。c_artifact_write(03-C §3.7)目前没有任何 Unit 认领,是已知缺口。2026-08-03:U-042 第六次真实自举压测发现真实 LLM 输出可能完全不给 depends_on/edges(比此前已知的\"字段名不对\"更彻底),_normalize_graph_manifest 现在对 brd/prd/sdd/benchmark 四个规范 artifact_type 齐全时强制按已知的固定线性链补 depends_on,不再完全依赖 LLM 自己给对。**2026-08-04 复核**:REQ-02 happy 用例(四类 artifact 及血缘完整)已随 U-014 的 plan_documents 真实产出、并经 U-031 REQ-01~14 全量回归确认满足,\"累计满足\"不再是待兑现状态;c_artifact_write 缺口已在 U-014 补上(src/artifact_write.py),此处遗留文字仅作历史记录"}, + {"id": "U-012", "phase": "PH1", "sub_phase": "PH1-S2", "name": "c_work_graph_execute 完整实现(见 development-plan.md 2026-07-31 范围说明)", "classification": "Value Path", "depends_on": ["U-006", "U-011"], "coverage": {"model": [], "view": [], "controller": ["c_work_graph_execute"], "process": ["p_work_graph_execution", "p_usage_limit_wait"], "requirement": ["REQ-07", "REQ-14"]}, "done": "REQ-07 boundary/failure 通过(happy 需 PH2 REQ-04/05/06 就绪后累计满足);REQ-14 happy 通过。退避重试是整图级别,非逐节点;CLASSIFIER_BLOCKED 用单次调用 permission_denials≥3 近似判定。**2026-08-04 复核**:REQ-07 happy 用例已随 PH2 各 Unit 就绪、以及 U-031 用 work_graph_orchestrate.py 把 c_work_graph_plan/c_work_graph_execute/c_work_node_run 真正串联后,在 U-031 REQ-01~14 全量回归中确认满足,不再是待兑现的推迟项"}, + {"id": "U-013", "phase": "PH1", "sub_phase": "PH1-S2", "name": "c_work_node_run + git worktree 隔离(见 development-plan.md 2026-07-31 订正、2026-08-02/03 真实 bug 修复)", "classification": "Value Path", "depends_on": ["U-012"], "coverage": {"model": ["work_node_execution"], "view": [], "controller": ["c_work_node_run"], "process": [], "requirement": ["REQ-03"]}, "done": "REQ-03 boundary 通过(真实 git worktree 隔离+merge,无冲突);happy 需 c_artifact_write 落地后累计满足。2026-08-02/03:U-042 第一次真实自举压测发现 Coder 编辑 worktree 后从不 commit、merge_worktree 空操作、真实改动被 remove_worktree 静默吞掉的真实 bug,新增 ensure_worktree_committed() 兜底自动提交;第八/九次压测又发现更深一层——worktree 和主仓库共享项目身份,memory:project 写入可能直接落在主仓库检出目录而非 worktree,导致下一个节点 merge 失败,已扩展 ensure_worktree_committed() 同时兜底主仓库自身、并把 .graphlemon-worktrees/ 加入 .gitignore,全部补了真实回归测试。**第三层真实 bug(2026-08-03,U-042 第十次真实压测发现,2026-08-04 补记——development-plan.md 已有此记录但此前未同步进本字段)**:为兜住主仓库漂移新加的显式排除 pathspec `-- . ':!.graphlemon-worktrees'` 与同一次修复新增的 .gitignore 规则相互冲突——两者同时命中同一路径时 git add -A 直接报错退出(即使抑制提示文案,退出码依然非零);修复为删掉这个多余的显式排除,只依赖 .gitignore 本身即可让 git add -A 正确跳过该目录,ensure_worktree_committed() 恢复成最简单的 git add -A,测试夹具 _init_git_repo() 同步补上同一条 .gitignore 规则。**2026-08-04 复核**:REQ-03 happy 用例已随 U-014 的 c_artifact_write 落地、并经 U-031 全量回归确认满足,不再是待兑现的推迟项"}, + {"id": "U-014", "phase": "PH1", "sub_phase": "PH1-S3", "name": "贪吃蛇场景端到端验收(含补建 c_artifact_write,见 development-plan.md 2026-07-31 实现补充)", "classification": "Value Path", "depends_on": ["U-011", "U-012", "U-013"], "coverage": {"model": ["artifact"], "view": [], "controller": ["c_artifact_write"], "process": [], "requirement": []}, "done": "架构文档 §11 验收标准第 1-3 条全部达成;plan_documents(Planner 四件套+血缘)真实验证过。**2026-08-04 订正(原文\"Coder/Validator 全流程真实跑通待用户确认后执行\"已过时)**:自 2026-08-02 起用户已多次明确授权真实运行,Coder/Validator 全流程(真实写代码、真实测试、真实归因)已在 PH4/PH5 及后续自举运行中反复真实跑通——U-031/U-032 的真实验证记录、U-042 累计 13 次真实自举压测、以及 git log 中大量 `graphlemon: code_diff/test_report artifact for task ` 提交均已证实,不再是待确认执行的悬空状态"}, {"id": "U-015", "phase": "PH2", "sub_phase": "PH2-S1", "name": "p_validator_root_cause_trace 实现", "classification": "Risk Gate", "depends_on": ["U-013"], "coverage": {"model": ["bug_record"], "view": [], "controller": ["c_bug_record_create"], "process": ["p_validator_root_cause_trace"], "requirement": ["REQ-04"]}, "done": "REQ-04 happy/boundary/failure 通过"}, {"id": "U-016", "phase": "PH2", "sub_phase": "PH2-S1", "name": "c_org_loop_route + fast_lane/full_replan(含 close_task_done,见 development-plan.md 2026-07-31 实现补充)", "classification": "Risk Gate", "depends_on": ["U-015"], "coverage": {"model": [], "view": [], "controller": ["c_org_loop_route"], "process": [], "requirement": ["REQ-05", "REQ-09"]}, "done": "REQ-05/REQ-09 全部用例通过(含 3 轮上限 → blocked_pending_human;validating→done 通过新增 close_task_done 打通)"}, @@ -59,13 +64,17 @@ {"id": "U-039", "phase": "PH5", "sub_phase": "PH5-S2", "name": "c_deploy_supervisor_cutover(见 development-plan.md 2026-08-02 实现补充)", "classification": "Risk Gate", "depends_on": ["U-038"], "coverage": {"model": ["deployment"], "view": [], "controller": ["c_deploy_supervisor_cutover"], "process": [], "requirement": []}, "done": "健康检查通过后完成真实切换(supervisor/deploy_cutover.py,真实进程停止+重启验证过);在途 work_node_execution 重启后可恢复(复用既有 REQ-06 机制);previous_instance_dir 保留至监控窗口结束;新增 LIVE_PORT=8420 常量(05 §5.9 缺的一个字段);真实测试发现并修复 deploy_supervisor.is_alive() 的僵尸进程判活缺陷(新增 reap_if_exited())"}, {"id": "U-040", "phase": "PH5", "sub_phase": "PH5-S3", "name": "c_deploy_supervisor_monitor(见 development-plan.md 2026-08-02 实现补充)", "classification": "Risk Gate", "depends_on": ["U-039"], "coverage": {"model": ["deploy_health_signal"], "view": [], "controller": ["c_deploy_supervisor_monitor"], "process": [], "requirement": []}, "done": "四类信号采样正常(supervisor/deploy_monitor.py);validator_approval_rate 偏离基线阈值时触发 anomaly_detected;approve 占比算法基于对 scheduler.finish_task_lifecycle 真实代码逻辑的核实(PASS 从不产生 bug_record,FAIL 必然产生),非字面 SDD 定义"}, {"id": "U-041", "phase": "PH5", "sub_phase": "PH5-S3", "name": "c_deploy_supervisor_rollback(见 development-plan.md 2026-08-02/03 实现补充)", "classification": "Risk Gate", "depends_on": ["U-038", "U-040"], "coverage": {"model": ["deployment"], "view": [], "controller": ["c_deploy_supervisor_rollback"], "process": [], "requirement": []}, "done": "回滚路径 A/B 各跑通一次(supervisor/deploy_rollback.py,真实进程+真实 git 仓库验证);旧版本也起不来时正确终态到 blocked_pending_human(真实场景验证,非假设);git revert 冲突有明确处理(真实构造冲突历史验证过,含 --abort 清理)。2026-08-03:U-042 第七次真实压测第一次真正走到 health_check 环节,发现 rollback_path_a 从未清理候选的 git worktree 检出目录(永久留在磁盘+git worktree list),已修复并补真实回归测试"}, - {"id": "U-042", "phase": "PH5", "sub_phase": "PH5-S3", "name": "自举闭环端到端验收(见 development-plan.md 2026-08-02 实现补充)", "classification": "Risk Gate", "depends_on": ["U-035", "U-041"], "coverage": {"model": [], "view": [], "controller": [], "process": [], "requirement": []}, "done": "真实复现 self-development-feasibility.md 9 步场景,全程无需人工评审代码内容(supervisor/self_hosting_e2e.py 编排层已建好);真实双实例 E2E 用例(RUN_REAL_SELF_HOSTING_E2E=1,独立于常规 RUN_REAL_AGENT_E2E 的单独环境变量)默认跳过,需显式环境变量开启且需额外用户确认才真正执行;日常回归只跑 mock 版本(6 个编排逻辑测试,已跑通)"}, - {"id": "U-043", "phase": "PH5", "sub_phase": "PH5-S4", "name": "控制台展示 deployment 状态与健康信号(见 development-plan.md 2026-08-02 实现补充)", "classification": "Value Path", "depends_on": ["U-024", "U-040"], "coverage": {"model": [], "view": ["v_deployment_status"], "controller": ["c_deployment_list", "c_deployment_current", "c_deployment_get"], "process": [], "requirement": []}, "done": "能看到当前 deployment 状态机所处状态与最近一次健康信号采样结果;02-V 从未定义过这个视图(PH5 后加),DOM/class 约定沿用现有页面;真实服务器 + urllib 验证过全部三条新路由"} + {"id": "U-042", "phase": "PH5", "sub_phase": "PH5-S3", "name": "自举闭环端到端验收(见 development-plan.md 2026-08-02 实现补充)", "classification": "Risk Gate", "depends_on": ["U-035", "U-041"], "coverage": {"model": [], "view": [], "controller": [], "process": [], "requirement": []}, "done": "真实复现 self-development-feasibility.md 9 步场景,全程无需人工评审代码内容(supervisor/self_hosting_e2e.py 编排层已建好);真实双实例 E2E 用例(RUN_REAL_SELF_HOSTING_E2E=1,独立于常规 RUN_REAL_AGENT_E2E 的单独环境变量)默认跳过,需显式环境变量开启且需额外用户确认才真正执行;日常回归只跑 mock 版本(6 个编排逻辑测试,已跑通)。**2026-08-04 复核(development-plan.md 2026-08-03\"真实压测\"记录未同步进本字段,现补上)**:截至 2026-08-03 已累计执行 13 次真实自举压测(用户逐次明确授权),依次发现并修复 9 个此前完全未知的真实缺口(具体条目分散记录在 U-011/U-013/U-031/U-037/U-038/U-041 各自 done 字段中);第 13 次真实压测第一次真正走完 task→plan→code→merge→classify→stage→health_check→真实 cutover 全链路,仅因监控窗口使用真实生产参数(24 小时/10 个任务)而未能在交互式会话内等到 finalized 终态——run_self_hosting_closed_loop() 已补上 monitor_window_hours/monitor_min_task_count 两个可覆盖旋钮以便后续压测拿到 finalized。这不再是\"编排层已建好、真实场景默认不跑\"的静态描述,而是已经过 13 轮真实验证、非常接近完整闭环的状态"}, + {"id": "U-043", "phase": "PH5", "sub_phase": "PH5-S4", "name": "控制台展示 deployment 状态与健康信号(见 development-plan.md 2026-08-02 实现补充)", "classification": "Value Path", "depends_on": ["U-024", "U-040"], "coverage": {"model": [], "view": ["v_deployment_status"], "controller": ["c_deployment_list", "c_deployment_current", "c_deployment_get"], "process": [], "requirement": []}, "done": "能看到当前 deployment 状态机所处状态与最近一次健康信号采样结果;02-V 从未定义过这个视图(PH5 后加),DOM/class 约定沿用现有页面;真实服务器 + urllib 验证过全部三条新路由"}, + + {"id": "U-044", "phase": "PH5+", "sub_phase": "用户直接请求的控制台功能扩展", "name": "v_project_list + v_goal_list CRUD(development-plan.md 第 5 节,2026-08-03 新增,2026-08-04 补记:此前 unit_matrix.json 无对应条目)", "classification": "Value Path", "depends_on": ["U-022", "U-025"], "coverage": {"model": ["project", "task"], "view": ["v_project_list", "v_goal_list"], "controller": ["c_project_list", "c_project_get", "c_project_update", "c_project_delete", "c_task_list"], "process": [], "requirement": []}, "done": "项目列表增删改查(DELETE 语义是软删除,status=archived,因 project_id 被大量外键引用)+ 任务列表排序(白名单校验列名)/编辑目标文本/删除(仅 status=queued 时允许,TaskNotEditableError/409 防止破坏已产出 artifact 的审计可追溯性)全部可用;真实运行的服务器 + curl 端到端验证过全部新增接口,含发现并修复的一个真实 bug(delete_task() 需同事务内先删该任务自己的 execution_event 行,否则真实创建的任务会因外键约束报 IntegrityError);src/test_project_query.py(12 用例)+ test_task_query.py/test_backend_server.py 新增真实 HTTP 路由测试类,474 个测试全绿。**本 Unit 由 Claude Code 直接实现,未经 Planner/Coder/Validator 自举闭环**——development-plan.md 第 5 节记录了原因:当时 implement_code() 只用写死的单节点 graph_manifest,不具备按视图/模块拆分执行的能力,两个新页面+6 个新接口这个规模用一次不可拆分的 Coder 会话去做风险不可控。git log 7c720ab \"Add v_project_list and v_goal_list CRUD (user-requested scope expansion)\" 确认已交付"}, + {"id": "U-045", "phase": "PH5+", "sub_phase": "用户直接请求的控制台功能扩展", "name": "v_task_detail/v_dashboard 开始/暂停/停止任务执行控制(development-plan.md 第 5.1 节,2026-08-03 新增,2026-08-04 补记:此前 unit_matrix.json 无对应条目)", "classification": "Value Path", "depends_on": ["U-025", "U-032", "U-044"], "coverage": {"model": ["task"], "view": ["v_task_detail", "v_dashboard"], "controller": ["c_task_execute", "c_task_pause", "c_task_stop"], "process": [], "requirement": []}, "done": "queued 任务可从控制台手动触发执行;Pause/Stop 为软停止(不做真进程 kill,正在跑的调用自然跑完),复用既有的 blocked_pending_human + blocked_reason=user_paused/user_stopped 而非新增 task.status 枚举值,manual_resume 恢复时按 blocked_reason 自动重新 spawn 后台执行线程(而不只是翻状态字段);根因是 03-C/04-P 全文假设有常驻调度器自动唤起任务,但 src/scheduler.py(U-032)只造了函数,从未被常驻进程持续调用,因此从未设计过\"人工点击开始\"的按钮,这次是补上这个真实缺口;真实运行的服务器 + curl 端到端验证过 /execute、/pause、/stop 全部状态转移;src/task_execution.py 新增 14 个用例 + test_backend_server.py 新增 8 个真实 HTTP 路由用例,496 个测试全绿。本 Unit 同样由 Claude Code 直接实现,原因同 U-044。git log add263a \"v_task_detail/v_dashboard: Start/Pause/Stop task execution controls\" 确认已交付"} ], "classification_summary": { - "Value Path": 17, + "Value Path": 19, "Risk Gate": 18, - "Enabler": 10 + "Enabler": 10, + "_2026-08-04_note": "Value Path 17→19:新增 U-044/U-045(development-plan.md 第 5/5.1 节的用户直接请求控制台功能扩展),此前未在 unit_matrix.json 中反映。总 Unit 数 45→47" }, "critical_path": ["U-001", "U-002", "U-004", "U-004.5", "U-005", "U-006", "U-010", "U-011", "U-012", "U-013", "U-014"], "ph5_critical_path": ["U-034", "U-035", "U-036", "U-037", "U-038", "U-039", "U-040", "U-041", "U-042"] -- libgit2 0.21.4