@hunter-harness/workflow-harness 0.2.27 → 0.2.29

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 (226) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/contracts/workflow-policy.json +34 -2
  3. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +1 -1
  4. package/harness/bundles/general/claude-code/harness-archive/templates/render-summary.mjs +25 -6
  5. package/harness/bundles/general/claude-code/harness-archive/templates/summary-data-template.json +44 -0
  6. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  7. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  8. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  9. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
  10. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
  11. package/harness/bundles/general/claude-code/harness-review/SKILL.md +1 -1
  12. package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
  13. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
  14. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
  15. package/harness/bundles/general/claude-code/harness-test/SKILL.md +26 -2
  16. package/harness/bundles/general/claude-code/harness-test/checklist.md +15 -0
  17. package/harness/bundles/general/claude-code/harness-test/reference.md +28 -4
  18. package/harness/bundles/general/claude-code/scripts/harness_archive.py +2061 -187
  19. package/harness/bundles/general/claude-code/scripts/harness_events.py +43 -9
  20. package/harness/bundles/general/claude-code/scripts/harness_gate.py +491 -7
  21. package/harness/bundles/general/claude-code/scripts/harness_integration.py +232 -0
  22. package/harness/bundles/general/claude-code/scripts/harness_phase.py +758 -1
  23. package/harness/bundles/general/claude-code/scripts/harness_plan_finalize.py +74 -0
  24. package/harness/bundles/general/claude-code/scripts/harness_retry.py +175 -0
  25. package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +702 -22
  26. package/harness/bundles/general/claude-code/scripts/harness_test_runner.py +974 -0
  27. package/harness/bundles/general/claude-code/scripts/harness_workflow_policy.py +87 -0
  28. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  29. package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +34 -2
  30. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
  31. package/harness/bundles/general/codebuddy/harness-archive/templates/render-summary.mjs +25 -6
  32. package/harness/bundles/general/codebuddy/harness-archive/templates/summary-data-template.json +44 -0
  33. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  34. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  35. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  36. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  37. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
  38. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
  39. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
  40. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
  41. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
  42. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +26 -2
  43. package/harness/bundles/general/codebuddy/harness-test/checklist.md +15 -0
  44. package/harness/bundles/general/codebuddy/harness-test/reference.md +28 -4
  45. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +2061 -187
  46. package/harness/bundles/general/codebuddy/scripts/harness_events.py +43 -9
  47. package/harness/bundles/general/codebuddy/scripts/harness_gate.py +491 -7
  48. package/harness/bundles/general/codebuddy/scripts/harness_integration.py +232 -0
  49. package/harness/bundles/general/codebuddy/scripts/harness_phase.py +758 -1
  50. package/harness/bundles/general/codebuddy/scripts/harness_plan_finalize.py +74 -0
  51. package/harness/bundles/general/codebuddy/scripts/harness_retry.py +175 -0
  52. package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +702 -22
  53. package/harness/bundles/general/codebuddy/scripts/harness_test_runner.py +974 -0
  54. package/harness/bundles/general/codebuddy/scripts/harness_workflow_policy.py +87 -0
  55. package/harness/bundles/general/codex/.harness-build.json +1 -1
  56. package/harness/bundles/general/codex/contracts/workflow-policy.json +34 -2
  57. package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
  58. package/harness/bundles/general/codex/harness-archive/templates/render-summary.mjs +25 -6
  59. package/harness/bundles/general/codex/harness-archive/templates/summary-data-template.json +44 -0
  60. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  61. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
  62. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  63. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  64. package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
  65. package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
  66. package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
  67. package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
  68. package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
  69. package/harness/bundles/general/codex/harness-test/SKILL.md +26 -2
  70. package/harness/bundles/general/codex/harness-test/checklist.md +15 -0
  71. package/harness/bundles/general/codex/harness-test/reference.md +28 -4
  72. package/harness/bundles/general/codex/scripts/harness_archive.py +2061 -187
  73. package/harness/bundles/general/codex/scripts/harness_events.py +43 -9
  74. package/harness/bundles/general/codex/scripts/harness_gate.py +491 -7
  75. package/harness/bundles/general/codex/scripts/harness_integration.py +232 -0
  76. package/harness/bundles/general/codex/scripts/harness_phase.py +758 -1
  77. package/harness/bundles/general/codex/scripts/harness_plan_finalize.py +74 -0
  78. package/harness/bundles/general/codex/scripts/harness_retry.py +175 -0
  79. package/harness/bundles/general/codex/scripts/harness_test_guard.py +702 -22
  80. package/harness/bundles/general/codex/scripts/harness_test_runner.py +974 -0
  81. package/harness/bundles/general/codex/scripts/harness_workflow_policy.py +87 -0
  82. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  83. package/harness/bundles/general/cursor/contracts/workflow-policy.json +34 -2
  84. package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
  85. package/harness/bundles/general/cursor/harness-archive/templates/render-summary.mjs +25 -6
  86. package/harness/bundles/general/cursor/harness-archive/templates/summary-data-template.json +44 -0
  87. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  88. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  89. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  90. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  91. package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
  92. package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
  93. package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
  94. package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
  95. package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
  96. package/harness/bundles/general/cursor/harness-test/SKILL.md +26 -2
  97. package/harness/bundles/general/cursor/harness-test/checklist.md +15 -0
  98. package/harness/bundles/general/cursor/harness-test/reference.md +28 -4
  99. package/harness/bundles/general/cursor/scripts/harness_archive.py +2061 -187
  100. package/harness/bundles/general/cursor/scripts/harness_events.py +43 -9
  101. package/harness/bundles/general/cursor/scripts/harness_gate.py +491 -7
  102. package/harness/bundles/general/cursor/scripts/harness_integration.py +232 -0
  103. package/harness/bundles/general/cursor/scripts/harness_phase.py +758 -1
  104. package/harness/bundles/general/cursor/scripts/harness_plan_finalize.py +74 -0
  105. package/harness/bundles/general/cursor/scripts/harness_retry.py +175 -0
  106. package/harness/bundles/general/cursor/scripts/harness_test_guard.py +702 -22
  107. package/harness/bundles/general/cursor/scripts/harness_test_runner.py +974 -0
  108. package/harness/bundles/general/cursor/scripts/harness_workflow_policy.py +87 -0
  109. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  110. package/harness/bundles/java/claude-code/contracts/workflow-policy.json +34 -2
  111. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  112. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
  113. package/harness/bundles/java/claude-code/harness-archive/templates/render-summary.mjs +25 -6
  114. package/harness/bundles/java/claude-code/harness-archive/templates/summary-data-template.json +44 -0
  115. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  116. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  117. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  118. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  119. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  120. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
  121. package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
  122. package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
  123. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
  124. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
  125. package/harness/bundles/java/claude-code/harness-test/SKILL.md +26 -2
  126. package/harness/bundles/java/claude-code/scripts/harness_archive.py +2061 -187
  127. package/harness/bundles/java/claude-code/scripts/harness_events.py +43 -9
  128. package/harness/bundles/java/claude-code/scripts/harness_gate.py +491 -7
  129. package/harness/bundles/java/claude-code/scripts/harness_integration.py +232 -0
  130. package/harness/bundles/java/claude-code/scripts/harness_phase.py +758 -1
  131. package/harness/bundles/java/claude-code/scripts/harness_plan_finalize.py +74 -0
  132. package/harness/bundles/java/claude-code/scripts/harness_retry.py +175 -0
  133. package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +702 -22
  134. package/harness/bundles/java/claude-code/scripts/harness_test_runner.py +974 -0
  135. package/harness/bundles/java/claude-code/scripts/harness_workflow_policy.py +87 -0
  136. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  137. package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +34 -2
  138. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  139. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
  140. package/harness/bundles/java/codebuddy/harness-archive/templates/render-summary.mjs +25 -6
  141. package/harness/bundles/java/codebuddy/harness-archive/templates/summary-data-template.json +44 -0
  142. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  143. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  144. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  145. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  146. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  147. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
  148. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
  149. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
  150. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
  151. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
  152. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +26 -2
  153. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +2061 -187
  154. package/harness/bundles/java/codebuddy/scripts/harness_events.py +43 -9
  155. package/harness/bundles/java/codebuddy/scripts/harness_gate.py +491 -7
  156. package/harness/bundles/java/codebuddy/scripts/harness_integration.py +232 -0
  157. package/harness/bundles/java/codebuddy/scripts/harness_phase.py +758 -1
  158. package/harness/bundles/java/codebuddy/scripts/harness_plan_finalize.py +74 -0
  159. package/harness/bundles/java/codebuddy/scripts/harness_retry.py +175 -0
  160. package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +702 -22
  161. package/harness/bundles/java/codebuddy/scripts/harness_test_runner.py +974 -0
  162. package/harness/bundles/java/codebuddy/scripts/harness_workflow_policy.py +87 -0
  163. package/harness/bundles/java/codex/.harness-build.json +1 -1
  164. package/harness/bundles/java/codex/contracts/workflow-policy.json +34 -2
  165. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  166. package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
  167. package/harness/bundles/java/codex/harness-archive/templates/render-summary.mjs +25 -6
  168. package/harness/bundles/java/codex/harness-archive/templates/summary-data-template.json +44 -0
  169. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  170. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
  171. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  172. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  173. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  174. package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
  175. package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
  176. package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
  177. package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
  178. package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
  179. package/harness/bundles/java/codex/harness-test/SKILL.md +26 -2
  180. package/harness/bundles/java/codex/scripts/harness_archive.py +2061 -187
  181. package/harness/bundles/java/codex/scripts/harness_events.py +43 -9
  182. package/harness/bundles/java/codex/scripts/harness_gate.py +491 -7
  183. package/harness/bundles/java/codex/scripts/harness_integration.py +232 -0
  184. package/harness/bundles/java/codex/scripts/harness_phase.py +758 -1
  185. package/harness/bundles/java/codex/scripts/harness_plan_finalize.py +74 -0
  186. package/harness/bundles/java/codex/scripts/harness_retry.py +175 -0
  187. package/harness/bundles/java/codex/scripts/harness_test_guard.py +702 -22
  188. package/harness/bundles/java/codex/scripts/harness_test_runner.py +974 -0
  189. package/harness/bundles/java/codex/scripts/harness_workflow_policy.py +87 -0
  190. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  191. package/harness/bundles/java/cursor/contracts/workflow-policy.json +34 -2
  192. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  193. package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
  194. package/harness/bundles/java/cursor/harness-archive/templates/render-summary.mjs +25 -6
  195. package/harness/bundles/java/cursor/harness-archive/templates/summary-data-template.json +44 -0
  196. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  197. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  198. package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  199. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  200. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  201. package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
  202. package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
  203. package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
  204. package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
  205. package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
  206. package/harness/bundles/java/cursor/harness-test/SKILL.md +26 -2
  207. package/harness/bundles/java/cursor/scripts/harness_archive.py +2061 -187
  208. package/harness/bundles/java/cursor/scripts/harness_events.py +43 -9
  209. package/harness/bundles/java/cursor/scripts/harness_gate.py +491 -7
  210. package/harness/bundles/java/cursor/scripts/harness_integration.py +232 -0
  211. package/harness/bundles/java/cursor/scripts/harness_phase.py +758 -1
  212. package/harness/bundles/java/cursor/scripts/harness_plan_finalize.py +74 -0
  213. package/harness/bundles/java/cursor/scripts/harness_retry.py +175 -0
  214. package/harness/bundles/java/cursor/scripts/harness_test_guard.py +702 -22
  215. package/harness/bundles/java/cursor/scripts/harness_test_runner.py +974 -0
  216. package/harness/bundles/java/cursor/scripts/harness_workflow_policy.py +87 -0
  217. package/harness/manifests/general/claude-code.json +34 -26
  218. package/harness/manifests/general/codebuddy.json +34 -26
  219. package/harness/manifests/general/codex.json +34 -26
  220. package/harness/manifests/general/cursor.json +34 -26
  221. package/harness/manifests/java/claude-code.json +34 -26
  222. package/harness/manifests/java/codebuddy.json +34 -26
  223. package/harness/manifests/java/codex.json +34 -26
  224. package/harness/manifests/java/cursor.json +34 -26
  225. package/hunter-workflow-family.json +2 -2
  226. package/package.json +1 -1
@@ -15,6 +15,7 @@ POLICY_REL = Path("harness") / "contracts" / "workflow-policy.json"
15
15
  TOP_LEVEL_KEYS = frozenset(
16
16
  {
17
17
  "schemaVersion",
18
+ "testExecution",
18
19
  "riskTiers",
19
20
  "skills",
20
21
  "requiredArtifacts",
@@ -62,6 +63,27 @@ CHECKPOINT_RULE_KEYS = frozenset(
62
63
  "reviewerTool",
63
64
  }
64
65
  )
66
+ TEST_EXECUTION_KEYS = frozenset(
67
+ {
68
+ "runner",
69
+ "defaultProfile",
70
+ "maxWorkers",
71
+ "singleInstance",
72
+ "processTreeCleanup",
73
+ "detachedProcessPreflight",
74
+ "confirmationFlag",
75
+ "confirmationRequiredProfiles",
76
+ "resourceIntensiveModules",
77
+ "profiles",
78
+ }
79
+ )
80
+ TEST_EXECUTION_PROFILE_KEYS = frozenset(
81
+ {
82
+ "description",
83
+ "includesResourceIntensive",
84
+ "moduleTimeoutSeconds",
85
+ }
86
+ )
65
87
 
66
88
 
67
89
  class PolicyValidationError(ValueError):
@@ -94,6 +116,71 @@ def validate_policy(data: Any) -> dict[str, Any]:
94
116
  if data["schemaVersion"] != 1:
95
117
  raise PolicyValidationError("unsupported schemaVersion")
96
118
 
119
+ test_execution = data["testExecution"]
120
+ _require_type(test_execution, dict, "testExecution")
121
+ _reject_unknown(test_execution, TEST_EXECUTION_KEYS, "testExecution")
122
+ for key in ("runner", "defaultProfile", "confirmationFlag"):
123
+ _require_type(test_execution[key], str, f"testExecution.{key}")
124
+ max_workers = test_execution["maxWorkers"]
125
+ _require_type(max_workers, int, "testExecution.maxWorkers")
126
+ if isinstance(max_workers, bool) or max_workers < 1 or max_workers > 2:
127
+ raise PolicyValidationError("testExecution.maxWorkers must be 1 or 2")
128
+ for key in (
129
+ "singleInstance",
130
+ "processTreeCleanup",
131
+ "detachedProcessPreflight",
132
+ ):
133
+ _require_type(test_execution[key], bool, f"testExecution.{key}")
134
+ if not test_execution[key]:
135
+ raise PolicyValidationError(f"testExecution.{key} must be true")
136
+ for key in ("confirmationRequiredProfiles", "resourceIntensiveModules"):
137
+ values = test_execution[key]
138
+ _require_type(values, list, f"testExecution.{key}")
139
+ if any(not isinstance(item, str) or not item for item in values):
140
+ raise PolicyValidationError(
141
+ f"testExecution.{key} must contain non-empty strings"
142
+ )
143
+
144
+ execution_profiles = test_execution["profiles"]
145
+ _require_type(execution_profiles, dict, "testExecution.profiles")
146
+ required_profile_names = {"safe", "system", "full"}
147
+ if set(execution_profiles) != required_profile_names:
148
+ raise PolicyValidationError(
149
+ "testExecution.profiles must define exactly safe, system, and full"
150
+ )
151
+ if test_execution["defaultProfile"] != "safe":
152
+ raise PolicyValidationError("testExecution.defaultProfile must be safe")
153
+ confirmation_profiles = set(test_execution["confirmationRequiredProfiles"])
154
+ if not {"system", "full"}.issubset(confirmation_profiles):
155
+ raise PolicyValidationError(
156
+ "testExecution confirmation must cover system and full"
157
+ )
158
+ for profile_name, profile in execution_profiles.items():
159
+ path = f"testExecution.profiles.{profile_name}"
160
+ _require_type(profile, dict, path)
161
+ _reject_unknown(profile, TEST_EXECUTION_PROFILE_KEYS, path)
162
+ _require_type(profile["description"], str, f"{path}.description")
163
+ _require_type(
164
+ profile["includesResourceIntensive"],
165
+ bool,
166
+ f"{path}.includesResourceIntensive",
167
+ )
168
+ timeout = profile["moduleTimeoutSeconds"]
169
+ _require_type(timeout, int, f"{path}.moduleTimeoutSeconds")
170
+ if isinstance(timeout, bool) or timeout <= 0:
171
+ raise PolicyValidationError(
172
+ f"{path}.moduleTimeoutSeconds must be a positive integer"
173
+ )
174
+ if execution_profiles["safe"]["includesResourceIntensive"]:
175
+ raise PolicyValidationError(
176
+ "testExecution.profiles.safe must exclude resource-intensive tests"
177
+ )
178
+ for profile_name in ("system", "full"):
179
+ if not execution_profiles[profile_name]["includesResourceIntensive"]:
180
+ raise PolicyValidationError(
181
+ f"testExecution.profiles.{profile_name} must include resource-intensive tests"
182
+ )
183
+
97
184
  risk_tiers = data["riskTiers"]
98
185
  _require_type(risk_tiers, dict, "riskTiers")
99
186
  for tier_name, tier in risk_tiers.items():
@@ -2,12 +2,12 @@
2
2
  "schema_version": 2,
3
3
  "profile": "general",
4
4
  "adapter": "claude-code",
5
- "bundle_version": "0.2.19",
5
+ "bundle_version": "0.2.21",
6
6
  "generator": "harness_deploy.py",
7
7
  "files": [
8
8
  {
9
9
  "path": ".harness-build.json",
10
- "sha256": "9da5ac3cdc99fda652e0292657d77ff89590629cc95fea21c336d4782cd46eb2"
10
+ "sha256": "ea2c4ed992ecbcdd6951fc52754a8b40b7408433c4270c6f7797199db5a889b7"
11
11
  },
12
12
  {
13
13
  "path": "agents/harness-evaluator.md",
@@ -31,7 +31,7 @@
31
31
  },
32
32
  {
33
33
  "path": "contracts/workflow-policy.json",
34
- "sha256": "3f39160c6905338a527170c0f15d83715ad56ac9fb449f4f568a6714ccdd3c9a"
34
+ "sha256": "92574af8d7252527be8cd2871675fc02ab7c3df95a72dab93228f6f884844971"
35
35
  },
36
36
  {
37
37
  "path": "harness-archive/checklist.md",
@@ -47,15 +47,15 @@
47
47
  },
48
48
  {
49
49
  "path": "harness-archive/SKILL.md",
50
- "sha256": "535bd2ca8715fe6030b0d6280f260c637d0a70c00111ab3a5cf7bab7b2a4cfd5"
50
+ "sha256": "dc9fe0755237665f6cb7f1502d762741485fb74c0943ccd94033f712c9368125"
51
51
  },
52
52
  {
53
53
  "path": "harness-archive/templates/render-summary.mjs",
54
- "sha256": "7cd1b29dab74510048a0077a7363775f19f47010ba8d46553b88755335e73496"
54
+ "sha256": "9e027c4c26dc5d076c35bb485fc618929d425b1f2b0ac097d45caad9817b29b4"
55
55
  },
56
56
  {
57
57
  "path": "harness-archive/templates/summary-data-template.json",
58
- "sha256": "b5cceb8f85cc99a689723863292119f3aeccacbb17aea7257632353b4e617ff7"
58
+ "sha256": "9f20b313d0810bb7e787aec0fe4a632ab6a598245bfe7b075973026340b8c81f"
59
59
  },
60
60
  {
61
61
  "path": "harness-codebase-map/checklist.md",
@@ -67,7 +67,7 @@
67
67
  },
68
68
  {
69
69
  "path": "harness-codebase-map/SKILL.md",
70
- "sha256": "fb04db711353439594a5fb2acf5004e118cdff0c109f341bb2fb8976102f4cb9"
70
+ "sha256": "101e1bbb7547afc3e5b2dfcf0ce59cfbb883bbfcf33e248fd003099d7f7c129c"
71
71
  },
72
72
  {
73
73
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -127,15 +127,15 @@
127
127
  },
128
128
  {
129
129
  "path": "harness-knowledge-ingest/scripts/harness_knowledge.py",
130
- "sha256": "062115a524d5bd4aec27e40e2b57cf4e7ed6e0509d4a8e6e78a79a62ee32e2c5"
130
+ "sha256": "c7278af0c041f36e466d1730349cc27377729fc772d70f513e171c7152149a20"
131
131
  },
132
132
  {
133
133
  "path": "harness-knowledge-ingest/SKILL.md",
134
- "sha256": "13310e20440e24bbfefed24342a6941935147d7f27219ead08d489cbf631fcb3"
134
+ "sha256": "618c53eb774a2dbdc5498a778cec90ec4c80a820ee73f93bc33085d2854b9623"
135
135
  },
136
136
  {
137
137
  "path": "harness-knowledge-query/SKILL.md",
138
- "sha256": "24db27e5577aeb98bde14d0c4e465b9b5635ff6bce2d12cb6a1bf0d331c08400"
138
+ "sha256": "ecd04aca60a8cec156b998e27ca52f93cbf4f3d6bacb15e1bc66dd85f9c1d6d5"
139
139
  },
140
140
  {
141
141
  "path": "harness-plan/checklist.md",
@@ -151,7 +151,7 @@
151
151
  },
152
152
  {
153
153
  "path": "harness-plan/SKILL.md",
154
- "sha256": "bd8f3e11ada1156d01843e3316c76f8c41743bd0d60237dff9040681571339cb"
154
+ "sha256": "9f309e605432a0951188d9ddda9903da894b1263ebe5b685af6a9e6457a3fe26"
155
155
  },
156
156
  {
157
157
  "path": "harness-review/checklist.md",
@@ -167,7 +167,7 @@
167
167
  },
168
168
  {
169
169
  "path": "harness-review/SKILL.md",
170
- "sha256": "4bf9ad4c922d0c02769aa378270cc40d161077d9d5954bc26ccafe70a0da8bfe"
170
+ "sha256": "f343c09c6199c598a1fb0333b2050b61961e8bddf397123f65e4585c422be02c"
171
171
  },
172
172
  {
173
173
  "path": "harness-run/checklist.md",
@@ -183,7 +183,7 @@
183
183
  },
184
184
  {
185
185
  "path": "harness-run/SKILL.md",
186
- "sha256": "d58739a0b8761e220a2d0887f2bae7eb8345ede23f078560a0acfde22a2f9718"
186
+ "sha256": "26d6d09e94dfa1f974abd3cbb17a439a535362cadad12637ff46e9ed0fa70e72"
187
187
  },
188
188
  {
189
189
  "path": "harness-submit/checklist.md",
@@ -195,7 +195,7 @@
195
195
  },
196
196
  {
197
197
  "path": "harness-submit/SKILL.md",
198
- "sha256": "bb4d5a48576dacf199a29332828958a0bda56fd99b5348d9d7ef393e6de68b4e"
198
+ "sha256": "a80b8331c582d1a6d5cfa864a2b31c9b3e575b9b170e18583e0739073819c731"
199
199
  },
200
200
  {
201
201
  "path": "harness-sync/reference.md",
@@ -203,11 +203,11 @@
203
203
  },
204
204
  {
205
205
  "path": "harness-sync/SKILL.md",
206
- "sha256": "1392f31271625b56227487996aa6b596ca8aa2b4ba2b4dea478c0cda34bb3742"
206
+ "sha256": "9142b15ee0f71d25094186f0b6b672b6807cfa4ff33e213bcd0803501403918e"
207
207
  },
208
208
  {
209
209
  "path": "harness-test/checklist.md",
210
- "sha256": "499bc792815fc364123452f81b00c4043211289538f6f7dd62d19355d60d2e9e"
210
+ "sha256": "f974457a7aa094e1fbdb7d3039b0e8f3cacb777638603366e63a0aaf9a514aad"
211
211
  },
212
212
  {
213
213
  "path": "harness-test/pitfalls-java.md",
@@ -219,7 +219,7 @@
219
219
  },
220
220
  {
221
221
  "path": "harness-test/reference.md",
222
- "sha256": "1b705db0a2f075d7c7aa48a9130719557daf1d5cddc0271ea68d4e75a3f827b2"
222
+ "sha256": "b7cbfc91cff9ed7fef7b9cbee79f81e8cc588ffd956b531570eabef98ad24125"
223
223
  },
224
224
  {
225
225
  "path": "harness-test/scripts/runtime-helpers.mjs",
@@ -227,7 +227,7 @@
227
227
  },
228
228
  {
229
229
  "path": "harness-test/SKILL.md",
230
- "sha256": "17d8472e69d30f64d3e8623599234ce5a30a1b16b0312025ef7988b7a7a2de0c"
230
+ "sha256": "8c8156f492b2ba7de8db3d3bf0961bff084f9a7fbf1393c44296207f31a19806"
231
231
  },
232
232
  {
233
233
  "path": "protocols/archive-report-protocol.md",
@@ -275,7 +275,7 @@
275
275
  },
276
276
  {
277
277
  "path": "scripts/harness_archive.py",
278
- "sha256": "40c9cc17e3b42a92e4aa4ff7fb503cfb10e408c45d1b7cbb825001032a1e55a7"
278
+ "sha256": "97f94770d4adada904732fd7529d5b90bd457e131a6077c3dd2c3906ee01fcd8"
279
279
  },
280
280
  {
281
281
  "path": "scripts/harness_change.py",
@@ -295,15 +295,15 @@
295
295
  },
296
296
  {
297
297
  "path": "scripts/harness_events.py",
298
- "sha256": "5733a66e8512adcbdc7b9f00ef3cc63f43f865ba0cdb14687a16c133d678aa43"
298
+ "sha256": "7f5e9e316c422f7532fe0fcf52beb809125f757af7ccfbdf85fa519c2de4e66d"
299
299
  },
300
300
  {
301
301
  "path": "scripts/harness_gate.py",
302
- "sha256": "abf0717cb8cf1f13b804458017483a981a64ebf812028353543b146be261b6ae"
302
+ "sha256": "29de8510a9377a2651410b4d0a3be1b9eeb44d8e0d7d4becb44e1734c95dd953"
303
303
  },
304
304
  {
305
305
  "path": "scripts/harness_integration.py",
306
- "sha256": "e1c17bc19a0bdcb1cb6f3cfc0074c579ca2becc45712e7bce08b188b6b206184"
306
+ "sha256": "88d0a6ffbdec74ce8c3a994c1ec80e5a0c550b3cccad8d46fb8c355ced1a7721"
307
307
  },
308
308
  {
309
309
  "path": "scripts/harness_ledger.py",
@@ -319,11 +319,11 @@
319
319
  },
320
320
  {
321
321
  "path": "scripts/harness_phase.py",
322
- "sha256": "5f16f9b03dc01a08f3dbc0bb0a416856833836f4c3fcb2c4c0799a876079c43d"
322
+ "sha256": "8143e5b97ff14ba46a508ce346d7a51af0122ef8aeff0543852994fbaca97cba"
323
323
  },
324
324
  {
325
325
  "path": "scripts/harness_plan_finalize.py",
326
- "sha256": "e5152dda3380b1c1acdd219f8af0117b0c1670f0998ea62340f89e27a09f7585"
326
+ "sha256": "1e96a642df48722bf7de1ae2aa53f9c87d641150d939e47686a0b36b5c4547e5"
327
327
  },
328
328
  {
329
329
  "path": "scripts/harness_preflight.py",
@@ -333,6 +333,10 @@
333
333
  "path": "scripts/harness_profile.py",
334
334
  "sha256": "d8f6a07455c27c9167df44b33eb20ef7c6c65530462cd4958794db1063d5ac04"
335
335
  },
336
+ {
337
+ "path": "scripts/harness_retry.py",
338
+ "sha256": "250a6f7fb564fb537ba8680a3385a50ec3dff6625aa4d1488d5c4e09393d20b5"
339
+ },
336
340
  {
337
341
  "path": "scripts/harness_review.py",
338
342
  "sha256": "a741a63f62993d72889e78f540feb57a95e713b4d7a98fa61ff208b2ce914ca7"
@@ -359,11 +363,15 @@
359
363
  },
360
364
  {
361
365
  "path": "scripts/harness_test_guard.py",
362
- "sha256": "a5792ca55242770d504a4a1ed458746a73bbf5bfa023eb8bc4f7d1e895c80a96"
366
+ "sha256": "426fd0002f643fc4b473f04f0c1164330de8a0c622cde7e07aad78d6a5e64df5"
367
+ },
368
+ {
369
+ "path": "scripts/harness_test_runner.py",
370
+ "sha256": "ba8b8b5628728593a1bcdab464b80b2a90536a909c0ce7df6a832f8ab16f08d1"
363
371
  },
364
372
  {
365
373
  "path": "scripts/harness_workflow_policy.py",
366
- "sha256": "a01530d0992cd589129b847c15f1d038cb54992387f694748c09fa182a2de240"
374
+ "sha256": "3c05971bccef2422217f88bf0d0a2e346248e46964474f20d383b95acec185da"
367
375
  }
368
376
  ]
369
377
  }
@@ -2,12 +2,12 @@
2
2
  "schema_version": 2,
3
3
  "profile": "general",
4
4
  "adapter": "codebuddy",
5
- "bundle_version": "0.2.19",
5
+ "bundle_version": "0.2.21",
6
6
  "generator": "harness_deploy.py",
7
7
  "files": [
8
8
  {
9
9
  "path": ".harness-build.json",
10
- "sha256": "9d4b1dfb2aa7fa7c54b9c4b358ca9aa0331bc607bb49c5d7c06cb86ac130e11f"
10
+ "sha256": "78da4d96c380e394b00d9273b471283611ea064cb33ebe0f5caa14f192d3a09c"
11
11
  },
12
12
  {
13
13
  "path": "agents/harness-evaluator.md",
@@ -31,7 +31,7 @@
31
31
  },
32
32
  {
33
33
  "path": "contracts/workflow-policy.json",
34
- "sha256": "3f39160c6905338a527170c0f15d83715ad56ac9fb449f4f568a6714ccdd3c9a"
34
+ "sha256": "92574af8d7252527be8cd2871675fc02ab7c3df95a72dab93228f6f884844971"
35
35
  },
36
36
  {
37
37
  "path": "harness-archive/checklist.md",
@@ -47,15 +47,15 @@
47
47
  },
48
48
  {
49
49
  "path": "harness-archive/SKILL.md",
50
- "sha256": "d670393d229d89551bc6d0dad18398fe66ac4dd89df90625355e1c2422e65bd4"
50
+ "sha256": "022e8b27aa408d6b060b47f8372f465a21a8e17f0ef81618da724923c434fecc"
51
51
  },
52
52
  {
53
53
  "path": "harness-archive/templates/render-summary.mjs",
54
- "sha256": "7cd1b29dab74510048a0077a7363775f19f47010ba8d46553b88755335e73496"
54
+ "sha256": "9e027c4c26dc5d076c35bb485fc618929d425b1f2b0ac097d45caad9817b29b4"
55
55
  },
56
56
  {
57
57
  "path": "harness-archive/templates/summary-data-template.json",
58
- "sha256": "b5cceb8f85cc99a689723863292119f3aeccacbb17aea7257632353b4e617ff7"
58
+ "sha256": "9f20b313d0810bb7e787aec0fe4a632ab6a598245bfe7b075973026340b8c81f"
59
59
  },
60
60
  {
61
61
  "path": "harness-codebase-map/checklist.md",
@@ -67,7 +67,7 @@
67
67
  },
68
68
  {
69
69
  "path": "harness-codebase-map/SKILL.md",
70
- "sha256": "2d97af6dc0d2e2c404dcc5ee6d36c178f934caa0bdf1e8c6cdf355a7ad4c8ea0"
70
+ "sha256": "77b13a710a7dd8000c3de3dff6338b0485d32c38c9e3520528f1b9cbd8ed80ef"
71
71
  },
72
72
  {
73
73
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -127,15 +127,15 @@
127
127
  },
128
128
  {
129
129
  "path": "harness-knowledge-ingest/scripts/harness_knowledge.py",
130
- "sha256": "062115a524d5bd4aec27e40e2b57cf4e7ed6e0509d4a8e6e78a79a62ee32e2c5"
130
+ "sha256": "c7278af0c041f36e466d1730349cc27377729fc772d70f513e171c7152149a20"
131
131
  },
132
132
  {
133
133
  "path": "harness-knowledge-ingest/SKILL.md",
134
- "sha256": "a8ebaf2f912ba6bcc9848110b41e6ceb6c3795dffcbdcb7fc9b5100b90223448"
134
+ "sha256": "35a1fd1cacedeb462e77df8d077d3084dbcfd115678220463e627b9f02770c70"
135
135
  },
136
136
  {
137
137
  "path": "harness-knowledge-query/SKILL.md",
138
- "sha256": "056bb8680ce112c7467916534205aebcdbc75262cf2e06200920d34bfbd15206"
138
+ "sha256": "2b8c699f5f36cb94b67bf4355509defa467ac1e58019f9cabae801ab0e823640"
139
139
  },
140
140
  {
141
141
  "path": "harness-plan/checklist.md",
@@ -151,7 +151,7 @@
151
151
  },
152
152
  {
153
153
  "path": "harness-plan/SKILL.md",
154
- "sha256": "0c9a084b1ff1c334fde922419a25b42aa327e38679707996073716f7d4051109"
154
+ "sha256": "4a74845d09bbd332f538a9ead5376d03ef7f9049af5f48bd5ee3b08ff8af90b3"
155
155
  },
156
156
  {
157
157
  "path": "harness-review/checklist.md",
@@ -167,7 +167,7 @@
167
167
  },
168
168
  {
169
169
  "path": "harness-review/SKILL.md",
170
- "sha256": "c067e963cc5c1de2deb6560b42aa90e59316afa0c9e832827c6e71533814ef99"
170
+ "sha256": "23d72aa40b0a1fbd8cd9a05f04a3fb5f7d62d23aa71ec43ad0217812631b0cd9"
171
171
  },
172
172
  {
173
173
  "path": "harness-run/checklist.md",
@@ -183,7 +183,7 @@
183
183
  },
184
184
  {
185
185
  "path": "harness-run/SKILL.md",
186
- "sha256": "6a9ac90d6abb6ce3714b4c02db8c9714a09223bb5807e74b96f98b57ba476fd6"
186
+ "sha256": "08f7578c1786bb9876ea9f88168b487ad52b773b96f467aa671c699b4c42f642"
187
187
  },
188
188
  {
189
189
  "path": "harness-submit/checklist.md",
@@ -195,7 +195,7 @@
195
195
  },
196
196
  {
197
197
  "path": "harness-submit/SKILL.md",
198
- "sha256": "75f2ba39db36b0cec51e8d41deb6f3bfad1f8efff09c2aface91d41d224036cb"
198
+ "sha256": "06ccb60bda74d16ee2a8584772810c4e249ecf0532d9d68bf1f8099d4b6a8bff"
199
199
  },
200
200
  {
201
201
  "path": "harness-sync/reference.md",
@@ -203,11 +203,11 @@
203
203
  },
204
204
  {
205
205
  "path": "harness-sync/SKILL.md",
206
- "sha256": "0919d763b16747d637d091400f8a511885f8a2162bed85926b8a90e32423b4e7"
206
+ "sha256": "d4f467375125a2e83615b677f20d9b4a28fa7ff60ddc19157a6c4df1d54d11d0"
207
207
  },
208
208
  {
209
209
  "path": "harness-test/checklist.md",
210
- "sha256": "499bc792815fc364123452f81b00c4043211289538f6f7dd62d19355d60d2e9e"
210
+ "sha256": "f974457a7aa094e1fbdb7d3039b0e8f3cacb777638603366e63a0aaf9a514aad"
211
211
  },
212
212
  {
213
213
  "path": "harness-test/pitfalls-java.md",
@@ -219,7 +219,7 @@
219
219
  },
220
220
  {
221
221
  "path": "harness-test/reference.md",
222
- "sha256": "1b705db0a2f075d7c7aa48a9130719557daf1d5cddc0271ea68d4e75a3f827b2"
222
+ "sha256": "b7cbfc91cff9ed7fef7b9cbee79f81e8cc588ffd956b531570eabef98ad24125"
223
223
  },
224
224
  {
225
225
  "path": "harness-test/scripts/runtime-helpers.mjs",
@@ -227,7 +227,7 @@
227
227
  },
228
228
  {
229
229
  "path": "harness-test/SKILL.md",
230
- "sha256": "3f742afb5343d7254a005c1b643f7678ca2b46a1f5da149016729850f40fe15e"
230
+ "sha256": "d853dc1b2cf9c9254abc64eb5e94b6ce4936a5f787c5e9dac365ae2fccab6a33"
231
231
  },
232
232
  {
233
233
  "path": "protocols/archive-report-protocol.md",
@@ -275,7 +275,7 @@
275
275
  },
276
276
  {
277
277
  "path": "scripts/harness_archive.py",
278
- "sha256": "40c9cc17e3b42a92e4aa4ff7fb503cfb10e408c45d1b7cbb825001032a1e55a7"
278
+ "sha256": "97f94770d4adada904732fd7529d5b90bd457e131a6077c3dd2c3906ee01fcd8"
279
279
  },
280
280
  {
281
281
  "path": "scripts/harness_change.py",
@@ -295,15 +295,15 @@
295
295
  },
296
296
  {
297
297
  "path": "scripts/harness_events.py",
298
- "sha256": "5733a66e8512adcbdc7b9f00ef3cc63f43f865ba0cdb14687a16c133d678aa43"
298
+ "sha256": "7f5e9e316c422f7532fe0fcf52beb809125f757af7ccfbdf85fa519c2de4e66d"
299
299
  },
300
300
  {
301
301
  "path": "scripts/harness_gate.py",
302
- "sha256": "abf0717cb8cf1f13b804458017483a981a64ebf812028353543b146be261b6ae"
302
+ "sha256": "29de8510a9377a2651410b4d0a3be1b9eeb44d8e0d7d4becb44e1734c95dd953"
303
303
  },
304
304
  {
305
305
  "path": "scripts/harness_integration.py",
306
- "sha256": "e1c17bc19a0bdcb1cb6f3cfc0074c579ca2becc45712e7bce08b188b6b206184"
306
+ "sha256": "88d0a6ffbdec74ce8c3a994c1ec80e5a0c550b3cccad8d46fb8c355ced1a7721"
307
307
  },
308
308
  {
309
309
  "path": "scripts/harness_ledger.py",
@@ -319,11 +319,11 @@
319
319
  },
320
320
  {
321
321
  "path": "scripts/harness_phase.py",
322
- "sha256": "5f16f9b03dc01a08f3dbc0bb0a416856833836f4c3fcb2c4c0799a876079c43d"
322
+ "sha256": "8143e5b97ff14ba46a508ce346d7a51af0122ef8aeff0543852994fbaca97cba"
323
323
  },
324
324
  {
325
325
  "path": "scripts/harness_plan_finalize.py",
326
- "sha256": "e5152dda3380b1c1acdd219f8af0117b0c1670f0998ea62340f89e27a09f7585"
326
+ "sha256": "1e96a642df48722bf7de1ae2aa53f9c87d641150d939e47686a0b36b5c4547e5"
327
327
  },
328
328
  {
329
329
  "path": "scripts/harness_preflight.py",
@@ -333,6 +333,10 @@
333
333
  "path": "scripts/harness_profile.py",
334
334
  "sha256": "d8f6a07455c27c9167df44b33eb20ef7c6c65530462cd4958794db1063d5ac04"
335
335
  },
336
+ {
337
+ "path": "scripts/harness_retry.py",
338
+ "sha256": "250a6f7fb564fb537ba8680a3385a50ec3dff6625aa4d1488d5c4e09393d20b5"
339
+ },
336
340
  {
337
341
  "path": "scripts/harness_review.py",
338
342
  "sha256": "a741a63f62993d72889e78f540feb57a95e713b4d7a98fa61ff208b2ce914ca7"
@@ -359,11 +363,15 @@
359
363
  },
360
364
  {
361
365
  "path": "scripts/harness_test_guard.py",
362
- "sha256": "a5792ca55242770d504a4a1ed458746a73bbf5bfa023eb8bc4f7d1e895c80a96"
366
+ "sha256": "426fd0002f643fc4b473f04f0c1164330de8a0c622cde7e07aad78d6a5e64df5"
367
+ },
368
+ {
369
+ "path": "scripts/harness_test_runner.py",
370
+ "sha256": "ba8b8b5628728593a1bcdab464b80b2a90536a909c0ce7df6a832f8ab16f08d1"
363
371
  },
364
372
  {
365
373
  "path": "scripts/harness_workflow_policy.py",
366
- "sha256": "a01530d0992cd589129b847c15f1d038cb54992387f694748c09fa182a2de240"
374
+ "sha256": "3c05971bccef2422217f88bf0d0a2e346248e46964474f20d383b95acec185da"
367
375
  }
368
376
  ]
369
377
  }