@hunter-harness/workflow-harness 0.2.42 → 0.2.43

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 (238) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/contracts/build-profile-v3.schema.json +56 -1
  3. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +1 -1
  4. package/harness/bundles/general/claude-code/harness-archive/reference.md +1 -0
  5. package/harness/bundles/general/claude-code/harness-archive/templates/render-summary.mjs +8 -0
  6. package/harness/bundles/general/claude-code/harness-archive/templates/summary-data-template.json +28 -0
  7. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  8. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  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-run/reference.md +6 -1
  14. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
  15. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
  16. package/harness/bundles/general/claude-code/harness-test/SKILL.md +8 -2
  17. package/harness/bundles/general/claude-code/protocols/execution-session-protocol.md +52 -0
  18. package/harness/bundles/general/claude-code/protocols/state-layout-protocol.md +24 -1
  19. package/harness/bundles/general/claude-code/protocols/verification-graph-protocol.md +6 -0
  20. package/harness/bundles/general/claude-code/scripts/harness_archive.py +4 -0
  21. package/harness/bundles/general/claude-code/scripts/harness_efficiency.py +290 -0
  22. package/harness/bundles/general/claude-code/scripts/harness_environment.py +719 -35
  23. package/harness/bundles/general/claude-code/scripts/harness_fixback.py +742 -0
  24. package/harness/bundles/general/claude-code/scripts/harness_profile.py +34 -0
  25. package/harness/bundles/general/claude-code/scripts/harness_runtime.py +1165 -3
  26. package/harness/bundles/general/claude-code/scripts/harness_service.py +76 -0
  27. package/harness/bundles/general/claude-code/scripts/harness_test_runner.py +127 -39
  28. package/harness/bundles/general/claude-code/scripts/harness_verification.py +408 -8
  29. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  30. package/harness/bundles/general/codebuddy/contracts/build-profile-v3.schema.json +56 -1
  31. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
  32. package/harness/bundles/general/codebuddy/harness-archive/reference.md +1 -0
  33. package/harness/bundles/general/codebuddy/harness-archive/templates/render-summary.mjs +8 -0
  34. package/harness/bundles/general/codebuddy/harness-archive/templates/summary-data-template.json +28 -0
  35. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  36. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  37. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  38. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
  39. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
  40. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
  41. package/harness/bundles/general/codebuddy/harness-run/reference.md +6 -1
  42. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
  43. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
  44. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +8 -2
  45. package/harness/bundles/general/codebuddy/protocols/execution-session-protocol.md +52 -0
  46. package/harness/bundles/general/codebuddy/protocols/state-layout-protocol.md +24 -1
  47. package/harness/bundles/general/codebuddy/protocols/verification-graph-protocol.md +6 -0
  48. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +4 -0
  49. package/harness/bundles/general/codebuddy/scripts/harness_efficiency.py +290 -0
  50. package/harness/bundles/general/codebuddy/scripts/harness_environment.py +719 -35
  51. package/harness/bundles/general/codebuddy/scripts/harness_fixback.py +742 -0
  52. package/harness/bundles/general/codebuddy/scripts/harness_profile.py +34 -0
  53. package/harness/bundles/general/codebuddy/scripts/harness_runtime.py +1165 -3
  54. package/harness/bundles/general/codebuddy/scripts/harness_service.py +76 -0
  55. package/harness/bundles/general/codebuddy/scripts/harness_test_runner.py +127 -39
  56. package/harness/bundles/general/codebuddy/scripts/harness_verification.py +408 -8
  57. package/harness/bundles/general/codex/.harness-build.json +1 -1
  58. package/harness/bundles/general/codex/contracts/build-profile-v3.schema.json +56 -1
  59. package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
  60. package/harness/bundles/general/codex/harness-archive/reference.md +1 -0
  61. package/harness/bundles/general/codex/harness-archive/templates/render-summary.mjs +8 -0
  62. package/harness/bundles/general/codex/harness-archive/templates/summary-data-template.json +28 -0
  63. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  64. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
  65. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  66. package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
  67. package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
  68. package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
  69. package/harness/bundles/general/codex/harness-run/reference.md +6 -1
  70. package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
  71. package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
  72. package/harness/bundles/general/codex/harness-test/SKILL.md +8 -2
  73. package/harness/bundles/general/codex/protocols/execution-session-protocol.md +52 -0
  74. package/harness/bundles/general/codex/protocols/state-layout-protocol.md +24 -1
  75. package/harness/bundles/general/codex/protocols/verification-graph-protocol.md +6 -0
  76. package/harness/bundles/general/codex/scripts/harness_archive.py +4 -0
  77. package/harness/bundles/general/codex/scripts/harness_efficiency.py +290 -0
  78. package/harness/bundles/general/codex/scripts/harness_environment.py +719 -35
  79. package/harness/bundles/general/codex/scripts/harness_fixback.py +742 -0
  80. package/harness/bundles/general/codex/scripts/harness_profile.py +34 -0
  81. package/harness/bundles/general/codex/scripts/harness_runtime.py +1165 -3
  82. package/harness/bundles/general/codex/scripts/harness_service.py +76 -0
  83. package/harness/bundles/general/codex/scripts/harness_test_runner.py +127 -39
  84. package/harness/bundles/general/codex/scripts/harness_verification.py +408 -8
  85. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  86. package/harness/bundles/general/cursor/contracts/build-profile-v3.schema.json +56 -1
  87. package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
  88. package/harness/bundles/general/cursor/harness-archive/reference.md +1 -0
  89. package/harness/bundles/general/cursor/harness-archive/templates/render-summary.mjs +8 -0
  90. package/harness/bundles/general/cursor/harness-archive/templates/summary-data-template.json +28 -0
  91. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  92. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  93. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  94. package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
  95. package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
  96. package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
  97. package/harness/bundles/general/cursor/harness-run/reference.md +6 -1
  98. package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
  99. package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
  100. package/harness/bundles/general/cursor/harness-test/SKILL.md +8 -2
  101. package/harness/bundles/general/cursor/protocols/execution-session-protocol.md +52 -0
  102. package/harness/bundles/general/cursor/protocols/state-layout-protocol.md +24 -1
  103. package/harness/bundles/general/cursor/protocols/verification-graph-protocol.md +6 -0
  104. package/harness/bundles/general/cursor/scripts/harness_archive.py +4 -0
  105. package/harness/bundles/general/cursor/scripts/harness_efficiency.py +290 -0
  106. package/harness/bundles/general/cursor/scripts/harness_environment.py +719 -35
  107. package/harness/bundles/general/cursor/scripts/harness_fixback.py +742 -0
  108. package/harness/bundles/general/cursor/scripts/harness_profile.py +34 -0
  109. package/harness/bundles/general/cursor/scripts/harness_runtime.py +1165 -3
  110. package/harness/bundles/general/cursor/scripts/harness_service.py +76 -0
  111. package/harness/bundles/general/cursor/scripts/harness_test_runner.py +127 -39
  112. package/harness/bundles/general/cursor/scripts/harness_verification.py +408 -8
  113. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  114. package/harness/bundles/java/claude-code/contracts/build-profile-v3.schema.json +56 -1
  115. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  116. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
  117. package/harness/bundles/java/claude-code/harness-archive/reference.md +1 -0
  118. package/harness/bundles/java/claude-code/harness-archive/templates/render-summary.mjs +8 -0
  119. package/harness/bundles/java/claude-code/harness-archive/templates/summary-data-template.json +28 -0
  120. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  121. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  122. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  123. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  124. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
  125. package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
  126. package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
  127. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
  128. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
  129. package/harness/bundles/java/claude-code/harness-test/SKILL.md +8 -2
  130. package/harness/bundles/java/claude-code/protocols/execution-session-protocol.md +52 -0
  131. package/harness/bundles/java/claude-code/protocols/state-layout-protocol.md +24 -1
  132. package/harness/bundles/java/claude-code/protocols/verification-graph-protocol.md +6 -0
  133. package/harness/bundles/java/claude-code/scripts/harness_archive.py +4 -0
  134. package/harness/bundles/java/claude-code/scripts/harness_efficiency.py +290 -0
  135. package/harness/bundles/java/claude-code/scripts/harness_environment.py +719 -35
  136. package/harness/bundles/java/claude-code/scripts/harness_fixback.py +742 -0
  137. package/harness/bundles/java/claude-code/scripts/harness_profile.py +34 -0
  138. package/harness/bundles/java/claude-code/scripts/harness_runtime.py +1165 -3
  139. package/harness/bundles/java/claude-code/scripts/harness_service.py +76 -0
  140. package/harness/bundles/java/claude-code/scripts/harness_test_runner.py +127 -39
  141. package/harness/bundles/java/claude-code/scripts/harness_verification.py +408 -8
  142. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  143. package/harness/bundles/java/codebuddy/contracts/build-profile-v3.schema.json +56 -1
  144. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  145. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
  146. package/harness/bundles/java/codebuddy/harness-archive/reference.md +1 -0
  147. package/harness/bundles/java/codebuddy/harness-archive/templates/render-summary.mjs +8 -0
  148. package/harness/bundles/java/codebuddy/harness-archive/templates/summary-data-template.json +28 -0
  149. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  150. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  151. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  152. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  153. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
  154. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
  155. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
  156. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
  157. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
  158. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +8 -2
  159. package/harness/bundles/java/codebuddy/protocols/execution-session-protocol.md +52 -0
  160. package/harness/bundles/java/codebuddy/protocols/state-layout-protocol.md +24 -1
  161. package/harness/bundles/java/codebuddy/protocols/verification-graph-protocol.md +6 -0
  162. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +4 -0
  163. package/harness/bundles/java/codebuddy/scripts/harness_efficiency.py +290 -0
  164. package/harness/bundles/java/codebuddy/scripts/harness_environment.py +719 -35
  165. package/harness/bundles/java/codebuddy/scripts/harness_fixback.py +742 -0
  166. package/harness/bundles/java/codebuddy/scripts/harness_profile.py +34 -0
  167. package/harness/bundles/java/codebuddy/scripts/harness_runtime.py +1165 -3
  168. package/harness/bundles/java/codebuddy/scripts/harness_service.py +76 -0
  169. package/harness/bundles/java/codebuddy/scripts/harness_test_runner.py +127 -39
  170. package/harness/bundles/java/codebuddy/scripts/harness_verification.py +408 -8
  171. package/harness/bundles/java/codex/.harness-build.json +1 -1
  172. package/harness/bundles/java/codex/contracts/build-profile-v3.schema.json +56 -1
  173. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  174. package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
  175. package/harness/bundles/java/codex/harness-archive/reference.md +1 -0
  176. package/harness/bundles/java/codex/harness-archive/templates/render-summary.mjs +8 -0
  177. package/harness/bundles/java/codex/harness-archive/templates/summary-data-template.json +28 -0
  178. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  179. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
  180. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  181. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  182. package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
  183. package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
  184. package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
  185. package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
  186. package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
  187. package/harness/bundles/java/codex/harness-test/SKILL.md +8 -2
  188. package/harness/bundles/java/codex/protocols/execution-session-protocol.md +52 -0
  189. package/harness/bundles/java/codex/protocols/state-layout-protocol.md +24 -1
  190. package/harness/bundles/java/codex/protocols/verification-graph-protocol.md +6 -0
  191. package/harness/bundles/java/codex/scripts/harness_archive.py +4 -0
  192. package/harness/bundles/java/codex/scripts/harness_efficiency.py +290 -0
  193. package/harness/bundles/java/codex/scripts/harness_environment.py +719 -35
  194. package/harness/bundles/java/codex/scripts/harness_fixback.py +742 -0
  195. package/harness/bundles/java/codex/scripts/harness_profile.py +34 -0
  196. package/harness/bundles/java/codex/scripts/harness_runtime.py +1165 -3
  197. package/harness/bundles/java/codex/scripts/harness_service.py +76 -0
  198. package/harness/bundles/java/codex/scripts/harness_test_runner.py +127 -39
  199. package/harness/bundles/java/codex/scripts/harness_verification.py +408 -8
  200. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  201. package/harness/bundles/java/cursor/contracts/build-profile-v3.schema.json +56 -1
  202. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  203. package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
  204. package/harness/bundles/java/cursor/harness-archive/reference.md +1 -0
  205. package/harness/bundles/java/cursor/harness-archive/templates/render-summary.mjs +8 -0
  206. package/harness/bundles/java/cursor/harness-archive/templates/summary-data-template.json +28 -0
  207. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  208. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  209. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  210. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  211. package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
  212. package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
  213. package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
  214. package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
  215. package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
  216. package/harness/bundles/java/cursor/harness-test/SKILL.md +8 -2
  217. package/harness/bundles/java/cursor/protocols/execution-session-protocol.md +52 -0
  218. package/harness/bundles/java/cursor/protocols/state-layout-protocol.md +24 -1
  219. package/harness/bundles/java/cursor/protocols/verification-graph-protocol.md +6 -0
  220. package/harness/bundles/java/cursor/scripts/harness_archive.py +4 -0
  221. package/harness/bundles/java/cursor/scripts/harness_efficiency.py +290 -0
  222. package/harness/bundles/java/cursor/scripts/harness_environment.py +719 -35
  223. package/harness/bundles/java/cursor/scripts/harness_fixback.py +742 -0
  224. package/harness/bundles/java/cursor/scripts/harness_profile.py +34 -0
  225. package/harness/bundles/java/cursor/scripts/harness_runtime.py +1165 -3
  226. package/harness/bundles/java/cursor/scripts/harness_service.py +76 -0
  227. package/harness/bundles/java/cursor/scripts/harness_test_runner.py +127 -39
  228. package/harness/bundles/java/cursor/scripts/harness_verification.py +408 -8
  229. package/harness/manifests/general/claude-code.json +40 -27
  230. package/harness/manifests/general/codebuddy.json +40 -27
  231. package/harness/manifests/general/codex.json +40 -27
  232. package/harness/manifests/general/cursor.json +40 -27
  233. package/harness/manifests/java/claude-code.json +41 -28
  234. package/harness/manifests/java/codebuddy.json +41 -28
  235. package/harness/manifests/java/codex.json +41 -28
  236. package/harness/manifests/java/cursor.json +41 -28
  237. package/hunter-workflow-family.json +6 -4
  238. package/package.json +1 -1
@@ -6,10 +6,30 @@ from __future__ import annotations
6
6
  import argparse
7
7
  import fnmatch
8
8
  import json
9
+ import time
9
10
  from pathlib import Path
10
11
  from typing import Any
11
12
 
12
13
 
14
+ _COVERAGE_RANK = {"incremental": 0, "module": 1, "module-am": 2, "full": 3}
15
+
16
+
17
+ def _normalize_targets(raw_targets: Any) -> list[dict[str, Any]]:
18
+ if isinstance(raw_targets, dict):
19
+ return [
20
+ {**dict(target), "id": str(target.get("id") or target_id)}
21
+ for target_id, target in raw_targets.items()
22
+ if isinstance(target_id, str) and isinstance(target, dict)
23
+ ]
24
+ if isinstance(raw_targets, list):
25
+ return [
26
+ dict(target)
27
+ for target in raw_targets
28
+ if isinstance(target, dict) and str(target.get("id") or "").strip()
29
+ ]
30
+ return []
31
+
32
+
13
33
  def select_verifications(payload: dict[str, Any]) -> dict[str, Any]:
14
34
  changed = sorted(
15
35
  {
@@ -18,9 +38,7 @@ def select_verifications(payload: dict[str, Any]) -> dict[str, Any]:
18
38
  if str(path).strip()
19
39
  }
20
40
  )
21
- targets = [
22
- target for target in payload.get("targets", []) if isinstance(target, dict)
23
- ]
41
+ targets = _normalize_targets(payload.get("targets", []))
24
42
  selected_ids: set[str] = set()
25
43
  reasons: dict[str, list[str]] = {}
26
44
  for target in targets:
@@ -90,16 +108,398 @@ def select_verifications(payload: dict[str, Any]) -> dict[str, Any]:
90
108
  }
91
109
 
92
110
 
111
+ def _resource_locks(target: dict[str, Any]) -> list[str]:
112
+ locks = sorted(
113
+ {
114
+ str(item).strip()
115
+ for item in target.get("resourceLocks", [])
116
+ if str(item).strip()
117
+ }
118
+ )
119
+ estimated = float(
120
+ target.get("estimatedDurationSeconds")
121
+ or target.get("expectedDurationSeconds")
122
+ or 0
123
+ )
124
+ if estimated >= 60 and not locks:
125
+ locks.append("harness:unclassified-heavy")
126
+ return locks
127
+
128
+
129
+ def _target_decision(
130
+ target: dict[str, Any],
131
+ *,
132
+ product_identity: str,
133
+ frozen_identity: str,
134
+ available_capabilities: set[str],
135
+ verification_ledger: list[dict[str, Any]],
136
+ ) -> tuple[str, list[str]]:
137
+ blockers: list[str] = []
138
+ if not product_identity:
139
+ return "BLOCKED", ["PRODUCT_IDENTITY_REQUIRED"]
140
+ required_capabilities = {
141
+ str(item).strip()
142
+ for item in target.get("requiredCapabilities", [])
143
+ if str(item).strip()
144
+ }
145
+ blockers.extend(
146
+ "CAPABILITY_MISSING:" + item
147
+ for item in sorted(required_capabilities - available_capabilities)
148
+ )
149
+ required_coverage = str(target.get("requiredCoverage") or "").strip()
150
+ coverage_level = str(
151
+ target.get("coverageLevel") or target.get("scope") or ""
152
+ ).strip()
153
+ if required_coverage:
154
+ if required_coverage not in _COVERAGE_RANK:
155
+ blockers.append("REQUIRED_COVERAGE_INVALID")
156
+ elif coverage_level not in _COVERAGE_RANK:
157
+ blockers.append("COVERAGE_DECLARATION_REQUIRED")
158
+ elif _COVERAGE_RANK[coverage_level] < _COVERAGE_RANK[required_coverage]:
159
+ blockers.append(
160
+ f"COVERAGE_INSUFFICIENT:{coverage_level}<{required_coverage}"
161
+ )
162
+ applicability = target.get("applicability")
163
+ if isinstance(applicability, dict) and applicability.get("applicable") is False:
164
+ return "SKIP", [
165
+ str(applicability.get("reasonCode") or "NOT_APPLICABLE")
166
+ ]
167
+ if (
168
+ target.get("requiresFrozenIdentity") is True
169
+ and not frozen_identity
170
+ ):
171
+ blockers.append("FROZEN_IDENTITY_REQUIRED")
172
+ if (
173
+ target.get("requiresFrozenIdentity") is True
174
+ and frozen_identity
175
+ and product_identity != frozen_identity
176
+ ):
177
+ blockers.append("FROZEN_IDENTITY_DRIFT")
178
+ if blockers:
179
+ return "BLOCKED", blockers
180
+ reuse = target.get("reuse")
181
+ if isinstance(reuse, dict) and reuse.get("eligible") is True:
182
+ if target.get("reusePolicy") == "never":
183
+ return "EXECUTE", ["REUSE_POLICY_NEVER"]
184
+ evidence_id = str(reuse.get("evidenceId") or "").strip()
185
+ evidence_product = str(reuse.get("productIdentity") or "").strip()
186
+ target_id = str(target.get("id") or "")
187
+ ledger_match = next(
188
+ (
189
+ item
190
+ for item in verification_ledger
191
+ if str(item.get("evidenceId") or "") == evidence_id
192
+ and str(item.get("targetId") or item.get("verification") or "")
193
+ == target_id
194
+ and str(item.get("productIdentity") or "") == product_identity
195
+ and item.get("status") == "OK"
196
+ ),
197
+ None,
198
+ )
199
+ if (
200
+ str(target.get("reusePolicy") or "") != "ledger-exact"
201
+ or not evidence_id
202
+ or evidence_product != product_identity
203
+ or ledger_match is None
204
+ ):
205
+ return "BLOCKED", ["REUSE_EVIDENCE_INVALID"]
206
+ return "REUSE", [str(reuse.get("reasonCode") or "REUSE_ELIGIBLE")]
207
+ return "EXECUTE", ["SELECTED_FOR_EXECUTION"]
208
+
209
+
210
+ def schedule_verifications(payload: dict[str, Any]) -> dict[str, Any]:
211
+ """Build an explainable, lock-aware verification execution plan.
212
+
213
+ Dependencies define the earliest wave. Nodes in the same wave may run in
214
+ parallel only when their declared resource locks are disjoint. Long tasks
215
+ without a lock declaration receive one shared conservative lock.
216
+ """
217
+ targets = _normalize_targets(payload.get("targets", []))
218
+ if not targets:
219
+ return {
220
+ "ok": False,
221
+ "code": "VERIFICATION_TARGETS_REQUIRED",
222
+ "productIdentity": str(payload.get("productIdentity") or ""),
223
+ "frozenIdentity": str(payload.get("frozenIdentity") or ""),
224
+ "plan": [],
225
+ "waves": [],
226
+ }
227
+ targets.sort(key=lambda item: str(item["id"]))
228
+ by_id = {str(item["id"]): item for item in targets}
229
+ product_identity = str(payload.get("productIdentity") or "")
230
+ frozen_identity = str(payload.get("frozenIdentity") or "")
231
+ available_capabilities = {
232
+ str(item).strip()
233
+ for item in payload.get("availableCapabilities", [])
234
+ if str(item).strip()
235
+ }
236
+ verification_ledger = [
237
+ dict(item)
238
+ for item in payload.get("verificationLedger", [])
239
+ if isinstance(item, dict)
240
+ ]
241
+ decisions: dict[str, tuple[str, list[str]]] = {
242
+ target_id: _target_decision(
243
+ target,
244
+ product_identity=product_identity,
245
+ frozen_identity=frozen_identity,
246
+ available_capabilities=available_capabilities,
247
+ verification_ledger=verification_ledger,
248
+ )
249
+ for target_id, target in by_id.items()
250
+ }
251
+ waves: list[list[str]] = []
252
+ placed: dict[str, int | None] = {}
253
+ pending = set(by_id)
254
+
255
+ while pending:
256
+ progressed = False
257
+ for target_id in sorted(pending):
258
+ target = by_id[target_id]
259
+ dependencies = [str(item) for item in target.get("dependsOn", [])]
260
+ unknown = sorted(set(dependencies) - set(by_id))
261
+ if unknown:
262
+ decisions[target_id] = (
263
+ "BLOCKED",
264
+ ["DEPENDENCY_UNKNOWN:" + item for item in unknown],
265
+ )
266
+ placed[target_id] = None
267
+ pending.remove(target_id)
268
+ progressed = True
269
+ break
270
+ if any(item not in placed for item in dependencies):
271
+ continue
272
+ failed_dependencies = [
273
+ item
274
+ for item in dependencies
275
+ if decisions[item][0] in {"SKIP", "BLOCKED"}
276
+ ]
277
+ if failed_dependencies:
278
+ decisions[target_id] = (
279
+ "BLOCKED",
280
+ [
281
+ "DEPENDENCY_BLOCKED:" + item
282
+ for item in sorted(failed_dependencies)
283
+ ],
284
+ )
285
+ placed[target_id] = None
286
+ pending.remove(target_id)
287
+ progressed = True
288
+ break
289
+ decision, _ = decisions[target_id]
290
+ if decision in {"SKIP", "BLOCKED"}:
291
+ placed[target_id] = None
292
+ pending.remove(target_id)
293
+ progressed = True
294
+ break
295
+ dependency_waves = [
296
+ placed[item]
297
+ for item in dependencies
298
+ if placed.get(item) is not None
299
+ ]
300
+ earliest = (
301
+ max(int(item) for item in dependency_waves) + 1
302
+ if dependency_waves
303
+ else 0
304
+ )
305
+ if decision == "REUSE":
306
+ placed[target_id] = max(0, earliest - 1)
307
+ pending.remove(target_id)
308
+ progressed = True
309
+ break
310
+ locks = set(_resource_locks(target))
311
+ wave = earliest
312
+ while True:
313
+ while wave >= len(waves):
314
+ waves.append([])
315
+ occupied = {
316
+ lock
317
+ for item_id in waves[wave]
318
+ for lock in _resource_locks(by_id[item_id])
319
+ }
320
+ if not locks & occupied:
321
+ waves[wave].append(target_id)
322
+ placed[target_id] = wave
323
+ break
324
+ wave += 1
325
+ pending.remove(target_id)
326
+ progressed = True
327
+ break
328
+ if not progressed:
329
+ for target_id in sorted(pending):
330
+ decisions[target_id] = ("BLOCKED", ["DEPENDENCY_CYCLE"])
331
+ placed[target_id] = None
332
+ pending.clear()
333
+
334
+ plan: list[dict[str, Any]] = []
335
+ for target_id, target in by_id.items():
336
+ decision, reasons = decisions[target_id]
337
+ dependencies = [str(item) for item in target.get("dependsOn", [])]
338
+ reason_codes = [
339
+ *reasons,
340
+ *["depends-on:" + item for item in dependencies],
341
+ ]
342
+ plan.append(
343
+ {
344
+ **target,
345
+ "id": target_id,
346
+ "decision": decision,
347
+ "reasonCodes": reason_codes,
348
+ "resourceLocks": _resource_locks(target),
349
+ "wave": placed[target_id],
350
+ }
351
+ )
352
+ return {
353
+ "ok": all(item["decision"] != "BLOCKED" for item in plan),
354
+ "code": (
355
+ "VERIFICATION_PLAN_READY"
356
+ if all(item["decision"] != "BLOCKED" for item in plan)
357
+ else "VERIFICATION_PLAN_BLOCKED"
358
+ ),
359
+ "productIdentity": product_identity,
360
+ "frozenIdentity": frozen_identity,
361
+ "plan": plan,
362
+ "waves": [
363
+ {"wave": index, "targets": target_ids}
364
+ for index, target_ids in enumerate(waves)
365
+ if target_ids
366
+ ],
367
+ }
368
+
369
+
370
+ def execute_verifications(payload: dict[str, Any]) -> dict[str, Any]:
371
+ """Execute a scheduled graph wave-by-wave through managed run sessions."""
372
+ import harness_runtime
373
+
374
+ scheduled = schedule_verifications(payload)
375
+ if not scheduled["ok"]:
376
+ return {**scheduled, "execution": []}
377
+ state_root = Path(str(payload.get("stateRoot") or "")).expanduser().resolve()
378
+ working_directory = Path(
379
+ str(payload.get("workingDirectory") or "")
380
+ ).expanduser().resolve()
381
+ if not str(payload.get("stateRoot") or "").strip():
382
+ return {
383
+ **scheduled,
384
+ "ok": False,
385
+ "code": "VERIFICATION_STATE_ROOT_REQUIRED",
386
+ "execution": [],
387
+ }
388
+ if not working_directory.is_dir():
389
+ return {
390
+ **scheduled,
391
+ "ok": False,
392
+ "code": "VERIFICATION_WORKDIR_INVALID",
393
+ "execution": [],
394
+ }
395
+ by_id = {str(item["id"]): item for item in scheduled["plan"]}
396
+ outcomes: dict[str, dict[str, Any]] = {
397
+ target_id: {
398
+ "targetId": target_id,
399
+ "status": "OK",
400
+ "reasonCode": "VERIFICATION_REUSED",
401
+ }
402
+ for target_id, target in by_id.items()
403
+ if target.get("decision") == "REUSE"
404
+ }
405
+ execution: list[dict[str, Any]] = list(outcomes.values())
406
+ for wave in scheduled["waves"]:
407
+ running: list[tuple[str, str]] = []
408
+ for target_id in wave["targets"]:
409
+ target = by_id[target_id]
410
+ failed_dependencies = [
411
+ dependency
412
+ for dependency in target.get("dependsOn", [])
413
+ if outcomes.get(str(dependency), {}).get("status") != "OK"
414
+ ]
415
+ if failed_dependencies:
416
+ outcome = {
417
+ "targetId": target_id,
418
+ "status": "BLOCKED",
419
+ "reasonCode": "DEPENDENCY_EXECUTION_FAILED",
420
+ "blockedBy": failed_dependencies,
421
+ }
422
+ outcomes[target_id] = outcome
423
+ execution.append(outcome)
424
+ continue
425
+ argv = target.get("argvTemplate")
426
+ if (
427
+ not isinstance(argv, list)
428
+ or not argv
429
+ or not all(isinstance(item, str) and item for item in argv)
430
+ or any("{" in item or "}" in item for item in argv)
431
+ ):
432
+ outcome = {
433
+ "targetId": target_id,
434
+ "status": "BLOCKED",
435
+ "reasonCode": "VERIFICATION_ARGV_NOT_CONCRETE",
436
+ }
437
+ outcomes[target_id] = outcome
438
+ execution.append(outcome)
439
+ continue
440
+ receipt = harness_runtime.start_run_session(
441
+ state_root=state_root,
442
+ verification=target_id,
443
+ argv=argv,
444
+ working_directory=working_directory,
445
+ timeout_seconds=target.get("timeoutSeconds"),
446
+ expected_duration_seconds=target.get(
447
+ "estimatedDurationSeconds"
448
+ ),
449
+ product_identity=scheduled["productIdentity"],
450
+ resource_locks=list(target["resourceLocks"]),
451
+ )
452
+ if receipt.get("status") in harness_runtime.RUN_TERMINAL_STATUSES:
453
+ outcome = {"targetId": target_id, **receipt}
454
+ outcomes[target_id] = outcome
455
+ execution.append(outcome)
456
+ else:
457
+ running.append((target_id, str(receipt["sessionId"])))
458
+ while running:
459
+ remaining: list[tuple[str, str]] = []
460
+ for target_id, session_id in running:
461
+ receipt = harness_runtime.run_session_status(state_root, session_id)
462
+ if receipt.get("status") in harness_runtime.RUN_TERMINAL_STATUSES:
463
+ outcome = {"targetId": target_id, **receipt}
464
+ outcomes[target_id] = outcome
465
+ execution.append(outcome)
466
+ else:
467
+ remaining.append((target_id, session_id))
468
+ running = remaining
469
+ if running:
470
+ time.sleep(0.05)
471
+ execution_ok = all(item.get("status") == "OK" for item in execution)
472
+ return {
473
+ **scheduled,
474
+ "ok": execution_ok,
475
+ "code": (
476
+ "VERIFICATION_EXECUTION_OK"
477
+ if execution_ok
478
+ else "VERIFICATION_EXECUTION_FAILED"
479
+ ),
480
+ "execution": execution,
481
+ }
482
+
483
+
93
484
  def main(argv: list[str] | None = None) -> int:
94
485
  parser = argparse.ArgumentParser(prog="harness_verification.py")
95
- parser.add_argument("select", nargs="?")
486
+ parser.add_argument(
487
+ "command",
488
+ nargs="?",
489
+ choices=("select", "plan", "execute"),
490
+ default="select",
491
+ )
96
492
  parser.add_argument("--input", required=True, type=Path)
97
493
  parser.add_argument("--out", type=Path)
98
494
  parser.add_argument("--json", action="store_true")
99
495
  args = parser.parse_args(argv)
100
- result = select_verifications(
101
- json.loads(args.input.read_text(encoding="utf-8-sig"))
102
- )
496
+ payload = json.loads(args.input.read_text(encoding="utf-8-sig"))
497
+ if args.command == "execute":
498
+ result = execute_verifications(payload)
499
+ elif args.command == "plan":
500
+ result = schedule_verifications(payload)
501
+ else:
502
+ result = select_verifications(payload)
103
503
  if args.out:
104
504
  args.out.parent.mkdir(parents=True, exist_ok=True)
105
505
  args.out.write_text(
@@ -107,7 +507,7 @@ def main(argv: list[str] | None = None) -> int:
107
507
  encoding="utf-8",
108
508
  )
109
509
  print(json.dumps(result, ensure_ascii=False, indent=2))
110
- return 0
510
+ return 0 if result.get("ok") else 1
111
511
 
112
512
 
113
513
  if __name__ == "__main__":
@@ -2,9 +2,9 @@
2
2
  "schema_version": 2,
3
3
  "profile": "general",
4
4
  "adapter": "claude-code",
5
- "bundle_version": "0.2.31",
5
+ "bundle_version": "0.2.32",
6
6
  "requires": {
7
- "minimumCliVersion": "0.2.44",
7
+ "minimumCliVersion": "0.2.45",
8
8
  "capabilities": [
9
9
  "sync@2",
10
10
  "rules-sync@1",
@@ -12,6 +12,7 @@
12
12
  "knowledge-sync@3",
13
13
  "build-profile@3",
14
14
  "verification-graph@1",
15
+ "execution-session@1",
15
16
  "external-convergence@1",
16
17
  "codegraph-status@2",
17
18
  "doctor-capability@1",
@@ -22,7 +23,7 @@
22
23
  "files": [
23
24
  {
24
25
  "path": ".harness-build.json",
25
- "sha256": "87389b46fe1cd171ac419b2bea1d86c859642768deaf77e58b6ee31d082c8f5c"
26
+ "sha256": "2bc63b2a999812dad07176ee1b887caac1053046cc1150ba7e504e1f04a13963"
26
27
  },
27
28
  {
28
29
  "path": "agents/harness-evaluator.md",
@@ -42,7 +43,7 @@
42
43
  },
43
44
  {
44
45
  "path": "contracts/build-profile-v3.schema.json",
45
- "sha256": "4bce197283c749a79a12bdefa85dbb6506656478806c629270594d52ecc6c14c"
46
+ "sha256": "12be5f258673f18d271aec962b333c6a25be1af19726c1565a568a4f085aadd7"
46
47
  },
47
48
  {
48
49
  "path": "contracts/ci-metrics.schema.json",
@@ -66,7 +67,7 @@
66
67
  },
67
68
  {
68
69
  "path": "harness-archive/reference.md",
69
- "sha256": "9a76b0d880e3951ca2d24e56573a4144fdfe3d7abb4a8a44dda4a19d4dce4ec1"
70
+ "sha256": "7564286fae2b73a9a646819b408d0dcd3ed757fdc833d19e8a130861f92ffb03"
70
71
  },
71
72
  {
72
73
  "path": "harness-archive/scripts/gen-manifest.ps1",
@@ -74,15 +75,15 @@
74
75
  },
75
76
  {
76
77
  "path": "harness-archive/SKILL.md",
77
- "sha256": "251ceb2210428ca34db6d3a76d55acfa7f53a7e7953f8b57c9a0fa13d11f2aaf"
78
+ "sha256": "087bccc2059780f405111656bf3a6a586e0e83af2408a5ccdc0110b0d69741de"
78
79
  },
79
80
  {
80
81
  "path": "harness-archive/templates/render-summary.mjs",
81
- "sha256": "a4d1a98de2cf6a6ab74ddba33b6529459f7f5b009f31c5a7021f6abe2c0afef0"
82
+ "sha256": "970585dcd1c590a6fc985289954b60c41b2cf012df7ea2dd790260e452e404c9"
82
83
  },
83
84
  {
84
85
  "path": "harness-archive/templates/summary-data-template.json",
85
- "sha256": "4cc275012d59f22fae14b41c81b076b9865c3f0027addcea5e746dd303101dd7"
86
+ "sha256": "6d2a1ef5b02287150f14f530902e78382fcf0111beeff4eb63bcf1a88f26b05c"
86
87
  },
87
88
  {
88
89
  "path": "harness-codebase-map/checklist.md",
@@ -94,7 +95,7 @@
94
95
  },
95
96
  {
96
97
  "path": "harness-codebase-map/SKILL.md",
97
- "sha256": "e80b9578f785db234ca0ce0ffad2326b7221f0871930a6c61c3defd70213f6f9"
98
+ "sha256": "6c358466447cb65726f5208b324dc3585cd99e60449b2d6594f434ac2bc1b3be"
98
99
  },
99
100
  {
100
101
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -158,11 +159,11 @@
158
159
  },
159
160
  {
160
161
  "path": "harness-knowledge-ingest/SKILL.md",
161
- "sha256": "948dea77f853df34786f8465a907170154255528503573b3b87aa27a57ef6235"
162
+ "sha256": "71f060cac1fbb20de5546cb9c701b19b0c94bc7c88a96c89e8a63e8346da1fb1"
162
163
  },
163
164
  {
164
165
  "path": "harness-knowledge-query/SKILL.md",
165
- "sha256": "bd6235efef89893cf35cc1e01e93112355f368c33722b69f4e72abc48d900ef0"
166
+ "sha256": "da4b65dfc7a599a8f74b4c1dec021d3ce22da82e14d7f6df79f915dc0394f7ce"
166
167
  },
167
168
  {
168
169
  "path": "harness-plan/checklist.md",
@@ -178,7 +179,7 @@
178
179
  },
179
180
  {
180
181
  "path": "harness-plan/SKILL.md",
181
- "sha256": "e5c1e00b76d02aa9ba5c765d84cb496f5304677d282385d3f7323240a4a64dc0"
182
+ "sha256": "c977aa7851fb32e9d82bf0c147cb209fee43010437ec3feabb3138dfbeba70d1"
182
183
  },
183
184
  {
184
185
  "path": "harness-review/checklist.md",
@@ -194,7 +195,7 @@
194
195
  },
195
196
  {
196
197
  "path": "harness-review/SKILL.md",
197
- "sha256": "5934dea44bebc26411edc3b1f5f127f032dea2e97f8f4f38a9d2d472a280bee3"
198
+ "sha256": "a496c7ed5914a4c14b3b2b05adb2a45d49f3bc816435c83979fd8660f7476467"
198
199
  },
199
200
  {
200
201
  "path": "harness-run/checklist.md",
@@ -206,11 +207,11 @@
206
207
  },
207
208
  {
208
209
  "path": "harness-run/reference.md",
209
- "sha256": "6b25813eb7d4ae78772e2f85fda4875698633538e562e8a18d31c773d1689a8a"
210
+ "sha256": "b6887480549e86434d9cfce0003ffe698e81e8ed0b63512e303278f21267748b"
210
211
  },
211
212
  {
212
213
  "path": "harness-run/SKILL.md",
213
- "sha256": "324297b618540c072fd7d6cabc6d424679e49bc6884c9340737a750a5887e00d"
214
+ "sha256": "5547c82ac3cbce6467db81d50e745b876b15cd944bcb89cc7433348eab2f004c"
214
215
  },
215
216
  {
216
217
  "path": "harness-submit/checklist.md",
@@ -222,7 +223,7 @@
222
223
  },
223
224
  {
224
225
  "path": "harness-submit/SKILL.md",
225
- "sha256": "c36b6af82ff4b6249e6312df63462c548e7e13ed1215e9a59624d76178e5c5f1"
226
+ "sha256": "b6dbf2271dcb5aa3c549c0e9f8a22941c0ce18164ce6e4efbec1f5c1b3fbae7e"
226
227
  },
227
228
  {
228
229
  "path": "harness-sync/reference.md",
@@ -230,7 +231,7 @@
230
231
  },
231
232
  {
232
233
  "path": "harness-sync/SKILL.md",
233
- "sha256": "27c56c5cca98a91b99c3f8e16f9b78a61d257be9aa8be21c8c4b5a7282b26dc9"
234
+ "sha256": "b59e3a519c106f992160920f7f546152bbb1039432358eb7472288dffb4ff270"
234
235
  },
235
236
  {
236
237
  "path": "harness-test/checklist.md",
@@ -254,7 +255,7 @@
254
255
  },
255
256
  {
256
257
  "path": "harness-test/SKILL.md",
257
- "sha256": "0986a30598cf5e4723cb6fa307b4ed8c2192f55f2cdc3cc5a5133c5382eb390f"
258
+ "sha256": "f81237ccd069f9daa77ad2302d97b33e3fc4bcf24e8bc04ade22d31a2202f101"
258
259
  },
259
260
  {
260
261
  "path": "protocols/archive-report-protocol.md",
@@ -268,6 +269,10 @@
268
269
  "path": "protocols/evidence-based-reporting-protocol.md",
269
270
  "sha256": "f78ea87823c0935a3033175b393582319da433cf4226e1705070b20d53890ba2"
270
271
  },
272
+ {
273
+ "path": "protocols/execution-session-protocol.md",
274
+ "sha256": "d0ac7ab78cb0bac155e5ca92186168c31779cdd0da1fabbbb2c493dd132f02c2"
275
+ },
271
276
  {
272
277
  "path": "protocols/external-platform-protocol.md",
273
278
  "sha256": "6893e3b6a5615ee3eda567952797f91f4d2fcec59c1f8fd947e472a4c1f6ed71"
@@ -302,7 +307,7 @@
302
307
  },
303
308
  {
304
309
  "path": "protocols/state-layout-protocol.md",
305
- "sha256": "8f20ae2dac0244f39b7dad162bf58f3a502b23dea968dc97d7f2b4d82f4a4cba"
310
+ "sha256": "517bfa32a9446a898e753344ac652e16cf282fe19abc59490e90926f35ee1e81"
306
311
  },
307
312
  {
308
313
  "path": "protocols/submit-protocol.md",
@@ -310,7 +315,7 @@
310
315
  },
311
316
  {
312
317
  "path": "protocols/verification-graph-protocol.md",
313
- "sha256": "f34b3dbcfb09ce0f3cbf56a22bda1b25afef305b6f57b90138ba7b366511f402"
318
+ "sha256": "8f1b140c4e51b1f3b437971b6d3154c2aeaf8dad404512f7bc2fbad5f640f0ca"
314
319
  },
315
320
  {
316
321
  "path": "README.md",
@@ -322,7 +327,7 @@
322
327
  },
323
328
  {
324
329
  "path": "scripts/harness_archive.py",
325
- "sha256": "428273edc77d4c8ee5f7488abd7e0dbc8c6f82b3d8267d02e9e144fe06bb53e4"
330
+ "sha256": "4ffdd0b5a61a60ee263d32d61b67da7c5ba4101968d0de7510894044c4f4b407"
326
331
  },
327
332
  {
328
333
  "path": "scripts/harness_change.py",
@@ -340,14 +345,22 @@
340
345
  "path": "scripts/harness_deploy.py",
341
346
  "sha256": "fb4290c2dd5c28a09c378da5ee7be491bdefe0410f277ec5dd2af1952cfddbca"
342
347
  },
348
+ {
349
+ "path": "scripts/harness_efficiency.py",
350
+ "sha256": "36b2ecbe75a453b35cf6085bbc5e61c04f82e627f9f4f243d29837fad6568c9d"
351
+ },
343
352
  {
344
353
  "path": "scripts/harness_environment.py",
345
- "sha256": "beeef14f7b5f6a14e15ba518236c2cee40c63e4a61d057d046edab3a48e629a2"
354
+ "sha256": "35ffcf5d76c7165f1aee7ed2953b1b86c943e9c751827b81c126e99a58fdd641"
346
355
  },
347
356
  {
348
357
  "path": "scripts/harness_events.py",
349
358
  "sha256": "0d4db19d71d5945837c255192f7c915af447f98e2ac66bf60e25b93f1613b391"
350
359
  },
360
+ {
361
+ "path": "scripts/harness_fixback.py",
362
+ "sha256": "723c48a0034648f8a96967749baacbfdde59774cec2a66b1b26a34ea5f7f2b0f"
363
+ },
351
364
  {
352
365
  "path": "scripts/harness_gate.py",
353
366
  "sha256": "404ad6fdf0f5508a22e12086a05f728df41074bbc2c8072f577d500a797c91c5"
@@ -386,7 +399,7 @@
386
399
  },
387
400
  {
388
401
  "path": "scripts/harness_profile.py",
389
- "sha256": "cad15c1143a3fe42aa76e45ccf821dc212c2df281cbea21d0dcfde44f4ca26c7"
402
+ "sha256": "0d6ec71588058e6ca7442ea7148169d1bf2f9db83a756ec29be1aa4b4281413a"
390
403
  },
391
404
  {
392
405
  "path": "scripts/harness_report_model.py",
@@ -402,11 +415,11 @@
402
415
  },
403
416
  {
404
417
  "path": "scripts/harness_runtime.py",
405
- "sha256": "0cc27b7622922fa1c998973979d4970c5c993efe42545fa64dd0e64993030fce"
418
+ "sha256": "a50cfc9dd5f157251a7ecb8287384319663ec44408bceb0d58e3507c9f8fe340"
406
419
  },
407
420
  {
408
421
  "path": "scripts/harness_service.py",
409
- "sha256": "56862b94d43314ad6515c37ad2945d256672cde66db3da1cbfbde8aebf94847c"
422
+ "sha256": "d3dd9bf79d4b89fe1b40b3564e2831b89008dfc781034875d72c034216079d24"
410
423
  },
411
424
  {
412
425
  "path": "scripts/harness_state.py",
@@ -426,11 +439,11 @@
426
439
  },
427
440
  {
428
441
  "path": "scripts/harness_test_runner.py",
429
- "sha256": "119a884794c0a417e6ffd128dfa601ac17ed5630b3db6b923d357875d3739c7e"
442
+ "sha256": "562b6bf2ab69b2c85c77ae300f25c6fdfbfb19d35791aea0c92350a99034af2e"
430
443
  },
431
444
  {
432
445
  "path": "scripts/harness_verification.py",
433
- "sha256": "a54a257d6c068f4e15f0174a841845cab61af02c4abc35503f99d7fdd206c4f7"
446
+ "sha256": "038f1f19b2ff10c65f6f66f48df63334a1834342107237c8bca1aeefea87515d"
434
447
  },
435
448
  {
436
449
  "path": "scripts/harness_workflow_policy.py",