@hunter-harness/workflow-harness 0.4.8 → 0.4.10

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 (453) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/CONTEXT.md +1 -1
  3. package/harness/bundles/general/claude-code/README.md +36 -38
  4. package/harness/bundles/general/claude-code/contracts/workflow-policy.json +0 -50
  5. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +1 -1
  6. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  7. package/harness/bundles/general/claude-code/harness-codebase-map/templates/TESTING.md +1 -1
  8. package/harness/bundles/general/claude-code/harness-execute/SKILL.md +17 -17
  9. package/harness/bundles/general/{codex/harness-run/checklist.md → claude-code/harness-execute/coding-checklist.md} +9 -9
  10. package/harness/bundles/general/{codex/harness-run/reference.md → claude-code/harness-execute/coding-reference.md} +36 -36
  11. package/harness/bundles/general/{codex/harness-run → claude-code/harness-execute}/protocols.md +4 -4
  12. package/harness/bundles/general/{codebuddy/harness-test/checklist.md → claude-code/harness-execute/testing-checklist.md} +9 -10
  13. package/harness/bundles/general/claude-code/harness-execute/testing-pitfalls-java.md +21 -0
  14. package/harness/bundles/general/{codex/harness-test/pitfalls.md → claude-code/harness-execute/testing-pitfalls.md} +7 -7
  15. package/harness/bundles/general/claude-code/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
  16. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +7 -1
  17. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
  18. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +3 -3
  19. package/harness/bundles/general/claude-code/harness-plan/checklist.md +2 -1
  20. package/harness/bundles/general/claude-code/harness-plan/reference.md +8 -0
  21. package/harness/bundles/general/claude-code/harness-pull/SKILL.md +1 -1
  22. package/harness/bundles/general/claude-code/harness-push/SKILL.md +1 -1
  23. package/harness/bundles/general/claude-code/harness-review/SKILL.md +3 -3
  24. package/harness/bundles/general/claude-code/harness-review/checklist.md +1 -1
  25. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
  26. package/harness/bundles/general/claude-code/harness-submit/checklist.md +1 -1
  27. package/harness/bundles/general/claude-code/harness-submit/reference.md +1 -1
  28. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
  29. package/harness/bundles/general/claude-code/protocols/evidence-based-reporting-protocol.md +1 -1
  30. package/harness/bundles/general/claude-code/protocols/ledger-protocol.md +8 -8
  31. package/harness/bundles/general/claude-code/protocols/sensitive-info-protocol.md +2 -2
  32. package/harness/bundles/general/claude-code/scripts/harness_context.py +71 -8
  33. package/harness/bundles/general/claude-code/scripts/harness_deploy.py +2 -2
  34. package/harness/bundles/general/claude-code/scripts/harness_events.py +17 -11
  35. package/harness/bundles/general/claude-code/scripts/harness_gate.py +95 -10
  36. package/harness/bundles/general/claude-code/scripts/harness_ledger.py +84 -4
  37. package/harness/bundles/general/claude-code/scripts/harness_profile.py +3 -3
  38. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  39. package/harness/bundles/general/codebuddy/CONTEXT.md +1 -1
  40. package/harness/bundles/general/codebuddy/README.md +36 -38
  41. package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +0 -50
  42. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
  43. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  44. package/harness/bundles/general/codebuddy/harness-codebase-map/templates/TESTING.md +1 -1
  45. package/harness/bundles/general/codebuddy/harness-execute/SKILL.md +17 -17
  46. package/harness/bundles/general/{claude-code/harness-run/checklist.md → codebuddy/harness-execute/coding-checklist.md} +9 -9
  47. package/harness/bundles/general/codebuddy/{harness-run/reference.md → harness-execute/coding-reference.md} +36 -36
  48. package/harness/bundles/general/codebuddy/{harness-run → harness-execute}/protocols.md +4 -4
  49. package/harness/bundles/general/{codex/harness-test/checklist.md → codebuddy/harness-execute/testing-checklist.md} +9 -10
  50. package/harness/bundles/general/codebuddy/harness-execute/testing-pitfalls-java.md +21 -0
  51. package/harness/bundles/general/{claude-code/harness-test/pitfalls.md → codebuddy/harness-execute/testing-pitfalls.md} +7 -7
  52. package/harness/bundles/general/codebuddy/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
  53. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +7 -1
  54. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  55. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +3 -3
  56. package/harness/bundles/general/codebuddy/harness-plan/checklist.md +2 -1
  57. package/harness/bundles/general/codebuddy/harness-plan/reference.md +8 -0
  58. package/harness/bundles/general/codebuddy/harness-pull/SKILL.md +1 -1
  59. package/harness/bundles/general/codebuddy/harness-push/SKILL.md +1 -1
  60. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +3 -3
  61. package/harness/bundles/general/codebuddy/harness-review/checklist.md +1 -1
  62. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
  63. package/harness/bundles/general/codebuddy/harness-submit/checklist.md +1 -1
  64. package/harness/bundles/general/codebuddy/harness-submit/reference.md +1 -1
  65. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
  66. package/harness/bundles/general/codebuddy/protocols/evidence-based-reporting-protocol.md +1 -1
  67. package/harness/bundles/general/codebuddy/protocols/ledger-protocol.md +8 -8
  68. package/harness/bundles/general/codebuddy/protocols/sensitive-info-protocol.md +2 -2
  69. package/harness/bundles/general/codebuddy/scripts/harness_context.py +71 -8
  70. package/harness/bundles/general/codebuddy/scripts/harness_deploy.py +2 -2
  71. package/harness/bundles/general/codebuddy/scripts/harness_events.py +17 -11
  72. package/harness/bundles/general/codebuddy/scripts/harness_gate.py +95 -10
  73. package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +84 -4
  74. package/harness/bundles/general/codebuddy/scripts/harness_profile.py +3 -3
  75. package/harness/bundles/general/codex/.harness-build.json +1 -1
  76. package/harness/bundles/general/codex/CONTEXT.md +1 -1
  77. package/harness/bundles/general/codex/README.md +36 -38
  78. package/harness/bundles/general/codex/contracts/workflow-policy.json +0 -50
  79. package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
  80. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  81. package/harness/bundles/general/codex/harness-codebase-map/templates/TESTING.md +1 -1
  82. package/harness/bundles/general/codex/harness-execute/SKILL.md +17 -17
  83. package/harness/bundles/general/{cursor/harness-run/checklist.md → codex/harness-execute/coding-checklist.md} +9 -9
  84. package/harness/bundles/general/{cursor/harness-run/reference.md → codex/harness-execute/coding-reference.md} +36 -36
  85. package/harness/bundles/general/{claude-code/harness-run → codex/harness-execute}/protocols.md +4 -4
  86. package/harness/bundles/general/{cursor/harness-test/checklist.md → codex/harness-execute/testing-checklist.md} +9 -10
  87. package/harness/bundles/general/codex/harness-execute/testing-pitfalls-java.md +21 -0
  88. package/harness/bundles/general/{codebuddy/harness-test/pitfalls.md → codex/harness-execute/testing-pitfalls.md} +7 -7
  89. package/harness/bundles/general/codex/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
  90. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +7 -1
  91. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  92. package/harness/bundles/general/codex/harness-plan/SKILL.md +3 -3
  93. package/harness/bundles/general/codex/harness-plan/checklist.md +2 -1
  94. package/harness/bundles/general/codex/harness-plan/reference.md +8 -0
  95. package/harness/bundles/general/codex/harness-pull/SKILL.md +1 -1
  96. package/harness/bundles/general/codex/harness-push/SKILL.md +1 -1
  97. package/harness/bundles/general/codex/harness-review/SKILL.md +3 -3
  98. package/harness/bundles/general/codex/harness-review/checklist.md +1 -1
  99. package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
  100. package/harness/bundles/general/codex/harness-submit/checklist.md +1 -1
  101. package/harness/bundles/general/codex/harness-submit/reference.md +1 -1
  102. package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
  103. package/harness/bundles/general/codex/protocols/evidence-based-reporting-protocol.md +1 -1
  104. package/harness/bundles/general/codex/protocols/ledger-protocol.md +8 -8
  105. package/harness/bundles/general/codex/protocols/sensitive-info-protocol.md +2 -2
  106. package/harness/bundles/general/codex/scripts/harness_context.py +71 -8
  107. package/harness/bundles/general/codex/scripts/harness_deploy.py +2 -2
  108. package/harness/bundles/general/codex/scripts/harness_events.py +17 -11
  109. package/harness/bundles/general/codex/scripts/harness_gate.py +95 -10
  110. package/harness/bundles/general/codex/scripts/harness_ledger.py +84 -4
  111. package/harness/bundles/general/codex/scripts/harness_profile.py +3 -3
  112. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  113. package/harness/bundles/general/cursor/CONTEXT.md +1 -1
  114. package/harness/bundles/general/cursor/README.md +36 -38
  115. package/harness/bundles/general/cursor/contracts/workflow-policy.json +0 -50
  116. package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
  117. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  118. package/harness/bundles/general/cursor/harness-codebase-map/templates/TESTING.md +1 -1
  119. package/harness/bundles/general/cursor/harness-execute/SKILL.md +17 -17
  120. package/harness/bundles/general/{codebuddy/harness-run/checklist.md → cursor/harness-execute/coding-checklist.md} +9 -9
  121. package/harness/bundles/general/{claude-code/harness-run/reference.md → cursor/harness-execute/coding-reference.md} +36 -36
  122. package/harness/bundles/general/cursor/{harness-run → harness-execute}/protocols.md +4 -4
  123. package/harness/bundles/general/{claude-code/harness-test/checklist.md → cursor/harness-execute/testing-checklist.md} +9 -10
  124. package/harness/bundles/general/cursor/harness-execute/testing-pitfalls-java.md +21 -0
  125. package/harness/bundles/general/cursor/{harness-test/pitfalls.md → harness-execute/testing-pitfalls.md} +7 -7
  126. package/harness/bundles/general/cursor/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
  127. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +7 -1
  128. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  129. package/harness/bundles/general/cursor/harness-plan/SKILL.md +3 -3
  130. package/harness/bundles/general/cursor/harness-plan/checklist.md +2 -1
  131. package/harness/bundles/general/cursor/harness-plan/reference.md +8 -0
  132. package/harness/bundles/general/cursor/harness-pull/SKILL.md +1 -1
  133. package/harness/bundles/general/cursor/harness-push/SKILL.md +1 -1
  134. package/harness/bundles/general/cursor/harness-review/SKILL.md +3 -3
  135. package/harness/bundles/general/cursor/harness-review/checklist.md +1 -1
  136. package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
  137. package/harness/bundles/general/cursor/harness-submit/checklist.md +1 -1
  138. package/harness/bundles/general/cursor/harness-submit/reference.md +1 -1
  139. package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
  140. package/harness/bundles/general/cursor/protocols/evidence-based-reporting-protocol.md +1 -1
  141. package/harness/bundles/general/cursor/protocols/ledger-protocol.md +8 -8
  142. package/harness/bundles/general/cursor/protocols/sensitive-info-protocol.md +2 -2
  143. package/harness/bundles/general/cursor/scripts/harness_context.py +71 -8
  144. package/harness/bundles/general/cursor/scripts/harness_deploy.py +2 -2
  145. package/harness/bundles/general/cursor/scripts/harness_events.py +17 -11
  146. package/harness/bundles/general/cursor/scripts/harness_gate.py +95 -10
  147. package/harness/bundles/general/cursor/scripts/harness_ledger.py +84 -4
  148. package/harness/bundles/general/cursor/scripts/harness_profile.py +3 -3
  149. package/harness/bundles/general/pi/.harness-build.json +1 -1
  150. package/harness/bundles/general/pi/CONTEXT.md +1 -1
  151. package/harness/bundles/general/pi/README.md +36 -38
  152. package/harness/bundles/general/pi/contracts/workflow-policy.json +0 -50
  153. package/harness/bundles/general/pi/harness-archive/SKILL.md +1 -1
  154. package/harness/bundles/general/pi/harness-codebase-map/SKILL.md +1 -1
  155. package/harness/bundles/general/pi/harness-codebase-map/templates/TESTING.md +1 -1
  156. package/harness/bundles/general/pi/harness-execute/SKILL.md +17 -17
  157. package/harness/bundles/general/pi/harness-execute/coding-checklist.md +279 -0
  158. package/harness/bundles/general/pi/harness-execute/coding-reference.md +886 -0
  159. package/harness/bundles/general/pi/harness-execute/protocols.md +141 -0
  160. package/harness/bundles/general/pi/harness-execute/testing-checklist.md +358 -0
  161. package/harness/bundles/general/pi/harness-execute/testing-pitfalls-java.md +21 -0
  162. package/harness/bundles/general/pi/harness-execute/testing-pitfalls.md +307 -0
  163. package/harness/bundles/general/pi/harness-execute/testing-reference.md +880 -0
  164. package/harness/bundles/general/pi/harness-knowledge-ingest/SKILL.md +7 -1
  165. package/harness/bundles/general/pi/harness-knowledge-query/SKILL.md +1 -1
  166. package/harness/bundles/general/pi/harness-plan/SKILL.md +3 -3
  167. package/harness/bundles/general/pi/harness-plan/checklist.md +2 -1
  168. package/harness/bundles/general/pi/harness-plan/reference.md +8 -0
  169. package/harness/bundles/general/pi/harness-pull/SKILL.md +1 -1
  170. package/harness/bundles/general/pi/harness-push/SKILL.md +1 -1
  171. package/harness/bundles/general/pi/harness-review/SKILL.md +3 -3
  172. package/harness/bundles/general/pi/harness-review/checklist.md +1 -1
  173. package/harness/bundles/general/pi/harness-submit/SKILL.md +1 -1
  174. package/harness/bundles/general/pi/harness-submit/checklist.md +1 -1
  175. package/harness/bundles/general/pi/harness-submit/reference.md +1 -1
  176. package/harness/bundles/general/pi/harness-sync/SKILL.md +1 -1
  177. package/harness/bundles/general/pi/protocols/evidence-based-reporting-protocol.md +1 -1
  178. package/harness/bundles/general/pi/protocols/ledger-protocol.md +8 -8
  179. package/harness/bundles/general/pi/protocols/sensitive-info-protocol.md +2 -2
  180. package/harness/bundles/general/pi/scripts/harness_context.py +71 -8
  181. package/harness/bundles/general/pi/scripts/harness_deploy.py +2 -2
  182. package/harness/bundles/general/pi/scripts/harness_events.py +17 -11
  183. package/harness/bundles/general/pi/scripts/harness_gate.py +95 -10
  184. package/harness/bundles/general/pi/scripts/harness_ledger.py +84 -4
  185. package/harness/bundles/general/pi/scripts/harness_profile.py +3 -3
  186. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  187. package/harness/bundles/java/claude-code/CONTEXT.md +1 -1
  188. package/harness/bundles/java/claude-code/README.md +36 -38
  189. package/harness/bundles/java/claude-code/contracts/workflow-policy.json +0 -50
  190. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  191. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
  192. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  193. package/harness/bundles/java/claude-code/harness-codebase-map/templates/TESTING.md +1 -1
  194. package/harness/bundles/java/claude-code/harness-execute/SKILL.md +49 -17
  195. package/harness/bundles/java/claude-code/{harness-run/checklist.md → harness-execute/coding-checklist.md} +6 -6
  196. package/harness/bundles/java/claude-code/{harness-run/reference.md → harness-execute/coding-reference.md} +37 -37
  197. package/harness/bundles/java/claude-code/harness-execute/protocols.md +141 -0
  198. package/harness/bundles/java/claude-code/{harness-test/checklist.md → harness-execute/testing-checklist.md} +9 -9
  199. package/harness/bundles/java/claude-code/{harness-test/pitfalls-java.md → harness-execute/testing-pitfalls-java.md} +2 -1
  200. package/harness/bundles/java/claude-code/harness-execute/testing-pitfalls.md +307 -0
  201. package/harness/bundles/java/claude-code/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
  202. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +7 -1
  203. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  204. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  205. package/harness/bundles/java/claude-code/harness-package/checklist.md +7 -7
  206. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +3 -3
  207. package/harness/bundles/java/claude-code/harness-plan/checklist.md +2 -1
  208. package/harness/bundles/java/claude-code/harness-plan/reference.md +8 -0
  209. package/harness/bundles/java/claude-code/harness-pull/SKILL.md +1 -1
  210. package/harness/bundles/java/claude-code/harness-push/SKILL.md +1 -1
  211. package/harness/bundles/java/claude-code/harness-review/SKILL.md +3 -3
  212. package/harness/bundles/java/claude-code/harness-review/checklist.md +1 -1
  213. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
  214. package/harness/bundles/java/claude-code/harness-submit/checklist.md +1 -1
  215. package/harness/bundles/java/claude-code/harness-submit/reference.md +1 -1
  216. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
  217. package/harness/bundles/java/claude-code/protocols/evidence-based-reporting-protocol.md +1 -1
  218. package/harness/bundles/java/claude-code/protocols/ledger-protocol.md +8 -8
  219. package/harness/bundles/java/claude-code/protocols/sensitive-info-protocol.md +2 -2
  220. package/harness/bundles/java/claude-code/scripts/harness_context.py +71 -8
  221. package/harness/bundles/java/claude-code/scripts/harness_deploy.py +2 -2
  222. package/harness/bundles/java/claude-code/scripts/harness_events.py +17 -11
  223. package/harness/bundles/java/claude-code/scripts/harness_gate.py +95 -10
  224. package/harness/bundles/java/claude-code/scripts/harness_ledger.py +84 -4
  225. package/harness/bundles/java/claude-code/scripts/harness_profile.py +3 -3
  226. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  227. package/harness/bundles/java/codebuddy/CONTEXT.md +1 -1
  228. package/harness/bundles/java/codebuddy/README.md +36 -38
  229. package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +0 -50
  230. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  231. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
  232. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  233. package/harness/bundles/java/codebuddy/harness-codebase-map/templates/TESTING.md +1 -1
  234. package/harness/bundles/java/codebuddy/harness-execute/SKILL.md +49 -17
  235. package/harness/bundles/java/codebuddy/{harness-run/checklist.md → harness-execute/coding-checklist.md} +6 -6
  236. package/harness/bundles/java/codebuddy/{harness-run/reference.md → harness-execute/coding-reference.md} +37 -37
  237. package/harness/bundles/java/codebuddy/harness-execute/protocols.md +141 -0
  238. package/harness/bundles/java/codebuddy/{harness-test/checklist.md → harness-execute/testing-checklist.md} +9 -9
  239. package/harness/bundles/java/codebuddy/{harness-test/pitfalls-java.md → harness-execute/testing-pitfalls-java.md} +2 -1
  240. package/harness/bundles/java/codebuddy/harness-execute/testing-pitfalls.md +307 -0
  241. package/harness/bundles/java/codebuddy/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
  242. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +7 -1
  243. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  244. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  245. package/harness/bundles/java/codebuddy/harness-package/checklist.md +7 -7
  246. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +3 -3
  247. package/harness/bundles/java/codebuddy/harness-plan/checklist.md +2 -1
  248. package/harness/bundles/java/codebuddy/harness-plan/reference.md +8 -0
  249. package/harness/bundles/java/codebuddy/harness-pull/SKILL.md +1 -1
  250. package/harness/bundles/java/codebuddy/harness-push/SKILL.md +1 -1
  251. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +3 -3
  252. package/harness/bundles/java/codebuddy/harness-review/checklist.md +1 -1
  253. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
  254. package/harness/bundles/java/codebuddy/harness-submit/checklist.md +1 -1
  255. package/harness/bundles/java/codebuddy/harness-submit/reference.md +1 -1
  256. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
  257. package/harness/bundles/java/codebuddy/protocols/evidence-based-reporting-protocol.md +1 -1
  258. package/harness/bundles/java/codebuddy/protocols/ledger-protocol.md +8 -8
  259. package/harness/bundles/java/codebuddy/protocols/sensitive-info-protocol.md +2 -2
  260. package/harness/bundles/java/codebuddy/scripts/harness_context.py +71 -8
  261. package/harness/bundles/java/codebuddy/scripts/harness_deploy.py +2 -2
  262. package/harness/bundles/java/codebuddy/scripts/harness_events.py +17 -11
  263. package/harness/bundles/java/codebuddy/scripts/harness_gate.py +95 -10
  264. package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +84 -4
  265. package/harness/bundles/java/codebuddy/scripts/harness_profile.py +3 -3
  266. package/harness/bundles/java/codex/.harness-build.json +1 -1
  267. package/harness/bundles/java/codex/CONTEXT.md +1 -1
  268. package/harness/bundles/java/codex/README.md +36 -38
  269. package/harness/bundles/java/codex/contracts/workflow-policy.json +0 -50
  270. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  271. package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
  272. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  273. package/harness/bundles/java/codex/harness-codebase-map/templates/TESTING.md +1 -1
  274. package/harness/bundles/java/codex/harness-execute/SKILL.md +49 -17
  275. package/harness/bundles/java/codex/{harness-run/checklist.md → harness-execute/coding-checklist.md} +6 -6
  276. package/harness/bundles/java/codex/{harness-run/reference.md → harness-execute/coding-reference.md} +37 -37
  277. package/harness/bundles/java/codex/harness-execute/protocols.md +141 -0
  278. package/harness/bundles/java/codex/{harness-test/checklist.md → harness-execute/testing-checklist.md} +9 -9
  279. package/harness/bundles/java/codex/{harness-test/pitfalls-java.md → harness-execute/testing-pitfalls-java.md} +2 -1
  280. package/harness/bundles/java/codex/harness-execute/testing-pitfalls.md +307 -0
  281. package/harness/bundles/java/codex/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
  282. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +7 -1
  283. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  284. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  285. package/harness/bundles/java/codex/harness-package/checklist.md +7 -7
  286. package/harness/bundles/java/codex/harness-plan/SKILL.md +3 -3
  287. package/harness/bundles/java/codex/harness-plan/checklist.md +2 -1
  288. package/harness/bundles/java/codex/harness-plan/reference.md +8 -0
  289. package/harness/bundles/java/codex/harness-pull/SKILL.md +1 -1
  290. package/harness/bundles/java/codex/harness-push/SKILL.md +1 -1
  291. package/harness/bundles/java/codex/harness-review/SKILL.md +3 -3
  292. package/harness/bundles/java/codex/harness-review/checklist.md +1 -1
  293. package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
  294. package/harness/bundles/java/codex/harness-submit/checklist.md +1 -1
  295. package/harness/bundles/java/codex/harness-submit/reference.md +1 -1
  296. package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
  297. package/harness/bundles/java/codex/protocols/evidence-based-reporting-protocol.md +1 -1
  298. package/harness/bundles/java/codex/protocols/ledger-protocol.md +8 -8
  299. package/harness/bundles/java/codex/protocols/sensitive-info-protocol.md +2 -2
  300. package/harness/bundles/java/codex/scripts/harness_context.py +71 -8
  301. package/harness/bundles/java/codex/scripts/harness_deploy.py +2 -2
  302. package/harness/bundles/java/codex/scripts/harness_events.py +17 -11
  303. package/harness/bundles/java/codex/scripts/harness_gate.py +95 -10
  304. package/harness/bundles/java/codex/scripts/harness_ledger.py +84 -4
  305. package/harness/bundles/java/codex/scripts/harness_profile.py +3 -3
  306. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  307. package/harness/bundles/java/cursor/CONTEXT.md +1 -1
  308. package/harness/bundles/java/cursor/README.md +36 -38
  309. package/harness/bundles/java/cursor/contracts/workflow-policy.json +0 -50
  310. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  311. package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
  312. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  313. package/harness/bundles/java/cursor/harness-codebase-map/templates/TESTING.md +1 -1
  314. package/harness/bundles/java/cursor/harness-execute/SKILL.md +49 -17
  315. package/harness/bundles/java/cursor/{harness-run/checklist.md → harness-execute/coding-checklist.md} +6 -6
  316. package/harness/bundles/java/cursor/{harness-run/reference.md → harness-execute/coding-reference.md} +37 -37
  317. package/harness/bundles/java/cursor/harness-execute/protocols.md +141 -0
  318. package/harness/bundles/java/cursor/{harness-test/checklist.md → harness-execute/testing-checklist.md} +9 -9
  319. package/harness/bundles/java/cursor/{harness-test/pitfalls-java.md → harness-execute/testing-pitfalls-java.md} +2 -1
  320. package/harness/bundles/java/cursor/harness-execute/testing-pitfalls.md +307 -0
  321. package/harness/bundles/java/cursor/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
  322. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +7 -1
  323. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  324. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  325. package/harness/bundles/java/cursor/harness-package/checklist.md +7 -7
  326. package/harness/bundles/java/cursor/harness-plan/SKILL.md +3 -3
  327. package/harness/bundles/java/cursor/harness-plan/checklist.md +2 -1
  328. package/harness/bundles/java/cursor/harness-plan/reference.md +8 -0
  329. package/harness/bundles/java/cursor/harness-pull/SKILL.md +1 -1
  330. package/harness/bundles/java/cursor/harness-push/SKILL.md +1 -1
  331. package/harness/bundles/java/cursor/harness-review/SKILL.md +3 -3
  332. package/harness/bundles/java/cursor/harness-review/checklist.md +1 -1
  333. package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
  334. package/harness/bundles/java/cursor/harness-submit/checklist.md +1 -1
  335. package/harness/bundles/java/cursor/harness-submit/reference.md +1 -1
  336. package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
  337. package/harness/bundles/java/cursor/protocols/evidence-based-reporting-protocol.md +1 -1
  338. package/harness/bundles/java/cursor/protocols/ledger-protocol.md +8 -8
  339. package/harness/bundles/java/cursor/protocols/sensitive-info-protocol.md +2 -2
  340. package/harness/bundles/java/cursor/scripts/harness_context.py +71 -8
  341. package/harness/bundles/java/cursor/scripts/harness_deploy.py +2 -2
  342. package/harness/bundles/java/cursor/scripts/harness_events.py +17 -11
  343. package/harness/bundles/java/cursor/scripts/harness_gate.py +95 -10
  344. package/harness/bundles/java/cursor/scripts/harness_ledger.py +84 -4
  345. package/harness/bundles/java/cursor/scripts/harness_profile.py +3 -3
  346. package/harness/bundles/java/pi/.harness-build.json +1 -1
  347. package/harness/bundles/java/pi/CONTEXT.md +1 -1
  348. package/harness/bundles/java/pi/README.md +36 -38
  349. package/harness/bundles/java/pi/contracts/workflow-policy.json +0 -50
  350. package/harness/bundles/java/pi/harness-apidoc/SKILL.md +1 -1
  351. package/harness/bundles/java/pi/harness-archive/SKILL.md +1 -1
  352. package/harness/bundles/java/pi/harness-codebase-map/SKILL.md +1 -1
  353. package/harness/bundles/java/pi/harness-codebase-map/templates/TESTING.md +1 -1
  354. package/harness/bundles/java/pi/harness-execute/SKILL.md +49 -17
  355. package/harness/bundles/java/pi/harness-execute/coding-checklist.md +252 -0
  356. package/harness/bundles/java/pi/harness-execute/coding-reference.md +820 -0
  357. package/harness/bundles/java/pi/harness-execute/protocols.md +141 -0
  358. package/harness/bundles/java/pi/harness-execute/testing-checklist.md +320 -0
  359. package/harness/bundles/java/pi/harness-execute/testing-pitfalls-java.md +17 -0
  360. package/harness/bundles/java/pi/harness-execute/testing-pitfalls.md +307 -0
  361. package/harness/bundles/java/pi/harness-execute/testing-reference.md +792 -0
  362. package/harness/bundles/java/pi/harness-knowledge-ingest/SKILL.md +7 -1
  363. package/harness/bundles/java/pi/harness-knowledge-query/SKILL.md +1 -1
  364. package/harness/bundles/java/pi/harness-package/SKILL.md +1 -1
  365. package/harness/bundles/java/pi/harness-package/checklist.md +7 -7
  366. package/harness/bundles/java/pi/harness-plan/SKILL.md +3 -3
  367. package/harness/bundles/java/pi/harness-plan/checklist.md +2 -1
  368. package/harness/bundles/java/pi/harness-plan/reference.md +8 -0
  369. package/harness/bundles/java/pi/harness-pull/SKILL.md +1 -1
  370. package/harness/bundles/java/pi/harness-push/SKILL.md +1 -1
  371. package/harness/bundles/java/pi/harness-review/SKILL.md +3 -3
  372. package/harness/bundles/java/pi/harness-review/checklist.md +1 -1
  373. package/harness/bundles/java/pi/harness-submit/SKILL.md +1 -1
  374. package/harness/bundles/java/pi/harness-submit/checklist.md +1 -1
  375. package/harness/bundles/java/pi/harness-submit/reference.md +1 -1
  376. package/harness/bundles/java/pi/harness-sync/SKILL.md +1 -1
  377. package/harness/bundles/java/pi/protocols/evidence-based-reporting-protocol.md +1 -1
  378. package/harness/bundles/java/pi/protocols/ledger-protocol.md +8 -8
  379. package/harness/bundles/java/pi/protocols/sensitive-info-protocol.md +2 -2
  380. package/harness/bundles/java/pi/scripts/harness_context.py +71 -8
  381. package/harness/bundles/java/pi/scripts/harness_deploy.py +2 -2
  382. package/harness/bundles/java/pi/scripts/harness_events.py +17 -11
  383. package/harness/bundles/java/pi/scripts/harness_gate.py +95 -10
  384. package/harness/bundles/java/pi/scripts/harness_ledger.py +84 -4
  385. package/harness/bundles/java/pi/scripts/harness_profile.py +3 -3
  386. package/harness/manifests/general/claude-code.json +62 -70
  387. package/harness/manifests/general/codebuddy.json +62 -70
  388. package/harness/manifests/general/codex.json +62 -70
  389. package/harness/manifests/general/cursor.json +62 -70
  390. package/harness/manifests/general/pi.json +62 -70
  391. package/harness/manifests/java/claude-code.json +65 -73
  392. package/harness/manifests/java/codebuddy.json +65 -73
  393. package/harness/manifests/java/codex.json +65 -73
  394. package/harness/manifests/java/cursor.json +65 -73
  395. package/harness/manifests/java/pi.json +65 -73
  396. package/hunter-workflow-family.json +2 -2
  397. package/package.json +1 -1
  398. package/harness/bundles/general/claude-code/harness-run/SKILL.md +0 -207
  399. package/harness/bundles/general/claude-code/harness-test/SKILL.md +0 -270
  400. package/harness/bundles/general/claude-code/harness-test/pitfalls-java.md +0 -14
  401. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +0 -188
  402. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +0 -250
  403. package/harness/bundles/general/codebuddy/harness-test/pitfalls-java.md +0 -14
  404. package/harness/bundles/general/codex/harness-run/SKILL.md +0 -188
  405. package/harness/bundles/general/codex/harness-test/SKILL.md +0 -250
  406. package/harness/bundles/general/codex/harness-test/pitfalls-java.md +0 -14
  407. package/harness/bundles/general/cursor/harness-run/SKILL.md +0 -188
  408. package/harness/bundles/general/cursor/harness-test/SKILL.md +0 -250
  409. package/harness/bundles/general/cursor/harness-test/pitfalls-java.md +0 -14
  410. package/harness/bundles/general/pi/harness-run/SKILL.md +0 -188
  411. package/harness/bundles/general/pi/harness-run/checklist.md +0 -279
  412. package/harness/bundles/general/pi/harness-run/protocols.md +0 -141
  413. package/harness/bundles/general/pi/harness-run/reference.md +0 -886
  414. package/harness/bundles/general/pi/harness-test/SKILL.md +0 -250
  415. package/harness/bundles/general/pi/harness-test/checklist.md +0 -359
  416. package/harness/bundles/general/pi/harness-test/pitfalls-java.md +0 -14
  417. package/harness/bundles/general/pi/harness-test/pitfalls.md +0 -307
  418. package/harness/bundles/general/pi/harness-test/reference.md +0 -880
  419. package/harness/bundles/java/claude-code/harness-run/SKILL.md +0 -225
  420. package/harness/bundles/java/claude-code/harness-run/protocols.md +0 -141
  421. package/harness/bundles/java/claude-code/harness-test/SKILL.md +0 -284
  422. package/harness/bundles/java/claude-code/harness-test/pitfalls.md +0 -307
  423. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +0 -206
  424. package/harness/bundles/java/codebuddy/harness-run/protocols.md +0 -141
  425. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +0 -264
  426. package/harness/bundles/java/codebuddy/harness-test/pitfalls.md +0 -307
  427. package/harness/bundles/java/codex/harness-run/SKILL.md +0 -206
  428. package/harness/bundles/java/codex/harness-run/protocols.md +0 -141
  429. package/harness/bundles/java/codex/harness-test/SKILL.md +0 -264
  430. package/harness/bundles/java/codex/harness-test/pitfalls.md +0 -307
  431. package/harness/bundles/java/cursor/harness-run/SKILL.md +0 -206
  432. package/harness/bundles/java/cursor/harness-run/protocols.md +0 -141
  433. package/harness/bundles/java/cursor/harness-test/SKILL.md +0 -264
  434. package/harness/bundles/java/cursor/harness-test/pitfalls.md +0 -307
  435. package/harness/bundles/java/pi/harness-run/SKILL.md +0 -206
  436. package/harness/bundles/java/pi/harness-run/checklist.md +0 -252
  437. package/harness/bundles/java/pi/harness-run/protocols.md +0 -141
  438. package/harness/bundles/java/pi/harness-run/reference.md +0 -820
  439. package/harness/bundles/java/pi/harness-test/SKILL.md +0 -264
  440. package/harness/bundles/java/pi/harness-test/checklist.md +0 -320
  441. package/harness/bundles/java/pi/harness-test/pitfalls-java.md +0 -16
  442. package/harness/bundles/java/pi/harness-test/pitfalls.md +0 -307
  443. package/harness/bundles/java/pi/harness-test/reference.md +0 -792
  444. /package/harness/bundles/general/claude-code/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
  445. /package/harness/bundles/general/codebuddy/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
  446. /package/harness/bundles/general/codex/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
  447. /package/harness/bundles/general/cursor/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
  448. /package/harness/bundles/general/pi/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
  449. /package/harness/bundles/java/claude-code/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
  450. /package/harness/bundles/java/codebuddy/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
  451. /package/harness/bundles/java/codex/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
  452. /package/harness/bundles/java/cursor/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
  453. /package/harness/bundles/java/pi/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
@@ -376,6 +376,14 @@ finalize 硬性要求证据包顶层 `adversarial_review` 收据,缺失即 `PL
376
376
  1. 先完成阶段 7.5 对抗评审,把结论写成草稿 `meta/plan-review-draft.json`:
377
377
  `{ "reviewer_identity": "inline:<标识>", "findings": [] }`
378
378
  (`review_mode` 缺省 `inline`;`completed_at` 缺省取当前时间;`findings` 为空数组表示无发现)
379
+
380
+ **草稿完整契约**(0.4.11 起可 `plan review-record --print-template` 取合法骨架):
381
+ 顶层键集精确为 `reviewer_identity / review_mode? / findings? / completed_at?`;
382
+ `reviewer_identity` 匹配 `^[a-z][a-z0-9_.:-]{0,159}$`。`findings` 元素键集精确为
383
+ `finding_id / category / severity / source_refs / message_zh / suggested_location`,
384
+ 其中 `severity ∈ {advisory, blocking}`、`source_refs` 至少一条非空字符串、
385
+ `finding_id` 同上面的 identity 规则。缺键/多键/枚举越界都会在
386
+ `PLAN_REVIEW_RECORD_INPUT_INVALID` 的 `problems[]` 里逐条给出 `field_path`。
379
387
  2. 跑 `plan review-record`:CLI 内部重跑 layer1/layer2/layer3 算出权威 `input_hash`,
380
388
  代算 `findings_hash`,把完整收据写回证据包顶层 `adversarial_review`(缺省覆盖 `--input`,
381
389
  可用 `--output` 写到别处)。stdout 的 `review_required: false` 表示该包未触发评审、收据不会被消费。
@@ -3,7 +3,7 @@ name: harness-pull
3
3
  description: 从 Hunter Platform 下拉配置/规则/架构/指令(及显式来源分支的分支文件恢复)。仅当用户显式调用
4
4
  /harness-pull 或明确说'从平台拉取/恢复'时使用;不得自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=3c6eec08da6f5a5c; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=7c08c3960f78dc1a; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-pull — 从 Hunter Platform 下拉与恢复
8
8
 
9
9
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-push
3
3
  description: 上传本地配置/规则/架构/指令(及显式归档)到 Hunter Platform。仅当用户显式调用 /harness-push
4
4
  或明确说'上传到平台'时使用;不得因存在本地修改就自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=3c6eec08da6f5a5c; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=7c08c3960f78dc1a; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-push — 上传到 Hunter Platform
8
8
 
9
9
  ## Purpose
@@ -4,7 +4,7 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
4
4
  .harness/context-index.json)和测试场景表,在隔离上下文运行。仅当用户显式调用 /harness-review 时使用;不得在
5
5
  test 结束后自动接续执行。
6
6
  ---
7
- <!-- generated by harness_deploy.py; core=3c6eec08da6f5a5c; overlay=none; agent=codebuddy; do not edit -->
7
+ <!-- generated by harness_deploy.py; core=7c08c3960f78dc1a; overlay=none; agent=codebuddy; do not edit -->
8
8
  # harness-review — 代码审查
9
9
 
10
10
  ## Purpose
@@ -25,7 +25,7 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
25
25
  ## 前置条件
26
26
 
27
27
  - `.harness/changes/<change-name>/plans/<change-name>-plan.md` 存在(任务真相源)
28
- - 必须读取 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 且 worktree 已创建 → 在 worktree 目录中执行审查;`requested=true` 但 worktree 不存在 → 停止,提示先修复 `harness-run`,不得静默回主目录
28
+ - 必须读取 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 且 worktree 已创建 → 在 worktree 目录中执行审查;`requested=true` 但 worktree 不存在 → 停止,提示先修复 `harness-execute`,不得静默回主目录
29
29
  - **review 不阻塞后续流程**:test 报告缺失或未运行不阻止 review(review 是参考性阶段),但应在报告中标注 test 状态供参考
30
30
 
31
31
  ## 统一读取协议
@@ -49,7 +49,7 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
49
49
  先用 `harness_context.py prepare --phase review --executor <tool> [--change <id>] --json` 与 `harness_context.py begin --phase review --change <id> --executor <tool> --json` 解析唯一 active change 并校验实际前序 receipt;多个 active change 未显式选择时返回 `ACTIVE_CHANGE_AMBIGUOUS`,禁止再按 Glob/mtime 猜测。阶段门禁使用 `harness_gate.py begin --phase review --change <id> --task <n> --skills-root <skills-root> --executor-tool <tool> --json`;结束时只执行一次 `harness_gate.py close`,正常路径的 `--to-phase` 取 `plannedPhases` 中 review 的后继,Fixback 才返回 run。由 gate 完成阶段事件、租约、上下文交接与远端补传。不得手工追加阶段边界或再次调用 context close;任一 close 失败不得宣称评审完成。
50
50
 
51
51
  0. **启动准备** — 确定变更名(Glob `.harness/changes/*/plans/*-plan.md`,排除 `.harness/archive/*/`,读 frontmatter 提取 change-name);**append `phase.start` 事件**(不得等审查完成才补)
52
- 1. **读取 worktree 状态(门禁检查)** — 读 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 但 worktree 不存在 → 停止并提示先修复 `harness-run`,不得静默回主目录(否则 git diff 为空);`requested=true` 且 worktree 已创建 → spawned agent 用该 worktree 路径执行 `git diff`(确保审查 worktree 变更而非主目录);`requested=false` → 审查主目录变更
52
+ 1. **读取 worktree 状态(门禁检查)** — 读 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 但 worktree 不存在 → 停止并提示先修复 `harness-execute`,不得静默回主目录(否则 git diff 为空);`requested=true` 且 worktree 已创建 → spawned agent 用该 worktree 路径执行 `git diff`(确保审查 worktree 变更而非主目录);`requested=false` → 审查主目录变更
53
53
  <!-- @section-id review.delegate -->
54
54
  ### 2. 审查执行(独立评审优先)
55
55
 
@@ -8,7 +8,7 @@ description: harness-review 的6维度审查检查项详细列表。仅在执行
8
8
 
9
9
  用 Glob 搜索 `.harness/changes/*/plans/*-plan.md`(**排除 `.harness/archive/*/`**),读取 frontmatter 提取 `change-name`。默认最多一个未归档变更;如有多个,优先取最近修改的,或询问用户。后续所有路径基于此变更名。
10
10
 
11
- **读取 worktree 状态**:读 `.harness/changes/<change-name>/meta/worktree.json`。`requested=true` 且 worktree 已创建 → 后续 `git diff` 的 `<项目路径>` 用 worktree 路径(`.worktrees/<change-name>`);`requested=true` 但 worktree 不存在 → 停止,提示先修复 `harness-run`,不得静默回主目录。
11
+ **读取 worktree 状态**:读 `.harness/changes/<change-name>/meta/worktree.json`。`requested=true` 且 worktree 已创建 → 后续 `git diff` 的 `<项目路径>` 用 worktree 路径(`.worktrees/<change-name>`);`requested=true` 但 worktree 不存在 → 停止,提示先修复 `harness-execute`,不得静默回主目录。
12
12
 
13
13
  ## 审查流程
14
14
 
@@ -3,7 +3,7 @@ name: harness-submit
3
3
  description: 最终提交封装:验证→中文 commit→提交/推送;worktree 模式含 --no-ff 合并回主分支。仅当用户显式调用
4
4
  /harness-submit(或 /harness-merge 重入合并段)时使用;用户口头说'提交/commit/push'时必须先确认,不得自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=3c6eec08da6f5a5c; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=7c08c3960f78dc1a; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-submit — 最终提交(含 worktree 合并)
8
8
 
9
9
  ## Purpose
@@ -33,7 +33,7 @@ description: harness-submit 的8 步工作流详细步骤和执行日志记录
33
33
  1. 通过 state layout resolver 读取权威 `evidence/verification-ledger.json`,记录 `diffHash` / `currentHead` / `unitTest` / `apiTest` 状态;split-v1 不得回退复制到 contract 目录
34
34
  2. 执行 `harness_ledger.py diff-hash --repo . --base <baseCommit> --change-dir ".harness/changes/<change-name>" --json` 计算当前 diffHash;manifest 校验失败即停止,不得绕过后与 ledger 比对
35
35
  3. 若 test 之后有代码变更(当前 diffHash ≠ test 完成时的 diffHash),按 7 类对 post-test diff 分类(见 `../protocols/ledger-protocol.md` 第六章),写入 ledger 的 `postTestClassification`
36
- 4. 行为性变更(BEHAVIORAL_SERVICE_CHANGE / API_CONTRACT_CHANGE / SQL_OR_MAPPER_CHANGE / SECURITY_OR_PERMISSION_CHANGE)→ **停止 submit**,提示先重跑 `/harness-test` 相关场景
36
+ 4. 行为性变更(BEHAVIORAL_SERVICE_CHANGE / API_CONTRACT_CHANGE / SQL_OR_MAPPER_CHANGE / SECURITY_OR_PERMISSION_CHANGE)→ **停止 submit**,提示先重跑 `/harness-execute` 相关场景
37
37
  5. 非行为性变更(NON_BEHAVIORAL_CLEANUP / COMMENT_ONLY / TEST_ONLY)→ 可继续 submit,但后续验证按复用规则处理
38
38
 
39
39
  **append `phase.start` 事件**(`harness_events.py append`;`note` 含 ledger diffHash、post-test 分类、验证策略):
@@ -136,7 +136,7 @@ powershell.exe -NoProfile -Command "git -C '<项目路径>' log HEAD..@{u} --one
136
136
  powershell.exe -Command "[System.IO.Directory]::Delete('<worktree-path>', $true)"
137
137
  ```
138
138
 
139
- 4. **ExitWorktree 工具限制**:`ExitWorktree(remove)` 只删由 `EnterWorktree` 创建的 worktree。若本会话进入的是已存在 worktree(由 `harness-run` 创建),工具会拒绝删除。此时用 `action:keep` 返回主仓库,再按上述 1-3 步手动清理。
139
+ 4. **ExitWorktree 工具限制**:`ExitWorktree(remove)` 只删由 `EnterWorktree` 创建的 worktree。若本会话进入的是已存在 worktree(由 `harness-execute` 创建),工具会拒绝删除。此时用 `action:keep` 返回主仓库,再按上述 1-3 步手动清理。
140
140
 
141
141
  5. **清理后更新 `meta/worktree.json`**:置 `created=false` + 追加 `removedAt`/`removedBy`/`removalNote`,记录产出保留待 `/harness-archive`。
142
142
 
@@ -4,7 +4,7 @@ description: Use when the user asks to synchronize, refresh, or validate Harness
4
4
  metadata, adapters, remote knowledge ownership, instruction entrypoints,
5
5
  config origins, or CodeGraph status.
6
6
  ---
7
- <!-- generated by harness_deploy.py; core=3c6eec08da6f5a5c; overlay=none; agent=codebuddy; do not edit -->
7
+ <!-- generated by harness_deploy.py; core=7c08c3960f78dc1a; overlay=none; agent=codebuddy; do not edit -->
8
8
  # harness-sync
9
9
 
10
10
  ## Purpose
@@ -42,7 +42,7 @@ description: harness 全流程的证据化报告协议。所有 skill 输出必
42
42
  | 情况 | 状态标记 | 报告表述 |
43
43
  |------|:--------:|----------|
44
44
  | 测试命令输出包含测试通过证据(Java=`Tests run: N, Failures: 0`;前端/Python 按各自工具) | ✅ | ✅ 已测试通过:N 个用例,0 失败 |
45
- | TDD 降级(无测试基础设施) | 🟡 | 🟡 静态验证通过,未执行真实单元测试,待测试基础设施补齐后运行 harness-test |
45
+ | TDD 降级(无测试基础设施) | 🟡 | 🟡 静态验证通过,未执行真实单元测试,待测试基础设施补齐后运行 harness-execute |
46
46
  | 测试命令被 hook 拒绝 | ❌ | ❌ 测试命令被拒绝,无法确认测试结果 |
47
47
  | 测试失败(有 Failures > 0) | ❌ | ❌ 测试失败:N 个用例,M 个失败 |
48
48
  | 用户确认跳过测试 | 🟡 | 🟡 用户确认跳过测试 |
@@ -4,7 +4,7 @@ description: verification-ledger、diffHash、service-fingerprint 的统一协
4
4
 
5
5
  # Ledger Protocol
6
6
 
7
- > 本协议被 harness-plan / harness-run / harness-test / harness-submit / harness-archive 共同引用。
7
+ > 本协议被 harness-plan / harness-execute / harness-execute / harness-submit / harness-archive 共同引用。
8
8
  > 目标:消除跨阶段重复编译/测试,让每个"✅ 已验证"结论可追溯、可复用,避免 post-test 小改动导致前序报告有效性表达不清。
9
9
 
10
10
  ## 一、为什么需要 verification-ledger
@@ -156,7 +156,7 @@ verification-ledger 把每次验证(compile / unit test / api test / package
156
156
  "moduleInputsHash": "sha256:<依赖闭包内容指纹>",
157
157
  "moduleInputsFiles": ["<project>/Svc.java", "..."],
158
158
  "profile": "local-dev-remote-sdk",
159
- "overlayPath": "C:/temp/harness-test-overlay/<change>/application-harness-test.yml",
159
+ "overlayPath": "C:/temp/harness-execute-overlay/<change>/application-harness-execute.yml",
160
160
  "startCommandHash": "sha256:<command 指纹>",
161
161
  "command": "<serviceStart.command>",
162
162
  "startedAt": "..."
@@ -165,7 +165,7 @@ verification-ledger 把每次验证(compile / unit test / api test / package
165
165
 
166
166
  `moduleInputsHash` 由 CLI `--files` ∪ `build-profile.json` 的 `serviceStart.inputFiles`(glob 列表,相对 project 展开)计算。**空输入被拒绝**(exit 非 0),不得生成可复用的空指纹(§5.1/§5.2)。
167
167
 
168
- 复用必须**同时**满足(§5.3):`moduleInputsHash` 一致、`startCommandHash` 一致、`profile` 一致、`overlayPath` 一致、进程身份(pid 存活 + create time 匹配 `startedAt`)可确认。任一变化 -> AI 自动 restart;身份无法确认 -> `needs-user-decision`;非 AI 用户进程永不自动 kill。否则必须进入 Service Decision Gate(见 harness-test)。
168
+ 复用必须**同时**满足(§5.3):`moduleInputsHash` 一致、`startCommandHash` 一致、`profile` 一致、`overlayPath` 一致、进程身份(pid 存活 + create time 匹配 `startedAt`)可确认。任一变化 -> AI 自动 restart;身份无法确认 -> `needs-user-decision`;非 AI 用户进程永不自动 kill。否则必须进入 Service Decision Gate(见 harness-execute)。
169
169
 
170
170
  ### 4.2 unitTestFull 最终全量门禁
171
171
 
@@ -216,13 +216,13 @@ harness_ledger.py diff-hash --repo <projectRoot> --base <baseCommit> --change-di
216
216
  - manifest 存在时必须严格验证 schema/mode/projectRoot、精确相对路径、文件存在性与 SHA-256;结构非法、路径越界或 hash 漂移均非零退出,旧 ledger 不得复用。
217
217
  - ignored test 在 checkpoint 前由 manifest 加入内容集;经 guard force-stage/commit 后由 Git diff 加入同一路径,集合去重,因此 hash 保持不变。
218
218
  - diffHash 只用于"内容是否变化"判断,不等于 commit hash
219
- - 账本中 `currentHead`(验证时 HEAD)与 `diffHash` 分开记录;reuse 规则 #2 允许 HEAD 前移(如 harness-run Step 5 checkpoint commit),因 diffHash 已 commit-invariant,HEAD 前移不改变指纹
219
+ - 账本中 `currentHead`(验证时 HEAD)与 `diffHash` 分开记录;reuse 规则 #2 允许 HEAD 前移(如 harness-execute Step 5 checkpoint commit),因 diffHash 已 commit-invariant,HEAD 前移不改变指纹
220
220
  - **禁止**使用类似 `3files-84plus-5minus` 的描述性字符串作为复用依据
221
221
  - **禁止**删除/忽略 test-tracking manifest 后继续复用,也禁止用手写 Git/Node/PowerShell hash 替代 canonical 命令。
222
222
 
223
223
  ## 六、Post-test 变更分类
224
224
 
225
- 当 `/harness-test` 完成后又发生代码变更(常见于 review 后清理、submit 前发现的小问题),后续 submit/package/archive **必须先对变更做分类**,写入 ledger 的 `postTestClassification`:
225
+ 当 `/harness-execute` 完成后又发生代码变更(常见于 review 后清理、submit 前发现的小问题),后续 submit/package/archive **必须先对变更做分类**,写入 ledger 的 `postTestClassification`:
226
226
 
227
227
  | 类型 | 示例 | 是否需要重跑 API | 是否需要重跑 unit | 是否需要重 compile |
228
228
  |------|------|:---:|:---:|:---:|
@@ -245,15 +245,15 @@ post-test 变更: NON_BEHAVIORAL_CLEANUP
245
245
  API 测试: 🔁 复用上一轮结果(diffHash 未变 / 仅清理性变更)
246
246
  ```
247
247
 
248
- **行为性变更**:必须重新运行 `/harness-test` 的相关场景(至少覆盖变更影响的接口/权限/SQL),ledger 对应项作废并重写。
248
+ **行为性变更**:必须重新运行 `/harness-execute` 的相关场景(至少覆盖变更影响的接口/权限/SQL),ledger 对应项作废并重写。
249
249
 
250
250
  ## 七、各阶段与 ledger 的交互
251
251
 
252
252
  | 阶段 | 读 ledger | 写 ledger |
253
253
  |------|:---:|:---:|
254
254
  | harness-plan | 计划起点读(了解前序变更状态/已有 ledger,作为复用链起点) | 计划落定后写初始 ledger(changeName/module/profile/baseCommit/diffHash 占位) |
255
- | harness-run | 步骤 2 前读(确认是否已有 compile/unitTest 可复用) | 步骤 2 后写 compile + unitTest(若跑了全量测试) |
256
- | harness-test | Phase 1 前读(复用 run 的 unitTest) | Phase 1/2 后写 unitTest + apiTest |
255
+ | harness-execute | 步骤 2 前读(确认是否已有 compile/unitTest 可复用) | 步骤 2 后写 compile + unitTest(若跑了全量测试) |
256
+ | harness-execute | Phase 1 前读(复用 run 的 unitTest) | Phase 1/2 后写 unitTest + apiTest |
257
257
  | harness-submit | 验证前读(复用 test 的 compile/unitTest) | 若重跑则写回 |
258
258
  | harness-archive | 归档前读(汇总各阶段状态,写入 `summary-data.json` 并上传平台) | 不写(归档时一并移入 archive) |
259
259
 
@@ -98,13 +98,13 @@ spring:
98
98
  > `HUNTER_HARNESS_SENSITIVE_SCAN=block` 才恢复阻断、`=off` 完全关闭。
99
99
  > 门禁放行不等于内容可以带明文凭据——本节的要求始终成立。
100
100
 
101
- profile `build-profile.json`、规则文档、Skill Markdown **不得包含凭据明文值**(spec §3.4 凭据边界:配置只含 env key、cache path、角色,不含值)。发布前用 `harness-test/scripts/runtime-helpers.mjs` 的 `findCredentialValues(text)` 扫描:
101
+ profile `build-profile.json`、规则文档、Skill Markdown **不得包含凭据明文值**(spec §3.4 凭据边界:配置只含 env key、cache path、角色,不含值)。发布前用 `harness-execute/scripts/runtime-helpers.mjs` 的 `findCredentialValues(text)` 扫描:
102
102
 
103
103
  - 命中 `password/token/secret/accessKey/Authorization: Bearer/jdbc password=` 等明文值 → ❌FAIL,必须改为占位符 `<*_REDACTED>` 或 env 引用 `${ENV}` / `$ENV`。
104
104
  - 占位符 `<TOKEN_REDACTED>` 与 env 引用 `${TEST_TOKEN}` / `$DB_PASSWORD` 不报(credential 配置允许 env key)。
105
105
 
106
106
  ```js
107
- import { findCredentialValues } from '<skills-root>/harness-test/scripts/runtime-helpers.mjs';
107
+ import { findCredentialValues } from '<skills-root>/harness-execute/scripts/runtime-helpers.mjs';
108
108
  const findings = findCredentialValues(fs.readFileSync('build-profile.json', 'utf8'));
109
109
  if (findings.length > 0) { /* ❌FAIL: 列出 line/code/snippet,改为 env key 或占位符 */ }
110
110
  ```
@@ -478,6 +478,55 @@ def _phase_has_ended(event_paths: list[Path], phase: str) -> bool:
478
478
  )
479
479
 
480
480
 
481
+ def _ensure_phase_end_event(
482
+ contract_root: Path,
483
+ *,
484
+ phase: str,
485
+ status: str,
486
+ executor: str,
487
+ ) -> dict[str, Any] | None:
488
+ """补齐 phase.start/end 事件对(P0-2)。
489
+
490
+ 平台 Run 计时由 events-sync 上报的 phase.start/end 事件对驱动。不经
491
+ gate close 收尾的阶段(典型:plan 走 finalize + context close)只写
492
+ transitions 收据,phase.end 永远缺席,平台计时永不停——连续两个 change
493
+ 复现,属结构性缺口(2026-08-30 sales-insight-agent demo-datasource 实测)。
494
+ close_transition 是所有跨阶段推进的共同通道,在此按事件配对补齐:
495
+ 有 start 无 end → 复用 start 的 run_id/attempt 代写 end;已有 end(gate
496
+ close 先行写入)或连 start 都没有 → 不动,返回 None。
497
+ """
498
+ import harness_events as he
499
+
500
+ events_file = contract_root / "events.ndjson"
501
+ events = _read_ndjson(events_file)
502
+ starts = [
503
+ item
504
+ for item in events
505
+ if hpaths.resolve_phase_name(item.get("phase")) == phase
506
+ and item.get("type") == "phase.start"
507
+ ]
508
+ if not starts or any(
509
+ hpaths.resolve_phase_name(item.get("phase")) == phase
510
+ and item.get("type") == "phase.end"
511
+ for item in events
512
+ ):
513
+ return None
514
+ start = starts[-1]
515
+ result = he.append_event(
516
+ contract_root,
517
+ phase=phase,
518
+ type_="phase.end",
519
+ run_id=str(start.get("run_id") or f"{phase}_unknown"),
520
+ attempt=int(start.get("attempt") or 1),
521
+ status=status,
522
+ executor_tool=executor,
523
+ note="context close 自动补齐 phase.end(平台计时事件对配对)",
524
+ )
525
+ if not result.get("ok"):
526
+ return {"code": "PHASE_END_PAIR_FAILED", "detail": result}
527
+ return {"code": "PHASE_END_AUTO_PAIRED", "event": result.get("event")}
528
+
529
+
481
530
  def _reselect_review_fixback(
482
531
  project: Path,
483
532
  change: str,
@@ -1334,6 +1383,12 @@ def close_transition(
1334
1383
  and latest.get("artifacts") == artifact_entries
1335
1384
  and (executor is None or latest.get("executor") == executor)
1336
1385
  ):
1386
+ paired = _ensure_phase_end_event(
1387
+ contract_root,
1388
+ phase=from_phase,
1389
+ status=status,
1390
+ executor=executor or str(latest.get("executor") or "unknown"),
1391
+ )
1337
1392
  return {
1338
1393
  "ok": True,
1339
1394
  "code": "TRANSITION_ALREADY_CLOSED",
@@ -1341,6 +1396,7 @@ def close_transition(
1341
1396
  "receipt": latest,
1342
1397
  "path": str(paths["transitions"]),
1343
1398
  "invalidation": None,
1399
+ "phaseEndPair": paired,
1344
1400
  }
1345
1401
  return {"ok": False, "code": "CONTEXT_LEASE_REQUIRED"}
1346
1402
  try:
@@ -1397,6 +1453,12 @@ def close_transition(
1397
1453
  receipt["receiptHash"] = _payload_hash(receipt)
1398
1454
  _append_ndjson(paths["transitions"], receipt)
1399
1455
  paths["lease"].unlink(missing_ok=True)
1456
+ paired = _ensure_phase_end_event(
1457
+ contract_root,
1458
+ phase=from_phase,
1459
+ status=status,
1460
+ executor=effective_executor,
1461
+ )
1400
1462
  invalidation = None
1401
1463
  if to_phase == "execute" and from_phase in {"execute", "review"}:
1402
1464
  invalidation = _invalidate_for_fixback(
@@ -1411,6 +1473,7 @@ def close_transition(
1411
1473
  "receipt": receipt,
1412
1474
  "path": str(paths["transitions"]),
1413
1475
  "invalidation": invalidation,
1476
+ "phaseEndPair": paired,
1414
1477
  }
1415
1478
 
1416
1479
 
@@ -1898,7 +1961,7 @@ def build_parser() -> argparse.ArgumentParser:
1898
1961
  prepare = sub.add_parser("prepare")
1899
1962
  prepare.add_argument("--json", action="store_true")
1900
1963
  prepare.add_argument("--project", required=True, type=Path)
1901
- prepare.add_argument("--change")
1964
+ prepare.add_argument("--change", "--change-dir", dest="change")
1902
1965
  prepare.add_argument("--phase", required=True)
1903
1966
  prepare.add_argument("--executor", required=True)
1904
1967
  prepare.add_argument("--title")
@@ -1907,7 +1970,7 @@ def build_parser() -> argparse.ArgumentParser:
1907
1970
  bootstrap = sub.add_parser("bootstrap-plan")
1908
1971
  bootstrap.add_argument("--json", action="store_true")
1909
1972
  bootstrap.add_argument("--project", required=True, type=Path)
1910
- bootstrap.add_argument("--change", required=True)
1973
+ bootstrap.add_argument("--change", "--change-dir", dest="change", required=True)
1911
1974
  bootstrap.add_argument("--executor", required=True)
1912
1975
  bootstrap.add_argument("--title")
1913
1976
  bootstrap.add_argument("--stage", default="plan", choices=["plan", "post-run"])
@@ -1915,7 +1978,7 @@ def build_parser() -> argparse.ArgumentParser:
1915
1978
  close = sub.add_parser("close")
1916
1979
  close.add_argument("--json", action="store_true")
1917
1980
  close.add_argument("--project", required=True, type=Path)
1918
- close.add_argument("--change", required=True)
1981
+ close.add_argument("--change", "--change-dir", dest="change", required=True)
1919
1982
  close.add_argument("--from-phase", required=True)
1920
1983
  close.add_argument("--to-phase", required=True)
1921
1984
  close.add_argument("--executor", required=True)
@@ -1924,7 +1987,7 @@ def build_parser() -> argparse.ArgumentParser:
1924
1987
  begin = sub.add_parser("begin")
1925
1988
  begin.add_argument("--json", action="store_true")
1926
1989
  begin.add_argument("--project", required=True, type=Path)
1927
- begin.add_argument("--change", required=True)
1990
+ begin.add_argument("--change", "--change-dir", dest="change", required=True)
1928
1991
  begin.add_argument("--phase", required=True)
1929
1992
  begin.add_argument("--executor", required=True)
1930
1993
  handoff = sub.add_parser(
@@ -1933,7 +1996,7 @@ def build_parser() -> argparse.ArgumentParser:
1933
1996
  )
1934
1997
  handoff.add_argument("--json", action="store_true")
1935
1998
  handoff.add_argument("--project", required=True, type=Path)
1936
- handoff.add_argument("--change", required=True)
1999
+ handoff.add_argument("--change", "--change-dir", dest="change", required=True)
1937
2000
  handoff.add_argument("--to-phase", required=True)
1938
2001
  handoff.add_argument(
1939
2002
  "--from-phase",
@@ -1946,20 +2009,20 @@ def build_parser() -> argparse.ArgumentParser:
1946
2009
  )
1947
2010
  renew.add_argument("--json", action="store_true")
1948
2011
  renew.add_argument("--project", required=True, type=Path)
1949
- renew.add_argument("--change", required=True)
2012
+ renew.add_argument("--change", "--change-dir", dest="change", required=True)
1950
2013
  renew.add_argument("--executor", required=True)
1951
2014
  renew.add_argument("--ttl-seconds", type=int, default=3600)
1952
2015
  configure = sub.add_parser("configure-plan")
1953
2016
  configure.add_argument("--json", action="store_true")
1954
2017
  configure.add_argument("--project", required=True, type=Path)
1955
- configure.add_argument("--change", required=True)
2018
+ configure.add_argument("--change", "--change-dir", dest="change", required=True)
1956
2019
  configure.add_argument("--phases", required=True)
1957
2020
  configure.add_argument("--operator", required=True)
1958
2021
  configure.add_argument("--reason", required=True)
1959
2022
  view = sub.add_parser("view")
1960
2023
  view.add_argument("--json", action="store_true")
1961
2024
  view.add_argument("--project", required=True, type=Path)
1962
- view.add_argument("--change", required=True)
2025
+ view.add_argument("--change", "--change-dir", dest="change", required=True)
1963
2026
  return parser
1964
2027
 
1965
2028
 
@@ -479,10 +479,10 @@ def copy_overlay_extras(overlay_dir: Path, out_dir: Path) -> list[str]:
479
479
  # it must NOT be installed to runtime. Only pitfalls-java.md is runtime.
480
480
  pitfalls = overlay_dir / "pitfalls-java.md"
481
481
  if pitfalls.is_file():
482
- test_pit = out_dir / "harness-test" / "pitfalls-java.md"
482
+ test_pit = out_dir / "harness-execute" / "testing-pitfalls-java.md"
483
483
  test_pit.parent.mkdir(parents=True, exist_ok=True)
484
484
  shutil.copy2(pitfalls, test_pit)
485
- extras.append("harness-test/pitfalls-java.md")
485
+ extras.append("harness-execute/testing-pitfalls-java.md")
486
486
  return extras
487
487
 
488
488
 
@@ -884,13 +884,19 @@ def build_event(args: argparse.Namespace, existing: list[dict[str, Any]]) -> dic
884
884
  def validate_append_event(args: argparse.Namespace) -> tuple[str, str] | None:
885
885
  """Validate type-specific append fields before any file is mutated."""
886
886
  event_type = str(args.type)
887
- for field in _EVENT_REQUIRED_FIELDS.get(event_type, ()):
888
- value = getattr(args, field, None)
889
- if value is None or (isinstance(value, str) and not value.strip()):
890
- return (
891
- "EVENT_REQUIRED_FIELD",
892
- f"EVENT_REQUIRED_FIELD: {event_type} requires --{field.replace('_', '-')}",
893
- )
887
+ missing = [
888
+ f"--{field.replace('_', '-')}"
889
+ for field in _EVENT_REQUIRED_FIELDS.get(event_type, ())
890
+ if getattr(args, field, None) is None
891
+ or (isinstance(getattr(args, field, None), str)
892
+ and not getattr(args, field).strip())
893
+ ]
894
+ if missing:
895
+ # 一次性列出全部缺失字段——逐个报错会让调用方每个字段往返一轮(E-3)
896
+ return (
897
+ "EVENT_REQUIRED_FIELD",
898
+ f"EVENT_REQUIRED_FIELD: {event_type} requires " + ", ".join(missing),
899
+ )
894
900
  allowed = _EVENT_ALLOWED_FIELDS[event_type]
895
901
  for field in OPTIONAL_FIELDS:
896
902
  value = getattr(args, field, None)
@@ -2146,7 +2152,7 @@ def build_parser() -> argparse.ArgumentParser:
2146
2152
  parents=[common],
2147
2153
  help="append one event and auto-render execution-log",
2148
2154
  )
2149
- p_append.add_argument("--change-dir", required=True)
2155
+ p_append.add_argument("--change-dir", "--change", dest="change_dir", required=True)
2150
2156
  p_append.add_argument("--phase", required=True)
2151
2157
  p_append.add_argument("--type", required=True)
2152
2158
  p_append.add_argument("--command", default=None)
@@ -2200,7 +2206,7 @@ def build_parser() -> argparse.ArgumentParser:
2200
2206
  parents=[common],
2201
2207
  help="validate and append many events under one lock (H-15)",
2202
2208
  )
2203
- p_batch.add_argument("--change-dir", required=True)
2209
+ p_batch.add_argument("--change-dir", "--change", dest="change_dir", required=True)
2204
2210
  p_batch.add_argument(
2205
2211
  "--file",
2206
2212
  required=True,
@@ -2213,7 +2219,7 @@ def build_parser() -> argparse.ArgumentParser:
2213
2219
  parents=[common],
2214
2220
  help="re-render execution-log.md from events.ndjson",
2215
2221
  )
2216
- p_render.add_argument("--change-dir", required=True)
2222
+ p_render.add_argument("--change-dir", "--change", dest="change_dir", required=True)
2217
2223
  p_render.set_defaults(func=cmd_render)
2218
2224
 
2219
2225
  p_summary = sub.add_parser(
@@ -2221,7 +2227,7 @@ def build_parser() -> argparse.ArgumentParser:
2221
2227
  parents=[common],
2222
2228
  help="summarize phases/issues from events.ndjson",
2223
2229
  )
2224
- p_summary.add_argument("--change-dir", required=True)
2230
+ p_summary.add_argument("--change-dir", "--change", dest="change_dir", required=True)
2225
2231
  p_summary.set_defaults(func=cmd_summary)
2226
2232
 
2227
2233
  return parser
@@ -2220,7 +2220,7 @@ def _validate_scenario_coverage(
2220
2220
  is due by that phase are required to carry passing receipts. Scenarios
2221
2221
  owned by a later phase (e.g. `ownerPhase=test` at `run` close) are
2222
2222
  reported under `deferred` instead of blocking the close — this matches the
2223
- documented hand-off rule in harness-run/SKILL.md ("ownerPhase=test 按计划移交").
2223
+ documented hand-off rule in harness-execute/SKILL.md ("ownerPhase=test 按计划移交").
2224
2224
  """
2225
2225
  manifest_path = change_dir / "meta" / "scenario-manifest.json"
2226
2226
  if not manifest_path.is_file():
@@ -2594,6 +2594,64 @@ def _normalize_gate_phase(args: argparse.Namespace, as_json: bool) -> int | None
2594
2594
  )
2595
2595
 
2596
2596
 
2597
+ def _verification_target_coverage_warning(
2598
+ change_dir: Path, phase: str
2599
+ ) -> dict[str, Any] | None:
2600
+ """E-5:场景表引用未声明的 verification target 时提前 WARN。
2601
+
2602
+ 场景带 execution_level(unit/integration/…),但 build-profile 的
2603
+ verificationGraph.targets 未声明对应 target 时,问题要等到 ledger record
2604
+ 才以 unsupported verification 报错——太迟。gate begin 提前列出待补清单。
2605
+ 映射约定:unit → unitTest;其他 level → 任一以其名开头的 target。
2606
+ """
2607
+ if phase != "execute":
2608
+ return None
2609
+ manifest_path = change_dir / "meta" / "scenario-manifest.json"
2610
+ profile_path = change_dir / "meta" / "build-profile.json"
2611
+ if not profile_path.is_file():
2612
+ # build-profile 常规位置在项目 .harness/config/;change meta 下优先
2613
+ profile_path = change_dir.parents[2] / ".harness" / "config" / "build-profile.json"
2614
+ if not manifest_path.is_file() or not profile_path.is_file():
2615
+ return None
2616
+ try:
2617
+ manifest = json.loads(manifest_path.read_text(encoding="utf-8-sig"))
2618
+ profile = json.loads(profile_path.read_text(encoding="utf-8-sig"))
2619
+ except (OSError, json.JSONDecodeError):
2620
+ return None
2621
+ content = manifest.get("content") if isinstance(manifest, dict) else None
2622
+ scenarios = content.get("scenarios") if isinstance(content, dict) else None
2623
+ if not isinstance(scenarios, list):
2624
+ return None
2625
+ levels = sorted({
2626
+ str(s.get("execution_level")).strip()
2627
+ for s in scenarios
2628
+ if isinstance(s, dict) and str(s.get("execution_level") or "").strip()
2629
+ })
2630
+ graph = profile.get("verificationGraph")
2631
+ targets = graph.get("targets") if isinstance(graph, dict) else None
2632
+ target_names = set(targets.keys()) if isinstance(targets, dict) else set()
2633
+ uncovered = [
2634
+ level for level in levels
2635
+ if level != "unit"
2636
+ and not any(name.lower().startswith(level.lower()) for name in target_names)
2637
+ ]
2638
+ # unit 场景由 unitTest 覆盖;只在完全没有 unitTest 时才算缺口
2639
+ if "unit" in levels and "unitTest" not in target_names:
2640
+ uncovered.append("unit(→unitTest)")
2641
+ if not uncovered:
2642
+ return None
2643
+ return {
2644
+ "code": "VERIFICATION_TARGETS_UNDECLARED",
2645
+ "message": (
2646
+ "场景表涉及未声明的验证级别: " + ", ".join(uncovered) +
2647
+ ";ledger record 将报 unsupported verification。请在 "
2648
+ ".harness/config/build-profile.json 的 verificationGraph.targets "
2649
+ "声明对应 target(如 integrationTest)"
2650
+ ),
2651
+ "uncoveredLevels": uncovered,
2652
+ }
2653
+
2654
+
2597
2655
  def cmd_begin(args: argparse.Namespace) -> int:
2598
2656
  as_json = bool(args.json)
2599
2657
  normalized = _normalize_gate_phase(args, as_json)
@@ -2911,6 +2969,14 @@ def cmd_begin(args: argparse.Namespace) -> int:
2911
2969
  )
2912
2970
  raise
2913
2971
 
2972
+ coverage_warning = _verification_target_coverage_warning(change_dir, args.phase)
2973
+ if coverage_warning is not None:
2974
+ gate_warnings.append(coverage_warning)
2975
+ print(
2976
+ f"[harness-gate] WARNING {coverage_warning['code']}: "
2977
+ f"{coverage_warning['message']}",
2978
+ file=sys.stderr,
2979
+ )
2914
2980
  payload = {
2915
2981
  "ok": True,
2916
2982
  "code": "PHASE_BEGUN",
@@ -3800,11 +3866,25 @@ def cmd_classify(args: argparse.Namespace) -> int:
3800
3866
  payload["classifiedAt"] = classified_at
3801
3867
 
3802
3868
  if change_dir is not None and change_dir.is_dir():
3803
- policy_doc = gate_policy_document(payload)
3804
- policy_path = change_dir / "meta" / "gate-policy.json"
3805
- _write_json(policy_path, policy_doc)
3806
- payload["policyPersisted"] = True
3807
- payload["policyPath"] = str(policy_path)
3869
+ finalized = (change_dir / "meta" / "plan-profile.json").is_file()
3870
+ if finalized and not getattr(args, "force", False):
3871
+ # P1-1:classify 形态像只读查询,实际是写操作。已发布的 change
3872
+ # 被误跑 classify 会覆盖 configure-plan 写入的工作副本(2026-08-30
3873
+ # demo-datasource 实测 plannedPhases 被清)。默认拒写并显式提示。
3874
+ payload["policyPersisted"] = False
3875
+ payload["warning"] = (
3876
+ "change 已发布(meta/plan-profile.json 存在),classify 不再重写 "
3877
+ "meta/gate-policy.json 工作副本;确需重算请显式传 --force"
3878
+ )
3879
+ payload["writeGuarded"] = True
3880
+ else:
3881
+ policy_doc = gate_policy_document(payload)
3882
+ policy_path = change_dir / "meta" / "gate-policy.json"
3883
+ _write_json(policy_path, policy_doc)
3884
+ payload["policyPersisted"] = True
3885
+ payload["policyPath"] = str(policy_path)
3886
+ if finalized:
3887
+ payload["warning"] = "--force:已发布 change 的工作副本已被重写"
3808
3888
  else:
3809
3889
  payload["policyPersisted"] = False
3810
3890
  payload["warning"] = (
@@ -3930,7 +4010,7 @@ def build_parser() -> argparse.ArgumentParser:
3930
4010
 
3931
4011
  p_begin = sub.add_parser("begin", parents=[shared])
3932
4012
  p_begin.add_argument("--phase", required=True)
3933
- p_begin.add_argument("--change", default=None)
4013
+ p_begin.add_argument("--change", "--change-dir", dest="change", default=None)
3934
4014
  p_begin.add_argument(
3935
4015
  "--project",
3936
4016
  default=None,
@@ -3960,7 +4040,7 @@ def build_parser() -> argparse.ArgumentParser:
3960
4040
  help="关闭阶段门禁(关门只调本命令;上下文交接由 --to-phase 内联完成,不要再单独调 harness_context.py close)",
3961
4041
  )
3962
4042
  p_close.add_argument("--phase", required=True)
3963
- p_close.add_argument("--change", default=None)
4043
+ p_close.add_argument("--change", "--change-dir", dest="change", default=None)
3964
4044
  p_close.add_argument(
3965
4045
  "--project",
3966
4046
  default=None,
@@ -3985,7 +4065,7 @@ def build_parser() -> argparse.ArgumentParser:
3985
4065
 
3986
4066
  p_classify = sub.add_parser("classify", parents=[shared])
3987
4067
  p_classify.add_argument("--project", default=None, type=Path, help=_PROJECT_ROOT_HELP)
3988
- p_classify.add_argument("--change", default=None)
4068
+ p_classify.add_argument("--change", "--change-dir", dest="change", default=None)
3989
4069
  p_classify.add_argument("--stage", required=True, choices=["plan", "post-run"])
3990
4070
  p_classify.add_argument(
3991
4071
  "--tier-override",
@@ -3993,13 +4073,18 @@ def build_parser() -> argparse.ArgumentParser:
3993
4073
  choices=["fast", "standard", "full"],
3994
4074
  )
3995
4075
  p_classify.add_argument("--override-by", default="user")
4076
+ p_classify.add_argument(
4077
+ "--force",
4078
+ action="store_true",
4079
+ help="已发布 change 也强制重写 gate-policy.json 工作副本",
4080
+ )
3996
4081
  p_classify.set_defaults(func=cmd_classify)
3997
4082
 
3998
4083
  p_checkpoint = sub.add_parser("checkpoint", parents=[shared])
3999
4084
  p_checkpoint.add_argument("--project", default=None, type=Path, help=_PROJECT_ROOT_HELP)
4000
4085
  p_checkpoint.add_argument("checkpoint_action", choices=["status", "approve"])
4001
4086
  p_checkpoint.add_argument("--id", required=True)
4002
- p_checkpoint.add_argument("--change", default=None)
4087
+ p_checkpoint.add_argument("--change", "--change-dir", dest="change", default=None)
4003
4088
  p_checkpoint.add_argument("--reviewer", default=None)
4004
4089
  p_checkpoint.set_defaults(func=cmd_checkpoint)
4005
4090