Commit 0813209f059f8ab85621ba7c1024da7e6f0a610d

Authored by graphlemon
2 parents dd58e9a4 3bebe3ba

graphlemon: merge 45aaac1b-5299-48ca-bd6f-1783326368d4

docs/development-plan.md
... ... @@ -487,3 +487,34 @@ PH0-PH5(45 个 Unit)全部完æˆã€U-042 真实自举压测进行中期间ï¼
487 487 **实现**:新增 `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 的状æ€åˆ¤æ–­ï¼‰ã€‚
488 488 - **实现过程中å‘现并修å¤ä¸€ä¸ªçœŸ gap**:`backend_server.create_server()` 本身从未把 `db_path` 存到 `server` å¯¹è±¡ä¸Šâ€”â€”ä¹‹å‰æ‰€æœ‰è¯·æ±‚处ç†å™¨å…±ç”¨ `server.conn` 一æ¡è¿žæŽ¥å³å¯ï¼Œè¿™æ¬¡æ–°å¢žçš„åŽå°æ‰§è¡Œçº¿ç¨‹éœ€è¦å¼€è‡ªå·±ç‹¬ç«‹çš„连接(ä¸èƒ½è·¨çº¿ç¨‹å…±äº« `server.conn`),å‘现这个字段根本ä¸å­˜åœ¨ã€‚补上 `server.db_path = resolved_db_path`。
489 489 - **éªŒè¯æ–¹å¼**:`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)。
  490 +
  491 +---
  492 +
  493 +## 6. 文档一致性核查记录(2026-08-04):development-plan.md / unit_matrix.json / git log 三方核对
  494 +
  495 +**任务背景**:本文档从 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)。
  496 +
  497 +### 6.1 核对方法
  498 +
  499 +以 `git log --oneline`(135 æ¡æäº¤ï¼Œè¦†ç›– U-001~U-043 全部 Unit æäº¤ã€å¤šæ¡ `U-0XX fix:`/`U-0XX follow-up:` 真实 bug ä¿®å¤æäº¤ã€ä»¥åŠç¬¬ 5/5.1 节两项控制å°åŠŸèƒ½æ‰©å±•æäº¤ï¼‰ä¸ºæœ€ç»ˆäº‹å®žæ¥æºï¼Œé€æ¡æ ¸å¯¹ï¼š
  500 +1. `unit_matrix.json` çš„ `meta.revisions` 数组是å¦å®Œæ•´è®°å½•了本文档æ¯ä¸€è½®äº‹åŽè¡¥è®°ï¼›
  501 +2. `unit_matrix.json` æ¯ä¸ª Unit çš„ `done` 字段是å¦å‡†ç¡®å映本文档åŒä¸€ Unit 最新一次"实现补充"/"真实 bug"段è½è®°å½•的真实状æ€ï¼›
  502 +3. 本文档中已ç»å®Œæ•´äº¤ä»˜ã€ä½†ä»Žæœªåœ¨ `unit_matrix.json` 里获得 Unit ç¼–å·çš„功能是å¦å­˜åœ¨ã€‚
  503 +
  504 +### 6.2 å‘现并订正的 6 处ä¸ä¸€è‡´
  505 +
  506 +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。
  507 +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` 字段åªè®°å½•了å‰ä¸¤å±‚。**已订正**:补上第三层记录。
  508 +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` æäº¤ï¼‰ï¼Œè¿™å¥è¯å·²ç»æ˜¯ä¸€å¹´å‰çš„æ‚¬ç©ºçŠ¶æ€æè¿°ã€‚**已订正**。
  509 +4. **U-042 çš„ `done` å­—æ®µæœªåæ˜  2026-08-03 çš„ 13 次真实压测**:本文档 U-042 段è½è®°å½•了"累计 13 次真实å°è¯•"å‘çŽ°å¹¶ä¿®å¤ 9 个真实缺å£ã€ç¬¬ 13 次已真正走完 task→...→真实 cutover 全链路,但 `unit_matrix.json` U-042 çš„ `done` 字段ä»åœç•™åœ¨ U-042 åˆšå»ºæˆæ—¶"编排层已建好ã€çœŸå®žåœºæ™¯é»˜è®¤ä¸è·‘"çš„é™æ€æè¿°ã€‚**已订正**。
  510 +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 的实际兑现记录。
  511 +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。
  512 +
  513 +### 6.3 未订正的已知é—留问题(记录但ä¸åœ¨æœ¬æ¬¡ä»»åŠ¡èŒƒå›´å†…å¤„ç†ï¼‰
  514 +
  515 +- `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 ç‰ˆæœ¬å·æ ¸æŸ¥ä»»åС处ç†ï¼Œæœ¬æ¬¡ä¸é¡ºæ‰‹æ”¹åŠ¨ã€‚
  516 +- CLAUDE.md å·²ç»æ˜Žç¡®æŒ‡å‡º `development-plan.md`/`unit_matrix.json` çš„"完æˆçжæ€"å™è¿°æœ¬èº«ä¼šéšç€çœŸå®žè‡ªä¸¾è¿è¡ŒæŒç»­è¿‡æ—¶ï¼Œæœ¬èŠ‚æ ¸æŸ¥è¦†ç›–çš„æ˜¯æˆªè‡³ 2026-08-04 的已知真实æäº¤åކå²ï¼›åŽç»­å¦‚æžœ git log 继续增长,应当é‡å¤æœ¬èŠ‚ 6.1 çš„æ ¸å¯¹æ–¹æ³•ï¼Œè€Œä¸æ˜¯å‡è®¾æœ¬æ¬¡æ ¸æŸ¥ç»“果长期有效。
  517 +
  518 +### 6.4 与 `unit_matrix.json` 的交å‰å¼•用
  519 +
  520 +`docs/sdd/unit_matrix.json` çš„ `meta.revisions` 数组是本节 6.2 六处订正的机器å¯è¯»ç‰ˆæœ¬ï¼ŒäºŒè€…åº”ä¿æŒä¸€è‡´ï¼›å¦‚æžœåŽç»­å†å‘çŽ°æ–°çš„æ¼‚ç§»ï¼Œåº”åŒæ—¶æ›´æ–°æœ¬èŠ‚å’Œ `unit_matrix.json.meta.revisions`(追加新记录,ä¸è¦†ç›–å·²æœ‰è®°å½•ï¼‰ï¼Œä¿æŒä¸¤ä»½æ–‡æ¡£"è°åœ¨ä»€ä¹ˆæ—¶å€™è®¢æ­£äº†ä»€ä¹ˆ"è¿™æ¡å®¡è®¡è½¨è¿¹å®Œæ•´å¯æŸ¥ã€‚
... ...
docs/sdd/unit_matrix.json
1 1 {
2 2 "meta": {
3 3 "project": "graphlemon",
4   - "version": "v1.0",
  4 + "version": "v1.1",
5 5 "generated_from": "docs/development-plan.md",
6 6 "source_sdd_version": "v1.6.0",
7 7 "methodology": "project-unit-decomposition + engineering-work-planning (local Hermes planning profile)",
8 8 "date": "2026-07-29",
9 9 "revisions": [
10   - {"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 回归要求"}
  10 + {"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 回归要求"},
  11 + {"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 数组留痕,本条为补记"},
  12 + {"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 补上集成。行内文本已记录,本条为补记"},
  13 + {"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。行内文本已记录,本条为补记"},
  14 + {"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 建对应条目。行内文本已记录,本条为补记"},
  15 + {"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/ 下任何业务代码或测试"}
11 16 ]
12 17 },
13 18 "units": [
... ... @@ -21,12 +26,12 @@
21 26 {"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 上原生对话框返回真实路径"},
22 27 {"id": "U-008", "phase": "PH0", "sub_phase": "PH0-S3", "name": "前端骨架", "classification": "Enabler", "depends_on": ["U-007"], "coverage": {"model": [], "view": [], "controller": [], "process": [], "requirement": []}, "done": "本地 web 应用路由跳转正常"},
23 28  
24   - {"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 订正)"},
  29 + {"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 实现补充"},
25 30 {"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 范围"},
26   - {"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 自己给对"},
27   - {"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 近似判定"},
28   - {"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,全部补了真实回归测试"},
29   - {"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 全流程真实跑通待用户确认后执行"},
  31 + {"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),此处遗留文字仅作历史记录"},
  32 + {"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 全量回归中确认满足,不再是待兑现的推迟项"},
  33 + {"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 全量回归确认满足,不再是待兑现的推迟项"},
  34 + {"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 <uuid>` 提交均已证实,不再是待确认执行的悬空状态"},
30 35  
31 36 {"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 通过"},
32 37 {"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 @@
59 64 {"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())"},
60 65 {"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 定义"},
61 66 {"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),已修复并补真实回归测试"},
62   - {"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 个编排逻辑测试,已跑通)"},
63   - {"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 验证过全部三条新路由"}
  67 + {"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 轮真实验证、非常接近完整闭环的状态"},
  68 + {"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 验证过全部三条新路由"},
  69 +
  70 + {"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)\" 确认已交付"},
  71 + {"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\" 确认已交付"}
64 72 ],
65 73 "classification_summary": {
66   - "Value Path": 17,
  74 + "Value Path": 19,
67 75 "Risk Gate": 18,
68   - "Enabler": 10
  76 + "Enabler": 10,
  77 + "_2026-08-04_note": "Value Path 17→19:新增 U-044/U-045(development-plan.md 第 5/5.1 节的用户直接请求控制台功能扩展),此前未在 unit_matrix.json 中反映。总 Unit 数 45→47"
69 78 },
70 79 "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"],
71 80 "ph5_critical_path": ["U-034", "U-035", "U-036", "U-037", "U-038", "U-039", "U-040", "U-041", "U-042"]
... ...