@hunter-harness/workflow-harness 0.2.16 → 0.2.18

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 (282) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/CONTEXT.md +14 -1
  3. package/harness/bundles/general/claude-code/README.md +1 -1
  4. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +7 -4
  5. package/harness/bundles/general/claude-code/harness-archive/reference.md +1 -1
  6. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +4 -2
  7. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +4 -2
  8. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +4 -2
  9. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +8 -4
  10. package/harness/bundles/general/claude-code/harness-plan/checklist.md +5 -5
  11. package/harness/bundles/general/claude-code/harness-plan/reference.md +5 -5
  12. package/harness/bundles/general/claude-code/harness-review/SKILL.md +5 -2
  13. package/harness/bundles/general/claude-code/harness-review/checklist.md +1 -1
  14. package/harness/bundles/general/claude-code/harness-run/SKILL.md +7 -3
  15. package/harness/bundles/general/claude-code/harness-run/checklist.md +5 -5
  16. package/harness/bundles/general/claude-code/harness-run/reference.md +1 -1
  17. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +6 -3
  18. package/harness/bundles/general/claude-code/harness-submit/checklist.md +11 -11
  19. package/harness/bundles/general/claude-code/harness-submit/reference.md +3 -3
  20. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +4 -2
  21. package/harness/bundles/general/claude-code/harness-sync/reference.md +1 -1
  22. package/harness/bundles/general/claude-code/harness-test/SKILL.md +7 -4
  23. package/harness/bundles/general/claude-code/harness-test/checklist.md +8 -5
  24. package/harness/bundles/general/claude-code/harness-test/pitfalls.md +1 -1
  25. package/harness/bundles/general/claude-code/harness-test/reference.md +28 -13
  26. package/harness/bundles/general/claude-code/protocols/submit-protocol.md +1 -1
  27. package/harness/bundles/general/claude-code/scripts/harness_deploy.py +7 -0
  28. package/harness/bundles/general/claude-code/scripts/harness_integration.py +26 -2
  29. package/harness/bundles/general/claude-code/scripts/harness_plan_finalize.py +159 -7
  30. package/harness/bundles/general/claude-code/scripts/harness_profile.py +1 -0
  31. package/harness/bundles/general/claude-code/scripts/harness_runtime.py +4 -4
  32. package/harness/bundles/general/claude-code/scripts/harness_service.py +1 -0
  33. package/harness/bundles/general/claude-code/scripts/harness_test_cleanup.py +175 -0
  34. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  35. package/harness/bundles/general/codebuddy/CONTEXT.md +14 -1
  36. package/harness/bundles/general/codebuddy/README.md +1 -1
  37. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +7 -4
  38. package/harness/bundles/general/codebuddy/harness-archive/reference.md +1 -1
  39. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +4 -2
  40. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +4 -2
  41. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +4 -2
  42. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +8 -4
  43. package/harness/bundles/general/codebuddy/harness-plan/checklist.md +5 -5
  44. package/harness/bundles/general/codebuddy/harness-plan/reference.md +5 -5
  45. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +5 -2
  46. package/harness/bundles/general/codebuddy/harness-review/checklist.md +1 -1
  47. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +7 -3
  48. package/harness/bundles/general/codebuddy/harness-run/checklist.md +5 -5
  49. package/harness/bundles/general/codebuddy/harness-run/reference.md +1 -1
  50. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +6 -3
  51. package/harness/bundles/general/codebuddy/harness-submit/checklist.md +11 -11
  52. package/harness/bundles/general/codebuddy/harness-submit/reference.md +3 -3
  53. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +4 -2
  54. package/harness/bundles/general/codebuddy/harness-sync/reference.md +1 -1
  55. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +7 -4
  56. package/harness/bundles/general/codebuddy/harness-test/checklist.md +8 -5
  57. package/harness/bundles/general/codebuddy/harness-test/pitfalls.md +1 -1
  58. package/harness/bundles/general/codebuddy/harness-test/reference.md +28 -13
  59. package/harness/bundles/general/codebuddy/protocols/submit-protocol.md +1 -1
  60. package/harness/bundles/general/codebuddy/scripts/harness_deploy.py +7 -0
  61. package/harness/bundles/general/codebuddy/scripts/harness_integration.py +26 -2
  62. package/harness/bundles/general/codebuddy/scripts/harness_plan_finalize.py +159 -7
  63. package/harness/bundles/general/codebuddy/scripts/harness_profile.py +1 -0
  64. package/harness/bundles/general/codebuddy/scripts/harness_runtime.py +4 -4
  65. package/harness/bundles/general/codebuddy/scripts/harness_service.py +1 -0
  66. package/harness/bundles/general/codebuddy/scripts/harness_test_cleanup.py +175 -0
  67. package/harness/bundles/general/codex/.harness-build.json +1 -1
  68. package/harness/bundles/general/codex/CONTEXT.md +14 -1
  69. package/harness/bundles/general/codex/README.md +1 -1
  70. package/harness/bundles/general/codex/harness-archive/SKILL.md +7 -4
  71. package/harness/bundles/general/codex/harness-archive/reference.md +1 -1
  72. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +4 -2
  73. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +4 -2
  74. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +4 -2
  75. package/harness/bundles/general/codex/harness-plan/SKILL.md +8 -4
  76. package/harness/bundles/general/codex/harness-plan/checklist.md +5 -5
  77. package/harness/bundles/general/codex/harness-plan/reference.md +5 -5
  78. package/harness/bundles/general/codex/harness-review/SKILL.md +5 -2
  79. package/harness/bundles/general/codex/harness-review/checklist.md +1 -1
  80. package/harness/bundles/general/codex/harness-run/SKILL.md +7 -3
  81. package/harness/bundles/general/codex/harness-run/checklist.md +5 -5
  82. package/harness/bundles/general/codex/harness-run/reference.md +1 -1
  83. package/harness/bundles/general/codex/harness-submit/SKILL.md +6 -3
  84. package/harness/bundles/general/codex/harness-submit/checklist.md +11 -11
  85. package/harness/bundles/general/codex/harness-submit/reference.md +3 -3
  86. package/harness/bundles/general/codex/harness-sync/SKILL.md +4 -2
  87. package/harness/bundles/general/codex/harness-sync/reference.md +1 -1
  88. package/harness/bundles/general/codex/harness-test/SKILL.md +7 -4
  89. package/harness/bundles/general/codex/harness-test/checklist.md +8 -5
  90. package/harness/bundles/general/codex/harness-test/pitfalls.md +1 -1
  91. package/harness/bundles/general/codex/harness-test/reference.md +28 -13
  92. package/harness/bundles/general/codex/protocols/submit-protocol.md +1 -1
  93. package/harness/bundles/general/codex/scripts/harness_deploy.py +7 -0
  94. package/harness/bundles/general/codex/scripts/harness_integration.py +26 -2
  95. package/harness/bundles/general/codex/scripts/harness_plan_finalize.py +159 -7
  96. package/harness/bundles/general/codex/scripts/harness_profile.py +1 -0
  97. package/harness/bundles/general/codex/scripts/harness_runtime.py +4 -4
  98. package/harness/bundles/general/codex/scripts/harness_service.py +1 -0
  99. package/harness/bundles/general/codex/scripts/harness_test_cleanup.py +175 -0
  100. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  101. package/harness/bundles/general/cursor/CONTEXT.md +14 -1
  102. package/harness/bundles/general/cursor/README.md +1 -1
  103. package/harness/bundles/general/cursor/harness-archive/SKILL.md +7 -4
  104. package/harness/bundles/general/cursor/harness-archive/reference.md +1 -1
  105. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +4 -2
  106. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +4 -2
  107. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +4 -2
  108. package/harness/bundles/general/cursor/harness-plan/SKILL.md +8 -4
  109. package/harness/bundles/general/cursor/harness-plan/checklist.md +5 -5
  110. package/harness/bundles/general/cursor/harness-plan/reference.md +5 -5
  111. package/harness/bundles/general/cursor/harness-review/SKILL.md +5 -2
  112. package/harness/bundles/general/cursor/harness-review/checklist.md +1 -1
  113. package/harness/bundles/general/cursor/harness-run/SKILL.md +7 -3
  114. package/harness/bundles/general/cursor/harness-run/checklist.md +5 -5
  115. package/harness/bundles/general/cursor/harness-run/reference.md +1 -1
  116. package/harness/bundles/general/cursor/harness-submit/SKILL.md +6 -3
  117. package/harness/bundles/general/cursor/harness-submit/checklist.md +11 -11
  118. package/harness/bundles/general/cursor/harness-submit/reference.md +3 -3
  119. package/harness/bundles/general/cursor/harness-sync/SKILL.md +4 -2
  120. package/harness/bundles/general/cursor/harness-sync/reference.md +1 -1
  121. package/harness/bundles/general/cursor/harness-test/SKILL.md +7 -4
  122. package/harness/bundles/general/cursor/harness-test/checklist.md +8 -5
  123. package/harness/bundles/general/cursor/harness-test/pitfalls.md +1 -1
  124. package/harness/bundles/general/cursor/harness-test/reference.md +28 -13
  125. package/harness/bundles/general/cursor/protocols/submit-protocol.md +1 -1
  126. package/harness/bundles/general/cursor/scripts/harness_deploy.py +7 -0
  127. package/harness/bundles/general/cursor/scripts/harness_integration.py +26 -2
  128. package/harness/bundles/general/cursor/scripts/harness_plan_finalize.py +159 -7
  129. package/harness/bundles/general/cursor/scripts/harness_profile.py +1 -0
  130. package/harness/bundles/general/cursor/scripts/harness_runtime.py +4 -4
  131. package/harness/bundles/general/cursor/scripts/harness_service.py +1 -0
  132. package/harness/bundles/general/cursor/scripts/harness_test_cleanup.py +175 -0
  133. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  134. package/harness/bundles/java/claude-code/CONTEXT.md +14 -1
  135. package/harness/bundles/java/claude-code/README.md +1 -1
  136. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +5 -2
  137. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +7 -4
  138. package/harness/bundles/java/claude-code/harness-archive/reference.md +1 -1
  139. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +4 -2
  140. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +4 -2
  141. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +4 -2
  142. package/harness/bundles/java/claude-code/harness-package/SKILL.md +5 -2
  143. package/harness/bundles/java/claude-code/harness-package/checklist.md +5 -5
  144. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +8 -4
  145. package/harness/bundles/java/claude-code/harness-plan/checklist.md +5 -5
  146. package/harness/bundles/java/claude-code/harness-plan/reference.md +5 -5
  147. package/harness/bundles/java/claude-code/harness-review/SKILL.md +5 -2
  148. package/harness/bundles/java/claude-code/harness-review/checklist.md +1 -1
  149. package/harness/bundles/java/claude-code/harness-run/SKILL.md +7 -3
  150. package/harness/bundles/java/claude-code/harness-run/checklist.md +6 -6
  151. package/harness/bundles/java/claude-code/harness-run/reference.md +352 -352
  152. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +6 -3
  153. package/harness/bundles/java/claude-code/harness-submit/checklist.md +11 -11
  154. package/harness/bundles/java/claude-code/harness-submit/reference.md +3 -3
  155. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +4 -2
  156. package/harness/bundles/java/claude-code/harness-sync/reference.md +1 -1
  157. package/harness/bundles/java/claude-code/harness-test/SKILL.md +8 -5
  158. package/harness/bundles/java/claude-code/harness-test/pitfalls.md +1 -1
  159. package/harness/bundles/java/claude-code/harness-test/reference.md +1 -1
  160. package/harness/bundles/java/claude-code/protocols/submit-protocol.md +1 -1
  161. package/harness/bundles/java/claude-code/scripts/harness_deploy.py +7 -0
  162. package/harness/bundles/java/claude-code/scripts/harness_integration.py +26 -2
  163. package/harness/bundles/java/claude-code/scripts/harness_plan_finalize.py +159 -7
  164. package/harness/bundles/java/claude-code/scripts/harness_profile.py +1 -0
  165. package/harness/bundles/java/claude-code/scripts/harness_runtime.py +4 -4
  166. package/harness/bundles/java/claude-code/scripts/harness_service.py +1 -0
  167. package/harness/bundles/java/claude-code/scripts/harness_test_cleanup.py +175 -0
  168. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  169. package/harness/bundles/java/codebuddy/CONTEXT.md +14 -1
  170. package/harness/bundles/java/codebuddy/README.md +1 -1
  171. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +5 -2
  172. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +7 -4
  173. package/harness/bundles/java/codebuddy/harness-archive/reference.md +1 -1
  174. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +4 -2
  175. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +4 -2
  176. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +4 -2
  177. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +5 -2
  178. package/harness/bundles/java/codebuddy/harness-package/checklist.md +5 -5
  179. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +8 -4
  180. package/harness/bundles/java/codebuddy/harness-plan/checklist.md +5 -5
  181. package/harness/bundles/java/codebuddy/harness-plan/reference.md +5 -5
  182. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +5 -2
  183. package/harness/bundles/java/codebuddy/harness-review/checklist.md +1 -1
  184. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +7 -3
  185. package/harness/bundles/java/codebuddy/harness-run/checklist.md +6 -6
  186. package/harness/bundles/java/codebuddy/harness-run/reference.md +352 -352
  187. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +6 -3
  188. package/harness/bundles/java/codebuddy/harness-submit/checklist.md +11 -11
  189. package/harness/bundles/java/codebuddy/harness-submit/reference.md +3 -3
  190. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +4 -2
  191. package/harness/bundles/java/codebuddy/harness-sync/reference.md +1 -1
  192. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +8 -5
  193. package/harness/bundles/java/codebuddy/harness-test/pitfalls.md +1 -1
  194. package/harness/bundles/java/codebuddy/harness-test/reference.md +1 -1
  195. package/harness/bundles/java/codebuddy/protocols/submit-protocol.md +1 -1
  196. package/harness/bundles/java/codebuddy/scripts/harness_deploy.py +7 -0
  197. package/harness/bundles/java/codebuddy/scripts/harness_integration.py +26 -2
  198. package/harness/bundles/java/codebuddy/scripts/harness_plan_finalize.py +159 -7
  199. package/harness/bundles/java/codebuddy/scripts/harness_profile.py +1 -0
  200. package/harness/bundles/java/codebuddy/scripts/harness_runtime.py +4 -4
  201. package/harness/bundles/java/codebuddy/scripts/harness_service.py +1 -0
  202. package/harness/bundles/java/codebuddy/scripts/harness_test_cleanup.py +175 -0
  203. package/harness/bundles/java/codex/.harness-build.json +1 -1
  204. package/harness/bundles/java/codex/CONTEXT.md +14 -1
  205. package/harness/bundles/java/codex/README.md +1 -1
  206. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +5 -2
  207. package/harness/bundles/java/codex/harness-archive/SKILL.md +7 -4
  208. package/harness/bundles/java/codex/harness-archive/reference.md +1 -1
  209. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +4 -2
  210. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +4 -2
  211. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +4 -2
  212. package/harness/bundles/java/codex/harness-package/SKILL.md +5 -2
  213. package/harness/bundles/java/codex/harness-package/checklist.md +5 -5
  214. package/harness/bundles/java/codex/harness-plan/SKILL.md +8 -4
  215. package/harness/bundles/java/codex/harness-plan/checklist.md +5 -5
  216. package/harness/bundles/java/codex/harness-plan/reference.md +5 -5
  217. package/harness/bundles/java/codex/harness-review/SKILL.md +5 -2
  218. package/harness/bundles/java/codex/harness-review/checklist.md +1 -1
  219. package/harness/bundles/java/codex/harness-run/SKILL.md +7 -3
  220. package/harness/bundles/java/codex/harness-run/checklist.md +6 -6
  221. package/harness/bundles/java/codex/harness-run/reference.md +352 -352
  222. package/harness/bundles/java/codex/harness-submit/SKILL.md +6 -3
  223. package/harness/bundles/java/codex/harness-submit/checklist.md +11 -11
  224. package/harness/bundles/java/codex/harness-submit/reference.md +3 -3
  225. package/harness/bundles/java/codex/harness-sync/SKILL.md +4 -2
  226. package/harness/bundles/java/codex/harness-sync/reference.md +1 -1
  227. package/harness/bundles/java/codex/harness-test/SKILL.md +8 -5
  228. package/harness/bundles/java/codex/harness-test/pitfalls.md +1 -1
  229. package/harness/bundles/java/codex/harness-test/reference.md +1 -1
  230. package/harness/bundles/java/codex/protocols/submit-protocol.md +1 -1
  231. package/harness/bundles/java/codex/scripts/harness_deploy.py +7 -0
  232. package/harness/bundles/java/codex/scripts/harness_integration.py +26 -2
  233. package/harness/bundles/java/codex/scripts/harness_plan_finalize.py +159 -7
  234. package/harness/bundles/java/codex/scripts/harness_profile.py +1 -0
  235. package/harness/bundles/java/codex/scripts/harness_runtime.py +4 -4
  236. package/harness/bundles/java/codex/scripts/harness_service.py +1 -0
  237. package/harness/bundles/java/codex/scripts/harness_test_cleanup.py +175 -0
  238. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  239. package/harness/bundles/java/cursor/CONTEXT.md +14 -1
  240. package/harness/bundles/java/cursor/README.md +1 -1
  241. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +5 -2
  242. package/harness/bundles/java/cursor/harness-archive/SKILL.md +7 -4
  243. package/harness/bundles/java/cursor/harness-archive/reference.md +1 -1
  244. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +4 -2
  245. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +4 -2
  246. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +4 -2
  247. package/harness/bundles/java/cursor/harness-package/SKILL.md +5 -2
  248. package/harness/bundles/java/cursor/harness-package/checklist.md +5 -5
  249. package/harness/bundles/java/cursor/harness-plan/SKILL.md +8 -4
  250. package/harness/bundles/java/cursor/harness-plan/checklist.md +5 -5
  251. package/harness/bundles/java/cursor/harness-plan/reference.md +5 -5
  252. package/harness/bundles/java/cursor/harness-review/SKILL.md +5 -2
  253. package/harness/bundles/java/cursor/harness-review/checklist.md +1 -1
  254. package/harness/bundles/java/cursor/harness-run/SKILL.md +7 -3
  255. package/harness/bundles/java/cursor/harness-run/checklist.md +6 -6
  256. package/harness/bundles/java/cursor/harness-run/reference.md +352 -352
  257. package/harness/bundles/java/cursor/harness-submit/SKILL.md +6 -3
  258. package/harness/bundles/java/cursor/harness-submit/checklist.md +11 -11
  259. package/harness/bundles/java/cursor/harness-submit/reference.md +3 -3
  260. package/harness/bundles/java/cursor/harness-sync/SKILL.md +4 -2
  261. package/harness/bundles/java/cursor/harness-sync/reference.md +1 -1
  262. package/harness/bundles/java/cursor/harness-test/SKILL.md +8 -5
  263. package/harness/bundles/java/cursor/harness-test/pitfalls.md +1 -1
  264. package/harness/bundles/java/cursor/harness-test/reference.md +1 -1
  265. package/harness/bundles/java/cursor/protocols/submit-protocol.md +1 -1
  266. package/harness/bundles/java/cursor/scripts/harness_deploy.py +7 -0
  267. package/harness/bundles/java/cursor/scripts/harness_integration.py +26 -2
  268. package/harness/bundles/java/cursor/scripts/harness_plan_finalize.py +159 -7
  269. package/harness/bundles/java/cursor/scripts/harness_profile.py +1 -0
  270. package/harness/bundles/java/cursor/scripts/harness_runtime.py +4 -4
  271. package/harness/bundles/java/cursor/scripts/harness_service.py +1 -0
  272. package/harness/bundles/java/cursor/scripts/harness_test_cleanup.py +175 -0
  273. package/harness/manifests/general/claude-code.json +37 -33
  274. package/harness/manifests/general/codebuddy.json +37 -33
  275. package/harness/manifests/general/codex.json +37 -33
  276. package/harness/manifests/general/cursor.json +37 -33
  277. package/harness/manifests/java/claude-code.json +39 -35
  278. package/harness/manifests/java/codebuddy.json +39 -35
  279. package/harness/manifests/java/codex.json +39 -35
  280. package/harness/manifests/java/cursor.json +39 -35
  281. package/hunter-workflow-family.json +2 -2
  282. package/package.json +1 -1
@@ -3,7 +3,7 @@ name: harness-submit
3
3
  description: 最终提交封装:验证→中文 commit→提交/推送;worktree 模式含 --no-ff
4
4
  合并回主分支。使用场景:提交代码、commit、push、合并分支、merge to main、完成开发
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=822ced2e1d949aed; overlay=java; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=6e87bc67bd51cbe9; overlay=java; agent=codebuddy; do not edit -->
7
7
  # harness-submit — 最终提交(含 worktree 合并)
8
8
 
9
9
  ## Purpose
@@ -43,6 +43,7 @@ description: 最终提交封装:验证→中文 commit→提交/推送;workt
43
43
  9. **每个 skill 边界只刷新一次状态快照** — 先运行 `python <skills-root>/scripts/harness_state.py capture --project . --change-dir ".harness/changes/<change-name>" --base <baseCommit> --json`;`changedSegments=[]` 时复用已有 profile/rules/map/knowledge/change/code 指纹,不再重复跑全量 `harness-sync`、知识重建或代码库扫描。只有对应 segment 变化或缺失时才定向刷新;快照不能替代源码读取和验证门禁。
44
44
 
45
45
  状态目录分层:新路径优先,旧路径兼容 → [[../protocols/state-layout-protocol.md|state-layout-protocol]]
46
+ > 片段:read-protocol
46
47
 
47
48
  ## 状态目录分层
48
49
 
@@ -60,7 +61,7 @@ worktree 合并前必须运行 `harness_change.py integration-lock acquire --run
60
61
  1. **合并最新代码** — 主目录与 worktree 均**不在业务工作区 stash/pull**;远端同步由合并段 integration transaction 在隔离 integration worktree 内完成(见「worktree 合并流程」);**正常路径禁止 `git stash` / `stash pop`**
61
62
  2. **最终验证** — ledger 复用优先;**提交前最终门禁只调 `can-reuse`**(删除与 coverage 冲突的二次全量门禁):`harness_ledger.py can-reuse --verification unitTestFull --scope module --project . --profile-input unitTestFull --command <resolved commands.unitTestFull.command>`。`--command` **按 profile key resolve**:读 `build-profile.json` 的 `commands.unitTestFull.command`(v2),或 `harness_profile.py resolve --project . --key unitTestFull --json` 取 resolved command,**不复制示例模块名**(文档示例只展示 key)。`--profile-input unitTestFull` 从 `verificationInputs.unitTestFull`(v2 由 `commands.unitTestFull.inputs` 派生)展开依赖闭包,**禁止用仅含 staged 文件的 `--files` 快捷方式**冒充全量闭包。`reuse=true` → 不再执行二次全量测试;仅 `reuse=false` 时执行**同一 resolved verification**(profile `unitTestFull` 命令),成功后用同一文件集、command、`scope=module` 经 **`harness_ledger.py record`** 写回 ledger `unitTestFull` 项。增量 `unitTest` 永远不能冒充 `unitTestFull` 门禁。
62
63
  3. **.gitignore + 精确暂存** ⚠️ — 检查 `.harness/` 在 `.gitignore`;**禁止 `git add -A`**。若存在 `evidence/test-tracking.json`,先执行 `python <skills-root>/scripts/harness_test_guard.py stage --project . --change-dir ".harness/changes/<change-name>" --json`;失败即硬停止。无 manifest 时不使用 `-f`。manifest 之外的文件按精确业务路径正常暂存,**禁止全局 force-add**。
63
- 4. **提交方式** — 主目录:AskUserQuestion 三选项(commit+push / 仅本地 / 取消);**worktree:固定仅本地 commit**
64
+ 4. **提交方式** — 主目录:blocking user confirmation 三选项(commit+push / 仅本地 / 取消);**worktree:固定仅本地 commit**
64
65
  5. **commit-message.txt** ⚠️ — 展示 staged、diff stat、完整中文 message;用户确认
65
66
  6. **commit / push** — `git commit -F`;主目录按选项 push(push 前 fetch 检查远端);**worktree:只 commit,记录 local hash**
66
67
  7. **收尾** — **`harness_gate.py close --phase submit --status ...`**;主目录:可选 worktree 清理 + 提示 `/harness-archive`;**worktree:接续下方合并流程**
@@ -96,6 +97,7 @@ M7. **ledger + 收尾** — 经 `harness_ledger.py record` 写入 `mergeFinalHas
96
97
  - 命令结果不得靠猜测;普通 Bash 被拒 → 立即改用等价 PowerShell 重试一次
97
98
  - 仅 PowerShell 成功且有明确证据(构建/git/测试输出、文件存在、exit 0)时可标 ✅OK;否则 ❌FAIL 或 🟡WARN
98
99
  - 禁止把 hook 拒绝、静态验证、无输出、用户跳过说成成功 → 详见 [[../protocols/powershell-protocol.md|powershell-protocol]]、[[../protocols/evidence-based-reporting-protocol.md|evidence-based-reporting-protocol]]
100
+ > 片段:p0-trust
99
101
 
100
102
  ## 关键规则(硬门禁速查)
101
103
 
@@ -141,7 +143,7 @@ git 经 PowerShell;commit/报告不得含明文密钥。遵循 `../protocols/s
141
143
 
142
144
  ## 交互白名单
143
145
 
144
- 本 skill **仅允许**以下 AskUserQuestion;其余默认值 + `decision` 事件:
146
+ 本 skill **仅允许**以下 blocking user confirmation;其余默认值 + `decision` 事件:
145
147
 
146
148
  1. **提交方式 + commit message**(主目录一次确认);worktree 固定仅本地 commit,仅确认 message
147
149
  2. **远程有新提交**(push 前):重新验证 / 停止 push
@@ -159,3 +161,4 @@ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/cha
159
161
  > **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 边界保持最新。
160
162
 
161
163
  每次阶段结束必须写 `--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` 环境变量统一注入。
164
+ > 片段:logging · phase=`submit`/`merge`
@@ -12,7 +12,7 @@ description: harness-submit 的8 步工作流详细步骤和执行日志记录
12
12
  - commit message 必须写入 `.harness/changes/<change>/runtime/commit-message.txt`。
13
13
  - 使用 `git commit -F`,禁止先英文 commit 再 amend。
14
14
  - commit message 禁止 `Co-Authored-By`、`Generated by`、`AI generated`。
15
- - AskUserQuestion 参数错误时不得自行绕过,必须改用固定模板重问。
15
+ - blocking user confirmation 参数错误时不得自行绕过,必须改用固定模板重问。
16
16
  - staged diff 是唯一提交依据。
17
17
 
18
18
 
@@ -130,7 +130,7 @@ powershell.exe -Command "Select-String -Path '<项目路径>\.gitignore' -Patter
130
130
 
131
131
  如果未包含:
132
132
  - **必须提醒用户**:`⚠️ .gitignore 未包含 .harness/,会导致 .harness/ 下文件被提交(含日志、报告、可能含敏感信息)`
133
- - **默认不提交 .harness/ 下文件**:使用 AskUserQuestion 询问用户是否:
133
+ - **默认不提交 .harness/ 下文件**:使用 blocking user confirmation 询问用户是否:
134
134
  1. 添加 .harness/ 到 .gitignore(推荐)
135
135
  2. 仅 stage 业务代码文件,不提交 .harness/
136
136
  3. 取消提交
@@ -146,7 +146,7 @@ powershell.exe -Command "git -C '<项目路径>' status --porcelain | Select-Str
146
146
 
147
147
  **worktree 模式(requested=true)**:固定为「仅本地 commit」,不展示「commit+push」选项;commit 完成后继续下方「worktree 合并流程」,跳过下方三选项询问。
148
148
 
149
- `harness-submit` 不调用 Superpowers 呈现合并选项。只允许使用固定 AskUserQuestion 模板:
149
+ `harness-submit` 不调用 Superpowers 呈现合并选项。只允许使用固定 blocking user confirmation 模板:
150
150
 
151
151
  ```text
152
152
  本次变更已完成验证,请选择提交方式:
@@ -156,7 +156,7 @@ powershell.exe -Command "git -C '<项目路径>' status --porcelain | Select-Str
156
156
  3. 取消提交
157
157
  ```
158
158
 
159
- 禁止在此步骤引入“创建 PR”“丢弃所有变更”“直接合并到主分支”等旧选项,避免 AskUserQuestion 参数错误和流程歧义。
159
+ 禁止在此步骤引入"创建 PR""丢弃所有变更""直接合并到主分支"等旧选项,避免 blocking user confirmation 参数错误和流程歧义。
160
160
 
161
161
  ## 步骤 5:展示提交摘要 + 确认 ⚠️ 强制阻断
162
162
 
@@ -256,7 +256,7 @@ powershell.exe -Command "git -C '<项目路径>' log HEAD..@{u} --oneline"
256
256
  - **不得直接 pull 后 push**
257
257
  - 必须 pull/rebase 后**重新构建/测试**(ledger 复用条件被破坏,须重跑并写回 ledger)
258
258
  - 验证通过后再 push
259
- - 使用 AskUserQuestion 询问用户:
259
+ - 使用 blocking user confirmation 询问用户:
260
260
  ```
261
261
  远程有新提交(N 个),需要 pull/rebase 后重新验证:
262
262
  1. 重新验证(pull/rebase + 构建 + 测试)
@@ -328,7 +328,7 @@ append `phase.start`(`--phase merge`;`note` 含 worktree 分支、主分支
328
328
  ### 步骤 M1:preflight
329
329
 
330
330
  ```powershell
331
- python harness/scripts/harness_integration.py preflight --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp>
331
+ python harness/scripts/harness_integration.py preflight --change <change-name> --run-id <run-id> --feature-branch harness/<change-name> --target-branch <主分支> --temp-root <task-temp>
332
332
  ```
333
333
 
334
334
  获取 integration lock、解析 base/feature head、写 journal 与保护 refs(`refs/harness/integration/<txn>/base|head`)。锁被其他 run 持有 → **停止**,不改动工作区与状态文件。
@@ -336,7 +336,7 @@ python harness/scripts/harness_integration.py preflight --change <change-name> -
336
336
  ### 步骤 M2:prepare
337
337
 
338
338
  ```powershell
339
- python harness/scripts/harness_integration.py prepare --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp>
339
+ python harness/scripts/harness_integration.py prepare --change <change-name> --run-id <run-id> --feature-branch harness/<change-name> --target-branch <主分支> --temp-root <task-temp>
340
340
  ```
341
341
 
342
342
  fetch 后从**已提交** target 创建临时 integration worktree;primary 的 staged/unstaged/untracked/ignored 与 mtime 均不被触碰。
@@ -344,7 +344,7 @@ fetch 后从**已提交** target 创建临时 integration worktree;primary 的
344
344
  ### 步骤 M3:merge
345
345
 
346
346
  ```powershell
347
- python harness/scripts/harness_integration.py merge --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp>
347
+ python harness/scripts/harness_integration.py merge --change <change-name> --run-id <run-id> --feature-branch harness/<change-name> --target-branch <主分支> --temp-root <task-temp>
348
348
  ```
349
349
 
350
350
  - 方式固定 `--no-ff`;merge diff 出现其他 Change 的 contract/runtime 路径 → 结构化 `FOREIGN_CHANGE_PATHS` 拒绝
@@ -356,7 +356,7 @@ python harness/scripts/harness_integration.py merge --change <change-name> --run
356
356
  在 integration worktree 内执行验证命令;远端引入他人提交或 ledger 不可复用时必跑:
357
357
 
358
358
  ```powershell
359
- python harness/scripts/harness_integration.py verify --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp> --command "<resolved command>"
359
+ python harness/scripts/harness_integration.py verify --change <change-name> --run-id <run-id> --feature-branch harness/<change-name> --target-branch <主分支> --temp-root <task-temp> --command "<resolved command>"
360
360
  ```
361
361
 
362
362
  任一命令非零退出 → step FAILED,不进入 push。
@@ -370,7 +370,7 @@ powershell.exe -Command "python harness/scripts/harness_check_gate.py --write"
370
370
  ### 步骤 M5:push
371
371
 
372
372
  ```powershell
373
- python harness/scripts/harness_integration.py push --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp>
373
+ python harness/scripts/harness_integration.py push --change <change-name> --run-id <run-id> --feature-branch harness/<change-name> --target-branch <主分支> --temp-root <task-temp>
374
374
  ```
375
375
 
376
376
  远端基线漂移 → `TARGET_MOVED` 结构化失败,不继续。成功后 journal `pushedHead` 即 `mergeFinalHash`。
@@ -378,7 +378,7 @@ python harness/scripts/harness_integration.py push --change <change-name> --run-
378
378
  ### 步骤 M6:cleanup
379
379
 
380
380
  ```powershell
381
- python harness/scripts/harness_integration.py cleanup --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp>
381
+ python harness/scripts/harness_integration.py cleanup --change <change-name> --run-id <run-id> --feature-branch harness/<change-name> --target-branch <主分支> --temp-root <task-temp>
382
382
  ```
383
383
 
384
384
  - `git worktree remove --force` 精确路径 → 验证注销 → 临时分支 `branch -D` → (push 成功后)删除保护 refs → 释放 integration lock
@@ -4,7 +4,7 @@ description: harness-submit 的提交格式、固定交互模板和中文 commit
4
4
 
5
5
  # harness-submit 参考
6
6
 
7
- ## 提交方式 AskUserQuestion 固定模板
7
+ ## 提交方式 blocking user confirmation 固定模板
8
8
 
9
9
  问题标题:`请选择提交方式`
10
10
 
@@ -14,7 +14,7 @@ description: harness-submit 的提交格式、固定交互模板和中文 commit
14
14
  2. `仅本地 commit,不 push`
15
15
  3. `取消提交`
16
16
 
17
- 不得临场增加复杂对象或嵌套参数,避免 AskUserQuestion 参数错误。
17
+ 不得临场增加复杂对象或嵌套参数,避免 blocking user confirmation 参数错误。
18
18
 
19
19
  > **worktree 模式(meta/worktree.json requested=true)**:固定选项 2「仅本地 commit」,不展示「commit+push」;commit 成功后 skill **自动接续** worktree 合并流程(`/harness-merge` 为别名)。push 只在主分支完成,产出 `mergeFinalHash`。
20
20
 
@@ -148,5 +148,5 @@ powershell.exe -NoProfile -Command "git -C '<项目路径>' log HEAD..@{u} --one
148
148
 
149
149
  - 步骤 1(合并最新代码):按无 upstream / 远端无新提交判定 N/A,在执行日志记录理由。
150
150
  - 步骤 5(commit-message.txt + `git commit -F`)N/A:无可暂存 diff,无新 commit 需生成。执行日志标注 `commit-message.txt / git commit -F: N/A(工作树 clean,无新 commit;N 个 wip 提交已存在,原样推送)`。
151
- - 步骤 4(提交方式选择):固定三选项仍适用。但当 review 标了 RED 兼容性破坏等需人工确认项时,可在"commit + push"选项的描述中注明"并确认 <RED 项>",**不得新增第四选项**、不得临场拼复杂 AskUserQuestion 参数。
151
+ - 步骤 4(提交方式选择):固定三选项仍适用。但当 review 标了 RED 兼容性破坏等需人工确认项时,可在"commit + push"选项的描述中注明"并确认 <RED 项>",**不得新增第四选项**、不得临场拼复杂 blocking user confirmation 参数。
152
152
  - push 仍按步骤 6:fetch 检查远端 → `git push -u`(无 upstream 则新建远端分支)→ 记录 pre-pull hash + final pushed hash。
@@ -2,7 +2,7 @@
2
2
  name: harness-sync
3
3
  description: 检查并更新项目AI元数据(CodeGraph索引、harness-codebase-map分析、CLAUDE.md、AGENTS.md、.harness/完整性),确保Claude对代码库的理解与最新代码一致。当用户说'同步/更新索引/刷新元数据/检查一致性'时使用
4
4
  ---
5
- <!-- generated by harness_deploy.py; core=822ced2e1d949aed; overlay=java; agent=codebuddy; do not edit -->
5
+ <!-- generated by harness_deploy.py; core=6e87bc67bd51cbe9; overlay=java; agent=codebuddy; do not edit -->
6
6
  # harness-sync — 元数据同步
7
7
 
8
8
  ## Purpose
@@ -38,7 +38,7 @@ python <skills-root>/scripts/harness_sync.py finalize --project . --run-id <run-
38
38
  | 3 | `.harness/codebase/map/` 是否过期 → 报告建议 `/harness-codebase-map` |
39
39
  | 3.5 | `harness_knowledge.py sync`;可 `sync --update`;失败不得假装可用。**知识闭环主入口**是 `/harness-knowledge-ingest auto`(含 Agent judge),sync 不重复列人工知识待办 |
40
40
  | 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) |
41
- | 4 | CLAUDE.md 完整性/行数 → 超限 AskUserQuestion 瘦身 |
41
+ | 4 | CLAUDE.md 完整性/行数 → 超限 blocking user confirmation 瘦身 |
42
42
  | 5 | AGENTS.md 与各 Agent 指令入口一致;Claude Code 启用时验证 CLAUDE.md 引用 AGENTS.md,禁止反向循环引用 |
43
43
  | 6 | `.harness/` 结构(init 规程 → `reference.md` 第 6 步);已装 skill 新鲜度只经 `hunter-harness refresh --dry-run --json` 的 post-adaptation freshness 判断,禁止 raw build 字节比较 |
44
44
  | 7–9 | `项目规则(见 .harness/context-index.json)/`、构建配置、测试目录 — **只提示不自动修复** |
@@ -50,6 +50,7 @@ python <skills-root>/scripts/harness_sync.py finalize --project . --run-id <run-
50
50
  - 命令结果不得靠猜测;普通 Bash 被拒 → 立即改用等价 PowerShell 重试一次
51
51
  - 仅 PowerShell 成功且有明确证据(构建/git/测试输出、文件存在、exit 0)时可标 ✅OK;否则 ❌FAIL 或 🟡WARN
52
52
  - 禁止把 hook 拒绝、静态验证、无输出、用户跳过说成成功 → 详见 [[../protocols/powershell-protocol.md|powershell-protocol]]、[[../protocols/evidence-based-reporting-protocol.md|evidence-based-reporting-protocol]]
53
+ > 片段:p0-trust
53
54
 
54
55
  ## 关键规则
55
56
 
@@ -80,3 +81,4 @@ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/cha
80
81
  > **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 边界保持最新。
81
82
 
82
83
  每次阶段结束必须写 `--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` 环境变量统一注入。
84
+ > 片段:logging · phase=`sync`;有未归档变更时写入其 change-dir events
@@ -58,7 +58,7 @@ powershell.exe -Command "git -C '<项目路径>' diff --stat HEAD~5 2>$null"
58
58
 
59
59
  **瘦身策略**:如果超过 200 行,不是简单截断——而是把可独立成篇的细节(如完整编码规范、详细架构图)迁移到 `项目规则(见 .harness/context-index.json)/` 下,CLAUDE.md 保留简洁的索引和关键命令。
60
60
 
61
- > ⚠️ CLAUDE.md 需要瘦身时,必须用 AskUserQuestion 与用户确认拆分方案后再执行。
61
+ > ⚠️ CLAUDE.md 需要瘦身时,必须用 blocking user confirmation 与用户确认拆分方案后再执行。
62
62
 
63
63
  ### 5. AGENTS.md 一致性
64
64
 
@@ -2,7 +2,7 @@
2
2
  name: harness-test
3
3
  description: 测试执行:读取场景表,执行单元测试+API接口测试+数据兼容验证,输出测试报告。当用户说'跑测试/验证/跑用例/接口测试/单元测试'时使用
4
4
  ---
5
- <!-- generated by harness_deploy.py; core=822ced2e1d949aed; overlay=java; agent=codebuddy; do not edit -->
5
+ <!-- generated by harness_deploy.py; core=6e87bc67bd51cbe9; overlay=java; agent=codebuddy; do not edit -->
6
6
  # harness-test — 测试执行
7
7
 
8
8
  ## Purpose
@@ -39,6 +39,7 @@ description: 测试执行:读取场景表,执行单元测试+API接口测试
39
39
  9. **每个 skill 边界只刷新一次状态快照** — 先运行 `python <skills-root>/scripts/harness_state.py capture --project . --change-dir ".harness/changes/<change-name>" --base <baseCommit> --json`;`changedSegments=[]` 时复用已有 profile/rules/map/knowledge/change/code 指纹,不再重复跑全量 `harness-sync`、知识重建或代码库扫描。只有对应 segment 变化或缺失时才定向刷新;快照不能替代源码读取和验证门禁。
40
40
 
41
41
  状态目录分层:新路径优先,旧路径兼容 → [[../protocols/state-layout-protocol.md|state-layout-protocol]]
42
+ > 片段:read-protocol
42
43
 
43
44
  ## Workflow
44
45
 
@@ -95,12 +96,13 @@ description: 测试执行:读取场景表,执行单元测试+API接口测试
95
96
  - **runtime overlay**:`-Dspring.config.additional-location=file:<ascii-abs-path>/application-harness-test.yml`;禁止默认 Edit tracked `application*.yml`
96
97
  - **known-good-test-profile**:profile 名、baseURL、healthUrl 写在 build-profile,非 skill 硬编码
97
98
  - **多租户请求头**:header 名/值来自 build-profile 的 `httpHeaders` 配置
98
- - **Service Gate**:`harness_service.py ensure` 返回 `needs-user-decision`(用户进程占端口)时**才** AskUserQuestion
99
+ - **Service Gate**:`harness_service.py ensure` 返回 `needs-user-decision`(用户进程占端口)时**才** blocking user confirmation
99
100
  ## P0 执行可信度规则
100
101
 
101
102
  - 命令结果不得靠猜测;普通 Bash 被拒 → 立即改用等价 PowerShell 重试一次
102
103
  - 仅 PowerShell 成功且有明确证据(构建/git/测试输出、文件存在、exit 0)时可标 ✅OK;否则 ❌FAIL 或 🟡WARN
103
104
  - 禁止把 hook 拒绝、静态验证、无输出、用户跳过说成成功 → 详见 [[../protocols/powershell-protocol.md|powershell-protocol]]、[[../protocols/evidence-based-reporting-protocol.md|evidence-based-reporting-protocol]]
105
+ > 片段:p0-trust
104
106
 
105
107
  ## 关键规则(硬门禁速查)
106
108
 
@@ -140,11 +142,11 @@ python <skills-root>/scripts/harness_test_guard.py record --project . --change-d
140
142
 
141
143
  ### 六、服务启动 + 生命周期管理
142
144
 
143
- 启动等待状态机:0–30s 每 2s 探测、30–120s 每 5s 探测、>120s 读日志判定;遇启动失败特征立即停。**Service Gate**:`harness_service.py ensure` 返回 `action=needs-user-decision`(用户自启服务占端口)时 **才** AskUserQuestion;AI 托管服务或端口空闲则自动继续,不询问。服务指纹(`moduleInputsHash`,来自 CLI `--files` ∪ `serviceStart.inputFiles`)+ `startCommandHash` + `profile` + `overlayPath` + 进程身份任一变化即 restart;**空输入被拒绝**,不生成可复用空指纹。测试结束默认清理 AI 启动的服务。详见 `reference.md`「服务决策门」。
145
+ 启动等待状态机:0–30s 每 2s 探测、30–120s 每 5s 探测、>120s 读日志判定;遇启动失败特征立即停。**Service Gate**:`harness_service.py ensure` 返回 `action=needs-user-decision`(用户自启服务占端口)时 **才** blocking user confirmation;AI 托管服务或端口空闲则自动继续,不询问。服务指纹(`moduleInputsHash`,来自 CLI `--files` ∪ `serviceStart.inputFiles`)+ `startCommandHash` + `profile` + `overlayPath` + 进程身份任一变化即 restart;**空输入被拒绝**,不生成可复用空指纹。测试结束默认清理 AI 启动的服务。详见 `reference.md`「服务决策门」。
144
146
 
145
147
  ### 七、运行时配置叠加(不动 tracked 配置)
146
148
 
147
- 禁止默认 Edit tracked 应用配置文件。默认运行时配置叠加(ASCII 绝对路径);改 tracked 配置 → 默认拒绝,记 `decision` 事件(不 AskUserQuestion,报告 🟡 WARN)。详见 `reference.md`。
149
+ 禁止默认 Edit tracked 应用配置文件。默认运行时配置叠加(ASCII 绝对路径);改 tracked 配置 → 默认拒绝,记 `decision` 事件(不 blocking user confirmation,报告 🟡 WARN)。详见 `reference.md`。
148
150
 
149
151
  ### 八、Token 缓存与复用
150
152
 
@@ -176,7 +178,7 @@ python <skills-root>/scripts/harness_test_guard.py record --project . --change-d
176
178
 
177
179
  ## 交互白名单
178
180
 
179
- 本 skill **仅允许**以下 AskUserQuestion;其余默认值 + `decision` 事件:
181
+ 本 skill **仅允许**以下 blocking user confirmation;其余默认值 + `decision` 事件:
180
182
 
181
183
  1. **Service Gate**:仅当 `harness_service.py ensure` 返回 `needs-user-decision`(用户进程占端口)时询问处理方式
182
184
 
@@ -193,3 +195,4 @@ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/cha
193
195
  > **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 边界保持最新。
194
196
 
195
197
  每次阶段结束必须写 `--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` 环境变量统一注入。
198
+ > 片段:logging · phase=`test` · 事件:phase/command/verification/decision/issue/artifact
@@ -191,7 +191,7 @@ $cred = $resp.data.accessToken
191
191
  **严重度**:🟡WARN
192
192
  **场景**:测试期间为了切换外部服务配置直接 Edit tracked 配置文件(如 `application-local-dev.yml`),测试后再还原,留下 diff 噪声
193
193
  **后果**:git diff --stat 出现意外文件、提交风险、误以为有业务变更
194
- **正确做法**:生成运行时配置叠加 `.harness/changes/<change>/runtime/application-harness-test.yml`(不提交),启动用 `-Dspring.config.additional-location=file:...` 叠加(按技术栈);如必须改 tracked 配置,先 AskUserQuestion,最终报告至少 🟡 WARN
194
+ **正确做法**:生成运行时配置叠加 `.harness/changes/<change>/runtime/application-harness-test.yml`(不提交),启动用 `-Dspring.config.additional-location=file:...` 叠加(按技术栈);如必须改 tracked 配置,先 blocking user confirmation,最终报告至少 🟡 WARN
195
195
 
196
196
  ### 规则 22:唯一约束字段与本地预存数据冲突
197
197
  **严重度**:❌FAIL
@@ -151,7 +151,7 @@ spring:
151
151
  powershell.exe -NoProfile -Command "mvn spring-boot:run -pl <module-from-build-profile> -Dspring-boot.run.profiles=local-dev -Dspring-boot.run.jvmArguments='-Dspring.config.additional-location=file:C:/temp/harness-test-overlay/<change-name>/application-harness-test.yml'"
152
152
  ```
153
153
 
154
- 不得默认使用 `.harness/changes/<change>/runtime/application-harness-test.yml` 相对路径作为 JVM `additional-location`。如必须修改 tracked yml,先 AskUserQuestion,最终报告至少 🟡 WARN。
154
+ 不得默认使用 `.harness/changes/<change>/runtime/application-harness-test.yml` 相对路径作为 JVM `additional-location`。如必须修改 tracked yml,先 blocking user confirmation,最终报告至少 🟡 WARN。
155
155
 
156
156
  ## Service Decision Gate 与服务生命周期管理
157
157
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: harness-submit 的确定性提交协议。用于避免 AskUserQuestion 参数错误、中文 commit message 失败、Co-Authored-By 违规和先 commit 后 amend。
2
+ description: harness-submit 的确定性提交协议。用于避免 blocking user confirmation 参数错误、中文 commit message 失败、Co-Authored-By 违规和先 commit 后 amend。
3
3
  ---
4
4
 
5
5
  # Submit Protocol
@@ -26,6 +26,10 @@ if hasattr(sys.stderr, "reconfigure"):
26
26
  sys.stderr.reconfigure(encoding="utf-8")
27
27
 
28
28
  INCLUDE_RE = re.compile(r"<!--\s*@include\s+shared/([^\s]+)\s*-->")
29
+ # retro §5.17: wiki links [[shared/xxx.md|alias]] reference shared fragments
30
+ # that are inlined by expand_includes. After expansion, replace the wiki link
31
+ # with the alias text (the shared content is already in the document).
32
+ WIKI_LINK_RE = re.compile(r"\[\[shared/([^\]|]+)\|([^\]]*)\]\]")
29
33
  # §7.5: overlay anchors support both new section-id and legacy section:"title".
30
34
  OVERRIDE_RE = re.compile(r'<!--\s*@override\s+(?:section-id:"([^"]+)"|section:"([^"]+)")\s*-->')
31
35
  APPEND_RE = re.compile(r'<!--\s*@append-after\s+(?:section-id:"([^"]+)"|section:"([^"]+)")\s*-->')
@@ -148,6 +152,9 @@ def expand_includes(text: str, shared_dir: Path) -> str:
148
152
  return body
149
153
 
150
154
  expanded = INCLUDE_RE.sub(repl, text)
155
+ # §5.17: replace [[shared/xxx.md|alias]] wiki links with the alias text,
156
+ # since the shared content has been inlined by @include expansion above.
157
+ expanded = WIKI_LINK_RE.sub(lambda m: m.group(2), expanded)
151
158
  lines = [ln for ln in expanded.splitlines() if not FRAGMENT_HINT_RE.match(ln)]
152
159
  return "\n".join(lines) + ("\n" if text.endswith("\n") else "")
153
160
 
@@ -1049,10 +1049,11 @@ class IntegrationTransaction:
1049
1049
  heavy_removed.append(name)
1050
1050
  except OSError as exc:
1051
1051
  heavy_failures.append({"path": name, "error": str(exc)})
1052
- self.runner.run(
1052
+ remove_result = self.runner.run(
1053
1053
  self.project_root, "worktree", "remove", "--force", str(resolved),
1054
1054
  check=False,
1055
1055
  )
1056
+ remove_returncode = getattr(remove_result, "returncode", 0)
1056
1057
  listed = self.runner.text(self.project_root, "worktree", "list", "--porcelain")
1057
1058
  registered_after = {
1058
1059
  str(Path(line.removeprefix("worktree ")).resolve())
@@ -1061,7 +1062,8 @@ class IntegrationTransaction:
1061
1062
  }
1062
1063
  still_registered = str(resolved) in registered_after
1063
1064
  residual_paths: list[str] = []
1064
- if resolved.exists():
1065
+ disk_path_present = resolved.exists()
1066
+ if disk_path_present:
1065
1067
  if resolved.is_file():
1066
1068
  residual_paths.append(resolved.name)
1067
1069
  else:
@@ -1075,6 +1077,27 @@ class IntegrationTransaction:
1075
1077
  break
1076
1078
  if len(residual_paths) >= 200:
1077
1079
  break
1080
+ # §5.30: Windows half-success — git worktree remove returned non-zero
1081
+ # but registration is already deleted and disk path remains. Return a
1082
+ # structured status distinct from generic CLEANUP_RESIDUAL so callers
1083
+ # can apply the allowlisted residual cleaner.
1084
+ if (
1085
+ remove_returncode != 0
1086
+ and not still_registered
1087
+ and disk_path_present
1088
+ and residual_paths
1089
+ and not heavy_failures
1090
+ ):
1091
+ return {
1092
+ "ok": False,
1093
+ "code": "REGISTRATION_REMOVED_RESIDUAL_PRESENT",
1094
+ "target": str(resolved),
1095
+ "heavyRootsRemoved": heavy_removed,
1096
+ "heavyRootFailures": heavy_failures,
1097
+ "worktreeRegistered": False,
1098
+ "diskPathPresent": True,
1099
+ "residualPaths": residual_paths,
1100
+ }
1078
1101
  ok = not heavy_failures and not still_registered and not residual_paths
1079
1102
  return {
1080
1103
  "ok": ok,
@@ -1083,6 +1106,7 @@ class IntegrationTransaction:
1083
1106
  "heavyRootsRemoved": heavy_removed,
1084
1107
  "heavyRootFailures": heavy_failures,
1085
1108
  "worktreeRegistered": still_registered,
1109
+ "diskPathPresent": disk_path_present,
1086
1110
  "residualPaths": residual_paths,
1087
1111
  }
1088
1112
 
@@ -300,6 +300,152 @@ def _terminal_exists(change_dir: Path, run_id: str, attempt: int) -> bool:
300
300
  )
301
301
 
302
302
 
303
+ def verify_plan(change_dir: Path) -> dict[str, Any]:
304
+ """Read-only verification of a finalized plan (retro §5.8).
305
+
306
+ Validates the published artifacts, receipt and events stream without
307
+ requiring the original staging directory. Returns the artifact hash,
308
+ phase.end count/status, frontmatter, and consistency checks. Any parse
309
+ error or inconsistency results in ok=false with a non-zero exit code.
310
+ """
311
+ change_dir = change_dir.resolve()
312
+ receipt_path = change_dir / "meta" / "plan-finalization.json"
313
+ if not receipt_path.is_file():
314
+ return _result_error("RECEIPT_MISSING", f"receipt not found: {receipt_path}")
315
+
316
+ try:
317
+ receipt = json.loads(receipt_path.read_text(encoding="utf-8-sig"))
318
+ except (OSError, json.JSONDecodeError) as exc:
319
+ return _result_error("RECEIPT_INVALID", str(exc))
320
+ if not isinstance(receipt, dict):
321
+ return _result_error("RECEIPT_INVALID", "receipt top-level must be an object")
322
+
323
+ change_name = str(receipt.get("changeName") or "").strip()
324
+ if not change_name:
325
+ return _result_error("RECEIPT_INVALID", "receipt missing changeName")
326
+
327
+ expected_hash = str(receipt.get("artifactsHash") or "").strip()
328
+ if not expected_hash.startswith("sha256:"):
329
+ return _result_error("RECEIPT_INVALID", "receipt artifactsHash missing or malformed")
330
+
331
+ files_list = receipt.get("files")
332
+ if not isinstance(files_list, list) or not files_list:
333
+ return _result_error("RECEIPT_INVALID", "receipt files list missing or empty")
334
+
335
+ # Recompute artifacts hash from published files.
336
+ digest = hashlib.sha256()
337
+ artifact_names: list[str] = []
338
+ for rel_text in files_list:
339
+ rel = rel_text.as_posix() if hasattr(rel_text, "as_posix") else str(rel_text)
340
+ target = change_dir / rel
341
+ if not target.is_file():
342
+ return _result_error(
343
+ "ARTIFACT_MISSING", f"published artifact missing: {rel}"
344
+ )
345
+ artifact_names.append(rel)
346
+ digest.update(rel.encode("utf-8"))
347
+ digest.update(b"\0")
348
+ digest.update(target.read_bytes())
349
+ digest.update(b"\0")
350
+ actual_hash = "sha256:" + digest.hexdigest()
351
+ if actual_hash != expected_hash:
352
+ return _result_error(
353
+ "ARTIFACT_HASH_DRIFT",
354
+ f"published artifacts hash {actual_hash} != receipt {expected_hash}",
355
+ )
356
+
357
+ # Validate frontmatter on markdown artifacts.
358
+ frontmatter_results: dict[str, Any] = {}
359
+ for rel in artifact_names:
360
+ if not rel.endswith(".md"):
361
+ continue
362
+ target = change_dir / rel
363
+ try:
364
+ text = target.read_text(encoding="utf-8-sig")
365
+ except OSError as exc:
366
+ return _result_error("ARTIFACT_UNREADABLE", f"{rel}: {exc}")
367
+ fm = _frontmatter(text)
368
+ if fm is None:
369
+ return _result_error(
370
+ "ARTIFACT_FRONTMATTER_MISSING", f"{rel}: no frontmatter"
371
+ )
372
+ if fm.get("change-name") != change_name:
373
+ return _result_error(
374
+ "ARTIFACT_FRONTMATTER_INVALID",
375
+ f"{rel}: change-name '{fm.get('change-name')}' != '{change_name}'",
376
+ )
377
+ frontmatter_results[rel] = {
378
+ "change-name": fm.get("change-name"),
379
+ "status": fm.get("status"),
380
+ }
381
+
382
+ # Validate gate-policy.json is parseable JSON.
383
+ gate_policy_path = change_dir / "meta" / "gate-policy.json"
384
+ gate_policy_consistent = True
385
+ if gate_policy_path.is_file():
386
+ try:
387
+ json.loads(gate_policy_path.read_text(encoding="utf-8-sig"))
388
+ except (OSError, json.JSONDecodeError):
389
+ gate_policy_consistent = False
390
+ else:
391
+ gate_policy_consistent = False
392
+
393
+ # Validate events.ndjson: count phase.end, check for parse errors.
394
+ events_path = change_dir / "events.ndjson"
395
+ phase_end_count = 0
396
+ phase_end_status: str | None = None
397
+ events_parse_errors: list[str] = []
398
+ if events_path.is_file():
399
+ for line_no, line in enumerate(events_path.read_text(encoding="utf-8").splitlines(), 1):
400
+ if not line.strip():
401
+ continue
402
+ try:
403
+ event = json.loads(line)
404
+ except json.JSONDecodeError as exc:
405
+ events_parse_errors.append(f"line {line_no}: {exc}")
406
+ continue
407
+ if not isinstance(event, dict):
408
+ events_parse_errors.append(f"line {line_no}: not an object")
409
+ continue
410
+ if (
411
+ event.get("phase") == "plan"
412
+ and event.get("type") == "phase.end"
413
+ ):
414
+ phase_end_count += 1
415
+ phase_end_status = str(event.get("status") or "").upper()
416
+ else:
417
+ events_parse_errors.append("events.ndjson missing")
418
+
419
+ if events_parse_errors:
420
+ return _result_error(
421
+ "EVENTS_PARSE_ERROR", "; ".join(events_parse_errors[:5])
422
+ )
423
+
424
+ if phase_end_count == 0:
425
+ return _result_error("PHASE_END_MISSING", "no plan phase.end event found")
426
+ if phase_end_count > 1:
427
+ return _result_error(
428
+ "PHASE_END_DUPLICATE", f"found {phase_end_count} phase.end events"
429
+ )
430
+
431
+ # Receipt consistency: status should be finalized.
432
+ receipt_consistent = receipt.get("status") == "finalized"
433
+
434
+ return {
435
+ "ok": True,
436
+ "action": "verify",
437
+ "changeDir": str(change_dir),
438
+ "changeName": change_name,
439
+ "artifactsHash": actual_hash,
440
+ "phaseEndCount": phase_end_count,
441
+ "phaseEndStatus": phase_end_status,
442
+ "frontmatter": frontmatter_results,
443
+ "gatePolicyConsistent": gate_policy_consistent,
444
+ "receiptConsistent": receipt_consistent,
445
+ "files": artifact_names,
446
+ }
447
+
448
+
303
449
  def _read_design_capabilities(staging: Path, change_name: str) -> list[str]:
304
450
  """Read capabilities from design frontmatter (retro §5.4)."""
305
451
  design_path = staging / "spec" / f"{change_name}-design.md"
@@ -569,18 +715,24 @@ def build_parser() -> argparse.ArgumentParser:
569
715
  finalize.add_argument("--run-id", required=True)
570
716
  finalize.add_argument("--attempt", required=True, type=int)
571
717
  finalize.add_argument("--json", action="store_true")
718
+ verify = sub.add_parser("verify")
719
+ verify.add_argument("--change-dir", required=True)
720
+ verify.add_argument("--json", action="store_true")
572
721
  return parser
573
722
 
574
723
 
575
724
  def main(argv: list[str] | None = None) -> int:
576
725
  args = build_parser().parse_args(argv)
577
- result = finalize_plan(
578
- Path(args.change_dir),
579
- Path(args.staging_dir),
580
- change_name=args.change,
581
- run_id=args.run_id,
582
- attempt=args.attempt,
583
- )
726
+ if args.command == "verify":
727
+ result = verify_plan(Path(args.change_dir))
728
+ else:
729
+ result = finalize_plan(
730
+ Path(args.change_dir),
731
+ Path(args.staging_dir),
732
+ change_name=args.change,
733
+ run_id=args.run_id,
734
+ attempt=args.attempt,
735
+ )
584
736
  stream = sys.stdout if result["ok"] else sys.stderr
585
737
  if args.json:
586
738
  stream.write(json.dumps(result, ensure_ascii=False, indent=2) + "\n")
@@ -48,6 +48,7 @@ PROFILE_REL = Path(".harness") / "config" / "build-profile.json"
48
48
  DEFAULT_EXCLUDED_ROOTS: tuple[str, ...] = (
49
49
  ".git",
50
50
  ".harness",
51
+ ".worktrees",
51
52
  ".claude/worktrees",
52
53
  ".codex/worktrees",
53
54
  ".cursor/worktrees",
@@ -23,10 +23,10 @@ if hasattr(sys.stderr, "reconfigure"):
23
23
  SCHEMA_VERSION = 1
24
24
  _CHANGE_ID = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$")
25
25
  _ADAPTERS = {
26
- "claude-code": (".claude/worktrees", "claude/"),
27
- "codex": (".codex/worktrees", "codex/"),
28
- "cursor": (".cursor/worktrees", "cursor/"),
29
- "codebuddy": (".codebuddy/worktrees", "codebuddy/"),
26
+ "claude-code": (".worktrees", "harness/"),
27
+ "codex": (".worktrees", "harness/"),
28
+ "cursor": (".worktrees", "harness/"),
29
+ "codebuddy": (".worktrees", "harness/"),
30
30
  }
31
31
 
32
32
 
@@ -164,6 +164,7 @@ def get_service_start(profile: dict[str, Any]) -> dict[str, Any]:
164
164
  # runtime resolve 把具体 overlay/profile 注入到 session,不写回持久 profile
165
165
  # (spec §3.1 持久 profile 只保存模板;§3.4 修复输入端陈旧 profile)。
166
166
  STALE_WORKTREE_MARKERS: tuple[str, ...] = (
167
+ ".worktrees/",
167
168
  ".claude/worktrees/",
168
169
  ".cursor/worktrees/",
169
170
  ".codeium/worktrees/",