@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
@@ -1,880 +0,0 @@
1
- ---
2
- description: harness-test 的 API 测试执行细节、批量 runner、token 缓存、测试数据治理、报告模板和关门检查。仅在执行接口测试需要参考详细操作时读取。
3
- ---
4
-
5
- # harness-test 参考 — API 测试详情
6
-
7
- ## 命令执行模式 preflight(0.1)
8
-
9
- `/harness-test` 高度依赖 PowerShell 与接口测试执行器。在编译/启动服务/生成执行器 **之前**
10
- 必须执行 4 项执行模式检查:
11
-
12
- | 检查项 | 命令 | 预期 |
13
- |---|---|---|
14
- | PowerShell 基础命令 | `powershell.exe -NoProfile -Command "$PSVersionTable.PSVersion"` | exitCode=0 |
15
- | 执行器运行时(如 Node) | `powershell.exe -NoProfile -Command "& 'C:\nvm4w\nodejs\node.exe' --version"` | exitCode=0 |
16
- | 构建工具(如 Maven) | `powershell.exe -NoProfile -Command "mvn -version"` | exitCode=0 |
17
- | 安全分类器 | 任一 PowerShell 命令是否返回"安全分类器暂时不可用"/"Auto mode 拦截" | 不应出现 |
18
-
19
- 将通过的 `executorPath` 等元数据写入 `.harness/changes/<change-name>/runtime/preflight.json`,
20
- 供后续接口测试执行器启动命令读取。
21
-
22
- **触发硬停**(任一情况):
23
-
24
- - "安全分类器暂时不可用"
25
- - Auto mode 导致 PowerShell 命令不可执行
26
- - PowerShell 被拒
27
- - PowerShell 可用但执行器 / 构建工具不可执行
28
-
29
- **硬停输出**(不得意译,不得继续编译/启动服务/生成执行器,不得长时间等待,不得盲目降级到 Playwright MCP):
30
-
31
- ```
32
- ❌ 命令执行模式不可用:PowerShell/接口测试执行器无法稳定执行。
33
- 请切换 Claude Code 权限模式,例如 bypassPermissions / 非 Auto mode,
34
- 或用允许命令执行的方式启动 Claude Code。
35
- 不要继续进入接口测试,避免长时间等待和错误 fallback。
36
- ```
37
-
38
- 重复重试 ≤ 1 次。
39
-
40
- ## fallback 执行器探测
41
-
42
- ### 探测流程
43
-
44
- Phase 0.1 必须先确认 PowerShell / 执行器 / 构建工具 可用。
45
-
46
- 如果首选接口测试执行器可用,**不执行 fallback 探测**,直接使用接口测试执行器。
47
- 只有首选执行器不可用时,才按顺序探测 PowerShell batch、Playwright MCP、curl fallback。
48
-
49
- **fallback 探测项**:
50
-
51
- 1. PowerShell batch runner (`.ps1`) 是否可用
52
- 2. Claude Code 是否暴露 Playwright MCP 工具(检查工具列表中是否有 `mcp__plugin_playwright_playwright__*`)
53
- 3. 如果可以执行命令,检查 `claude mcp list` 中是否有 playwright
54
- 4. `@playwright/mcp` 是否可启动
55
- 5. 当前 skill 的 `allowed-tools` 是否允许 Playwright 相关工具
56
- 6. curl fallback 是否只能使用 UTF-8 JSON body file,禁止中文 JSON 内联
57
-
58
- ### 输出格式
59
-
60
- ```markdown
61
- ### fallback 执行器可用性
62
- | 项 | 结果 | 证据 |
63
- |---|---|---|
64
- | 接口测试执行器 | ✅使用 / ❌不可用 | ... |
65
- | PowerShell batch runner | 未使用 / ✅fallback / ❌不可用 | ... |
66
- | Playwright MCP browser_evaluate | 未使用 / ✅fallback / ❌不可用 | ... |
67
- | curl + UTF-8 JSON body file | 未使用 / ✅fallback / ❌不可用 | ... |
68
- | 最终决策 | 接口测试执行器 / PowerShell batch / Playwright MCP browser_evaluate / curl fallback | ... |
69
- ```
70
-
71
- 如果 fallback 不可用,必须写明原因,不得静默改用 curl。
72
-
73
- ## 接口测试工具优先级
74
-
75
- **优先级**(从高到低):
76
-
77
- | 优先级 | 工具 | 适用场景 | 说明 |
78
- |:------:|------|---------|------|
79
- | 1 | **PowerShell + 接口测试执行器 (`.mjs`,Node runner 为一种实现)** | 默认且首选 | PowerShell + 执行器绝对路径执行,统一 baseURL/headers/凭证,结构化输出+耗时统计;可按项目替换为其他 HTTP 客户端 |
80
- | 2 | **PowerShell batch runner (`.ps1`)** | 首选不可用时降级 | UTF-8 编码正确,可脚本化批量执行 |
81
- | 3 | **Playwright MCP `browser_evaluate` + `fetch`** | 1+2 不可用时 fallback | UTF-8 编码正确,但每场景单独调用 MCP,**不得替代执行器** |
82
- | 4 | **curl + UTF-8 JSON body file** | 最后兜底 | 必须先将 JSON body 写入 UTF-8 文件,再通过 PowerShell(`curl.exe` 或 `Invoke-RestMethod`,经 `Bash(powershell.exe:*)` 通道)发送;`disallowed-tools` 已禁 `Bash(curl *)`,不得用 Bash 直接 curl |
83
- | ❌ | curl 内联含中文 JSON | **禁止** | Windows 下 GBK 编码导致 UTF-8 解析失败 |
84
- | ❌ | Bash 裸 `node ...` | **禁止** | Bash 在中文路径项目下被 hook 拒绝;且 Node 在 Bash 中常不在 PATH |
85
-
86
- > **Windows 环境避免用 curl 发送含中文的请求体**(GBK 编码导致 UTF-8 解析失败)。
87
- > **如果执行器在 PowerShell 可用,禁止使用 Playwright MCP 逐条执行接口测试。**
88
-
89
- ## 已知良好测试配置(known-good-test-profile,按项目固化)
90
-
91
- 本项目默认使用 **local-dev profile + 本地数据库 + 远程缓存 + 远程 SDK 网关 + 远程认证服务**(按技术栈;Java Spring Boot 为例)。
92
-
93
- ```yaml
94
- known-good-test-profile:
95
- name: <配置名,如 local-dev-remote-sdk>
96
- module: <模块/服务(按项目)>
97
- profile: <运行时 profile(按技术栈,如 Spring Boot 的 springProfile)>
98
- port: <端口>
99
- contextPath: <上下文路径>
100
- healthUrl: <健康检查 URL>
101
-
102
- database:
103
- primary: <主库连接(按项目)>
104
- cache: <缓存连接(按项目)>
105
-
106
- remote:
107
- gateway: <网关 URL(如适用)>
108
- sdkUrl: <外部 SDK URL(如适用)>
109
- authLoginUrl: <认证服务登录 URL(如 SSO)>
110
-
111
- overlay:
112
- pathStrategy: ascii-temp
113
- directory: C:/temp/harness-test-overlay
114
- fileName: application-harness-test.yml
115
-
116
- service:
117
- askBeforeReusingExisting: true
118
- askBeforeRestartingUserService: true
119
- stopAfterTest: true
120
- restoreOriginalService: false
121
- ```
122
-
123
- 默认不假设本地网关存在。
124
-
125
- ## 运行时配置叠加(不动 tracked 配置)
126
-
127
- 不要直接 Edit tracked 应用配置文件(如 `application-local-dev.yml`)。默认生成 ASCII 绝对路径运行时配置叠加:
128
-
129
- ```text
130
- C:/temp/harness-test-overlay/<change-name>/application-harness-test.yml
131
- ```
132
-
133
- 内容按已知良好测试配置渲染(按项目;Java Spring Boot 为例):
134
-
135
- ```yaml
136
- # 按项目填入需要覆盖的配置项,示例:
137
- <external-service>:
138
- sdk:
139
- url: <外部 SDK URL>
140
- spring:
141
- cloud:
142
- nacos:
143
- discovery:
144
- register-enabled: false # 避免本地服务注册到线上
145
- ```
146
-
147
- 唯一默认启动命令(按技术栈,Java Spring Boot 为例):
148
-
149
- ```powershell
150
- powershell.exe -NoProfile -Command "mvn spring-boot:run -pl <module> -Dspring-boot.run.profiles=<profile> -Dspring-boot.run.jvmArguments='-Dspring.config.additional-location=file:C:/temp/harness-test-overlay/<change-name>/application-harness-test.yml'"
151
- ```
152
-
153
- 不得默认使用 `.harness/changes/<change>/runtime/application-harness-test.yml` 相对路径作为 JVM `additional-location`。如必须修改 tracked 配置文件,先 blocking user confirmation,最终报告至少 🟡 WARN。
154
-
155
- ## 服务决策门(Service Decision Gate)与服务生命周期管理
156
-
157
- 运行时文件:
158
-
159
- | 文件 | 内容 |
160
- |---|---|
161
- | `service.pid` | AI 启动/重启后的进程 PID |
162
- | `service-start-command.txt` | 实际执行的 PowerShell 启动命令(脱敏) |
163
- | `service-start.log` | 应用启动 stdout/stderr |
164
- | `runtime/service-session.json` | pid、moduleInputsHash、moduleInputsFiles、profile、startCommandHash、overlayPath、command、startedBy、startedAt |
165
-
166
- serviceState:`AI_STARTED` / `AI_RESTARTED_FROM_USER_SERVICE` / `USER_STARTED` / `REUSED_EXISTING` / `NOT_STARTED`。
167
-
168
- > **Task 3 §5.1/§5.2**:`build-profile.json` 的 `serviceStart.inputFiles`(glob 列表,相对 project 展开)是服务指纹的来源;`harness_service.py ensure` 取 CLI `--files` ∪ `serviceStart.inputFiles` 计算依赖闭包。**空输入被拒绝**(exit 非 0,`service inputs are empty`),**不得生成可复用的空指纹**。通用项目 detect 无法猜 module 源,`inputFiles` 默认空数组,须人工配置。
169
-
170
- 发现已有应用服务时,先展示服务决策门,再问:
171
-
172
- ```text
173
- 1. 直接复用当前服务
174
- 2. 重启服务,使用已知良好测试配置
175
- 3. 跳过接口测试,只执行单元测试
176
- 4. 停止测试
177
- ```
178
-
179
- 只有 `service-session.json` 与当前**同时**满足以下条件才允许自动复用(§5.3):`moduleInputsHash` 一致、`startCommandHash` 一致、`profile` 一致、`overlayPath` 一致、进程身份(pid 存活 + create time 与 `startedAt` 匹配)可确认。任一变化 -> AI 自动 restart;身份无法确认 -> `needs-user-decision`;非 AI 用户进程**永不自动 kill**。否则必须询问。
180
-
181
- 若用户选择重启已有服务,必须提示:测试结束后关闭新测试服务,不会恢复原服务。
182
-
183
- 最终报告必须包含 originalServicePid、originalServiceStopped、testServicePid、testServiceStopped、restoredOriginalService、finalPortState。
184
-
185
- ### 重入沿用
186
-
187
- 同一变更的 harness-test 重入时,若环境未变(PG/端口/执行器与上次一致)、上次已确认执行器方案、且源码未改服务启动逻辑,可沿用上次服务决策不重复询问,执行日志记 `重入沿用+环境未变`。不适用情形(fingerprint 不匹配、环境已变、USER_STARTED、源码改启动逻辑)仍须询问/重启。详见 checklist.md「0.10.x 重入沿用」。
188
-
189
- ## 启动等待状态机
190
-
191
- | 阶段 | 探测频率 | 行为 |
192
- |---|---|---|
193
- | 0–30s | 每 2s 一次(端口 + healthUrl) | 命中即继续 |
194
- | 30–120s | 每 5s 一次 | 命中即继续 |
195
- | 超过 120s | 读取最近 200 行 `service-start.log` | 异常即停 |
196
-
197
- 立即失败的异常关键字(按技术栈识别,如 Java Spring Boot 的 `BindException` / `Could not resolve placeholder` /
198
- `Connection refused during bean init` / `BeanCreationException` /
199
- `Failed to start bean` / `BUILD FAILURE`)。
200
-
201
- 每等待 >10s 必须输出一次状态行:
202
-
203
- ```
204
- 服务启动中:elapsed=20s, port=not listening, lastLog="..."
205
- ```
206
-
207
- ## 批量测试执行器(强制 setup / test / cleanup 三阶段)
208
-
209
- > ⚠️ **强制单次执行**:执行器必须一次性跑完所有场景并输出 JSON,主会话不再逐条调用 Playwright MCP。只有首选执行器失败才降级为 PowerShell batch / 多次 `browser_evaluate`。
210
-
211
- ### 文件位置
212
-
213
- - 脚本:`.harness/changes/<change-name>/runtime/api-test-runner.mjs`
214
- - 结果:`.harness/changes/<change-name>/runtime/api-test-results.json`
215
- - 均在 `.harness/changes/<change>/runtime/` 下,不提交到 git
216
-
217
- ### 执行方式(一次命令,PowerShell + 执行器绝对路径)
218
-
219
- ```powershell
220
- powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\nvm4w\nodejs\node.exe' '.harness/changes/<change-name>/runtime/api-test-runner.mjs'"
221
- ```
222
-
223
- - 绝对路径默认 `C:\nvm4w\nodejs\node.exe`(Node runner 为一种实现,可按项目替换);不同环境从 `preflight.json` 的 `executorPath` 读取
224
- - 禁止裸 `node ...`,禁止用 Bash 执行 node
225
- - 失败 ≤ 1 次重试,仍失败必须提示用户切换权限模式或手动执行执行器
226
-
227
- 执行器内部按 setup → test → cleanup 三阶段,失败时不会用 null ID 继续请求。
228
- 主会话只 Read `api-test-results.json` 生成摘要,不再调用 MCP。
229
-
230
- ### 执行器三阶段模板(setup / test / cleanup)
231
-
232
- ```javascript
233
- // api-test-runner.mjs — 批量接口测试执行器(PowerShell + 执行器绝对路径执行;Node runner 为一种实现,可按项目替换)
234
- import { request } from '@playwright/test';
235
- import { writeFileSync, readFileSync } from 'node:fs';
236
-
237
- const BASE_URL = 'http://127.0.0.1:<port>'; // 直连本地 baseURL
238
- const CONTEXT_PATH = '<context-path>';
239
- const HEADERS = {
240
- 'Content-Type': 'application/json; charset=UTF-8',
241
- 'tenant-id': '1' // 如项目适用,从配置读取
242
- };
243
- const RESULTS_FILE = '.harness/changes/<change-name>/runtime/api-test-results.json';
244
- const CREDENTIAL_CACHE = '.harness/changes/<change-name>/runtime/credential-cache.json';
245
-
246
- // ===== Payload schema(从数据契约/接口定义/真实样例生成,禁止临场猜)=====
247
- // 关键字段从项目的数据契约(如 VO/DTO/接口定义)读取,必填字段逐一核对
248
- // 详见 .harness/changes/<change>/plans/<change>-test-scenarios.md
249
-
250
- const setupState = {
251
- resourceId: null,
252
- errors: []
253
- };
254
-
255
- // ===== 凭证复用:先本地轻量接口验证,失败才走远程认证服务 =====
256
- let credentialRefreshCount = 0;
257
- async function resolveCredential(role) {
258
- let cache = {};
259
- try { cache = JSON.parse(readFileSync(CREDENTIAL_CACHE, 'utf8')); } catch {}
260
- const entry = cache.credentials?.[role];
261
- if (entry?.token) {
262
- const ctx = await request.newContext({ baseURL: BASE_URL });
263
- const probe = await ctx.get(`${CONTEXT_PATH}/meta`, { // 本地轻量健康接口
264
- headers: { ...HEADERS, Authorization: `Bearer ${entry.token}` },
265
- timeout: 5000
266
- });
267
- if (probe.ok()) return entry.token;
268
- }
269
- if (credentialRefreshCount >= 1) {
270
- throw new Error('凭证重取超过 1 次,请检查认证服务/账号配置');
271
- }
272
- credentialRefreshCount++;
273
- return await loginViaAuthService(role); // 写回 cache
274
- }
275
-
276
- // ===== setup:创建前置数据 =====
277
- async function setup(token) {
278
- const ctx = await request.newContext({ baseURL: BASE_URL });
279
- // 唯一前缀,避免冲突
280
- const prefix = `TEST_<change-name>_${Date.now()}_${Math.random().toString(36).slice(2,6)}`;
281
- // 唯一约束字段必须随机或避让,避免冲突导致 BLOCKED
282
- const uniqueField = 900000 + Math.floor(Math.random() * 9999);
283
- try {
284
- const resp = await ctx.post(`${CONTEXT_PATH}/<resource>/create`, {
285
- headers: { ...HEADERS, Authorization: `Bearer ${token}` },
286
- data: JSON.stringify({
287
- // payload 字段从数据契约/接口定义/真实样例生成,禁止临场猜
288
- code: `${prefix}_res1`,
289
- name: `${prefix}_资源`,
290
- uniqueField // 唯一约束字段,随机或避让
291
- }),
292
- timeout: 10000
293
- });
294
- const json = await resp.json();
295
- if (json.code === 0 || json.code === '0') {
296
- setupState.resourceId = json.data?.id;
297
- } else {
298
- setupState.errors.push({ step: 'createResource', code: json.code, message: json.message });
299
- }
300
- } catch (e) {
301
- setupState.errors.push({ step: 'createResource', error: e.message });
302
- }
303
- }
304
-
305
- // ===== test:依赖判定 → BLOCKED 不发请求 =====
306
- const results = [];
307
- async function runOne(scenario, token) {
308
- // 依赖检查
309
- if (scenario.requires?.resourceId && !setupState.resourceId) {
310
- results.push({ scenario: scenario.id, status: 0, passed: false, state: 'BLOCKED',
311
- reason: 'setup.createResource failed' });
312
- return;
313
- }
314
- const start = Date.now();
315
- try {
316
- const ctx = await request.newContext({ baseURL: BASE_URL });
317
- const url = scenario.url.replace('{resourceId}', setupState.resourceId ?? '');
318
- const resp = await ctx.fetch(url, {
319
- method: scenario.method,
320
- headers: { ...HEADERS, ...scenario.headers, Authorization: `Bearer ${token}` },
321
- data: scenario.body ? JSON.stringify(scenario.body(setupState)) : undefined,
322
- timeout: scenario.timeout || 10000
323
- });
324
- const data = await resp.json();
325
- const durationMs = Date.now() - start;
326
- results.push({
327
- scenario: scenario.id, method: scenario.method, url,
328
- status: resp.status(), code: data.code, message: data.message || data.msg,
329
- durationMs,
330
- state: checkPassed(scenario, resp.status(), data) ? 'PASS' : 'FAIL',
331
- passed: checkPassed(scenario, resp.status(), data)
332
- });
333
- } catch (err) {
334
- results.push({
335
- scenario: scenario.id, method: scenario.method, url: scenario.url,
336
- status: 0, code: 'ERROR', message: err.message,
337
- durationMs: Date.now() - start,
338
- state: 'FAIL', passed: false
339
- });
340
- }
341
- }
342
-
343
- // ===== cleanup:尽力清理 =====
344
- async function cleanup(token) {
345
- const ctx = await request.newContext({ baseURL: BASE_URL });
346
- let cleaned = 0, leftover = 0;
347
- const errors = [];
348
- if (setupState.resourceId) {
349
- try {
350
- const resp = await ctx.delete(`${CONTEXT_PATH}/<resource>/${setupState.resourceId}`, {
351
- headers: { ...HEADERS, Authorization: `Bearer ${token}` },
352
- timeout: 10000
353
- });
354
- if (resp.ok()) cleaned++; else { leftover++; errors.push({ id: setupState.resourceId, status: resp.status() }); }
355
- } catch (e) {
356
- leftover++; errors.push({ id: setupState.resourceId, error: e.message });
357
- }
358
- }
359
- return { cleaned, leftover, errors };
360
- }
361
-
362
- // ===== 主流程 =====
363
- const token = await resolveCredential('admin');
364
- const batchStart = Date.now();
365
- await setup(token);
366
- for (const scenario of scenarios) {
367
- await runOne(scenario, token);
368
- }
369
- const cleanupResult = await cleanup(token);
370
- const batchDurationMs = Date.now() - batchStart;
371
-
372
- const summary = {
373
- runner: 'api-test-executor',
374
- scenariosTotal: results.length,
375
- passed: results.filter(r => r.state === 'PASS').length,
376
- failed: results.filter(r => r.state === 'FAIL').length,
377
- blocked: results.filter(r => r.state === 'BLOCKED').length,
378
- skipped: results.filter(r => r.state === 'SKIPPED').length,
379
- setupErrors: setupState.errors,
380
- cleanupResult,
381
- credentialRefreshCount,
382
- // §5.22: 分层耗时 schema — batchDurationMs 是整个 runner wall-clock;
383
- // 每个场景的 requestDurationMs 是单 HTTP 请求耗时。聚合合同套件场景
384
- // 只记录 batch reference/coveredTests,不允许均摊生成伪请求耗时。
385
- batchDurationMs,
386
- startedAt: '<ISO>', finishedAt: '<ISO>'
387
- };
388
- writeFileSync(RESULTS_FILE, JSON.stringify({ results, summary }, null, 2));
389
- console.log(`\n结果已写入 ${RESULTS_FILE}`);
390
- ```
391
-
392
- > **关键点**:
393
- > - `setup` / `test` / `cleanup` 三阶段,依赖未满足时标 `BLOCKED`,**不发起请求**
394
- > - 执行器用 `request.newContext({ baseURL })` 或原生 HTTP 客户端 **直连本地 baseURL**
395
- > - 凭证从本地 cache 读 + 本地轻量接口验证,**完全不依赖浏览器当前页面 origin**
396
- > - 同一次执行内 `credentialRefreshCount` 不得 > 1
397
- > - payload 从数据契约/接口定义/真实样例生成,并在脚本注释中标注字段来源
398
- > - **§5.22 分层耗时**:`batchDurationMs` 是 runner wall-clock(整个批次耗时),`requestDurationMs` 是单 HTTP 请求耗时。聚合合同套件场景(如 API-C01~C04 共享同一 pytest 批次)只记录 `batchReference` + `coveredTests`,**禁止用 `batchDurationMs / N` 均摊生成伪 `requestDurationMs`**
399
-
400
- ### 执行器降级方案(PowerShell batch runner .ps1)
401
-
402
- ```powershell
403
- # api-test-runner.ps1 — PowerShell 批量接口测试
404
- $baseUrl = "http://127.0.0.1:<port>"
405
- $headers = @{
406
- "Content-Type" = "application/json; charset=UTF-8"
407
- "tenant-id" = "1" # 如项目适用
408
- }
409
-
410
- $results = @()
411
- foreach ($scenario in $scenarios) {
412
- $sw = [System.Diagnostics.Stopwatch]::StartNew()
413
- try {
414
- $body = $scenario.body | ConvertTo-Json -Depth 10 -Compress
415
- $resp = Invoke-RestMethod -Uri "$baseUrl$($scenario.url)" -Method $scenario.method -Headers $headers -Body $body -ContentType "application/json; charset=UTF-8"
416
- $sw.Stop()
417
- $results += [PSCustomObject]@{
418
- scenario = $scenario.id
419
- method = $scenario.method
420
- url = $scenario.url
421
- status = 200
422
- code = $resp.code
423
- message = $resp.message
424
- durationMs = $sw.ElapsedMilliseconds
425
- passed = $true
426
- }
427
- } catch {
428
- $sw.Stop()
429
- $results += [PSCustomObject]@{
430
- scenario = $scenario.id
431
- method = $scenario.method
432
- url = $scenario.url
433
- status = $_.Exception.Response.StatusCode.value__
434
- code = "ERROR"
435
- message = $_.Exception.Message
436
- durationMs = $sw.ElapsedMilliseconds
437
- passed = $false
438
- }
439
- }
440
- }
441
-
442
- $results | ConvertTo-Json -Depth 4
443
- ```
444
-
445
- ## 资源安全测试执行
446
-
447
- ### 档位与确认
448
-
449
- | 档位 | 默认 | 执行范围 | 确认 |
450
- |---|:---:|---|---|
451
- | `safe` | ✅ | 普通模块,逐模块串行 | 不需要 |
452
- | `system` | ❌ | 服务生命周期、集成等资源密集型模块 | `--confirm-resource-intensive` 或受控 CI |
453
- | `full` | ❌ | 普通模块后接资源密集型模块,仍逐模块串行 | `--confirm-resource-intensive` 或受控 CI |
454
-
455
- 通用命令通过 `harness_test_runner.py exec` 托管;Python `unittest` 测试库通过 `harness_test_runner.py unittest` 逐文件执行。不得把“完整验证”解释为单解释器的裸 discovery,也不得同时启动两套同项目测试。
456
-
457
- ### 资源边界
458
-
459
- - `HARNESS_TEST_MAX_WORKERS` 默认且最高为 `2`,环境变量只能进一步调低。
460
- - Runner 获取基于项目绝对路径的单实例锁;活动 owner 存在时返回 `TEST_RUN_ALREADY_ACTIVE`。
461
- - Runner 降低自身调度优先级,子进程继承该优先级。
462
- - Windows 普通模块进入 kill-on-close Job Object;显式验证 detached service 的模块不能嵌套 Job,Runner 持续记录从测试根进程派生的精确 PID 血缘并在结束时逐一回收。其他平台进入独立进程组。
463
- - detached-service 模块启动前先执行两级 nested-breakaway preflight;受限沙箱拒绝时返回 `DETACHED_PROCESS_CAPABILITY_UNAVAILABLE` 并在模块开始前失败,避免所有服务用例各自等待启动超时。
464
- - 正常返回、失败、超时和中断均执行进程树清理;PID 血缘模式只处理本次测试的后代,不按进程名做全局清理。
465
- - 单模块超时返回 `TEST_COMMAND_TIMEOUT`;无法建立进程树隔离返回 `PROCESS_TREE_ISOLATION_UNAVAILABLE`。两者都不得以裸命令重试。
466
- - 清理只作用于 Runner 创建的进程树,禁止 `taskkill /IM python.exe`、`Stop-Process -Name node` 等宽泛清理用户进程。
467
-
468
- ## 命令与请求超时治理
469
-
470
- 所有命令必须有"预期时长 + 超时上限",超过预期时长**必须输出一次当前状态**:
471
-
472
- | 命令类型 | 预期 | 超时 | 超时行为 |
473
- |----------|:----:|:----:|----------|
474
- | PowerShell preflight (0.1) | 1–2s | **5s** | 失败立即停 0.1 |
475
- | 接口测试执行器(普通) | 30s | **60s** | 抛错继续报告,不再重试 |
476
- | 接口测试执行器(复杂场景) | 60s | **120s** | 同上 |
477
- | 凭证获取(认证服务) | 5–10s | **15s** | 计 1 次重取;超过 1 次 → 🟡 WARN |
478
- | 单个 HTTP GET | < 1s | **8s** | requestDurationMs > 10s → 🟡 SLOW |
479
- | 单个 HTTP POST/PUT | < 2s | **10s** | requestDurationMs > 10s → 🟡 SLOW |
480
- | health probe | < 1s | **3s** | 计入启动状态机 |
481
- | 构建工具编译(如 Maven compile) | 10–60s | **180s** | 输出最后 30 行日志后停 |
482
- | 测试命令(如 Maven test) | 60–180s | **300s** | 输出失败用例后停 |
483
- | 资源密集型测试模块 | 60–300s | **600s** | 终止该模块进程树,停止后续模块 |
484
- | service start | 30–60s | **120s** | 4.1 启动状态机收敛 |
485
-
486
- **§5.22 分层耗时与反馈规则**:
487
- - 等待 > 10s 必须输出一次状态行(启动等待、执行器、构建工具均适用)
488
- - 不得静默等待
489
- - **`requestDurationMs`**(单 HTTP 请求耗时):`> 10000` → 🟡 SLOW;`> 30000` → ❌ TIMEOUT_RISK
490
- - **`batchDurationMs`**(runner wall-clock,整个批次耗时):`> 180000`(3 分钟)→ 🟡 BATCH_SLOW;`> 300000`(5 分钟)→ ❌ BATCH_TIMEOUT_RISK
491
- - **聚合合同套件场景**(如 API-C01~C04 共享同一 pytest 批次):只记录 `batchReference` + `coveredTests`,**禁止用 `batchDurationMs / N` 均摊生成伪 `requestDurationMs`**
492
- - 报告必须明确标注是哪一层越界(batch-level 还是 request-level),不得混用
493
- - 请求慢不得忽略,必须说明是服务、网络、认证还是工具调用开销
494
-
495
- ## 认证凭证缓存与复用
496
-
497
- ### 缓存文件
498
-
499
- `.harness/changes/<change-name>/runtime/credential-cache.json`(不提交到 git)
500
-
501
- ### 缓存结构
502
-
503
- ```json
504
- {
505
- "baseUrl": "http://127.0.0.1:<port>",
506
- "profile": "<profile>",
507
- "credentials": {
508
- "admin": {
509
- "username": "admin",
510
- "role": "<角色,如 SUPER_ADMIN>",
511
- "token": "<raw token only in runtime file>",
512
- "tokenHash": "<sha256 prefix>",
513
- "createdAt": "2026-06-22T10:00:00+08:00",
514
- "lastValidatedAt": "2026-06-22T10:15:00+08:00",
515
- "expiresAt": null
516
- },
517
- "normal_user": {
518
- "username": "user1",
519
- "role": "<角色,如 NORMAL>",
520
- "token": "<raw token only in runtime file>",
521
- "tokenHash": "<sha256 prefix>",
522
- "createdAt": "2026-06-22T10:00:00+08:00",
523
- "lastValidatedAt": "2026-06-22T10:15:00+08:00",
524
- "expiresAt": null
525
- }
526
- }
527
- }
528
- ```
529
-
530
- ### 凭证使用策略
531
-
532
- 1. 先读取 `credential-cache.json`
533
- 2. 如果已有目标角色凭证,先用**本地轻量接口**验证(如 `GET /meta`,直连本地 baseURL)
534
- 3. 验证通过(200 + code=0)则复用,**不重新登录、不访问远程认证服务**
535
- 4. 验证失败(401 / 凭证过期 / login required)→ 才访问远程认证服务(如 SSO)重新获取并写回 cache
536
- 5. 同一上下文中,前面已获取过凭证时必须优先复用
537
- 6. **接口测试执行器必须使用 request context 或原生 HTTP 客户端直接请求本地 baseURL,不得依赖浏览器当前页面 origin**
538
- 7. **不得因浏览器当前页面 origin 在认证服务就重新获取凭证**——凭证是独立凭证,与浏览器停留页面无关
539
- 8. **禁止低效流程**:先在远程认证服务页面获取凭证 → 导航到 localhost → 再重新获取凭证。正确流程是直接用本地 baseURL + 已缓存凭证验证,缓存失效才走认证服务
540
- 9. **不得在报告、execution-log、对话总结中输出明文凭证**
541
-
542
- > 凭证脱敏与持久化处理遵循 `../protocols/sensitive-info-protocol.md`。
543
-
544
- **输出示例(正确)**:
545
- ```
546
- 凭证策略:
547
- - admin 凭证: ✅ 复用缓存(本地轻量接口验证通过),lastValidatedAt=2026-06-22T10:15:00+08:00
548
- - normal 凭证: 🔄 缓存失效,已通过认证服务刷新
549
- Admin 凭证获取成功:<CREDENTIAL_REDACTED>,hash=sha256:abcd1234
550
- ```
551
-
552
- **输出示例(错误)**:
553
- ```
554
- Admin 凭证获取成功:aedcf3b8c9d2e1f4...
555
- ```
556
-
557
- ## 测试数据治理
558
-
559
- ### 测试数据命名
560
-
561
- 接口测试创建数据必须使用唯一前缀:
562
-
563
- ```
564
- TEST_<change-name>_<timestamp>_<short-random>
565
- ```
566
-
567
- 示例:`TEST_fix-pagination_20260622_a3f2`
568
-
569
- 所有测试数据编码、名称等必须带此前缀。
570
-
571
- ### 测试数据冲突预防
572
-
573
- 存在唯一约束的字段(按项目识别):
574
-
575
- 1. 使用随机值(如 `900000 + random`)
576
- 2. 先查询已有值后避让
577
- 3. 使用唯一隔离值
578
-
579
- **不得**因唯一约束字段与本地预存数据冲突导致大面积 BLOCKED。
580
-
581
- ### 请求体生成(禁止临场猜字段)
582
-
583
- 生成执行器前必须建立 payload schema:
584
-
585
- 1. 读取对应数据契约 / DTO / 接口定义(如 `<XxxSaveReqVO>` / `<XxxQueryReqVO>`)
586
- 2. 读取接口层方法(参数注解、校验注解,如 Controller 方法)
587
- 3. 读取已有测试 / Postman / 真实请求样例
588
- 4. 在执行器注释或 JSON 中记录字段来源(如 "from <数据契约名>")
589
-
590
- ### 测试数据记录
591
-
592
- 测试报告必须包含测试数据表:
593
-
594
- ```markdown
595
- ## 测试数据
596
- | 类型 | ID | Code | 用途 | 是否需要清理 |
597
- |------|----|------|------|:----------:|
598
- | 资源 | 123 | TEST_fix-pagination_20260622_a3f2_res1 | 分页查询测试 | ✅ 已清理 |
599
- | 资源 | 456 | TEST_fix-pagination_20260622_a3f2_res2 | 分页查询测试 | 🟡 接口不支持删除 |
600
- ```
601
-
602
- ### 清理策略
603
-
604
- - 如果接口支持删除、禁用或回滚 → 测试结束后清理
605
- - 不能清理 → 记录遗留数据和原因
606
- - 不得反复试错创建冲突数据
607
-
608
- ## 响应验证
609
-
610
- - HTTP 状态码 与预期对比
611
- - `code` 字段 与预期对比(**自动兼容两种格式**:下划线 `1_003_002_009` 和数字 `1003002009`)
612
- - `message` 关键词匹配(模糊匹配即可)
613
-
614
- ## 数据兼容测试
615
-
616
- 如果场景表有「数据兼容场景」:查询已有数据,验证新字段返回 null 或默认值,不报错。
617
-
618
- ## 覆盖标注诚实性规则
619
-
620
- 场景状态标注规则:
621
-
622
- - ✅ 仅当断言实际执行**且**场景声明的前置条件/数据真实构造。
623
- - 🟡(推断):未构造场景条件、以相邻场景或同接口行为推断时使用,必须注明推断依据。
624
- - 用同一请求重复调用来"覆盖"不同异常场景 → 一律 🟡。
625
- - 报告汇总行的通过数只统计 ✅。
626
-
627
- ## 输出格式(测试报告模板)
628
-
629
- 测试完成后,将报告保存到 `.harness/changes/<change-name>/reports/test/test-report-YYYYMMDD-HHmm.md`(时间戳格式:日期+时分),同时在控制台输出摘要。
630
-
631
- ```markdown
632
- ## 测试报告 — <功能名>
633
-
634
- ### 请求执行器
635
- - 接口测试执行器: ✅ 使用 / ❌ 不可用,原因:...
636
- - PowerShell batch runner (.ps1): 未使用 / 🟡 fallback,原因:...
637
- - Playwright MCP browser_evaluate: 未使用 / 🟡 fallback,原因:...
638
- - curl: 未使用 / 🟡 fallback,原因:...
639
-
640
- ### 服务生命周期
641
- | 项 | 值 |
642
- |---|---|
643
- | serviceState | AI_STARTED / USER_STARTED / REUSED_EXISTING / NOT_STARTED |
644
- | pid | 12345 |
645
- | startCommand | <脱敏的 PowerShell 启动命令> |
646
- | stopAfterTest | true / false |
647
- | stopped | ✅ / ❌ / N/A |
648
-
649
- ### 凭证策略
650
- - admin 凭证: ✅ 复用缓存(本地验证通过) / 🔄 缓存失效已刷新(认证服务)
651
- - normal 凭证: ✅ 复用缓存 / 🔄 已刷新
652
- - credentialRefreshCount: 0 / 1(>1 → 🟡 WARN)
653
-
654
- ### 单元测试
655
- > ✅ 复用 harness-run 单元测试结果:Tests run: N, Failures: 0, Errors: 0
656
- > (diffHash=<...>, module=<...>, profile=<...>, scope=<...>)
657
- > 或:🔄 已重跑(原因:diffHash 变化 / 行为性 post-test 修改 / run 未跑全量)
658
-
659
- | 指标 | 数值 |
660
- |------|:----:|
661
- | 总测试数 | 31 |
662
- | 通过 | 31 |
663
- | 失败 | 0 |
664
- | 跳过 | 0 |
665
-
666
- ### 执行器三阶段
667
- | 阶段 | 状态 | 说明 |
668
- |---|---|---|
669
- | setup | ✅ 全部成功 / ❌ N 个错误 | createResource OK |
670
- | test | N PASS / M FAIL / K BLOCKED / J SKIPPED | BLOCKED 全部因 setup.createResource 失败 |
671
- | cleanup | cleaned=X / leftover=Y | 接口 /<resource> 不支持删除,2 条遗留 |
672
-
673
- ### 接口测试
674
- | # | 场景 | 方法 | URL | 预期 | 实际 | requestDurationMs | 状态 |
675
- |:--:|------|:----:|-----|------|------|----------:|:--:|
676
- | API-001 | 创建资源 | POST | /api/xxx | 200, code=0 | 200, code=0 | 245 | ✅ PASS |
677
- | API-002 | 参数校验 | POST | /api/xxx | code=xxx | code=xxx | 180 | ✅ PASS |
678
- | API-003 | 查询子规则 | GET | /api/xxx/{id} | 200 | — | — | 🟡 BLOCKED(setup.createRule 失败) |
679
-
680
- ### 请求耗时统计(§5.22 分层耗时)
681
- | 层级 | 场景/批次 | 方法 | URL | 耗时 | 状态 |
682
- |------|----------|:----:|-----|----:|:----:|
683
- | request | API-001 | POST | /api/xxx | 245ms | ✅ |
684
- | request | API-010 | GET | /api/yyy | 12450ms | 🟡SLOW |
685
- | batch | pytest-batch-1 | — | — | 158000ms | 🟡BATCH_SLOW |
686
-
687
- > **§5.22 分层耗时说明**:
688
- > - `request` 层级记录单 HTTP 请求耗时(`requestDurationMs`)
689
- > - `batch` 层级记录 runner wall-clock(`batchDurationMs`),整个 pytest 批次耗时
690
- > - 聚合合同套件场景(如 API-C01~C04 共享同一批次)只记录一行 `batch` 条目 + `coveredTests` 列表,**不得均摊为 4 个伪 `request` 条目**
691
-
692
- ### 数据兼容
693
- | # | 场景 | 预期 | 实际 | 结果 |
694
- |:--:|------|------|------|:--:|
695
- | COM-001 | 旧数据查询 | 200, 不报错 | 200, 新字段=null | ✅ |
696
-
697
- ### 测试数据
698
- | 类型 | ID | Code | 用途 | 是否需要清理 |
699
- |------|----|------|------|:----------:|
700
- | 资源 | 123 | TEST_xxx_20260622_a3f2_res1 | 分页测试 | ✅ 已清理 |
701
-
702
- ### 汇总
703
- - 单元测试: N 通过 / 0 失败
704
- - 接口测试: K PASS / L FAIL / B BLOCKED / S SKIPPED / P 🟡SLOW
705
- - 数据兼容: N 通过 / 0 失败
706
- - 请求执行器: 接口测试执行器(✅ 正常)
707
- - serviceState: AI_STARTED → ✅ stopped
708
- - 测试数据: N 条已清理 / M 条遗留
709
- - credentialRefreshCount: 0
710
-
711
- ### 归档数据与平台监控(顶层维度状态)
712
- - compile: ✅ OK
713
- - unitTest: ✅ OK / 🟡 REUSED_FROM_RUN
714
- - apiTest: **OK / PARTIAL / BLOCKED / NOT_RUN / FAIL**
715
- - 例:`apiTest=PARTIAL` — 15 个 API 场景中 5 个 PASS,9 个 BLOCKED,1 个 FAIL
716
- - gitDiffCheck: ✅
717
- - serviceLifecycle: ✅ AI_STARTED stopped / 🟡 USER_STARTED 保留
718
-
719
- ### 关门检查结果
720
- - git status --porcelain: ✅/❌
721
- - git diff --stat: ✅/❌
722
- - git diff --check: ✅/❌(❌ → 最终结果 ❌FAIL)
723
- - 明文敏感信息: ✅无/❌有
724
- - runtime 不提交: ✅已确认
725
- - 服务生命周期: AI_STARTED→✅stopped(pid=12345) / USER_STARTED→🟡保留 / REUSED_EXISTING→🟡保留
726
- - 测试数据清理: ✅已清理/🟡N条遗留
727
- - 执行器表完整性: ✅四种执行器均已列出,未与接口测试执行器混写
728
-
729
- ### 下一步
730
- - 如果 ✅OK:进入 /harness-review
731
- - 如果 🟡WARN:根据 WARN 原因决定是否补充测试或进入 review
732
- - 如果 ❌FAIL:修复失败项后重新运行 /harness-test
733
- ```
734
-
735
- ## CLI 速查(gate / ledger)
736
-
737
- > test 阶段常用子集。`--task` **仅在该 change 启用 checkpoint 时必需**。ledger status 枚举: ok|fail|not_run(没有 PASS)。`record` 还需 `--duration-ms`、`--evidence`,以及 `--files` 或 `--profile-input`+`--project`。
738
- > `--skills-root` 仅用于 `begin`(及 `lint-skills`):必须是 adapter 根(如 `.cursor/skills`),不是 `scripts/` 子目录。**`close` 不需要 `--skills-root`**(该子命令不接受此参数)。
739
- >
740
- > ⚠️ **`--project` 一律传路径,不传项目名**(在项目根就写 `--project .`)。传项目名会解析成 `<cwd>/<名字>` 并报 `PROJECT_ROOT_INVALID` / `EXECUTION_ROOT_INVALID`。
741
-
742
- ```powershell
743
- # gate begin/close(phase=test;--task 仅 checkpoint 启用时必需;close 不需要 --skills-root)
744
- python <skills-root>/scripts/harness_gate.py begin --change <cn> --phase test --skills-root <skills-root> [--task N]
745
- python <skills-root>/scripts/harness_gate.py close --change <cn> --phase test --status OK --to-phase <plannedPhases 中 test 的后继> --executor <tool> [--task N]
746
-
747
- # ledger 记录 / 复用(--profile-input = verification key,不是文件路径)
748
- python <skills-root>/scripts/harness_ledger.py record --change-dir <dir> --verification unitTestFull --status ok --command "<完整命令>" --exit-code 0 --duration-ms 120000 --evidence "Tests run: N, Failures: 0" --coverage full --files "packages/core/src/index.ts"
749
- python <skills-root>/scripts/harness_ledger.py record --change-dir <dir> --verification browserTest --status ok --command "<真实栈 Playwright 命令>" --exit-code 0 --duration-ms 120000 --evidence "Browser E2E: N passed, 0 failed" --coverage module --files "<Playwright 配置与受测 spec>"
750
- python <skills-root>/scripts/harness_ledger.py can-reuse --change-dir <dir> --verification unitTestFull --profile-input unitTestFull --project <project>
751
-
752
- # scenario-manifest schemaVersion 2:绑定场景必须带 receipt,先生成骨架再 record
753
- python <skills-root>/scripts/harness_ledger.py scenario-receipt-template --change-dir <dir> --scenario-ids "API-001,API-002" --runner <runner 名> --out runtime/scenario-receipt-api.json --json
754
- ```
755
-
756
- > **Ledger v3(v2 契约 / split-v1 布局起)**:`record` 强制顶层身份(缺失非零退出、不写账本);`--metrics-json` 必须过 typed schema(unit/apiTest/browserTest/apiContract/dbCompatibility 各有不同必填键);`browserTest` 在报告中投影为 `browserE2E`;dbCompatibility 等不适用验证用 `--applicability NOT_APPLICABLE --applicability-reason "<scope 原因>"`(不计通过也不计失败)。legacy 契约行为不变。详见 `../protocols/ledger-protocol.md` 第十节。
757
-
758
- ### 常见报错对照
759
-
760
- | 报错 | 原因 | 处理 |
761
- |------|------|------|
762
- | `unsupported status: PASS` | ledger status 无 PASS | 改用 `ok` / `fail` / `not_run` |
763
- | `TASK_NUMBER_REQUIRED` | 该 change 启用了 checkpoint(如 foundation-gate pending) | 补 `--task N` |
764
- | skills-root / BUNDLE_IDENTITY_* | `begin` 未传或传了 `.../scripts` 子目录(`close` 不接受该参数) | 仅对 `begin` 显式传 adapter 根:`.cursor/skills` / `.claude/skills`(含 `.harness-build.json`) |
765
- | `--profile-input` 指向文件路径 | 参数语义是 verification key | 传 `compile` / `unitTestFull` 等 key,不是 JSON 路径 |
766
- | `record requires --files or a non-empty --profile-input file set` | 缺少输入文件集 | 补 `--files` 或 `--profile-input <key> --project <project>` |
767
- | `--profile-input requires --project` | can-reuse/record 展开 profile 需要项目根 | 补 `--project <project>` |
768
- | `record` 缺 `--duration-ms` / `--evidence` | 参数为必填 | 按模板补齐 |
769
- | `PROJECT_ROOT_INVALID` | `--project` 传了项目名而不是路径 | 传 `.` 或绝对路径;报错的 `resolvedProject` 显示实际解析结果 |
770
- | `SCENARIO_RECEIPT_REQUIRED` | manifest 是 schemaVersion 2,`--scenario-ids` 必须配 receipt | 用 `scenario-receipt-template` 生成骨架 |
771
- | `SCENARIO_RECEIPT_NOT_FOUND` | receipt 路径找不到 | 看报错的 `triedPaths`;相对路径同时按 CWD 与 `--change-dir` 解析 |
772
- | `REQUIRED_SCENARIO_NOT_EXECUTED`(test 关门) | `ownerPhase=test` 的场景到 test 阶段仍无通过 receipt——这是真阻塞 | 补跑该场景;接口被验证码挡住时按 `pitfalls.md` 规则 31 记 BLOCKED,不得伪造 receipt |
773
-
774
- `can-reuse` 的主文案按 `executionNeed` 呈现,错误码仅放技术详情:`first-run` 表示首次执行,`rerun` 表示已有证据因输入或环境变化失效,`evidence-incomplete` 表示旧记录缺少当前契约字段,`reuse` 表示可直接复用。不得把 `VALIDATION_MISSING` 翻译成“强制重跑”。
775
-
776
- ## 结果分级规则
777
-
778
- > 结果状态分级与证据要求遵循 `../protocols/evidence-based-reporting-protocol.md`。
779
-
780
- ### 整体结果
781
-
782
- **✅OK**(全部满足):
783
- - 所有 P0 接口/权限/数据兼容场景真实验证通过
784
- - 无未解释的环境变更
785
- - 请求执行器、token 策略、测试数据均有记录
786
- - 关键测试请求有 durationMs 证据
787
- - git diff --check 通过
788
- - 服务生命周期已正确收尾
789
-
790
- **🟡WARN**(任一满足):
791
- - 业务验证通过,但存在测试环境变更
792
- - 使用了 fallback 请求执行器
793
- - 有测试数据未清理
794
- - 有 P1 场景未验证
795
- - 有慢请求(🟡SLOW)/ 任一 P0 场景被跳过 / BLOCKED
796
- - 有非关键降级
797
- - AI_STARTED 服务未关闭
798
- - `credentialRefreshCount > 1`
799
-
800
- **❌FAIL**(任一满足):
801
- - 任一 P0 场景 FAIL(请求执行了,断言失败)
802
- - 服务无法启动 / 0.1 命令执行模式失败且未恢复
803
- - 编译/单测失败
804
- - 批量 runner 执行失败且无有效 fallback
805
- - git diff --check 失败
806
-
807
- > **P0 场景 BLOCKED 不得仍 OK**:必须 🟡 WARN 或 ❌ FAIL。
808
-
809
- ### API 测试维度状态(写入 `summary-data.json` 并由平台展示)
810
-
811
- | 状态 | 定义 |
812
- |---|---|
813
- | `OK` | P0 API 全部 PASS |
814
- | `PARTIAL` | 部分 PASS + 部分 FAIL/BLOCKED |
815
- | `BLOCKED` | P0 API 全部无法执行(环境/前置数据) |
816
- | `NOT_RUN` | 完全没执行任何 API |
817
- | `FAIL` | P0 API 明确 FAIL |
818
-
819
- > ⚠️ **不得**把"5 PASS + 9 BLOCKED + 1 FAIL"写成 `apiTest=NOT_RUN`。正确:`apiTest=PARTIAL`。
820
-
821
- ## 请求执行器 fallback 输出
822
-
823
- 在测试报告中必须区分四种执行器(不得笼统写"Playwright"):
824
-
825
- ```markdown
826
- ## 请求执行器
827
- - 接口测试执行器: ✅ 使用 / ❌ 不可用,原因:...
828
- - PowerShell batch runner (.ps1): 未使用 / 🟡 fallback,原因:...
829
- - Playwright MCP browser_evaluate: 未使用 / 🟡 fallback,原因:...
830
- - curl: 未使用 / 🟡 fallback,原因:...
831
- ```
832
-
833
- 默认期望:`接口测试执行器 ✅ 使用`,其余三项 `未使用`。
834
-
835
- - 如果执行器正常执行,其余三项均标"未使用"
836
- - 如果首选执行器不可执行降级为 PowerShell batch / 多次 MCP `browser_evaluate`,按实际标 🟡 fallback 并写原因
837
- - 如果最终用了 curl,必须解释为什么接口测试执行器、PowerShell batch、Playwright MCP 都不可用
838
- - **不得**把 "Playwright API 执行器" 与 "Playwright MCP browser_evaluate" 混写
839
-
840
- ## 关门检查
841
-
842
- 在输出最终总结前,必须执行并展示以下 10 项检查:
843
-
844
- 1. `powershell.exe -NoProfile -Command "git status --porcelain"`
845
- 2. `powershell.exe -NoProfile -Command "git diff --stat"`
846
- 3. `powershell.exe -NoProfile -Command "git diff --check"`(如果失败 → 最终结果 ❌FAIL)
847
- 4. 检查报告和日志是否包含明文凭证/password/secret/access-key/client-secret
848
- 5. 检查 `.harness/changes/<change>/runtime/` 是否不会被提交(.gitignore 确认)
849
- 6. **服务生命周期收尾**:AI_STARTED→Stop-Process / USER_STARTED→只提示 / REUSED_EXISTING→保留或用户确认 / NOT_STARTED→N/A
850
- 7. **资源生命周期收尾**:单实例锁已释放、Runner 管理的进程树无残留;禁止宽泛停止用户原有进程
851
- 8. 检查测试数据是否需要清理
852
- 9. 检查请求执行器结果是否完整(4 种执行器表完整、未与接口测试执行器混写)
853
- 10. 检查是否存在慢请求或超时风险;若有未清理测试数据、fallback、慢请求或环境变更 → 至少 🟡WARN
854
-
855
- ## 真实 diffHash 生成
856
-
857
- > diffHash 与 ledger 复用规则遵循 `../protocols/ledger-protocol.md`。
858
-
859
- 后续复用 ledger 前必须生成真实 SHA-256 diffHash,且必须同时覆盖 tracked/untracked 变化和 test-tracking manifest 中被忽略的测试。`<baseCommit>` 从 ledger 读取(plan 阶段写入),缺失时用 `git merge-base HEAD <默认分支>`:
860
-
861
- ```powershell
862
- python <skills-root>/scripts/harness_ledger.py diff-hash --repo . --base <baseCommit> --change-dir ".harness/changes/<change-name>" --json
863
- ```
864
-
865
- 通过 `harness_ledger.py record` 写入 state layout resolver 返回的 `evidence/verification-ledger.json`:
866
-
867
- ```json
868
- {
869
- "diffHash": "sha256:<real_hash>",
870
- "algorithmVersion": "content-changeset-2"
871
- }
872
- ```
873
-
874
- 禁止使用描述性字符串、单段 `git diff` 或自写 hash 替代脚本。manifest 无效、路径越界或 hash 漂移时必须停止,不得删除 manifest 后继续复用旧 ledger。
875
-
876
- ## 执行日志记录
877
-
878
- `/harness-test` 只向 `events.ndjson` 追加事件(schema_version 3,兼容读取 v1/v2);`logs/execution-log.md` 由 `harness_events.py append` 自动渲染。Phase 0 之前 append `phase.start`;各阶段写入 `command` / `verification` / `decision` / `issue` / `artifact`,人类可读摘要放 `note`。事件类型与脚本用法见 [[../protocols/report-pipeline-protocol.md|report-pipeline-protocol]] 与 SKILL.md `## 执行日志`。
879
-
880
- 关键 `note` / 事件须覆盖:0.1 命令执行模式、fallback 执行器、serviceState、凭证策略、单元测试复用、批量执行器、verification-ledger 写入、关门检查、API 状态(不得把 PARTIAL 写成 NOT_RUN)。