@hunter-harness/workflow-harness 0.2.29 → 0.2.31

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 (170) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +3 -3
  3. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +3 -3
  4. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +3 -3
  5. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +323 -32
  6. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +3 -3
  7. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +6 -6
  8. package/harness/bundles/general/claude-code/harness-plan/checklist.md +10 -4
  9. package/harness/bundles/general/claude-code/harness-plan/reference.md +17 -17
  10. package/harness/bundles/general/claude-code/harness-review/SKILL.md +3 -3
  11. package/harness/bundles/general/claude-code/harness-run/SKILL.md +4 -4
  12. package/harness/bundles/general/claude-code/harness-run/checklist.md +2 -2
  13. package/harness/bundles/general/claude-code/harness-run/reference.md +3 -12
  14. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +3 -3
  15. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +30 -53
  16. package/harness/bundles/general/claude-code/harness-sync/reference.md +89 -142
  17. package/harness/bundles/general/claude-code/harness-test/SKILL.md +3 -3
  18. package/harness/bundles/general/claude-code/scripts/harness_change.py +189 -0
  19. package/harness/bundles/general/claude-code/scripts/harness_gate.py +97 -14
  20. package/harness/bundles/general/claude-code/scripts/harness_plan_finalize.py +364 -74
  21. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  22. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +3 -3
  23. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +3 -3
  24. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +3 -3
  25. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +323 -32
  26. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +3 -3
  27. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +6 -6
  28. package/harness/bundles/general/codebuddy/harness-plan/checklist.md +10 -4
  29. package/harness/bundles/general/codebuddy/harness-plan/reference.md +17 -17
  30. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +3 -3
  31. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +4 -4
  32. package/harness/bundles/general/codebuddy/harness-run/checklist.md +2 -2
  33. package/harness/bundles/general/codebuddy/harness-run/reference.md +3 -12
  34. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +3 -3
  35. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +32 -53
  36. package/harness/bundles/general/codebuddy/harness-sync/reference.md +89 -142
  37. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +3 -3
  38. package/harness/bundles/general/codebuddy/scripts/harness_change.py +189 -0
  39. package/harness/bundles/general/codebuddy/scripts/harness_gate.py +97 -14
  40. package/harness/bundles/general/codebuddy/scripts/harness_plan_finalize.py +364 -74
  41. package/harness/bundles/general/codex/.harness-build.json +1 -1
  42. package/harness/bundles/general/codex/harness-archive/SKILL.md +3 -3
  43. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +3 -3
  44. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +3 -3
  45. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +323 -32
  46. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +3 -3
  47. package/harness/bundles/general/codex/harness-plan/SKILL.md +6 -6
  48. package/harness/bundles/general/codex/harness-plan/checklist.md +10 -4
  49. package/harness/bundles/general/codex/harness-plan/reference.md +17 -17
  50. package/harness/bundles/general/codex/harness-review/SKILL.md +3 -3
  51. package/harness/bundles/general/codex/harness-run/SKILL.md +4 -4
  52. package/harness/bundles/general/codex/harness-run/checklist.md +2 -2
  53. package/harness/bundles/general/codex/harness-run/reference.md +3 -12
  54. package/harness/bundles/general/codex/harness-submit/SKILL.md +3 -3
  55. package/harness/bundles/general/codex/harness-sync/SKILL.md +32 -53
  56. package/harness/bundles/general/codex/harness-sync/reference.md +89 -142
  57. package/harness/bundles/general/codex/harness-test/SKILL.md +3 -3
  58. package/harness/bundles/general/codex/scripts/harness_change.py +189 -0
  59. package/harness/bundles/general/codex/scripts/harness_gate.py +97 -14
  60. package/harness/bundles/general/codex/scripts/harness_plan_finalize.py +364 -74
  61. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  62. package/harness/bundles/general/cursor/harness-archive/SKILL.md +3 -3
  63. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +3 -3
  64. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +3 -3
  65. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +323 -32
  66. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +3 -3
  67. package/harness/bundles/general/cursor/harness-plan/SKILL.md +6 -6
  68. package/harness/bundles/general/cursor/harness-plan/checklist.md +10 -4
  69. package/harness/bundles/general/cursor/harness-plan/reference.md +17 -17
  70. package/harness/bundles/general/cursor/harness-review/SKILL.md +3 -3
  71. package/harness/bundles/general/cursor/harness-run/SKILL.md +4 -4
  72. package/harness/bundles/general/cursor/harness-run/checklist.md +2 -2
  73. package/harness/bundles/general/cursor/harness-run/reference.md +3 -12
  74. package/harness/bundles/general/cursor/harness-submit/SKILL.md +3 -3
  75. package/harness/bundles/general/cursor/harness-sync/SKILL.md +32 -53
  76. package/harness/bundles/general/cursor/harness-sync/reference.md +89 -142
  77. package/harness/bundles/general/cursor/harness-test/SKILL.md +3 -3
  78. package/harness/bundles/general/cursor/scripts/harness_change.py +189 -0
  79. package/harness/bundles/general/cursor/scripts/harness_gate.py +97 -14
  80. package/harness/bundles/general/cursor/scripts/harness_plan_finalize.py +364 -74
  81. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  82. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +3 -3
  83. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +3 -3
  84. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +3 -3
  85. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +3 -3
  86. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +323 -32
  87. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +3 -3
  88. package/harness/bundles/java/claude-code/harness-package/SKILL.md +3 -3
  89. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +6 -6
  90. package/harness/bundles/java/claude-code/harness-plan/checklist.md +10 -4
  91. package/harness/bundles/java/claude-code/harness-plan/reference.md +17 -17
  92. package/harness/bundles/java/claude-code/harness-review/SKILL.md +3 -3
  93. package/harness/bundles/java/claude-code/harness-run/SKILL.md +4 -4
  94. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +3 -3
  95. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +30 -53
  96. package/harness/bundles/java/claude-code/harness-sync/reference.md +89 -142
  97. package/harness/bundles/java/claude-code/harness-test/SKILL.md +3 -3
  98. package/harness/bundles/java/claude-code/scripts/harness_change.py +189 -0
  99. package/harness/bundles/java/claude-code/scripts/harness_gate.py +97 -14
  100. package/harness/bundles/java/claude-code/scripts/harness_plan_finalize.py +364 -74
  101. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  102. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +3 -3
  103. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +3 -3
  104. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +3 -3
  105. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +3 -3
  106. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +323 -32
  107. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +3 -3
  108. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +3 -3
  109. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +6 -6
  110. package/harness/bundles/java/codebuddy/harness-plan/checklist.md +10 -4
  111. package/harness/bundles/java/codebuddy/harness-plan/reference.md +17 -17
  112. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +3 -3
  113. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +4 -4
  114. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +3 -3
  115. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +32 -53
  116. package/harness/bundles/java/codebuddy/harness-sync/reference.md +89 -142
  117. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +3 -3
  118. package/harness/bundles/java/codebuddy/scripts/harness_change.py +189 -0
  119. package/harness/bundles/java/codebuddy/scripts/harness_gate.py +97 -14
  120. package/harness/bundles/java/codebuddy/scripts/harness_plan_finalize.py +364 -74
  121. package/harness/bundles/java/codex/.harness-build.json +1 -1
  122. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +3 -3
  123. package/harness/bundles/java/codex/harness-archive/SKILL.md +3 -3
  124. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +3 -3
  125. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +3 -3
  126. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +323 -32
  127. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +3 -3
  128. package/harness/bundles/java/codex/harness-package/SKILL.md +3 -3
  129. package/harness/bundles/java/codex/harness-plan/SKILL.md +6 -6
  130. package/harness/bundles/java/codex/harness-plan/checklist.md +10 -4
  131. package/harness/bundles/java/codex/harness-plan/reference.md +17 -17
  132. package/harness/bundles/java/codex/harness-review/SKILL.md +3 -3
  133. package/harness/bundles/java/codex/harness-run/SKILL.md +4 -4
  134. package/harness/bundles/java/codex/harness-submit/SKILL.md +3 -3
  135. package/harness/bundles/java/codex/harness-sync/SKILL.md +32 -53
  136. package/harness/bundles/java/codex/harness-sync/reference.md +89 -142
  137. package/harness/bundles/java/codex/harness-test/SKILL.md +3 -3
  138. package/harness/bundles/java/codex/scripts/harness_change.py +189 -0
  139. package/harness/bundles/java/codex/scripts/harness_gate.py +97 -14
  140. package/harness/bundles/java/codex/scripts/harness_plan_finalize.py +364 -74
  141. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  142. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +3 -3
  143. package/harness/bundles/java/cursor/harness-archive/SKILL.md +3 -3
  144. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +3 -3
  145. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +3 -3
  146. package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +323 -32
  147. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +3 -3
  148. package/harness/bundles/java/cursor/harness-package/SKILL.md +3 -3
  149. package/harness/bundles/java/cursor/harness-plan/SKILL.md +6 -6
  150. package/harness/bundles/java/cursor/harness-plan/checklist.md +10 -4
  151. package/harness/bundles/java/cursor/harness-plan/reference.md +17 -17
  152. package/harness/bundles/java/cursor/harness-review/SKILL.md +3 -3
  153. package/harness/bundles/java/cursor/harness-run/SKILL.md +4 -4
  154. package/harness/bundles/java/cursor/harness-submit/SKILL.md +3 -3
  155. package/harness/bundles/java/cursor/harness-sync/SKILL.md +32 -53
  156. package/harness/bundles/java/cursor/harness-sync/reference.md +89 -142
  157. package/harness/bundles/java/cursor/harness-test/SKILL.md +3 -3
  158. package/harness/bundles/java/cursor/scripts/harness_change.py +189 -0
  159. package/harness/bundles/java/cursor/scripts/harness_gate.py +97 -14
  160. package/harness/bundles/java/cursor/scripts/harness_plan_finalize.py +364 -74
  161. package/harness/manifests/general/claude-code.json +30 -21
  162. package/harness/manifests/general/codebuddy.json +30 -21
  163. package/harness/manifests/general/codex.json +30 -21
  164. package/harness/manifests/general/cursor.json +30 -21
  165. package/harness/manifests/java/claude-code.json +30 -21
  166. package/harness/manifests/java/codebuddy.json +30 -21
  167. package/harness/manifests/java/codex.json +30 -21
  168. package/harness/manifests/java/cursor.json +30 -21
  169. package/hunter-workflow-family.json +18 -2
  170. package/package.json +1 -1
@@ -20,7 +20,7 @@ disallowed-tools:
20
20
  - Bash(awk *)
21
21
  - Bash(curl *)
22
22
  ---
23
- <!-- generated by harness_deploy.py; core=777d8783b2b2f001; overlay=java; agent=claude-code; do not edit -->
23
+ <!-- generated by harness_deploy.py; core=5e077a99a90502cb; overlay=java; agent=claude-code; do not edit -->
24
24
  # harness-plan — 需求规划
25
25
 
26
26
  ## Purpose
@@ -82,14 +82,14 @@ disallowed-tools:
82
82
  | 阶段 | 动作 |
83
83
  |------|------|
84
84
  | 0 | 用当前解释器运行 `harness_runtime.py doctor`,后续消费绝对 argv;git status;脏工作区 → baseline 隔离 + `decision`,不询问 |
85
- | 0.5 | 先初始化 change-name + `phase.start`,从第一条知识查询起保留事件证据 |
85
+ | 0.5 | 先初始化 change-name、plan-run-id attempt(首次为 1),用同一身份追加 `phase.start`;从第一条知识查询起保留事件证据,并在 finalizer 中复用该身份 |
86
86
  | 1 | `harness-knowledge-query` 单次 query(内部 ensure-current;失败记 `issue`) |
87
87
  | 2 | 歧义优先检查 + 复杂度分级;先确认会改变实现方向的语义歧义 |
88
88
  | 3 | 按复杂度执行有预算的代码探索;简单修复不得扩散到无关模块 |
89
89
  | 4 | **设计审批包** blocking user confirmation;确认事件早于 approved 设计文档和 `meta/worktree.json` |
90
90
  | 5–6 | plan + implementation-detail + test-scenarios → `plans/` |
91
91
  | 7.5 | 仅 `--adversarial` 对抗评审 |
92
- | 8 | 在临时产物集上运行 `harness_plan_finalize.py finalize`;原子发布、唯一 `phase.end`、render → `checklist.md` |
92
+ | 8 | 在临时产物集上运行 `harness_plan_finalize.py finalize`,随后立即运行 `verify`;原子发布、派生清单计数对账、完整生命周期、render → `checklist.md` |
93
93
 
94
94
  change-name 范围变更 → 提示重命名或记 🟡WARN(→ `reference.md`)
95
95
 
@@ -106,7 +106,7 @@ change-name 范围变更 → 提示重命名或记 🟡WARN(→ `reference.md`
106
106
  |------|------|
107
107
  | 产物路径 | 只写 `.harness/changes/<cn>/`;禁止 superpowers 输入 |
108
108
  | 设计审批包 | 一次 blocking user confirmation 含 worktree(读 `harness.json` `defaultWorktree`) |
109
- | 阶段 8 | spec/plan/detail/scenarios/worktree.json 先进入 staging;仅 finalizer 校验成功后发布并写唯一 `phase.end`/log,失败不得手工补终态 |
109
+ | 阶段 8 | spec/plan/detail/scenarios/worktree.json 先进入 staging;仅 finalizer 校验成功后发布并写唯一 `phase.end`/log;随后 `verify` 必须确认 start/end、收据哈希、全部任务表和非空场景清单一致,失败不得手工补终态 |
110
110
  | Plan 结束 | **禁止**询问执行模式;只提示 `/harness-run` |
111
111
  | 知识查询 | 0.5 失败不得假装已读历史 |
112
112
  | 歧义优先检查 | 否定、对比、动作对象或范围存在多种合理解释时,最小取证后先给推荐理解并一次一问;确认前不深挖错误方向 |
@@ -134,12 +134,12 @@ change-name 范围变更 → 提示重命名或记 🟡WARN(→ `reference.md`
134
134
  `events.ndjson` 为唯一事实源(schema_version 3,兼容读取 v1/v2;`note` 承载人类可读摘要);`logs/execution-log.md` 由 `harness_events.py` 渲染,**禁止用 Write/Edit 直接维护**。直接修改的内容会在 `phase.end` 或 finalize 时被完整重建覆盖,属于数据丢失;需要保留的详情必须进入事件 `note`。结构 → [[../protocols/report-pipeline-protocol.md|report-pipeline-protocol]]
135
135
 
136
136
  ```powershell
137
- python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --note "<触发指令>"
137
+ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --run-id <phase-run-id> --attempt <n> --note "<触发指令>"
138
138
  ```
139
139
 
140
140
  > **脚本接线**:`harness_events.py append`;`harness_archive.py finalize`;`harness_preflight.py check`;`harness_ledger.py can-reuse`;`harness_service.py ensure/stop`(须 `--files`/`serviceStart.inputFiles`)。JSON 输出按 D13 护栏解读。
141
141
 
142
142
  > **Task 4 §6.1 写入契约**:普通 `append` = 加锁 -> 追加一行 -> fsync -> 解锁,**不 load 历史、不渲染**(O(1),跨进程锁 `events.ndjson.lock`,UUID 用完整 `uuid4().hex` 无需去重扫描)。仅 `--type phase.end` append 在追加成功后渲染一次 `execution-log.md`;显式 `harness_events.py render` 随时从完整 events 重建;`harness_archive.py finalize` 在 collect 前强制 render 一次。高频 command append 期间 log 可能滞后,phase 边界保持最新。
143
143
 
144
- 每次阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`;重试同一阶段时增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
144
+ 每个阶段的 `phase.start` 与对应 `phase.end` 必须复用同一 `--run-id` / `--attempt`;阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`。重试同一阶段时生成新的 run-id 并增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
145
145
  > 片段:logging · phase=`plan`
@@ -14,7 +14,7 @@ description: harness-plan 的阶段检查清单和覆盖检查列表。仅在执
14
14
 
15
15
  ## 阶段 0.5:事件初始化与知识查询
16
16
 
17
- - [ ] 先确定 change-name,并立即用 `harness_events.py append` 追加 `phase.start`
17
+ - [ ] 先确定 change-name、稳定的 plan-run-id 与 attempt(首次为 1),立即用 `harness_events.py append ... --phase plan --type phase.start --run-id <plan-run-id> --attempt <attempt>` 追加开始事件
18
18
  - [ ] 再执行一次 knowledge `query`;由 query 内部 ensure-current,不另跑前置 sync
19
19
  - [ ] 查询失败追加 `issue`,不得重跑“sync + query”循环或假装已读取历史
20
20
 
@@ -210,8 +210,11 @@ source: harness-plan
210
210
  > **缺任一文件 → ❌FAIL,不得宣称 plan 完成。**
211
211
 
212
212
  - [ ] 所有待发布产物先写入 staging,不直接覆盖正式 change 目录
213
- - [ ] 执行 `harness_plan_finalize.py finalize --change-dir ... --staging-dir ... --change ... --run-id ... --attempt ... --json`
213
+ - [ ] 执行 `harness_plan_finalize.py finalize --change-dir ... --staging-dir ... --change ... --run-id <plan-run-id> --attempt <attempt> --json`;身份必须与本次 `phase.start` 完全相同
214
214
  - [ ] finalizer 返回 `ok=true` 与 `artifactsHash`;重复执行返回 `idempotent=true`
215
+ - [ ] 紧接着执行 `harness_plan_finalize.py verify --change-dir ... --json`
216
+ - [ ] verify 返回 `phaseStartCount=1`、`phaseEndCount=1`、`phaseEndStatus=OK`、`receiptConsistent=true`
217
+ - [ ] verify 的 `taskCount` 等于全部任务表行数,`scenarioCount` 等于 Markdown 中全部唯一场景 ID 数;任一为 0 或不一致即 ❌FAIL
215
218
  - [ ] finalizer 失败时正式目录无半发布产物、无成功 `phase.end`、无伪造 execution log
216
219
  - [ ] 禁止在 finalizer 之前手工追加成功 `phase.end`
217
220
 
@@ -222,6 +225,9 @@ source: harness-plan
222
225
  | `.harness/changes/<change>/plans/<change>-implementation-detail.md` | ✅ | □ |
223
226
  | `.harness/changes/<change>/plans/<change>-test-scenarios.md` | ✅ | □ |
224
227
  | `.harness/changes/<change>/meta/worktree.json` | ✅ | □ |
228
+ | `.harness/changes/<change>/meta/implementation-checkpoints.json` | ✅ | □ |
229
+ | `.harness/changes/<change>/meta/scenario-manifest.json`(非空且计数一致) | ✅ | □ |
230
+ | `.harness/changes/<change>/meta/plan-finalization.json`(finalized) | ✅ | □ |
225
231
  | `.harness/changes/<change>/logs/execution-log.md` | ✅ | □ |
226
232
  | `.harness/changes/<change>/events.ndjson` | ✅ | □ |
227
233
 
@@ -244,7 +250,7 @@ source: harness-plan
244
250
 
245
251
  ## 关键原则
246
252
 
247
- - **产物路径唯一性**:`.harness/changes/<change-name>/` 是唯一真相源,plan 产物必须直接写入此目录
253
+ - **产物路径唯一性**:正式 `.harness/changes/<change-name>/` 是唯一真相源;plan 只写 staging,由 finalizer 原子发布,禁止先写正式目录再补 staging
248
254
  - **原生规划协议**:阶段 4/6 使用 clarification、decision-grilling、implementation-planning 三段内置协议,不运行时依赖 Superpowers/grill-me/writing-plans
249
255
  - **阶段 4 是强制阻断检查点**——展示设计审批包后必须停下来问用户,收到回复后才能写 approved 设计文档。不要跳过
250
256
  - 代码探索只读不写——这个阶段的目标是理解,不是修改
@@ -255,7 +261,7 @@ source: harness-plan
255
261
 
256
262
  ## 事件记录(前置规则)
257
263
 
258
- - [ ] 确定 change-name 后立即 append `phase.start` 事件;各阶段用 `harness_events.py append` 写入 `decision` / `issue` / `artifact`
264
+ - [ ] 确定 change-name 后立即用稳定且可复用的 `--run-id` / `--attempt` append `phase.start` 事件;各阶段用 `harness_events.py append` 写入 `decision` / `issue` / `artifact`
259
265
  - [ ] 阶段 0 在 change-name 确定前可不写事件;阶段 0.5 确定 change-name 后必须开始记录
260
266
 
261
267
  ## 需求范围缩减后的 change-name 检查 ⚠️
@@ -228,35 +228,35 @@ status: approved
228
228
 
229
229
  #### 1.1 <类名.方法名>
230
230
 
231
- | # | 分类 | 场景描述 | 输入 | 预期 | 执行层级 | 预计时长 | 资源预算 | 超时 | 可复用证据 |
232
- |:--:|:----:|----------|------|------|----------|----------|----------|------|------------|
233
- | UT-001 | 正常 | ... | ... | ... | affected | ≤10s | 1 worker / ≤512MB | 30s | inputsHash + command |
234
- | UT-002 | 异常 | ... | ... | 抛 xxxException | affected | ≤10s | 1 worker / ≤512MB | 30s | inputsHash + command |
235
- | UT-003 | 边界 | ... | ... | ... | module | ≤60s | ≤50% CPU / ≤1GB | 120s | ledger identity |
231
+ | ID | 优先级 | 分类 | 场景描述 | 输入 | 预期 | 执行层级 | 预计时长 | 资源预算 | 超时 | 可复用证据 |
232
+ |:--:|:------:|:----:|----------|------|------|----------|----------|----------|------|------------|
233
+ | UT-001 | P0 | 正常 | ... | ... | ... | affected | ≤10s | 1 worker / ≤512MB | 30s | inputsHash + command |
234
+ | UT-002 | P0 | 异常 | ... | ... | 抛 xxxException | affected | ≤10s | 1 worker / ≤512MB | 30s | inputsHash + command |
235
+ | UT-003 | P1 | 边界 | ... | ... | ... | module | ≤60s | ≤50% CPU / ≤1GB | 120s | ledger identity |
236
236
 
237
237
  ### 二、接口测试场景
238
238
 
239
239
  #### 2.1 POST /xxx
240
240
 
241
- | # | 分类 | 场景描述 | 关键字段 | HTTP | code | message | 执行层级 | 预计时长 | 资源预算 | 超时 | 可复用证据 |
242
- |:--:|:----:|----------|----------|:----:|:----:|--------|----------|----------|----------|------|------------|
243
- | API-001 | 正常 | ... | ... | 200 | 0 | 成功 | module | ≤60s | 1 service / ≤1GB | 120s | environmentHash + ledger |
244
- | API-002 | 校验 | ... | ... | 200 | xxx | ... | affected | ≤20s | 1 service / ≤1GB | 60s | environmentHash + ledger |
241
+ | ID | 优先级 | 分类 | 场景描述 | 关键字段 | HTTP | code | message | 执行层级 | 预计时长 | 资源预算 | 超时 | 可复用证据 |
242
+ |:--:|:------:|:----:|----------|----------|:----:|:----:|--------|----------|----------|----------|------|------------|
243
+ | API-001 | P0 | 正常 | ... | ... | 200 | 0 | 成功 | module | ≤60s | 1 service / ≤1GB | 120s | environmentHash + ledger |
244
+ | API-002 | P1 | 校验 | ... | ... | 200 | xxx | ... | affected | ≤20s | 1 service / ≤1GB | 60s | environmentHash + ledger |
245
245
 
246
246
  ### 三、数据兼容场景
247
247
 
248
- | # | 分类 | 场景描述 | 操作 | 数据特征 | 预期 | 执行层级 | 预计时长 | 资源预算 | 超时 | 可复用证据 |
249
- |:--:|:----:|----------|:----:|----------|------|----------|----------|----------|------|------------|
250
- | COM-001 | 旧数据 | ... | ... | ... | ... | module | ≤60s | isolated DB / ≤1GB | 120s | dbSchemaHash + ledger |
248
+ | ID | 优先级 | 分类 | 场景描述 | 操作 | 数据特征 | 预期 | 执行层级 | 预计时长 | 资源预算 | 超时 | 可复用证据 |
249
+ |:--:|:------:|:----:|----------|:----:|----------|------|----------|----------|----------|------|------------|
250
+ | COM-001 | P1 | 旧数据 | ... | ... | ... | ... | module | ≤60s | isolated DB / ≤1GB | 120s | dbSchemaHash + ledger |
251
251
 
252
252
  ### 四、集成场景
253
253
 
254
- | # | 分类 | 场景描述 | 前置条件 | 步骤 | 预期 | 执行层级 | 预计时长 | 资源预算 | 超时 | 可复用证据 |
255
- |:--:|:----:|----------|----------|------|------|----------|----------|----------|------|------------|
256
- | INT-001 | 端到端 | ... | ... | N 步操作 | ... | candidate | ≤10m | ≤50% CPU / ≤2GB | 15m | verification identity |
254
+ | ID | 优先级 | 分类 | 场景描述 | 前置条件 | 步骤 | 预期 | 执行层级 | 预计时长 | 资源预算 | 超时 | 可复用证据 |
255
+ |:--:|:------:|:----:|----------|----------|------|------|----------|----------|----------|------|------------|
256
+ | INT-001 | P0 | 端到端 | ... | ... | N 步操作 | ... | candidate | ≤10m | ≤50% CPU / ≤2GB | 15m | verification identity |
257
257
  ```
258
258
 
259
- 执行层级固定为 `affected`(快速反馈)、`module`(变更模块门禁)、`candidate`(产品候选)。禁止所有场景默认跑全仓库;无法给出预算或超时时必须说明原因,并拆分或隔离高成本场景。只有 command、inputs/toolchain/environment 身份一致的成功 ledger 证据可以复用。
259
+ 新计划必须显式使用 `ID` 和 `优先级` 列;`P0/P1` 都要求 ledger 证据,`P2` 才是 advisory。解析器兼容旧的 `#`、`分类`、`场景描述` 表头,旧表缺优先级时保守按 `P1` 处理。执行层级固定为 `affected`(快速反馈)、`module`(变更模块门禁)、`candidate`(产品候选)。禁止所有场景默认跑全仓库;无法给出预算或超时时必须说明原因,并拆分或隔离高成本场景。只有 command、inputs/toolchain/environment 身份一致的成功 ledger 证据可以复用。
260
260
 
261
261
  ## 产物保存规则(跨阶段:阶段0.5/4/6/8)
262
262
 
@@ -299,7 +299,7 @@ status: approved
299
299
 
300
300
  > 如果 frontmatter 缺失,后续 run/test/review/submit/archive 不得依赖模型猜测 change-name。
301
301
 
302
- 4. **初始化结构化事件**:确定 change-name 后,立即运行 `harness_events.py append --type phase.start`。脚本负责建立父目录和 `events.ndjson`;执行日志在 `phase.end` 时由完整事件流渲染,任何阶段都不得直接用 Write/Edit 维护该投影。
302
+ 4. **初始化结构化事件**:确定 change-name 后,立即生成稳定的 `<plan-run-id>`(同一次 plan 尝试内不得改变;首次 `<attempt>` 为 `1`),运行 `harness_events.py append --change-dir ... --phase plan --type phase.start --run-id <plan-run-id> --attempt <attempt>`。finalizer 必须复用完全相同的 `--run-id` / `--attempt`,否则 verify 会按生命周期身份 fail-closed。脚本负责建立父目录和 `events.ndjson`;执行日志在 `phase.end` 时由完整事件流渲染,任何阶段都不得直接用 Write/Edit 维护该投影。
303
303
 
304
304
  5. **保存计划文件**:计划文件包含 YAML frontmatter(含 change-name),保存到:
305
305
  - `.harness/changes/<change-name>/plans/<change-name>-plan.md`(简洁任务表)
@@ -21,7 +21,7 @@ disallowed-tools:
21
21
  - Bash(curl *)
22
22
  - Bash(codegraph *)
23
23
  ---
24
- <!-- generated by harness_deploy.py; core=777d8783b2b2f001; overlay=java; agent=claude-code; do not edit -->
24
+ <!-- generated by harness_deploy.py; core=5e077a99a90502cb; overlay=java; agent=claude-code; do not edit -->
25
25
  # harness-review — 代码审查
26
26
 
27
27
  ## Purpose
@@ -161,12 +161,12 @@ review 读取 `state-snapshot.json`(`harness_state.py` / state-layout-protocol
161
161
  `events.ndjson` 为唯一事实源(schema_version 3,兼容读取 v1/v2;`note` 承载人类可读摘要);`logs/execution-log.md` 由 `harness_events.py` 渲染,**禁止用 Write/Edit 直接维护**。直接修改的内容会在 `phase.end` 或 finalize 时被完整重建覆盖,属于数据丢失;需要保留的详情必须进入事件 `note`。结构 → [[../protocols/report-pipeline-protocol.md|report-pipeline-protocol]]
162
162
 
163
163
  ```powershell
164
- python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --note "<触发指令>"
164
+ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --run-id <phase-run-id> --attempt <n> --note "<触发指令>"
165
165
  ```
166
166
 
167
167
  > **脚本接线**:`harness_events.py append`;`harness_archive.py finalize`;`harness_preflight.py check`;`harness_ledger.py can-reuse`;`harness_service.py ensure/stop`(须 `--files`/`serviceStart.inputFiles`)。JSON 输出按 D13 护栏解读。
168
168
 
169
169
  > **Task 4 §6.1 写入契约**:普通 `append` = 加锁 -> 追加一行 -> fsync -> 解锁,**不 load 历史、不渲染**(O(1),跨进程锁 `events.ndjson.lock`,UUID 用完整 `uuid4().hex` 无需去重扫描)。仅 `--type phase.end` append 在追加成功后渲染一次 `execution-log.md`;显式 `harness_events.py render` 随时从完整 events 重建;`harness_archive.py finalize` 在 collect 前强制 render 一次。高频 command append 期间 log 可能滞后,phase 边界保持最新。
170
170
 
171
- 每次阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`;重试同一阶段时增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
171
+ 每个阶段的 `phase.start` 与对应 `phase.end` 必须复用同一 `--run-id` / `--attempt`;阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`。重试同一阶段时生成新的 run-id 并增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
172
172
  > 片段:logging · phase=`review` · 事件:phase/decision/verification/issue/artifact
@@ -21,7 +21,7 @@ disallowed-tools:
21
21
  - Bash(curl *)
22
22
  - Bash(codegraph *)
23
23
  ---
24
- <!-- generated by harness_deploy.py; core=777d8783b2b2f001; overlay=java; agent=claude-code; do not edit -->
24
+ <!-- generated by harness_deploy.py; core=5e077a99a90502cb; overlay=java; agent=claude-code; do not edit -->
25
25
  # harness-run — 需求编码
26
26
 
27
27
  ## Purpose
@@ -75,7 +75,7 @@ disallowed-tools:
75
75
 
76
76
  ## Workflow 概要
77
77
 
78
- 0. 加载上下文:先 `harness_change.py resolve [--change] --json`(多 active 缺参 → `CHANGE_SELECTION_REQUIRED`,禁止按 mtime 猜测);读 spec/plan/detail/scenarios/ledger/run-task-status/worktree;`--fixback` 读 fixback → **`harness_gate.py begin --phase run --change <id>`**(内部 claim + phase.start + identity;禁止手工 Write `events.ndjson` / 手工 `phase.end`)
78
+ 0. 加载上下文:先 `harness_change.py resolve [--change] --json`(多 active 缺参 → `CHANGE_SELECTION_REQUIRED`,禁止按 mtime 猜测);读 spec/plan/detail/scenarios/ledger/run-task-status/worktree;`--fixback` 读 fixback → **`harness_gate.py begin --phase run --change <id>`**(先 fail-closed 校验 Plan 收据/哈希/完整生命周期/全部任务/非空场景清单,再 claim + phase.start + identity;禁止手工 Write `events.ndjson` / 手工 `phase.end`)
79
79
  0.5. **测试基础设施探测**(先写 `CHECKING`,四项证据齐备后再结论)→ `reference.md` Step 0.5;进入 TDD 前执行 `harness_test_guard.py begin --project . --change-dir ".harness/changes/<cn>" --json`
80
80
  1. **变更簇 TDD** — `protocols.md` `run-tdd-protocol`;批量 RED/GREEN;按需 `change-cluster-review-protocol`(高风险 + reviewer 预检可用)
81
81
  2. 构建验证 + **仅**通过 `harness_ledger.py record` 写 ledger(禁止 Write/Edit `verification-ledger.json`);`diff-hash --change-dir` 纳入 ignored tests → `reference.md` Step 2c
@@ -161,12 +161,12 @@ python <skills-root>/scripts/harness_test_guard.py record --project . --change-d
161
161
  `events.ndjson` 为唯一事实源(schema_version 3,兼容读取 v1/v2;`note` 承载人类可读摘要);`logs/execution-log.md` 由 `harness_events.py` 渲染,**禁止用 Write/Edit 直接维护**。直接修改的内容会在 `phase.end` 或 finalize 时被完整重建覆盖,属于数据丢失;需要保留的详情必须进入事件 `note`。结构 → [[../protocols/report-pipeline-protocol.md|report-pipeline-protocol]]
162
162
 
163
163
  ```powershell
164
- python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --note "<触发指令>"
164
+ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --run-id <phase-run-id> --attempt <n> --note "<触发指令>"
165
165
  ```
166
166
 
167
167
  > **脚本接线**:`harness_events.py append`;`harness_archive.py finalize`;`harness_preflight.py check`;`harness_ledger.py can-reuse`;`harness_service.py ensure/stop`(须 `--files`/`serviceStart.inputFiles`)。JSON 输出按 D13 护栏解读。
168
168
 
169
169
  > **Task 4 §6.1 写入契约**:普通 `append` = 加锁 -> 追加一行 -> fsync -> 解锁,**不 load 历史、不渲染**(O(1),跨进程锁 `events.ndjson.lock`,UUID 用完整 `uuid4().hex` 无需去重扫描)。仅 `--type phase.end` append 在追加成功后渲染一次 `execution-log.md`;显式 `harness_events.py render` 随时从完整 events 重建;`harness_archive.py finalize` 在 collect 前强制 render 一次。高频 command append 期间 log 可能滞后,phase 边界保持最新。
170
170
 
171
- 每次阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`;重试同一阶段时增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
171
+ 每个阶段的 `phase.start` 与对应 `phase.end` 必须复用同一 `--run-id` / `--attempt`;阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`。重试同一阶段时生成新的 run-id 并增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
172
172
  > 片段:logging · phase=`run`
@@ -20,7 +20,7 @@ disallowed-tools:
20
20
  - Bash(awk *)
21
21
  - Bash(curl *)
22
22
  ---
23
- <!-- generated by harness_deploy.py; core=777d8783b2b2f001; overlay=java; agent=claude-code; do not edit -->
23
+ <!-- generated by harness_deploy.py; core=5e077a99a90502cb; overlay=java; agent=claude-code; do not edit -->
24
24
  # harness-submit — 最终提交(含 worktree 合并)
25
25
 
26
26
  ## Purpose
@@ -181,12 +181,12 @@ git 经 PowerShell;commit/报告不得含明文密钥。遵循 `../protocols/s
181
181
  `events.ndjson` 为唯一事实源(schema_version 3,兼容读取 v1/v2;`note` 承载人类可读摘要);`logs/execution-log.md` 由 `harness_events.py` 渲染,**禁止用 Write/Edit 直接维护**。直接修改的内容会在 `phase.end` 或 finalize 时被完整重建覆盖,属于数据丢失;需要保留的详情必须进入事件 `note`。结构 → [[../protocols/report-pipeline-protocol.md|report-pipeline-protocol]]
182
182
 
183
183
  ```powershell
184
- python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --note "<触发指令>"
184
+ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --run-id <phase-run-id> --attempt <n> --note "<触发指令>"
185
185
  ```
186
186
 
187
187
  > **脚本接线**:`harness_events.py append`;`harness_archive.py finalize`;`harness_preflight.py check`;`harness_ledger.py can-reuse`;`harness_service.py ensure/stop`(须 `--files`/`serviceStart.inputFiles`)。JSON 输出按 D13 护栏解读。
188
188
 
189
189
  > **Task 4 §6.1 写入契约**:普通 `append` = 加锁 -> 追加一行 -> fsync -> 解锁,**不 load 历史、不渲染**(O(1),跨进程锁 `events.ndjson.lock`,UUID 用完整 `uuid4().hex` 无需去重扫描)。仅 `--type phase.end` append 在追加成功后渲染一次 `execution-log.md`;显式 `harness_events.py render` 随时从完整 events 重建;`harness_archive.py finalize` 在 collect 前强制 render 一次。高频 command append 期间 log 可能滞后,phase 边界保持最新。
190
190
 
191
- 每次阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`;重试同一阶段时增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
191
+ 每个阶段的 `phase.start` 与对应 `phase.end` 必须复用同一 `--run-id` / `--attempt`;阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`。重试同一阶段时生成新的 run-id 并增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
192
192
  > 片段:logging · phase=`submit`/`merge`
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: harness-sync
3
- description: "检查并更新项目AI元数据(CodeGraph索引、harness-codebase-map分析、CLAUDE.md、AGENTS.md、.harness/完整性),确保Claude对代码库的理解与最新代码一致。当用户说'同步/更新索引/刷新元数据/检查一致性'时使用"
3
+ description: "Use when the user asks to synchronize, refresh, or validate Harness metadata, adapters, knowledge, rules, instruction entrypoints, config origins, or CodeGraph status."
4
4
  argument-hint: "项目路径或留空使用当前目录"
5
5
  effort: medium
6
6
  allowed-tools: [Read, Glob, Grep, Edit, Write, Bash(powershell.exe:*)]
@@ -19,88 +19,65 @@ disallowed-tools:
19
19
  - Bash(awk *)
20
20
  - Bash(curl *)
21
21
  ---
22
- <!-- generated by harness_deploy.py; core=777d8783b2b2f001; overlay=java; agent=claude-code; do not edit -->
23
- # harness-sync — 元数据同步
22
+ <!-- generated by harness_deploy.py; core=5e077a99a90502cb; overlay=java; agent=claude-code; do not edit -->
23
+ # harness-sync
24
24
 
25
25
  ## Purpose
26
26
 
27
- 检查并更新 AI 元数据(CodeGraph、codebase map、knowledge 索引、公共规则、CLAUDE.md、AGENTS.md、`.harness/`),使理解与代码一致。
27
+ 通过一个有界入口同步 Harness 投影、知识、公共规则和元数据,并输出可验证的组件收据。
28
28
 
29
- ## When to Use
29
+ ## Before running
30
30
 
31
- 「同步/更新索引/刷新元数据」、提交前校准、archive/knowledge 变化后。跳过:刚 sync 且无新提交。
32
-
33
- ## Workflow(薄编排)
34
-
35
- 运行开始先执行受管 runtime 生命周期:
31
+ 读取 `reference.md`。先执行只读能力握手;若最低 CLI 版本或任一必需能力不满足,立即停止,不得先运行 knowledge、refresh 或其他重操作:
36
32
 
37
33
  ```powershell
38
- python <skills-root>/scripts/harness_sync.py reap --project . --json
39
- python <skills-root>/scripts/harness_sync.py begin --project . --run-id <run-id> --agent <agent> --purpose harness-sync --json
34
+ npx hunter-harness capabilities --json
40
35
  ```
41
36
 
42
- 所有 deploy 临时产物只能写入 `begin` 返回的 `workspace`。无论正常完成、命令失败还是异常退出,都必须在 `finally` 中执行:
37
+ 工作流要求 `sync@1`、`rules-sync@1`、`rules-review@1`、`knowledge-sync@2`。`BLOCKED_CAPABILITY_MISMATCH` 属环境阻塞,不得降级为手工拼接旧流程。
38
+
39
+ ## Run
43
40
 
44
41
  ```powershell
45
- python <skills-root>/scripts/harness_sync.py finalize --project . --run-id <run-id> --json
42
+ npx hunter-harness sync --project <项目路径> --profile interactive --progress jsonl --json
46
43
  ```
47
44
 
48
- 禁止重新使用固定 `sync-deploy-*` 目录;`--keep-temp` 仅供显式诊断。
49
-
50
- | Phase | 检查 → 动作 |
51
- |-------|-------------|
52
- | 0 | 读 SKILL + `reference.md` + protocols |
53
- | 1 | git log/diff 感知变更量 |
54
- | 2 | CodeGraph 索引是否需重建 |
55
- | 3 | `.harness/codebase/map/` 是否过期 → 报告建议 `/harness-codebase-map` |
56
- | 3.5 | `harness_knowledge.py sync`;可 `sync --update`;失败不得假装可用。**知识闭环主入口**是 `/harness-knowledge-ingest auto`(含 Agent judge),sync 不重复列人工知识待办 |
57
- | 3.6 | 单次运行 `harness_knowledge.py maintain --project . --drain --json`,有界推进全部 `.harness/knowledge/maintenance-outbox/{pending,failed}`;不得为每个条目重复启动 Python/重建索引(§8.2:archive close 只 enqueue,sync 异步推进 outbox 到 completed/pending-judge) |
58
- | 4 | CLAUDE.md 完整性/行数 → 超限 blocking user confirmation 瘦身 |
59
- | 5 | AGENTS.md 与各 Agent 指令入口一致;Claude Code 启用时验证 CLAUDE.md 引用 AGENTS.md,禁止反向循环引用 |
60
- | 5.5 | 运行 `npx hunter-harness rules-sync --json`:扫描各 Agent 用户规则并收敛到 `.harness/rules/`,刷新受管投影;读取结构化 review/test/archive 证据生成 `.harness/knowledge/rule-candidates.json`。表现差异按 Agent 适配器语义归一,真实分歧只报告不覆盖 |
61
- | 5.6 | 读取 `rule_review_pending`。用户主动交互式 sync 且存在新增候选时,运行 `npx hunter-harness rules-review --json`,由 Agent 将候选推荐为公共规则/项目知识/回归测试/CI 任务/Harness issue/暂缓/拒绝,展示证据与规则 diff 并询问用户;批准或修改后用带 candidate revision + target hash 的 decision JSON 执行 `rules-review --apply`。非交互 sync 只报告待评审数,不阻塞、不激活 |
62
- | 6 | `.harness/` 结构(init 规程 → `reference.md` 第 6 步);已装 skill 新鲜度只经 `hunter-harness refresh --dry-run --json` 的 post-adaptation freshness 判断,禁止 raw build 字节比较 |
63
- | 7–9 | `项目规则(见 .harness/context-index.json)/`、构建配置、测试目录 — **只提示不自动修复** |
64
-
65
- 状态判断表格、修复动作、输出示例 → `reference.md`
66
-
67
- ## P0 执行可信度规则
68
-
69
- - 命令结果不得靠猜测;普通 Bash 被拒 → 立即改用等价 PowerShell 重试一次
70
- - 仅 PowerShell 成功且有明确证据(构建/git/测试输出、文件存在、exit 0)时可标 ✅OK;否则 ❌FAIL 或 🟡WARN
71
- - 禁止把 hook 拒绝、静态验证、无输出、用户跳过说成成功 → 详见 [[../protocols/powershell-protocol.md|powershell-protocol]]、[[../protocols/evidence-based-reporting-protocol.md|evidence-based-reporting-protocol]]
72
- > 片段:p0-trust
73
-
74
- ## 关键规则
45
+ CLI 负责 Python runtime 解析、投影事务、knowledge、rules、map、指令图、配置来源、change 状态及 CodeGraph 证据汇总。禁止直接调用内部 Python 脚本,禁止使用固定 `HEAD~5`,禁止自动全量重建 CodeGraph。
75
46
 
76
- 变更量先行 · CodeGraph 依赖编译产物 · map Repomix 互斥 · CLAUDE 瘦身须用户确认 · 公共规则自动收敛但真实分歧不覆盖 · 历史证据先生成候选再由 Agent 推荐、用户批准 · Phase 7–9 只提示 · knowledge sync 失败记 WARN/FAIL
47
+ 长阶段的 heartbeat stderr;stdout 只保留紧凑摘要。完整报告写入摘要中的 `reportPath`,并带 `reportSha256`。不得把完整 JSON 报告直接回显到对话。
77
48
 
78
- ## Output Format
49
+ ## Interpret
79
50
 
80
- 各组件状态表格 + 操作摘要 → `reference.md`
51
+ - `OK`:所有可验证组件通过。
52
+ - `WARN`:存在过期、冲突、待评审或 `UNKNOWN` 证据;按 `reportPath` 中的 `nextAction` 处理。
53
+ - `FAIL`:组件执行失败;不得宣称同步完成。
54
+ - `BLOCKED`:runtime、项目状态或能力契约阻塞;先修复阻塞条件。
55
+ - `UNKNOWN`:证据不足,不等于成功,也不触发无界重建。
81
56
 
82
- ## 渐进披露
57
+ 非交互或 CI 使用 `--profile general --progress jsonl --json`,不得等待规则候选确认。交互式运行若报告规则待评审,再按 `reference.md` 的显式入口处理。
83
58
 
84
- - **Read `reference.md`** — 10 步详细判定与修复
59
+ ## Safety
85
60
 
86
- ## 交互白名单
61
+ 同步不得修改 `.harness/state` 或 `.harness/cache` 的内部文件;只通过 CLI 事务写入。配置真源与生成投影存在漂移时只报告,不静默覆盖真源。change 清理先 dry-run,仅对已验证归档收据执行安全清理。
87
62
 
88
- - CLAUDE.md/AGENTS.md 瘦身拆分确认
89
- - 新增、修改、弱化、删除公共规则前的候选处置与最终 diff 确认
63
+ ## P0 执行可信度规则
90
64
 
91
- 非交互、定时或 CI sync 禁止等待输入;只输出 `rule_review_pending` 和后续 `rules-review` 命令。
65
+ - 命令结果不得靠猜测;普通 Bash 被拒 立即改用等价 PowerShell 重试一次
66
+ - 仅 PowerShell 成功且有明确证据(构建/git/测试输出、文件存在、exit 0)时可标 ✅OK;否则 ❌FAIL 或 🟡WARN
67
+ - 禁止把 hook 拒绝、静态验证、无输出、用户跳过说成成功 → 详见 [[../protocols/powershell-protocol.md|powershell-protocol]]、[[../protocols/evidence-based-reporting-protocol.md|evidence-based-reporting-protocol]]
68
+ > 片段:p0-trust
92
69
 
93
70
  ## 执行日志
94
71
 
95
72
  `events.ndjson` 为唯一事实源(schema_version 3,兼容读取 v1/v2;`note` 承载人类可读摘要);`logs/execution-log.md` 由 `harness_events.py` 渲染,**禁止用 Write/Edit 直接维护**。直接修改的内容会在 `phase.end` 或 finalize 时被完整重建覆盖,属于数据丢失;需要保留的详情必须进入事件 `note`。结构 → [[../protocols/report-pipeline-protocol.md|report-pipeline-protocol]]
96
73
 
97
74
  ```powershell
98
- python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --note "<触发指令>"
75
+ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --run-id <phase-run-id> --attempt <n> --note "<触发指令>"
99
76
  ```
100
77
 
101
78
  > **脚本接线**:`harness_events.py append`;`harness_archive.py finalize`;`harness_preflight.py check`;`harness_ledger.py can-reuse`;`harness_service.py ensure/stop`(须 `--files`/`serviceStart.inputFiles`)。JSON 输出按 D13 护栏解读。
102
79
 
103
80
  > **Task 4 §6.1 写入契约**:普通 `append` = 加锁 -> 追加一行 -> fsync -> 解锁,**不 load 历史、不渲染**(O(1),跨进程锁 `events.ndjson.lock`,UUID 用完整 `uuid4().hex` 无需去重扫描)。仅 `--type phase.end` append 在追加成功后渲染一次 `execution-log.md`;显式 `harness_events.py render` 随时从完整 events 重建;`harness_archive.py finalize` 在 collect 前强制 render 一次。高频 command append 期间 log 可能滞后,phase 边界保持最新。
104
81
 
105
- 每次阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`;重试同一阶段时增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
106
- > 片段:logging · phase=`sync`;有未归档变更时写入其 change-dir events
82
+ 每个阶段的 `phase.start` 与对应 `phase.end` 必须复用同一 `--run-id` / `--attempt`;阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`。重试同一阶段时生成新的 run-id 并增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
83
+ > 片段:logging · phase=`sync`