coding-agent-harness 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/CONTRIBUTING.md +2 -2
  3. package/LICENSE +661 -21
  4. package/LICENSE-EXCEPTION.md +37 -0
  5. package/README.md +96 -4
  6. package/README.zh-CN.md +75 -4
  7. package/SKILL.md +52 -51
  8. package/dist/build-dist.mjs +189 -0
  9. package/dist/check-dist-observation.mjs +428 -0
  10. package/dist/check-harness.mjs +489 -0
  11. package/dist/check-import-graph.mjs +511 -0
  12. package/dist/check-runtime-emit.mjs +304 -0
  13. package/dist/check-type-boundaries.mjs +139 -0
  14. package/dist/commands/dashboard-command.mjs +80 -0
  15. package/dist/commands/migration-command.mjs +152 -0
  16. package/dist/commands/preset-command.mjs +91 -0
  17. package/dist/commands/task-command.mjs +324 -0
  18. package/dist/harness.mjs +304 -0
  19. package/dist/lib/capability-registry.mjs +643 -0
  20. package/dist/lib/check-module-parallel.mjs +227 -0
  21. package/dist/lib/check-profiles.mjs +414 -0
  22. package/dist/lib/check-task-contracts.mjs +54 -0
  23. package/dist/lib/core-shared.mjs +254 -0
  24. package/dist/lib/dashboard-data.mjs +608 -0
  25. package/dist/lib/dashboard-workbench.mjs +334 -0
  26. package/dist/lib/dashboard-writer.mjs +200 -0
  27. package/dist/lib/git-status-summary.mjs +45 -0
  28. package/dist/lib/governance-index-generator.mjs +236 -0
  29. package/dist/lib/governance-sync.mjs +617 -0
  30. package/dist/lib/governance-table-boundary.mjs +161 -0
  31. package/{scripts → dist}/lib/harness-core.mjs +3 -0
  32. package/dist/lib/harness-paths.mjs +338 -0
  33. package/dist/lib/lesson-maintenance.mjs +139 -0
  34. package/dist/lib/markdown-utils.mjs +193 -0
  35. package/dist/lib/migration-planner.mjs +439 -0
  36. package/dist/lib/migration-support.mjs +317 -0
  37. package/dist/lib/phase-kind.mjs +46 -0
  38. package/dist/lib/preset-audit-contracts.mjs +40 -0
  39. package/dist/lib/preset-engine.mjs +516 -0
  40. package/dist/lib/preset-registry.mjs +831 -0
  41. package/dist/lib/preset-resource-contracts.mjs +83 -0
  42. package/dist/lib/review-confirm-git-gate.mjs +244 -0
  43. package/dist/lib/status-builder.mjs +87 -0
  44. package/{scripts → dist}/lib/status-dashboard-renderer.mjs +48 -47
  45. package/dist/lib/structure-migration.mjs +404 -0
  46. package/dist/lib/subagent-authorization-audit.mjs +198 -0
  47. package/dist/lib/task-audit-metadata.mjs +376 -0
  48. package/dist/lib/task-audit-migration.mjs +355 -0
  49. package/dist/lib/task-completion-consistency.mjs +29 -0
  50. package/dist/lib/task-index.mjs +133 -0
  51. package/dist/lib/task-lesson-candidates.mjs +239 -0
  52. package/dist/lib/task-lesson-sedimentation.mjs +300 -0
  53. package/dist/lib/task-lifecycle/create-task-helpers.mjs +84 -0
  54. package/dist/lib/task-lifecycle/phase-sync.mjs +82 -0
  55. package/dist/lib/task-lifecycle/review-confirm.mjs +93 -0
  56. package/dist/lib/task-lifecycle/review-gates.mjs +62 -0
  57. package/dist/lib/task-lifecycle/review-submission.mjs +52 -0
  58. package/dist/lib/task-lifecycle/scaffold-provenance.mjs +54 -0
  59. package/dist/lib/task-lifecycle/template-files.mjs +52 -0
  60. package/dist/lib/task-lifecycle/text-utils.mjs +26 -0
  61. package/dist/lib/task-lifecycle.mjs +611 -0
  62. package/dist/lib/task-metadata.mjs +116 -0
  63. package/dist/lib/task-review-model.mjs +474 -0
  64. package/dist/lib/task-scanner.mjs +439 -0
  65. package/dist/lib/task-tombstone-commands.mjs +125 -0
  66. package/dist/postinstall.mjs +14 -0
  67. package/dist/run-built-tests.mjs +84 -0
  68. package/docs-release/README.md +1 -0
  69. package/docs-release/architecture/overview.md +13 -13
  70. package/docs-release/architecture/overview.zh-CN.md +13 -13
  71. package/docs-release/architecture/system-explainer/01-system-overview.md +218 -0
  72. package/docs-release/architecture/system-explainer/02-module-dependency.md +257 -0
  73. package/docs-release/architecture/system-explainer/03-task-lifecycle.md +304 -0
  74. package/docs-release/architecture/system-explainer/04-check-and-governance.md +241 -0
  75. package/docs-release/architecture/system-explainer/05-data-flow.md +276 -0
  76. package/docs-release/architecture/system-explainer/06-preset-and-migration.md +300 -0
  77. package/docs-release/architecture/system-explainer/README.md +67 -0
  78. package/docs-release/architecture/system-explainer/en-US/01-system-overview.md +227 -0
  79. package/docs-release/architecture/system-explainer/en-US/02-module-dependency.md +263 -0
  80. package/docs-release/architecture/system-explainer/en-US/03-task-lifecycle.md +319 -0
  81. package/docs-release/architecture/system-explainer/en-US/04-check-and-governance.md +252 -0
  82. package/docs-release/architecture/system-explainer/en-US/05-data-flow.md +290 -0
  83. package/docs-release/architecture/system-explainer/en-US/06-preset-and-migration.md +320 -0
  84. package/docs-release/architecture/system-explainer/en-US/README.md +70 -0
  85. package/docs-release/guides/agent-installation.en-US.md +22 -15
  86. package/docs-release/guides/agent-installation.md +23 -15
  87. package/docs-release/guides/contributing.md +3 -3
  88. package/docs-release/guides/contributing.zh-CN.md +3 -3
  89. package/docs-release/guides/document-audience-and-surfaces.en-US.md +10 -10
  90. package/docs-release/guides/document-audience-and-surfaces.md +10 -10
  91. package/docs-release/guides/legacy-migration-agent-prompt.md +25 -2
  92. package/docs-release/guides/legacy-migration-agent-prompt.zh-CN.md +25 -2
  93. package/docs-release/guides/migration-playbook.en-US.md +63 -1
  94. package/docs-release/guides/migration-playbook.md +59 -1
  95. package/docs-release/guides/parent-control-repository-pattern.en-US.md +25 -25
  96. package/docs-release/guides/parent-control-repository-pattern.md +25 -25
  97. package/docs-release/guides/preset-development.md +28 -4
  98. package/docs-release/guides/repository-operating-models.en-US.md +21 -21
  99. package/docs-release/guides/repository-operating-models.md +21 -21
  100. package/docs-release/guides/task-state-machine.en-US.md +35 -18
  101. package/docs-release/guides/task-state-machine.md +35 -18
  102. package/docs-release/guides/typescript-runtime-migration-closeout.md +96 -0
  103. package/examples/minimal-project/AGENTS.md +2 -2
  104. package/examples/minimal-project/coding-agent-harness/harness.yaml +14 -0
  105. package/examples/minimal-project/coding-agent-harness/planning/tasks/demo-task/INDEX.md +60 -0
  106. package/examples/minimal-project/coding-agent-harness/planning/tasks/demo-task/progress.md +11 -0
  107. package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/review.md +1 -1
  108. package/package.json +22 -13
  109. package/presets/legacy-migration/preset.yaml +5 -5
  110. package/presets/legacy-migration/templates/execution_strategy.append.md +1 -1
  111. package/presets/lesson-sedimentation/preset.yaml +3 -3
  112. package/presets/module/preset.yaml +2 -2
  113. package/presets/module/templates/execution_strategy.append.md +1 -1
  114. package/presets/module/templates/task_plan.append.md +3 -3
  115. package/presets/standard-task/preset.yaml +2 -2
  116. package/references/adversarial-review-standard.md +2 -2
  117. package/references/agents-md-pattern.md +14 -14
  118. package/references/cadence-ledger.md +1 -1
  119. package/references/ci-cd-standard.md +1 -1
  120. package/references/delivery-operating-model-standard.md +4 -4
  121. package/references/docs-directory-standard.md +65 -159
  122. package/references/external-source-intake-standard.md +10 -10
  123. package/references/harness-ledger.md +6 -6
  124. package/references/legacy-12-phase-bootstrap.md +2 -2
  125. package/references/lessons-governance.md +15 -15
  126. package/references/long-running-task-standard.md +6 -6
  127. package/references/module-parallel-standard.md +34 -34
  128. package/references/planning-loop.md +6 -6
  129. package/references/project-onboarding-audit.md +4 -4
  130. package/references/regression-system.md +2 -2
  131. package/references/repo-governance-standard.md +4 -4
  132. package/references/review-routing-standard.md +1 -1
  133. package/references/ssot-governance.md +19 -19
  134. package/references/taskr-gap-analysis.md +5 -5
  135. package/references/walkthrough-closeout.md +14 -14
  136. package/references/worktree-parallel.md +3 -3
  137. package/skills/preset-creator/references/complex-task-skeleton/brief.md +11 -0
  138. package/skills/preset-creator/references/complex-task-skeleton/task_plan.md +1 -1
  139. package/skills/preset-creator/references/preset-package-skeleton.md +5 -5
  140. package/templates/AGENTS.md.template +31 -29
  141. package/templates/architecture/README.md +4 -4
  142. package/templates/architecture/service-catalog.md +2 -2
  143. package/templates/architecture/services/service-template.md +1 -1
  144. package/templates/dashboard/assets/app-src/00-state.js +12 -0
  145. package/templates/dashboard/assets/app-src/10-router.js +3 -0
  146. package/templates/dashboard/assets/app-src/20-overview.js +13 -3
  147. package/templates/dashboard/assets/app-src/35-task-detail.js +46 -6
  148. package/templates/dashboard/assets/app-src/40-modules.js +1 -1
  149. package/templates/dashboard/assets/app-src/55-presets.js +375 -0
  150. package/templates/dashboard/assets/app-src/60-shared.js +3 -1
  151. package/templates/dashboard/assets/app-src/90-bindings.js +131 -0
  152. package/templates/dashboard/assets/app.css +583 -0
  153. package/templates/dashboard/assets/app.css.manifest.json +1 -0
  154. package/templates/dashboard/assets/app.js +585 -11
  155. package/templates/dashboard/assets/app.manifest.json +1 -0
  156. package/templates/dashboard/assets/css-src/00-foundation.css +4 -0
  157. package/templates/dashboard/assets/css-src/40-detail-modules-migration.css +62 -0
  158. package/templates/dashboard/assets/css-src/45-presets.css +516 -0
  159. package/templates/dashboard/assets/i18n.js +144 -4
  160. package/templates/development/README.md +10 -10
  161. package/templates/development/cross-repo-debugging.md +3 -3
  162. package/templates/development/external-context/service-template.md +2 -2
  163. package/templates/development/external-source-packs/README.md +4 -4
  164. package/templates/integrations/README.md +4 -4
  165. package/templates/integrations/api-contract.md +2 -2
  166. package/templates/integrations/event-contract.md +2 -2
  167. package/templates/integrations/third-party/vendor-template.md +2 -2
  168. package/templates/integrations/webhook-contract.md +2 -2
  169. package/templates/ledger/Harness-Ledger.md +1 -1
  170. package/templates/planning/INDEX.md +88 -0
  171. package/templates/planning/brief.md +1 -1
  172. package/templates/planning/module_session_prompt.md +2 -1
  173. package/templates/planning/review.md +0 -18
  174. package/templates/planning/task_plan.md +5 -44
  175. package/templates/planning/visual_map.md +13 -9
  176. package/templates/planning/visual_map.simple.md +52 -0
  177. package/templates/planning/walkthrough.md +47 -0
  178. package/templates/reference/docs-library-standard.md +8 -8
  179. package/templates/reference/execution-workflow-standard.md +29 -2
  180. package/templates/reference/external-source-intake-standard.md +15 -15
  181. package/templates/reference/repo-governance-standard.md +1 -1
  182. package/templates/ssot/Module-Registry.md +1 -1
  183. package/templates/walkthrough/walkthrough-template.md +2 -2
  184. package/templates-zh-CN/AGENTS.md.template +31 -29
  185. package/templates-zh-CN/CLAUDE.md.template +1 -1
  186. package/templates-zh-CN/architecture/README.md +4 -4
  187. package/templates-zh-CN/architecture/service-catalog.md +2 -2
  188. package/templates-zh-CN/architecture/services/service-template.md +1 -1
  189. package/templates-zh-CN/development/README.md +10 -10
  190. package/templates-zh-CN/development/cross-repo-debugging.md +3 -3
  191. package/templates-zh-CN/development/external-context/service-template.md +2 -2
  192. package/templates-zh-CN/development/external-source-packs/README.md +4 -4
  193. package/templates-zh-CN/integrations/README.md +4 -4
  194. package/templates-zh-CN/integrations/api-contract.md +2 -2
  195. package/templates-zh-CN/integrations/event-contract.md +2 -2
  196. package/templates-zh-CN/integrations/third-party/vendor-template.md +2 -2
  197. package/templates-zh-CN/integrations/webhook-contract.md +2 -2
  198. package/templates-zh-CN/ledger/Harness-Ledger.md +1 -1
  199. package/templates-zh-CN/lessons/lesson-arch-process-change.md +1 -1
  200. package/templates-zh-CN/lessons/lesson-new-doc.md +3 -3
  201. package/templates-zh-CN/lessons/lesson-ref-change.md +4 -4
  202. package/templates-zh-CN/planning/INDEX.md +87 -0
  203. package/templates-zh-CN/planning/brief.md +1 -1
  204. package/templates-zh-CN/planning/module_session_prompt.md +12 -11
  205. package/templates-zh-CN/planning/review.md +0 -18
  206. package/templates-zh-CN/planning/task_plan.md +3 -63
  207. package/templates-zh-CN/planning/visual_map.md +14 -7
  208. package/templates-zh-CN/planning/visual_map.simple.md +48 -0
  209. package/templates-zh-CN/planning/walkthrough.md +47 -0
  210. package/templates-zh-CN/reference/adversarial-review-standard.md +2 -2
  211. package/templates-zh-CN/reference/delivery-operating-model-standard.md +3 -3
  212. package/templates-zh-CN/reference/docs-library-standard.md +28 -28
  213. package/templates-zh-CN/reference/execution-workflow-standard.md +32 -7
  214. package/templates-zh-CN/reference/external-source-intake-standard.md +16 -16
  215. package/templates-zh-CN/reference/harness-ledger-standard.md +6 -6
  216. package/templates-zh-CN/reference/regression-ssot-governance.md +2 -2
  217. package/templates-zh-CN/reference/repo-governance-standard.md +1 -1
  218. package/templates-zh-CN/reference/review-routing-standard.md +1 -1
  219. package/templates-zh-CN/reference/walkthrough-standard.md +7 -7
  220. package/templates-zh-CN/reference/worktree-standard.md +1 -1
  221. package/templates-zh-CN/regression/Cadence-Ledger.md +2 -2
  222. package/templates-zh-CN/ssot/Delivery-SSoT.md +3 -3
  223. package/templates-zh-CN/ssot/Module-Registry.md +3 -3
  224. package/templates-zh-CN/ssot/Regression-SSoT.md +2 -2
  225. package/templates-zh-CN/walkthrough/walkthrough-template.md +5 -5
  226. package/tsconfig.dist.json +16 -0
  227. package/tsconfig.json +25 -0
  228. package/tsconfig.runtime.json +24 -0
  229. package/examples/minimal-project/.harness-capabilities.json +0 -8
  230. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/progress.md +0 -11
  231. package/scripts/check-harness.mjs +0 -508
  232. package/scripts/commands/dashboard-command.mjs +0 -67
  233. package/scripts/commands/migration-command.mjs +0 -96
  234. package/scripts/commands/preset-command.mjs +0 -73
  235. package/scripts/commands/task-command.mjs +0 -327
  236. package/scripts/harness.mjs +0 -287
  237. package/scripts/lib/capability-registry.mjs +0 -591
  238. package/scripts/lib/check-module-parallel.mjs +0 -237
  239. package/scripts/lib/check-profiles.mjs +0 -418
  240. package/scripts/lib/check-task-contracts.mjs +0 -47
  241. package/scripts/lib/core-shared.mjs +0 -196
  242. package/scripts/lib/dashboard-data.mjs +0 -412
  243. package/scripts/lib/dashboard-workbench.mjs +0 -257
  244. package/scripts/lib/dashboard-writer.mjs +0 -198
  245. package/scripts/lib/git-status-summary.mjs +0 -46
  246. package/scripts/lib/governance-index-generator.mjs +0 -174
  247. package/scripts/lib/governance-sync.mjs +0 -514
  248. package/scripts/lib/governance-table-boundary.mjs +0 -175
  249. package/scripts/lib/lesson-maintenance.mjs +0 -152
  250. package/scripts/lib/markdown-utils.mjs +0 -158
  251. package/scripts/lib/migration-planner.mjs +0 -478
  252. package/scripts/lib/migration-support.mjs +0 -312
  253. package/scripts/lib/preset-audit-contracts.mjs +0 -37
  254. package/scripts/lib/preset-engine.mjs +0 -497
  255. package/scripts/lib/preset-registry.mjs +0 -627
  256. package/scripts/lib/preset-resource-contracts.mjs +0 -83
  257. package/scripts/lib/review-confirm-git-gate.mjs +0 -248
  258. package/scripts/lib/subagent-authorization-audit.mjs +0 -196
  259. package/scripts/lib/task-completion-consistency.mjs +0 -16
  260. package/scripts/lib/task-index.mjs +0 -93
  261. package/scripts/lib/task-lesson-candidates.mjs +0 -242
  262. package/scripts/lib/task-lesson-sedimentation.mjs +0 -326
  263. package/scripts/lib/task-lifecycle/review-confirm.mjs +0 -101
  264. package/scripts/lib/task-lifecycle/review-gates.mjs +0 -70
  265. package/scripts/lib/task-lifecycle/text-utils.mjs +0 -24
  266. package/scripts/lib/task-lifecycle.mjs +0 -649
  267. package/scripts/lib/task-review-model.mjs +0 -469
  268. package/scripts/lib/task-scanner.mjs +0 -576
  269. package/scripts/lib/task-tombstone-commands.mjs +0 -140
  270. package/scripts/postinstall.mjs +0 -14
  271. package/templates/walkthrough/Closeout-SSoT.md +0 -43
  272. package/templates-zh-CN/walkthrough/Closeout-SSoT.md +0 -42
  273. /package/examples/minimal-project/{docs → coding-agent-harness/governance/generated}/Harness-Ledger.md +0 -0
  274. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/brief.md +0 -0
  275. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/execution_strategy.md +0 -0
  276. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/findings.md +0 -0
  277. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/lesson_candidates.md +0 -0
  278. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/task_plan.md +0 -0
  279. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/visual_map.md +0 -0
@@ -0,0 +1,304 @@
1
+ # 03 — 任务生命周期
2
+
3
+ ## Level 0 — 一个任务的一生
4
+
5
+ 一个任务从创建到收口,经历六个状态:
6
+
7
+ ```mermaid
8
+ flowchart LR
9
+ A["not_started\n目录已创建"] --> B["planned\n计划已填写"] --> C["in_progress\n正在执行"]
10
+ C --> D["review\n等待人工审查"]
11
+ D --> E["done\n收口完成"]
12
+ C -->|"外部阻塞"| F["blocked"] -->|"解除"| C
13
+ D -->|"打回重做"| C
14
+ ```
15
+
16
+ 每个状态转换都有对应的 CLI 命令触发。`planned` 状态在实践中通常被跳过——
17
+ Agent 创建任务后直接进入 `in_progress`。
18
+
19
+ ---
20
+
21
+ ## Level 1 — 状态与命令的对应关系
22
+
23
+ ```mermaid
24
+ flowchart TD
25
+ NS["not_started\n任务目录已创建\n文件已 scaffold"]
26
+ IP["in_progress\n正在执行"]
27
+ R["review\n等待人工审查"]
28
+ D["done\n收口完成"]
29
+ BL["blocked\n外部依赖阻塞"]
30
+
31
+ NS -->|"harness task-start"| IP
32
+ IP -->|"harness task-review"| R
33
+ R -->|"harness review-confirm\n(人工操作)"| D
34
+ IP -->|"harness task-phase --blocked"| BL
35
+ BL -->|"harness task-start"| IP
36
+ R -->|"打回重做"| IP
37
+ ```
38
+
39
+ **关键点**:`review-confirm` 是整个系统里**唯一不能被 Agent 自动执行**的命令。
40
+ 它需要真实的人类操作,并会写入带有 Git `user.name` / `user.email` 的可审计确认块。
41
+
42
+ ---
43
+
44
+ ## Level 2 — Budget 决定门禁严格程度
45
+
46
+ Budget 是任务的复杂度等级,直接决定审查门禁有多严:
47
+
48
+ | 门禁项 | simple | standard | complex |
49
+ | --- | --- | --- | --- |
50
+ | 需要 Visual Map 阶段进度 | ✗ | ✓ | ✓ |
51
+ | 需要 lesson_candidates.md | ✗ | ✓ | ✓ |
52
+ | 需要 Agent 写 review.md | ✗ | ✓ | ✓ |
53
+ | 需要关闭所有 blocking findings | ✗ | ✓ | ✓ |
54
+ | 需要 Walkthrough 链接 | ✗ | ✓ | ✓ |
55
+ | 需要 Lesson 决策完成 | ✗ | ✓ | ✓ |
56
+ | 需要人工 review-confirm | ✗ | ✓ | ✓ |
57
+
58
+ `simple` 任务可以直接从 `in_progress` 跳到 `done`,没有任何门禁。
59
+ `standard` 和 `complex` 的门禁完全相同——区别在于 `complex` 任务通常需要 subagent 授权和对抗审查。
60
+
61
+ ---
62
+
63
+ ## Level 3 — task-review 的门禁细节
64
+
65
+ 当 Agent 执行 `harness task-review` 时,系统在**进入 review 状态之前**做三项检查
66
+ (`review-gates.mjs`):
67
+
68
+ ```mermaid
69
+ flowchart TD
70
+ Trigger["harness task-review task-123"]
71
+
72
+ Trigger --> C1{"当前状态 == in_progress?"}
73
+ C1 -->|"否"| E1["❌ 拒绝\n状态不对"]
74
+ C1 -->|"是(且 budget != simple)"| C2{"lesson_candidates.md 存在?"}
75
+ C2 -->|"否"| E2["❌ 拒绝\n缺 lesson candidates"]
76
+ C2 -->|"是"| C3{"Visual Map 有至少一个阶段\n记录了进度或证据?"}
77
+ C3 -->|"否"| E3["❌ 拒绝\n无阶段进度记录"]
78
+ C3 -->|"是"| OK["✅ 进入 review 状态"]
79
+ ```
80
+
81
+ "阶段记录了进度"的判定(`review-gates.mjs`):
82
+ - `phase.completion > 0`,或
83
+ - `phase.state` 是 `in_progress / review / blocked / done`,或
84
+ - `phase.evidenceStatus` 是 `partial / present / waived`
85
+
86
+ 进入 review 状态后,Agent 需要写 `review.md`,填写 findings 表格。
87
+
88
+ ---
89
+
90
+ ## Level 3 — review-confirm 的门禁细节
91
+
92
+ 当人类执行 `harness review-confirm` 时,系统在**执行确认之前**做四项检查:
93
+
94
+ ```mermaid
95
+ flowchart TD
96
+ Trigger["harness review-confirm task-123"]
97
+
98
+ Trigger --> C1{"确认文本与任务 ID 匹配?"}
99
+ C1 -->|"否"| E1["❌ 拒绝\n确认文本不对"]
100
+ C1 -->|"是"| C2{"无阻塞性审查发现?\n(P0/P1/P2 open findings)"}
101
+ C2 -->|"否"| E2["❌ 拒绝\n还有未关闭的 blocking findings"]
102
+ C2 -->|"是"| C3{"Git 工作树干净?"}
103
+ C3 -->|"否"| E3["❌ 拒绝\n有未提交的改动"]
104
+ C3 -->|"是"| Exec["✅ 执行确认"]
105
+
106
+ Exec --> Write1["写入确认审计字段\n到 INDEX.md"]
107
+ Write1 --> Commit1["Git 提交 #1\nchore: confirm review task-123"]
108
+ Commit1 --> Commit2["Git 提交 #2\nchore: record review confirmation audit task-123"]
109
+ ```
110
+
111
+ **两次提交策略**:第一次提交 `INDEX.md` 中的确认字段,第二次提交最终审计元数据。
112
+ 这样即使第二次提交失败,第一次提交也已经锁定了确认记录。
113
+
114
+ **Task Audit Metadata 确认字段**(写入 `INDEX.md`):
115
+
116
+ ```markdown
117
+ ## Task Audit Metadata
118
+
119
+ | Field | Value |
120
+ | --- | --- |
121
+ | Human Review Status | confirmed |
122
+ | Confirmation ID | HRC-<timestamp> |
123
+ | Confirmed At | <ISO timestamp> |
124
+ | Reviewer | <git user.name> |
125
+ | Reviewer Email | <git user.email> |
126
+ | Confirm Text | <task id confirmation> |
127
+ | Evidence Checked | <evidence path> |
128
+ | Review Commit SHA | <git commit sha> |
129
+ | Audit Status | committed |
130
+ ```
131
+
132
+ ---
133
+
134
+ ## Level 3 — lifecycleState 派生逻辑
135
+
136
+ `lifecycleState` 是从任务状态 + 审查状态综合派生的,不存储在文件里,每次运行时重新计算。
137
+
138
+ 派生函数 `deriveLifecycleState()` 的完整决策树(按优先级顺序):
139
+
140
+ | 条件 | lifecycleState |
141
+ | --- | --- |
142
+ | `reviewStatus == "blocked-open-findings"` | `review-blocked` |
143
+ | `closeoutStatus == "closed"` 且 `reviewStatus != "confirmed"` | `closed-review-pending` |
144
+ | `closeoutStatus == "closed"` | `closed` |
145
+ | `state == "blocked"` | `blocked` |
146
+ | `state == "done"` | `closing` |
147
+ | `state == "review"` | `in_review` |
148
+ | `state == "in_progress"` | `active` |
149
+ | `state == "planned"` 或 `"not_started"` | `ready` |
150
+ | 其他 | `unknown` |
151
+
152
+ ---
153
+
154
+ ## Level 3 — 生命周期队列
155
+
156
+ 任务根据当前状态被自动分配到不同队列,这些队列在 Dashboard 中可见。
157
+ **一个任务可以同时属于多个队列**(比如同时在 `missing-materials` 和 `blocked`)。
158
+
159
+ 队列分配逻辑(`deriveTaskQueues()`):
160
+
161
+ ```mermaid
162
+ flowchart TD
163
+ Start["任务"]
164
+
165
+ Start --> T1{"tombstone.deletionState != active?"}
166
+ T1 -->|"是"| Q_DEL["soft-deleted-superseded 队列"]
167
+ T1 -->|"否"| T2{"有物料问题?"}
168
+
169
+ T2 -->|"是"| Q_MAT["missing-materials 队列"]
170
+ T2 -->|"否"| T3{"有阻塞原因?"}
171
+
172
+ T3 -->|"是"| Q_BLK["blocked 队列"]
173
+ T3 -->|"否"| T4{"已提交审查 + 准备确认\n+ 无 lesson 工作\n+ 无其他队列?"}
174
+
175
+ T4 -->|"是"| Q_REV["review 队列"]
176
+ T4 -->|"否"| T5{"有 lesson 工作?"}
177
+
178
+ T5 -->|"是"| Q_LES["lessons 队列"]
179
+ T5 -->|"否"| T6{"审查已确认?"}
180
+
181
+ T6 -->|"是,closeoutStatus=closed"| Q_FIN["finalized 队列"]
182
+ T6 -->|"是,其他"| Q_CON["confirmed 队列"]
183
+ T6 -->|"否,队列为空"| Q_ACT["active 队列"]
184
+ ```
185
+
186
+ **阻塞原因来源**:物料问题、P0-P2 阻塞性 findings、状态冲突、过时的扫描器版本。
187
+
188
+ ---
189
+
190
+ ## Level 4 — Governance Sync:状态变更如何写入账本
191
+
192
+ 任务状态每次变更,都会触发 `syncTaskGovernance()`,原子地更新 `Harness-Ledger.md`。
193
+
194
+ **锁机制**(`governance-sync.mjs`):
195
+
196
+ ```mermaid
197
+ sequenceDiagram
198
+ participant CLI as harness CLI
199
+ participant Lock as .harness/locks/governance-sync.lock
200
+ participant Ledger as coding-agent-harness/governance/generated/Harness-Ledger.md
201
+ participant Git
202
+
203
+ CLI->>Lock: fs.openSync(lockPath, "wx")\n(排他写入,EEXIST 则抛错)
204
+ Note over Lock: 如果锁已存在 → GovernanceSyncError\ncode: governance-lock-exists
205
+ CLI->>Ledger: 更新 task-123 对应的行
206
+ CLI->>Git: git add + git commit
207
+ Git-->>CLI: commit SHA
208
+ CLI->>Lock: fs.unlinkSync(lockPath)\n(删除锁文件)
209
+ ```
210
+
211
+ 锁文件使用 `wx` 标志(写入+排他)创建,这是 Node.js 文件系统的原子操作——
212
+ 如果文件已存在,`openSync` 会抛出 `EEXIST` 错误,不会覆盖。
213
+
214
+ **与 `governance rebuild` 的区别**:
215
+
216
+ | 操作 | 触发方式 | 写入目标 | 频率 |
217
+ | --- | --- | --- | --- |
218
+ | `syncTaskGovernance` | 自动(每次状态变更) | `Harness-Ledger.md` 对应行 | 高频 |
219
+ | `rebuildGovernanceIndexes` | 手动(`harness governance rebuild`) | `coding-agent-harness/governance/generated/` 索引表 | 低频 |
220
+
221
+ ---
222
+
223
+ ## Level 3 — Tombstone:软删除与合并
224
+
225
+ 任务可以被软删除、合并或被取代,而不是物理删除。
226
+ Tombstone 块追加到 `task_plan.md` 末尾(不替换原内容),保留历史审计链。
227
+
228
+ 支持的操作:
229
+ - `supersedeTask()`:标记为被新任务替代
230
+ - `softDeleteTask()`:软删除
231
+ - `archiveTask()`:归档
232
+ - `reopenTask()`:移除 Tombstone 块,重新激活任务
233
+
234
+ **Tombstone 块格式**:
235
+
236
+ ```markdown
237
+ ## Task Tombstone
238
+
239
+ | Field | Value |
240
+ | --- | --- |
241
+ | State | superseded |
242
+ | Superseded By | new-task-id |
243
+ | Reason | <reason text> |
244
+ | Operator | coordinator |
245
+ | Timestamp | <ISO timestamp> |
246
+ | Reopen Eligible | yes |
247
+ | Archive Eligible | no |
248
+ ```
249
+
250
+ ---
251
+
252
+ ## Level 2 — 设计决策
253
+
254
+ ### 为什么需要 lifecycleState 这个派生状态
255
+
256
+ `task.state` 是 Agent 手写进 `progress.md` 的原始执行阶段,只有粗粒度值,
257
+ 且存在大量历史别名(`complete`、`completed`、`doing`、`active` 等)。
258
+ 这个字段无法区分"Agent 说自己完成了"和"人工确认完成了",
259
+ 也无法区分"等待人审"和"材料缺失"。
260
+
261
+ `lifecycleState` 从多个文件综合推导,是 Dashboard 的主生命周期语义。
262
+ 驱动这个设计的核心场景是:一个 `task.state = review` 的任务,
263
+ 可能实际上处于"缺材料"、"有 open P0 finding"、"等待人审"三种完全不同的治理状态,
264
+ 而旧模型把这三种情况全部混入同一个 review 队列。
265
+
266
+ ### 为什么一个任务可以同时属于多个队列
267
+
268
+ 一个任务可以同时"等待人审"(Review 队列)且"有未决 lesson candidate"(Lessons 队列),
269
+ 这两件事的责任方不同(前者是 human reviewer,后者是 coordinator),
270
+ 退出条件也不同,不应该合并成一个状态。多队列模型让每个治理关注点独立可追踪。
271
+
272
+ ### 为什么 Tombstone 不直接删除任务目录
273
+
274
+ 文档库没有数据库级外键,物理删除后会留下孤儿引用
275
+ (Ledger、Closeout Index、其他任务的 `Supersedes` 字段都可能指向被删任务)。
276
+ Tombstone 标记让 Soft-deleted / Superseded 队列可以只读追溯"为什么这个任务不在活跃队列里"。
277
+
278
+ ### 为什么 review-confirm 需要两次 Git 提交
279
+
280
+ 两次提交让 audit commit 的 SHA 成为不可篡改的时间戳。
281
+ 第一次提交确认本身,第二次提交包含第一个 commit SHA 的审计记录。
282
+ 如果只写文件不提交,Agent 可以在不留 Git 历史的情况下伪造确认状态。
283
+ 检查器可以验证 confirmation commit 是否真实存在于 Git 历史中。
284
+
285
+ ### 为什么 governance-sync 用文件锁而不是 Git 自身的锁
286
+
287
+ Git 自身的锁(`.git/index.lock`)只保护 index 操作,
288
+ 不保护 Markdown 文件的读-改-写序列。两个并发 CLI 进程可以同时读取同一个 governance 表、
289
+ 各自修改、然后先后提交,导致后者覆盖前者的行列更新。
290
+ 文件锁的粒度是"整个 governance sync 操作",而不是单次 git 命令。
291
+
292
+ ### 为什么 simple budget 跳过所有门禁
293
+
294
+ simple 任务对应 trivial 级别的改动(文档修正、配置调整),
295
+ 强制经过 `task-review → review-confirm → task-complete` 三步会让 overhead 超过任务本身的价值。
296
+ 这是有意的快速路径,不是遗漏。
297
+
298
+ ### Lesson 系统的设计意图
299
+
300
+ Lesson 系统把任务执行中发现的可复用经验从"聊天里提到过"变成
301
+ "可追踪、可审查、可沉淀到标准文档"的治理对象。
302
+ Lesson candidate 决策必须在 `review-confirm` 之前完成,
303
+ 因为 `review-confirm` 是责任转移点——人工确认后,任务进入 finalization,
304
+ 此时再要求 Agent 补 lesson 决策会造成责任归属混乱。
@@ -0,0 +1,241 @@
1
+ # 04 — 检查体系与治理
2
+
3
+ ## Level 0 — 检查的目的
4
+
5
+ `harness check` 和 `harness status` 的核心问题是:
6
+
7
+ > **这个仓库的文档状态是否合规?**
8
+
9
+ "合规"的定义因场景不同而不同,所以有三种 profile。
10
+ 每种 profile 对应不同的使用场景,运行不同的验证器子集。
11
+
12
+ ---
13
+
14
+ ## Level 1 — 三种 Check Profile
15
+
16
+ ```mermaid
17
+ flowchart LR
18
+ subgraph "source-package"
19
+ SP["验证 harness 自身\n发布包的完整性\n(CI 用)"]
20
+ end
21
+
22
+ subgraph "private-harness"
23
+ PH["验证私有运行仓库\n(如 .harness-private)"]
24
+ end
25
+
26
+ subgraph "target-project"
27
+ TP["验证用户的目标项目\n(最常用,默认)"]
28
+ end
29
+ ```
30
+
31
+ | Profile | 典型命令 | 用途 |
32
+ | --- | --- | --- |
33
+ | `source-package` | `harness check --profile source-package .` | CI 验证 harness 自身发布包,检查 staged 文件边界(不允许 `.harness-private/` 或生成的 dashboard 被 tracked) |
34
+ | `private-harness` | `harness check --profile private-harness .harness-private` | 验证私有运行记录 |
35
+ | `target-project` | `harness check ~/my-app`(默认) | 验证用户项目合规,运行完整的 9 个验证器 |
36
+
37
+ **source-package 的特殊检查**:除了运行验证器,还会调用 `validateSourcePackageBoundary()`,
38
+ 检查 git staged 文件中是否包含了不应发布的内容(`.harness-private/`、生成的 dashboard 等)。
39
+
40
+ ---
41
+
42
+ ## Level 2 — buildStatus() 调用了哪些验证器
43
+
44
+ `buildStatus()` 是检查的核心函数,它按顺序调用 9 个验证器:
45
+
46
+ ```mermaid
47
+ flowchart TD
48
+ BS["buildStatus()"]
49
+
50
+ BS --> V1["① validateCapabilities\n能力注册表与实际文件是否一致\n依赖关系是否满足"]
51
+ BS --> V2["② validateReviewSchema\nreview.md 是否有必要的章节\nfindings 表格格式是否合规"]
52
+ BS --> V3["③ validateVisualMaps\nvisual_map.md 格式是否合规\n阶段字段是否完整"]
53
+ BS --> V4["④ validatePlanContracts\n任务文件是否有 Task Contract 标记"]
54
+ BS --> V5["⑤ validateTaskPresetContracts\nPreset 任务的合约是否完整\n资源声明是否存在"]
55
+ BS --> V6["⑥ validateContextDocs\n上下文文档(brief 等)是否存在"]
56
+ BS --> V7["⑦ validateGovernanceTableBoundaries\n治理表格的内容是否合规\n(不允许执行日志、临时 prompt 等)"]
57
+ BS --> V8["⑧ validateSubagentAuthorization\nsubagent 授权状态是否记录\n授权字段是否完整"]
58
+ BS --> V9["⑨ validateTaskCompletionConsistency\n已完成任务的 Visual Map 阶段是否也完成"]
59
+ ```
60
+
61
+ 每个验证器返回 `failures`(硬失败,必须修复)和 `warnings`(软警告,建议修复)。
62
+
63
+ > **注意**:`check-module-parallel.mjs` 存在于 `scripts/lib/` 但**不在** `buildStatus()` 的调用链中,它是独立工具,用于验证模块并行工作的 worktree 隔离。
64
+
65
+ ---
66
+
67
+ ## Level 3 — 每个验证器检查什么
68
+
69
+ ### ① validateCapabilities
70
+
71
+ 读取 `coding-agent-harness/harness.yaml`,检查:
72
+ - 声明的能力是否都是合法的能力名(在 `allowedCapabilities` 枚举中)
73
+ - 能力的依赖是否都已启用(如 `subagent-worker` 需要先有 `module-parallel`)
74
+ - 能力对应的 artifact 路径是否存在
75
+
76
+ ### ② validateReviewSchema
77
+
78
+ 扫描所有 `review.md` 文件,检查每个文件是否包含 4 个必需章节(用字符串匹配,支持中英文):
79
+
80
+ 1. `Reviewer Identity` / `审查者身份`
81
+ 2. `Confidence Challenge` / `信心挑战`
82
+ 3. `Evidence Checked` / `已检查证据`
83
+ 4. `Final Confidence Basis` / `最终信心依据`
84
+
85
+ 对于 findings 表格,还会检查:
86
+ - 必须有 Severity(P0-P3)、Open(yes/no)、Disposition、Blocks Release 列
87
+ - **P0/P1 severity 的 finding 不能同时 open=yes 或 blocks=yes**(这是硬失败)
88
+ - `accepted-risk` / `deferred` disposition 必须有 follow-up routing
89
+ - Evidence ID 引用(`E-\d+`)必须在 Evidence ID 表中存在
90
+
91
+ 对于 verifier-backed review,还需要 `template_id: harness-verifier/v1` 和 `verdict: pass|fail|inconclusive`。
92
+
93
+ ### ③ validateVisualMaps
94
+
95
+ 检查 `visual_map.md` 中的 Phase ID 表必须包含 9 列:
96
+ `Phase ID, Depends On, State, Completion, Output, Required Evidence, Evidence Status, Blocking Risk, Owner / Handoff`
97
+
98
+ 验证规则:
99
+ - `State` 必须在 `allowedPhaseStates` 中
100
+ - `Evidence Status` 必须在 `allowedEvidenceStatus` 中
101
+ - `Completion` 必须是 0-100 的整数
102
+ - `state=done` 时 `completion` 必须 = 100
103
+ - `state=planned` 时 `completion` 必须 = 0
104
+ - canonical 源的 visual map 需要 `Visual Map Contract: v1.0` 标记
105
+
106
+ ### ④ validatePlanContracts
107
+
108
+ 检查 `task_plan.md` 是否包含 `Task Contract: harness-task/v1` 标记行。
109
+ 这是任务被 harness 识别的最基本要求。
110
+
111
+ ### ⑤ validateTaskPresetContracts
112
+
113
+ 对于使用了 Preset 的任务,检查:
114
+ - Preset 声明的资源文件是否存在
115
+ - `references/INDEX.md` 中是否有对应的索引行
116
+ - `task_plan.md` 的"Preset Required Reads"中是否列出了必需阅读
117
+
118
+ ### ⑦ validateGovernanceTableBoundaries
119
+
120
+ 检查 5 个全局治理表格的内容合规性:
121
+
122
+ | 表格 | 不允许出现的内容 |
123
+ | --- | --- |
124
+ | Feature-SSoT | 模块级细节、过长的证据描述 |
125
+ | Harness-Ledger | 执行日志、临时修复 prompt、原始对话记录 |
126
+ | Closeout-SSoT | 执行日志、原始对话记录 |
127
+ | Regression-SSoT | 执行日志、临时 prompt |
128
+ | Cadence-Ledger | 原始对话记录、临时 prompt |
129
+
130
+ **时间边界**:2026-05-24 之前的行标记为 legacy,仅产生 warning;之后的行产生 failure。
131
+
132
+ ### ⑧ validateSubagentAuthorization
133
+
134
+ 扫描所有 `execution_strategy.md` 文件,查找 **Subagent Authorization** 表。
135
+
136
+ 对于 worker 角色且 status 为 `authorized` 的行,检查 4 个字段完整性:
137
+ `Authorized By, Authorized At, Scope, Worktree / Branch`
138
+
139
+ 字段值必须是"具体的"(非空、非占位符 `[...]`、非 `pending/n/a/none/—` 等)。
140
+
141
+ 若 **Subagent Delegation Decision** 表中 worker 的 decision=`ask-user`,
142
+ 则必须在 **User Authorization Decision** 表中找到对应的已解决行。
143
+
144
+ **warning vs failure**:strict 模式下产生 failure;adoption 模式下产生 warning。
145
+
146
+ ### ⑨ validateTaskCompletionConsistency
147
+
148
+ 检查 `task.state=done` 的任务,其 Visual Map 中的所有 phase 是否也都完成。
149
+
150
+ "完成"的判定:`phase.state=skipped` 或 `(phase.state=done 且 phase.completion=100)`。
151
+
152
+ 若存在不完整的 phase:
153
+ - `closeoutStatus=closed` → **failure**
154
+ - 否则 → **warning**
155
+
156
+ ---
157
+
158
+ ## Level 2 — 检查输出结构
159
+
160
+ `harness status --json` 输出的核心字段:
161
+
162
+ ```mermaid
163
+ flowchart TD
164
+ Output["status JSON"]
165
+
166
+ Output --> F["failures[]\n硬失败,必须修复\n(阻止 CI 通过)"]
167
+ Output --> W["warnings[]\n软警告,建议修复\n(不阻止 CI)"]
168
+ Output --> T["tasks[]\n所有任务的结构化数据"]
169
+ Output --> C["capabilities[]\n能力注册表状态"]
170
+ Output --> G["git\nGit 状态摘要(dirty files 等)"]
171
+
172
+ T --> TF["每个 task 包含:\nid / title / state / budget\nlifecycleState / reviewQueueState\ntaskQueues[] / phases[]\ncloseoutStatus / tombstone\nlessonCandidateDecisionComplete\nbriefSource / visualMapSource\ntaskPreset / presetVersion\nhandoffs[]"]
173
+ ```
174
+
175
+ ---
176
+
177
+ ## Level 3 — 治理索引重建
178
+
179
+ `harness governance rebuild --apply` 从任务扫描结果重建全局索引表:
180
+
181
+ ```mermaid
182
+ flowchart TD
183
+ Cmd["harness governance rebuild --apply"]
184
+
185
+ Cmd --> Scan["collectTasks()\n扫描所有任务"]
186
+ Scan --> Filter["过滤掉 deletionState == deleted 的任务"]
187
+ Filter --> Sort["按 id 字母序排序"]
188
+ Sort --> Gen["生成 governance surfaces"]
189
+
190
+ Gen --> TI["coding-agent-harness/governance/generated/task-index.md\n所有任务的汇总索引表"]
191
+ Gen --> MI["coding-agent-harness/governance/generated/module-index.md\n模块步骤索引表"]
192
+
193
+ TI --> Atomic["原子写入\n(governance-sync 锁 + git commit)"]
194
+ MI --> Atomic
195
+ ```
196
+
197
+ 这个操作是**手动触发**的,不会在每次任务状态变更时自动运行。
198
+ 自动运行的是 `syncTaskGovernance()`,它只更新 `Harness-Ledger.md` 的对应行。
199
+
200
+ **为什么分开**:`Harness-Ledger.md` 是高频写入的账本(每次状态变更都更新),
201
+ 而 `generated/` 索引表是低频的全量重建(需要扫描所有任务,成本较高)。
202
+ 把两者分开可以避免每次状态变更都触发全量扫描。
203
+
204
+ ---
205
+
206
+ ## Level 2 — 设计决策
207
+
208
+ ### 为什么检查器分 failures 和 warnings 两级
209
+
210
+ 两级从一开始就存在。v2 中,活跃目标项目必须从
211
+ `coding-agent-harness/harness.yaml` 运行:
212
+ - v2 项目对缺失必需文件报 failure,并可阻断 CI
213
+ - legacy 结构只作为迁移输入;先运行 `migrate-structure --plan` 和
214
+ `migrate-structure --apply`,再进入普通 status/check/dashboard 流程
215
+
216
+ 这样 active runtime 保持单一形状,同时迁移命令仍能读取旧结构并生成切换计划。
217
+ 没有考虑过三级或更多级别——两级已经足够区分"必须修复"和"建议迁移"。
218
+
219
+ ### 为什么 governance 表格有时间边界
220
+
221
+ 2026-05-24 之前的行标记为 legacy,仅产生 warning;之后的行产生 failure。
222
+ 这是因为 governance 表格的内容规范是后来引入的,
223
+ 不能让历史数据突然变成硬失败阻断所有操作。
224
+ 时间边界让新写入的行必须合规,同时给历史数据留出迁移窗口。
225
+
226
+ ### 为什么 subagent authorization 区分 strict 和 adoption 模式
227
+
228
+ subagent 授权检查的严格程度取决于项目的成熟度:
229
+ - 新项目从一开始就要求完整的授权记录(strict → failure)
230
+ - 旧项目在迁移过程中可能有大量历史任务缺少授权记录(adoption → warning)
231
+
232
+ 这避免了"接入 harness 后所有历史任务突然报错"的体验问题。
233
+
234
+ ### 为什么 validateTaskCompletionConsistency 区分 closed 和非 closed
235
+
236
+ 如果一个任务已经 `closeoutStatus=closed`(人工确认收口),
237
+ 但 Visual Map 中还有未完成的 phase,这是一个严重的不一致——
238
+ 说明收口确认时遗漏了检查,必须报 failure。
239
+
240
+ 如果任务还没有 closed,同样的不一致只是 warning——
241
+ 可能是 Agent 还在工作中,或者某些 phase 会被标记为 skipped。