@hunter-harness/workflow-harness 0.2.42 → 0.2.44

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 (334) 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 +156 -1
  3. package/harness/bundles/general/claude-code/contracts/fixtures/managed-execution.json +341 -0
  4. package/harness/bundles/general/claude-code/contracts/process-identity.schema.json +132 -0
  5. package/harness/bundles/general/claude-code/contracts/run-session.schema.json +142 -0
  6. package/harness/bundles/general/claude-code/contracts/service-retirement-receipt.schema.json +85 -0
  7. package/harness/bundles/general/claude-code/contracts/service-session.schema.json +147 -0
  8. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +1 -1
  9. package/harness/bundles/general/claude-code/harness-archive/reference.md +1 -0
  10. package/harness/bundles/general/claude-code/harness-archive/templates/render-summary.mjs +8 -0
  11. package/harness/bundles/general/claude-code/harness-archive/templates/summary-data-template.json +28 -0
  12. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  13. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  14. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
  15. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
  16. package/harness/bundles/general/claude-code/harness-review/SKILL.md +1 -1
  17. package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
  18. package/harness/bundles/general/claude-code/harness-run/reference.md +6 -1
  19. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
  20. package/harness/bundles/general/claude-code/harness-submit/checklist.md +12 -0
  21. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
  22. package/harness/bundles/general/claude-code/harness-test/SKILL.md +8 -2
  23. package/harness/bundles/general/claude-code/protocols/execution-session-protocol.md +52 -0
  24. package/harness/bundles/general/claude-code/protocols/state-layout-protocol.md +24 -1
  25. package/harness/bundles/general/claude-code/protocols/verification-graph-protocol.md +6 -0
  26. package/harness/bundles/general/claude-code/scripts/harness_archive.py +271 -22
  27. package/harness/bundles/general/claude-code/scripts/harness_change.py +137 -2
  28. package/harness/bundles/general/claude-code/scripts/harness_efficiency.py +443 -0
  29. package/harness/bundles/general/claude-code/scripts/harness_environment.py +760 -46
  30. package/harness/bundles/general/claude-code/scripts/harness_execution_contracts.py +596 -0
  31. package/harness/bundles/general/claude-code/scripts/harness_fixback.py +742 -0
  32. package/harness/bundles/general/claude-code/scripts/harness_integration.py +289 -52
  33. package/harness/bundles/general/claude-code/scripts/harness_ledger.py +5 -0
  34. package/harness/bundles/general/claude-code/scripts/harness_orchestration.py +344 -0
  35. package/harness/bundles/general/claude-code/scripts/harness_process.py +1065 -0
  36. package/harness/bundles/general/claude-code/scripts/harness_profile.py +278 -4
  37. package/harness/bundles/general/claude-code/scripts/harness_runtime.py +1576 -3
  38. package/harness/bundles/general/claude-code/scripts/harness_service.py +1528 -177
  39. package/harness/bundles/general/claude-code/scripts/harness_test_runner.py +224 -146
  40. package/harness/bundles/general/claude-code/scripts/harness_verification.py +487 -8
  41. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  42. package/harness/bundles/general/codebuddy/contracts/build-profile-v3.schema.json +156 -1
  43. package/harness/bundles/general/codebuddy/contracts/fixtures/managed-execution.json +341 -0
  44. package/harness/bundles/general/codebuddy/contracts/process-identity.schema.json +132 -0
  45. package/harness/bundles/general/codebuddy/contracts/run-session.schema.json +142 -0
  46. package/harness/bundles/general/codebuddy/contracts/service-retirement-receipt.schema.json +85 -0
  47. package/harness/bundles/general/codebuddy/contracts/service-session.schema.json +147 -0
  48. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
  49. package/harness/bundles/general/codebuddy/harness-archive/reference.md +1 -0
  50. package/harness/bundles/general/codebuddy/harness-archive/templates/render-summary.mjs +8 -0
  51. package/harness/bundles/general/codebuddy/harness-archive/templates/summary-data-template.json +28 -0
  52. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  53. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  54. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  55. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
  56. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
  57. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
  58. package/harness/bundles/general/codebuddy/harness-run/reference.md +6 -1
  59. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
  60. package/harness/bundles/general/codebuddy/harness-submit/checklist.md +12 -0
  61. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
  62. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +8 -2
  63. package/harness/bundles/general/codebuddy/protocols/execution-session-protocol.md +52 -0
  64. package/harness/bundles/general/codebuddy/protocols/state-layout-protocol.md +24 -1
  65. package/harness/bundles/general/codebuddy/protocols/verification-graph-protocol.md +6 -0
  66. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +271 -22
  67. package/harness/bundles/general/codebuddy/scripts/harness_change.py +137 -2
  68. package/harness/bundles/general/codebuddy/scripts/harness_efficiency.py +443 -0
  69. package/harness/bundles/general/codebuddy/scripts/harness_environment.py +760 -46
  70. package/harness/bundles/general/codebuddy/scripts/harness_execution_contracts.py +596 -0
  71. package/harness/bundles/general/codebuddy/scripts/harness_fixback.py +742 -0
  72. package/harness/bundles/general/codebuddy/scripts/harness_integration.py +289 -52
  73. package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +5 -0
  74. package/harness/bundles/general/codebuddy/scripts/harness_orchestration.py +344 -0
  75. package/harness/bundles/general/codebuddy/scripts/harness_process.py +1065 -0
  76. package/harness/bundles/general/codebuddy/scripts/harness_profile.py +278 -4
  77. package/harness/bundles/general/codebuddy/scripts/harness_runtime.py +1576 -3
  78. package/harness/bundles/general/codebuddy/scripts/harness_service.py +1528 -177
  79. package/harness/bundles/general/codebuddy/scripts/harness_test_runner.py +224 -146
  80. package/harness/bundles/general/codebuddy/scripts/harness_verification.py +487 -8
  81. package/harness/bundles/general/codex/.harness-build.json +1 -1
  82. package/harness/bundles/general/codex/contracts/build-profile-v3.schema.json +156 -1
  83. package/harness/bundles/general/codex/contracts/fixtures/managed-execution.json +341 -0
  84. package/harness/bundles/general/codex/contracts/process-identity.schema.json +132 -0
  85. package/harness/bundles/general/codex/contracts/run-session.schema.json +142 -0
  86. package/harness/bundles/general/codex/contracts/service-retirement-receipt.schema.json +85 -0
  87. package/harness/bundles/general/codex/contracts/service-session.schema.json +147 -0
  88. package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
  89. package/harness/bundles/general/codex/harness-archive/reference.md +1 -0
  90. package/harness/bundles/general/codex/harness-archive/templates/render-summary.mjs +8 -0
  91. package/harness/bundles/general/codex/harness-archive/templates/summary-data-template.json +28 -0
  92. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  93. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
  94. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  95. package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
  96. package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
  97. package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
  98. package/harness/bundles/general/codex/harness-run/reference.md +6 -1
  99. package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
  100. package/harness/bundles/general/codex/harness-submit/checklist.md +12 -0
  101. package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
  102. package/harness/bundles/general/codex/harness-test/SKILL.md +8 -2
  103. package/harness/bundles/general/codex/protocols/execution-session-protocol.md +52 -0
  104. package/harness/bundles/general/codex/protocols/state-layout-protocol.md +24 -1
  105. package/harness/bundles/general/codex/protocols/verification-graph-protocol.md +6 -0
  106. package/harness/bundles/general/codex/scripts/harness_archive.py +271 -22
  107. package/harness/bundles/general/codex/scripts/harness_change.py +137 -2
  108. package/harness/bundles/general/codex/scripts/harness_efficiency.py +443 -0
  109. package/harness/bundles/general/codex/scripts/harness_environment.py +760 -46
  110. package/harness/bundles/general/codex/scripts/harness_execution_contracts.py +596 -0
  111. package/harness/bundles/general/codex/scripts/harness_fixback.py +742 -0
  112. package/harness/bundles/general/codex/scripts/harness_integration.py +289 -52
  113. package/harness/bundles/general/codex/scripts/harness_ledger.py +5 -0
  114. package/harness/bundles/general/codex/scripts/harness_orchestration.py +344 -0
  115. package/harness/bundles/general/codex/scripts/harness_process.py +1065 -0
  116. package/harness/bundles/general/codex/scripts/harness_profile.py +278 -4
  117. package/harness/bundles/general/codex/scripts/harness_runtime.py +1576 -3
  118. package/harness/bundles/general/codex/scripts/harness_service.py +1528 -177
  119. package/harness/bundles/general/codex/scripts/harness_test_runner.py +224 -146
  120. package/harness/bundles/general/codex/scripts/harness_verification.py +487 -8
  121. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  122. package/harness/bundles/general/cursor/contracts/build-profile-v3.schema.json +156 -1
  123. package/harness/bundles/general/cursor/contracts/fixtures/managed-execution.json +341 -0
  124. package/harness/bundles/general/cursor/contracts/process-identity.schema.json +132 -0
  125. package/harness/bundles/general/cursor/contracts/run-session.schema.json +142 -0
  126. package/harness/bundles/general/cursor/contracts/service-retirement-receipt.schema.json +85 -0
  127. package/harness/bundles/general/cursor/contracts/service-session.schema.json +147 -0
  128. package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
  129. package/harness/bundles/general/cursor/harness-archive/reference.md +1 -0
  130. package/harness/bundles/general/cursor/harness-archive/templates/render-summary.mjs +8 -0
  131. package/harness/bundles/general/cursor/harness-archive/templates/summary-data-template.json +28 -0
  132. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  133. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  134. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  135. package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
  136. package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
  137. package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
  138. package/harness/bundles/general/cursor/harness-run/reference.md +6 -1
  139. package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
  140. package/harness/bundles/general/cursor/harness-submit/checklist.md +12 -0
  141. package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
  142. package/harness/bundles/general/cursor/harness-test/SKILL.md +8 -2
  143. package/harness/bundles/general/cursor/protocols/execution-session-protocol.md +52 -0
  144. package/harness/bundles/general/cursor/protocols/state-layout-protocol.md +24 -1
  145. package/harness/bundles/general/cursor/protocols/verification-graph-protocol.md +6 -0
  146. package/harness/bundles/general/cursor/scripts/harness_archive.py +271 -22
  147. package/harness/bundles/general/cursor/scripts/harness_change.py +137 -2
  148. package/harness/bundles/general/cursor/scripts/harness_efficiency.py +443 -0
  149. package/harness/bundles/general/cursor/scripts/harness_environment.py +760 -46
  150. package/harness/bundles/general/cursor/scripts/harness_execution_contracts.py +596 -0
  151. package/harness/bundles/general/cursor/scripts/harness_fixback.py +742 -0
  152. package/harness/bundles/general/cursor/scripts/harness_integration.py +289 -52
  153. package/harness/bundles/general/cursor/scripts/harness_ledger.py +5 -0
  154. package/harness/bundles/general/cursor/scripts/harness_orchestration.py +344 -0
  155. package/harness/bundles/general/cursor/scripts/harness_process.py +1065 -0
  156. package/harness/bundles/general/cursor/scripts/harness_profile.py +278 -4
  157. package/harness/bundles/general/cursor/scripts/harness_runtime.py +1576 -3
  158. package/harness/bundles/general/cursor/scripts/harness_service.py +1528 -177
  159. package/harness/bundles/general/cursor/scripts/harness_test_runner.py +224 -146
  160. package/harness/bundles/general/cursor/scripts/harness_verification.py +487 -8
  161. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  162. package/harness/bundles/java/claude-code/contracts/build-profile-v3.schema.json +156 -1
  163. package/harness/bundles/java/claude-code/contracts/fixtures/managed-execution.json +341 -0
  164. package/harness/bundles/java/claude-code/contracts/process-identity.schema.json +132 -0
  165. package/harness/bundles/java/claude-code/contracts/run-session.schema.json +142 -0
  166. package/harness/bundles/java/claude-code/contracts/service-retirement-receipt.schema.json +85 -0
  167. package/harness/bundles/java/claude-code/contracts/service-session.schema.json +147 -0
  168. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  169. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
  170. package/harness/bundles/java/claude-code/harness-archive/reference.md +1 -0
  171. package/harness/bundles/java/claude-code/harness-archive/templates/render-summary.mjs +8 -0
  172. package/harness/bundles/java/claude-code/harness-archive/templates/summary-data-template.json +28 -0
  173. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  174. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  175. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  176. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  177. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
  178. package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
  179. package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
  180. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
  181. package/harness/bundles/java/claude-code/harness-submit/checklist.md +12 -0
  182. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
  183. package/harness/bundles/java/claude-code/harness-test/SKILL.md +8 -2
  184. package/harness/bundles/java/claude-code/protocols/execution-session-protocol.md +52 -0
  185. package/harness/bundles/java/claude-code/protocols/state-layout-protocol.md +24 -1
  186. package/harness/bundles/java/claude-code/protocols/verification-graph-protocol.md +6 -0
  187. package/harness/bundles/java/claude-code/scripts/harness_archive.py +271 -22
  188. package/harness/bundles/java/claude-code/scripts/harness_change.py +137 -2
  189. package/harness/bundles/java/claude-code/scripts/harness_efficiency.py +443 -0
  190. package/harness/bundles/java/claude-code/scripts/harness_environment.py +760 -46
  191. package/harness/bundles/java/claude-code/scripts/harness_execution_contracts.py +596 -0
  192. package/harness/bundles/java/claude-code/scripts/harness_fixback.py +742 -0
  193. package/harness/bundles/java/claude-code/scripts/harness_integration.py +289 -52
  194. package/harness/bundles/java/claude-code/scripts/harness_ledger.py +5 -0
  195. package/harness/bundles/java/claude-code/scripts/harness_orchestration.py +344 -0
  196. package/harness/bundles/java/claude-code/scripts/harness_process.py +1065 -0
  197. package/harness/bundles/java/claude-code/scripts/harness_profile.py +278 -4
  198. package/harness/bundles/java/claude-code/scripts/harness_runtime.py +1576 -3
  199. package/harness/bundles/java/claude-code/scripts/harness_service.py +1528 -177
  200. package/harness/bundles/java/claude-code/scripts/harness_test_runner.py +224 -146
  201. package/harness/bundles/java/claude-code/scripts/harness_verification.py +487 -8
  202. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  203. package/harness/bundles/java/codebuddy/contracts/build-profile-v3.schema.json +156 -1
  204. package/harness/bundles/java/codebuddy/contracts/fixtures/managed-execution.json +341 -0
  205. package/harness/bundles/java/codebuddy/contracts/process-identity.schema.json +132 -0
  206. package/harness/bundles/java/codebuddy/contracts/run-session.schema.json +142 -0
  207. package/harness/bundles/java/codebuddy/contracts/service-retirement-receipt.schema.json +85 -0
  208. package/harness/bundles/java/codebuddy/contracts/service-session.schema.json +147 -0
  209. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  210. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
  211. package/harness/bundles/java/codebuddy/harness-archive/reference.md +1 -0
  212. package/harness/bundles/java/codebuddy/harness-archive/templates/render-summary.mjs +8 -0
  213. package/harness/bundles/java/codebuddy/harness-archive/templates/summary-data-template.json +28 -0
  214. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  215. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  216. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  217. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  218. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
  219. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
  220. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
  221. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
  222. package/harness/bundles/java/codebuddy/harness-submit/checklist.md +12 -0
  223. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
  224. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +8 -2
  225. package/harness/bundles/java/codebuddy/protocols/execution-session-protocol.md +52 -0
  226. package/harness/bundles/java/codebuddy/protocols/state-layout-protocol.md +24 -1
  227. package/harness/bundles/java/codebuddy/protocols/verification-graph-protocol.md +6 -0
  228. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +271 -22
  229. package/harness/bundles/java/codebuddy/scripts/harness_change.py +137 -2
  230. package/harness/bundles/java/codebuddy/scripts/harness_efficiency.py +443 -0
  231. package/harness/bundles/java/codebuddy/scripts/harness_environment.py +760 -46
  232. package/harness/bundles/java/codebuddy/scripts/harness_execution_contracts.py +596 -0
  233. package/harness/bundles/java/codebuddy/scripts/harness_fixback.py +742 -0
  234. package/harness/bundles/java/codebuddy/scripts/harness_integration.py +289 -52
  235. package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +5 -0
  236. package/harness/bundles/java/codebuddy/scripts/harness_orchestration.py +344 -0
  237. package/harness/bundles/java/codebuddy/scripts/harness_process.py +1065 -0
  238. package/harness/bundles/java/codebuddy/scripts/harness_profile.py +278 -4
  239. package/harness/bundles/java/codebuddy/scripts/harness_runtime.py +1576 -3
  240. package/harness/bundles/java/codebuddy/scripts/harness_service.py +1528 -177
  241. package/harness/bundles/java/codebuddy/scripts/harness_test_runner.py +224 -146
  242. package/harness/bundles/java/codebuddy/scripts/harness_verification.py +487 -8
  243. package/harness/bundles/java/codex/.harness-build.json +1 -1
  244. package/harness/bundles/java/codex/contracts/build-profile-v3.schema.json +156 -1
  245. package/harness/bundles/java/codex/contracts/fixtures/managed-execution.json +341 -0
  246. package/harness/bundles/java/codex/contracts/process-identity.schema.json +132 -0
  247. package/harness/bundles/java/codex/contracts/run-session.schema.json +142 -0
  248. package/harness/bundles/java/codex/contracts/service-retirement-receipt.schema.json +85 -0
  249. package/harness/bundles/java/codex/contracts/service-session.schema.json +147 -0
  250. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  251. package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
  252. package/harness/bundles/java/codex/harness-archive/reference.md +1 -0
  253. package/harness/bundles/java/codex/harness-archive/templates/render-summary.mjs +8 -0
  254. package/harness/bundles/java/codex/harness-archive/templates/summary-data-template.json +28 -0
  255. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  256. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
  257. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  258. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  259. package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
  260. package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
  261. package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
  262. package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
  263. package/harness/bundles/java/codex/harness-submit/checklist.md +12 -0
  264. package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
  265. package/harness/bundles/java/codex/harness-test/SKILL.md +8 -2
  266. package/harness/bundles/java/codex/protocols/execution-session-protocol.md +52 -0
  267. package/harness/bundles/java/codex/protocols/state-layout-protocol.md +24 -1
  268. package/harness/bundles/java/codex/protocols/verification-graph-protocol.md +6 -0
  269. package/harness/bundles/java/codex/scripts/harness_archive.py +271 -22
  270. package/harness/bundles/java/codex/scripts/harness_change.py +137 -2
  271. package/harness/bundles/java/codex/scripts/harness_efficiency.py +443 -0
  272. package/harness/bundles/java/codex/scripts/harness_environment.py +760 -46
  273. package/harness/bundles/java/codex/scripts/harness_execution_contracts.py +596 -0
  274. package/harness/bundles/java/codex/scripts/harness_fixback.py +742 -0
  275. package/harness/bundles/java/codex/scripts/harness_integration.py +289 -52
  276. package/harness/bundles/java/codex/scripts/harness_ledger.py +5 -0
  277. package/harness/bundles/java/codex/scripts/harness_orchestration.py +344 -0
  278. package/harness/bundles/java/codex/scripts/harness_process.py +1065 -0
  279. package/harness/bundles/java/codex/scripts/harness_profile.py +278 -4
  280. package/harness/bundles/java/codex/scripts/harness_runtime.py +1576 -3
  281. package/harness/bundles/java/codex/scripts/harness_service.py +1528 -177
  282. package/harness/bundles/java/codex/scripts/harness_test_runner.py +224 -146
  283. package/harness/bundles/java/codex/scripts/harness_verification.py +487 -8
  284. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  285. package/harness/bundles/java/cursor/contracts/build-profile-v3.schema.json +156 -1
  286. package/harness/bundles/java/cursor/contracts/fixtures/managed-execution.json +341 -0
  287. package/harness/bundles/java/cursor/contracts/process-identity.schema.json +132 -0
  288. package/harness/bundles/java/cursor/contracts/run-session.schema.json +142 -0
  289. package/harness/bundles/java/cursor/contracts/service-retirement-receipt.schema.json +85 -0
  290. package/harness/bundles/java/cursor/contracts/service-session.schema.json +147 -0
  291. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  292. package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
  293. package/harness/bundles/java/cursor/harness-archive/reference.md +1 -0
  294. package/harness/bundles/java/cursor/harness-archive/templates/render-summary.mjs +8 -0
  295. package/harness/bundles/java/cursor/harness-archive/templates/summary-data-template.json +28 -0
  296. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  297. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  298. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  299. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  300. package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
  301. package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
  302. package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
  303. package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
  304. package/harness/bundles/java/cursor/harness-submit/checklist.md +12 -0
  305. package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
  306. package/harness/bundles/java/cursor/harness-test/SKILL.md +8 -2
  307. package/harness/bundles/java/cursor/protocols/execution-session-protocol.md +52 -0
  308. package/harness/bundles/java/cursor/protocols/state-layout-protocol.md +24 -1
  309. package/harness/bundles/java/cursor/protocols/verification-graph-protocol.md +6 -0
  310. package/harness/bundles/java/cursor/scripts/harness_archive.py +271 -22
  311. package/harness/bundles/java/cursor/scripts/harness_change.py +137 -2
  312. package/harness/bundles/java/cursor/scripts/harness_efficiency.py +443 -0
  313. package/harness/bundles/java/cursor/scripts/harness_environment.py +760 -46
  314. package/harness/bundles/java/cursor/scripts/harness_execution_contracts.py +596 -0
  315. package/harness/bundles/java/cursor/scripts/harness_fixback.py +742 -0
  316. package/harness/bundles/java/cursor/scripts/harness_integration.py +289 -52
  317. package/harness/bundles/java/cursor/scripts/harness_ledger.py +5 -0
  318. package/harness/bundles/java/cursor/scripts/harness_orchestration.py +344 -0
  319. package/harness/bundles/java/cursor/scripts/harness_process.py +1065 -0
  320. package/harness/bundles/java/cursor/scripts/harness_profile.py +278 -4
  321. package/harness/bundles/java/cursor/scripts/harness_runtime.py +1576 -3
  322. package/harness/bundles/java/cursor/scripts/harness_service.py +1528 -177
  323. package/harness/bundles/java/cursor/scripts/harness_test_runner.py +224 -146
  324. package/harness/bundles/java/cursor/scripts/harness_verification.py +487 -8
  325. package/harness/manifests/general/claude-code.json +76 -31
  326. package/harness/manifests/general/codebuddy.json +76 -31
  327. package/harness/manifests/general/codex.json +76 -31
  328. package/harness/manifests/general/cursor.json +76 -31
  329. package/harness/manifests/java/claude-code.json +77 -32
  330. package/harness/manifests/java/codebuddy.json +77 -32
  331. package/harness/manifests/java/codex.json +77 -32
  332. package/harness/manifests/java/cursor.json +77 -32
  333. package/hunter-workflow-family.json +6 -4
  334. package/package.json +1 -1
@@ -6,10 +6,81 @@ from __future__ import annotations
6
6
  import argparse
7
7
  import fnmatch
8
8
  import json
9
+ import time
10
+ from collections import Counter
9
11
  from pathlib import Path
10
12
  from typing import Any
11
13
 
12
14
 
15
+ _COVERAGE_RANK = {"incremental": 0, "module": 1, "module-am": 2, "full": 3}
16
+
17
+ _REASON_EXPLANATIONS = {
18
+ "PRODUCT_IDENTITY_REQUIRED": "A product identity is required before a verification can run.",
19
+ "CAPABILITY_MISSING": "A required execution capability is not available.",
20
+ "REQUIRED_COVERAGE_INVALID": "The required coverage declaration is invalid.",
21
+ "COVERAGE_DECLARATION_REQUIRED": "The target does not declare the coverage level needed for this gate.",
22
+ "COVERAGE_INSUFFICIENT": "The target coverage is below the required gate level.",
23
+ "NOT_APPLICABLE": "The target is explicitly not applicable to this change.",
24
+ "FROZEN_IDENTITY_REQUIRED": "The target requires a frozen product identity.",
25
+ "FROZEN_IDENTITY_DRIFT": "The current product identity differs from the frozen identity.",
26
+ "REUSE_POLICY_NEVER": "The target policy explicitly requires a fresh execution.",
27
+ "REUSE_EVIDENCE_INVALID": "Ledger evidence does not match the target and product identity exactly.",
28
+ "REUSE_ELIGIBLE": "Identity-matched ledger evidence permits reuse.",
29
+ "SELECTED_FOR_EXECUTION": "The target was selected for execution and passed its gate checks.",
30
+ "COMMAND_NOT_DECLARED": "The target command key is absent from the authoritative command declaration map.",
31
+ "COMMAND_DECLARATION_INVALID": "The authoritative command declaration is empty or malformed.",
32
+ "DEPENDENCY_UNKNOWN": "The target depends on a node that is not in the verification graph.",
33
+ "DEPENDENCY_BLOCKED": "A dependency was skipped or blocked, so this target cannot run.",
34
+ "DEPENDENCY_CYCLE": "The verification graph contains a dependency cycle.",
35
+ "VERIFICATION_REUSED": "The target reused an identity-matched verification receipt.",
36
+ "VERIFICATION_ARGV_NOT_CONCRETE": "The target command arguments are not concrete and executable.",
37
+ }
38
+
39
+
40
+ def _reason_explanation(reason_codes: list[str], decision: str) -> str:
41
+ explanations: list[str] = []
42
+ for raw in reason_codes:
43
+ code = str(raw).split(":", 1)[0]
44
+ explanation = _REASON_EXPLANATIONS.get(code)
45
+ if explanation is None:
46
+ if raw.startswith("depends-on:"):
47
+ explanation = f"The target waits for dependency {raw.split(':', 1)[1]} to complete."
48
+ elif raw.startswith("consumer-of:"):
49
+ explanation = f"The target is included because it consumes {raw.split(':', 1)[1]}."
50
+ elif raw.startswith("input-match:"):
51
+ explanation = f"A changed input matched {raw.split(':', 1)[1]}."
52
+ elif raw.startswith("CAPABILITY_MISSING:"):
53
+ explanation = f"Capability {raw.split(':', 1)[1]} is unavailable."
54
+ else:
55
+ explanation = f"Verification decision reason: {raw}."
56
+ if explanation not in explanations:
57
+ explanations.append(explanation)
58
+ if explanations:
59
+ return " ".join(explanations)
60
+ return {
61
+ "EXECUTE": "The target passed all declared gate checks and is ready to execute.",
62
+ "REUSE": "The target has valid identity-matched reusable evidence.",
63
+ "SKIP": "The target is not applicable to this change.",
64
+ "BLOCKED": "The target cannot execute until its blocking conditions are resolved.",
65
+ }.get(decision, "The target has no executable decision.")
66
+
67
+
68
+ def _normalize_targets(raw_targets: Any) -> list[dict[str, Any]]:
69
+ if isinstance(raw_targets, dict):
70
+ return [
71
+ {**dict(target), "id": str(target.get("id") or target_id)}
72
+ for target_id, target in raw_targets.items()
73
+ if isinstance(target_id, str) and isinstance(target, dict)
74
+ ]
75
+ if isinstance(raw_targets, list):
76
+ return [
77
+ dict(target)
78
+ for target in raw_targets
79
+ if isinstance(target, dict) and str(target.get("id") or "").strip()
80
+ ]
81
+ return []
82
+
83
+
13
84
  def select_verifications(payload: dict[str, Any]) -> dict[str, Any]:
14
85
  changed = sorted(
15
86
  {
@@ -18,9 +89,7 @@ def select_verifications(payload: dict[str, Any]) -> dict[str, Any]:
18
89
  if str(path).strip()
19
90
  }
20
91
  )
21
- targets = [
22
- target for target in payload.get("targets", []) if isinstance(target, dict)
23
- ]
92
+ targets = _normalize_targets(payload.get("targets", []))
24
93
  selected_ids: set[str] = set()
25
94
  reasons: dict[str, list[str]] = {}
26
95
  for target in targets:
@@ -90,16 +159,426 @@ def select_verifications(payload: dict[str, Any]) -> dict[str, Any]:
90
159
  }
91
160
 
92
161
 
162
+ def _resource_locks(target: dict[str, Any]) -> list[str]:
163
+ locks = sorted(
164
+ {
165
+ str(item).strip()
166
+ for item in target.get("resourceLocks", [])
167
+ if str(item).strip()
168
+ }
169
+ )
170
+ estimated = float(
171
+ target.get("estimatedDurationSeconds")
172
+ or target.get("expectedDurationSeconds")
173
+ or 0
174
+ )
175
+ if estimated >= 60 and not locks:
176
+ locks.append("harness:unclassified-heavy")
177
+ return locks
178
+
179
+
180
+ def _target_decision(
181
+ target: dict[str, Any],
182
+ *,
183
+ product_identity: str,
184
+ frozen_identity: str,
185
+ available_capabilities: set[str],
186
+ verification_ledger: list[dict[str, Any]],
187
+ command_declarations: dict[str, Any] | None = None,
188
+ ) -> tuple[str, list[str]]:
189
+ blockers: list[str] = []
190
+ if not product_identity:
191
+ return "BLOCKED", ["PRODUCT_IDENTITY_REQUIRED"]
192
+ if command_declarations is not None:
193
+ command_key = str(target.get("commandKey") or "").strip()
194
+ declaration = command_declarations.get(command_key) if command_key else None
195
+ if declaration is None:
196
+ blockers.append("COMMAND_NOT_DECLARED")
197
+ elif isinstance(declaration, dict):
198
+ argv = declaration.get("argv") or declaration.get("argvTemplate")
199
+ if not isinstance(argv, list) or not argv or not all(
200
+ isinstance(item, str) and item for item in argv
201
+ ):
202
+ blockers.append("COMMAND_DECLARATION_INVALID")
203
+ elif not isinstance(declaration, list) or not declaration or not all(
204
+ isinstance(item, str) and item for item in declaration
205
+ ):
206
+ blockers.append("COMMAND_DECLARATION_INVALID")
207
+ required_capabilities = {
208
+ str(item).strip()
209
+ for item in target.get("requiredCapabilities", [])
210
+ if str(item).strip()
211
+ }
212
+ blockers.extend(
213
+ "CAPABILITY_MISSING:" + item
214
+ for item in sorted(required_capabilities - available_capabilities)
215
+ )
216
+ required_coverage = str(target.get("requiredCoverage") or "").strip()
217
+ coverage_level = str(
218
+ target.get("coverageLevel") or target.get("scope") or ""
219
+ ).strip()
220
+ if required_coverage:
221
+ if required_coverage not in _COVERAGE_RANK:
222
+ blockers.append("REQUIRED_COVERAGE_INVALID")
223
+ elif coverage_level not in _COVERAGE_RANK:
224
+ blockers.append("COVERAGE_DECLARATION_REQUIRED")
225
+ elif _COVERAGE_RANK[coverage_level] < _COVERAGE_RANK[required_coverage]:
226
+ blockers.append(
227
+ f"COVERAGE_INSUFFICIENT:{coverage_level}<{required_coverage}"
228
+ )
229
+ applicability = target.get("applicability")
230
+ if isinstance(applicability, dict) and applicability.get("applicable") is False:
231
+ return "SKIP", [
232
+ str(applicability.get("reasonCode") or "NOT_APPLICABLE")
233
+ ]
234
+ if (
235
+ target.get("requiresFrozenIdentity") is True
236
+ and not frozen_identity
237
+ ):
238
+ blockers.append("FROZEN_IDENTITY_REQUIRED")
239
+ if (
240
+ target.get("requiresFrozenIdentity") is True
241
+ and frozen_identity
242
+ and product_identity != frozen_identity
243
+ ):
244
+ blockers.append("FROZEN_IDENTITY_DRIFT")
245
+ if blockers:
246
+ return "BLOCKED", blockers
247
+ reuse = target.get("reuse")
248
+ if isinstance(reuse, dict) and reuse.get("eligible") is True:
249
+ if target.get("reusePolicy") == "never":
250
+ return "EXECUTE", ["REUSE_POLICY_NEVER"]
251
+ evidence_id = str(reuse.get("evidenceId") or "").strip()
252
+ evidence_product = str(reuse.get("productIdentity") or "").strip()
253
+ target_id = str(target.get("id") or "")
254
+ ledger_match = next(
255
+ (
256
+ item
257
+ for item in verification_ledger
258
+ if str(item.get("evidenceId") or "") == evidence_id
259
+ and str(item.get("targetId") or item.get("verification") or "")
260
+ == target_id
261
+ and str(item.get("productIdentity") or "") == product_identity
262
+ and item.get("status") == "OK"
263
+ ),
264
+ None,
265
+ )
266
+ if (
267
+ str(target.get("reusePolicy") or "") != "ledger-exact"
268
+ or not evidence_id
269
+ or evidence_product != product_identity
270
+ or ledger_match is None
271
+ ):
272
+ return "BLOCKED", ["REUSE_EVIDENCE_INVALID"]
273
+ return "REUSE", [str(reuse.get("reasonCode") or "REUSE_ELIGIBLE")]
274
+ return "EXECUTE", ["SELECTED_FOR_EXECUTION"]
275
+
276
+
277
+ def schedule_verifications(payload: dict[str, Any]) -> dict[str, Any]:
278
+ """Build an explainable, lock-aware verification execution plan.
279
+
280
+ Dependencies define the earliest wave. Nodes in the same wave may run in
281
+ parallel only when their declared resource locks are disjoint. Long tasks
282
+ without a lock declaration receive one shared conservative lock.
283
+ """
284
+ targets = _normalize_targets(payload.get("targets", []))
285
+ if not targets:
286
+ return {
287
+ "ok": False,
288
+ "code": "VERIFICATION_TARGETS_REQUIRED",
289
+ "productIdentity": str(payload.get("productIdentity") or ""),
290
+ "frozenIdentity": str(payload.get("frozenIdentity") or ""),
291
+ "plan": [],
292
+ "waves": [],
293
+ }
294
+ targets.sort(key=lambda item: str(item["id"]))
295
+ by_id = {str(item["id"]): item for item in targets}
296
+ product_identity = str(payload.get("productIdentity") or "")
297
+ frozen_identity = str(payload.get("frozenIdentity") or "")
298
+ available_capabilities = {
299
+ str(item).strip()
300
+ for item in payload.get("availableCapabilities", [])
301
+ if str(item).strip()
302
+ }
303
+ verification_ledger = [
304
+ dict(item)
305
+ for item in payload.get("verificationLedger", [])
306
+ if isinstance(item, dict)
307
+ ]
308
+ raw_commands = payload.get("commands")
309
+ command_declarations = (
310
+ {str(key): value for key, value in raw_commands.items()}
311
+ if isinstance(raw_commands, dict)
312
+ else None
313
+ )
314
+ decisions: dict[str, tuple[str, list[str]]] = {
315
+ target_id: _target_decision(
316
+ target,
317
+ product_identity=product_identity,
318
+ frozen_identity=frozen_identity,
319
+ available_capabilities=available_capabilities,
320
+ verification_ledger=verification_ledger,
321
+ command_declarations=command_declarations,
322
+ )
323
+ for target_id, target in by_id.items()
324
+ }
325
+ waves: list[list[str]] = []
326
+ placed: dict[str, int | None] = {}
327
+ pending = set(by_id)
328
+
329
+ while pending:
330
+ progressed = False
331
+ for target_id in sorted(pending):
332
+ target = by_id[target_id]
333
+ dependencies = [str(item) for item in target.get("dependsOn", [])]
334
+ unknown = sorted(set(dependencies) - set(by_id))
335
+ if unknown:
336
+ decisions[target_id] = (
337
+ "BLOCKED",
338
+ ["DEPENDENCY_UNKNOWN:" + item for item in unknown],
339
+ )
340
+ placed[target_id] = None
341
+ pending.remove(target_id)
342
+ progressed = True
343
+ break
344
+ if any(item not in placed for item in dependencies):
345
+ continue
346
+ failed_dependencies = [
347
+ item
348
+ for item in dependencies
349
+ if decisions[item][0] in {"SKIP", "BLOCKED"}
350
+ ]
351
+ if failed_dependencies:
352
+ decisions[target_id] = (
353
+ "BLOCKED",
354
+ [
355
+ "DEPENDENCY_BLOCKED:" + item
356
+ for item in sorted(failed_dependencies)
357
+ ],
358
+ )
359
+ placed[target_id] = None
360
+ pending.remove(target_id)
361
+ progressed = True
362
+ break
363
+ decision, _ = decisions[target_id]
364
+ if decision in {"SKIP", "BLOCKED"}:
365
+ placed[target_id] = None
366
+ pending.remove(target_id)
367
+ progressed = True
368
+ break
369
+ dependency_waves = [
370
+ placed[item]
371
+ for item in dependencies
372
+ if placed.get(item) is not None
373
+ ]
374
+ earliest = (
375
+ max(int(item) for item in dependency_waves) + 1
376
+ if dependency_waves
377
+ else 0
378
+ )
379
+ if decision == "REUSE":
380
+ placed[target_id] = max(0, earliest - 1)
381
+ pending.remove(target_id)
382
+ progressed = True
383
+ break
384
+ locks = set(_resource_locks(target))
385
+ wave = earliest
386
+ while True:
387
+ while wave >= len(waves):
388
+ waves.append([])
389
+ occupied = {
390
+ lock
391
+ for item_id in waves[wave]
392
+ for lock in _resource_locks(by_id[item_id])
393
+ }
394
+ if not locks & occupied:
395
+ waves[wave].append(target_id)
396
+ placed[target_id] = wave
397
+ break
398
+ wave += 1
399
+ pending.remove(target_id)
400
+ progressed = True
401
+ break
402
+ if not progressed:
403
+ for target_id in sorted(pending):
404
+ decisions[target_id] = ("BLOCKED", ["DEPENDENCY_CYCLE"])
405
+ placed[target_id] = None
406
+ pending.clear()
407
+
408
+ plan: list[dict[str, Any]] = []
409
+ for target_id, target in by_id.items():
410
+ decision, reasons = decisions[target_id]
411
+ dependencies = [str(item) for item in target.get("dependsOn", [])]
412
+ reason_codes = [
413
+ *reasons,
414
+ *["depends-on:" + item for item in dependencies],
415
+ ]
416
+ plan.append(
417
+ {
418
+ **target,
419
+ "id": target_id,
420
+ "decision": decision,
421
+ "reasonCodes": reason_codes,
422
+ "explanation": _reason_explanation(reason_codes, decision),
423
+ "resourceLocks": _resource_locks(target),
424
+ "wave": placed[target_id],
425
+ }
426
+ )
427
+ decision_counts = dict(
428
+ sorted(Counter(item["decision"] for item in plan).items())
429
+ )
430
+ return {
431
+ "ok": all(item["decision"] != "BLOCKED" for item in plan),
432
+ "code": (
433
+ "VERIFICATION_PLAN_READY"
434
+ if all(item["decision"] != "BLOCKED" for item in plan)
435
+ else "VERIFICATION_PLAN_BLOCKED"
436
+ ),
437
+ "productIdentity": product_identity,
438
+ "frozenIdentity": frozen_identity,
439
+ "plan": plan,
440
+ "decisionCounts": decision_counts,
441
+ "waves": [
442
+ {"wave": index, "targets": target_ids}
443
+ for index, target_ids in enumerate(waves)
444
+ if target_ids
445
+ ],
446
+ }
447
+
448
+
449
+ def execute_verifications(payload: dict[str, Any]) -> dict[str, Any]:
450
+ """Execute a scheduled graph wave-by-wave through managed run sessions."""
451
+ import harness_runtime
452
+
453
+ scheduled = schedule_verifications(payload)
454
+ if not scheduled["ok"]:
455
+ return {**scheduled, "execution": []}
456
+ state_root = Path(str(payload.get("stateRoot") or "")).expanduser().resolve()
457
+ working_directory = Path(
458
+ str(payload.get("workingDirectory") or "")
459
+ ).expanduser().resolve()
460
+ if not str(payload.get("stateRoot") or "").strip():
461
+ return {
462
+ **scheduled,
463
+ "ok": False,
464
+ "code": "VERIFICATION_STATE_ROOT_REQUIRED",
465
+ "execution": [],
466
+ }
467
+ if not working_directory.is_dir():
468
+ return {
469
+ **scheduled,
470
+ "ok": False,
471
+ "code": "VERIFICATION_WORKDIR_INVALID",
472
+ "execution": [],
473
+ }
474
+ by_id = {str(item["id"]): item for item in scheduled["plan"]}
475
+ outcomes: dict[str, dict[str, Any]] = {
476
+ target_id: {
477
+ "targetId": target_id,
478
+ "status": "OK",
479
+ "reasonCode": "VERIFICATION_REUSED",
480
+ }
481
+ for target_id, target in by_id.items()
482
+ if target.get("decision") == "REUSE"
483
+ }
484
+ execution: list[dict[str, Any]] = list(outcomes.values())
485
+ for wave in scheduled["waves"]:
486
+ running: list[tuple[str, str]] = []
487
+ for target_id in wave["targets"]:
488
+ target = by_id[target_id]
489
+ failed_dependencies = [
490
+ dependency
491
+ for dependency in target.get("dependsOn", [])
492
+ if outcomes.get(str(dependency), {}).get("status") != "OK"
493
+ ]
494
+ if failed_dependencies:
495
+ outcome = {
496
+ "targetId": target_id,
497
+ "status": "BLOCKED",
498
+ "reasonCode": "DEPENDENCY_EXECUTION_FAILED",
499
+ "blockedBy": failed_dependencies,
500
+ }
501
+ outcomes[target_id] = outcome
502
+ execution.append(outcome)
503
+ continue
504
+ argv = target.get("argvTemplate")
505
+ if (
506
+ not isinstance(argv, list)
507
+ or not argv
508
+ or not all(isinstance(item, str) and item for item in argv)
509
+ or any("{" in item or "}" in item for item in argv)
510
+ ):
511
+ outcome = {
512
+ "targetId": target_id,
513
+ "status": "BLOCKED",
514
+ "reasonCode": "VERIFICATION_ARGV_NOT_CONCRETE",
515
+ }
516
+ outcomes[target_id] = outcome
517
+ execution.append(outcome)
518
+ continue
519
+ receipt = harness_runtime.start_run_session(
520
+ state_root=state_root,
521
+ verification=target_id,
522
+ argv=argv,
523
+ working_directory=working_directory,
524
+ timeout_seconds=target.get("timeoutSeconds"),
525
+ expected_duration_seconds=target.get(
526
+ "estimatedDurationSeconds"
527
+ ),
528
+ product_identity=scheduled["productIdentity"],
529
+ resource_locks=list(target["resourceLocks"]),
530
+ )
531
+ if receipt.get("status") in harness_runtime.RUN_TERMINAL_STATUSES:
532
+ outcome = {"targetId": target_id, **receipt}
533
+ outcomes[target_id] = outcome
534
+ execution.append(outcome)
535
+ else:
536
+ running.append((target_id, str(receipt["sessionId"])))
537
+ while running:
538
+ remaining: list[tuple[str, str]] = []
539
+ for target_id, session_id in running:
540
+ receipt = harness_runtime.run_session_status(state_root, session_id)
541
+ if receipt.get("status") in harness_runtime.RUN_TERMINAL_STATUSES:
542
+ outcome = {"targetId": target_id, **receipt}
543
+ outcomes[target_id] = outcome
544
+ execution.append(outcome)
545
+ else:
546
+ remaining.append((target_id, session_id))
547
+ running = remaining
548
+ if running:
549
+ time.sleep(0.05)
550
+ execution_ok = all(item.get("status") == "OK" for item in execution)
551
+ return {
552
+ **scheduled,
553
+ "ok": execution_ok,
554
+ "code": (
555
+ "VERIFICATION_EXECUTION_OK"
556
+ if execution_ok
557
+ else "VERIFICATION_EXECUTION_FAILED"
558
+ ),
559
+ "execution": execution,
560
+ }
561
+
562
+
93
563
  def main(argv: list[str] | None = None) -> int:
94
564
  parser = argparse.ArgumentParser(prog="harness_verification.py")
95
- parser.add_argument("select", nargs="?")
565
+ parser.add_argument(
566
+ "command",
567
+ nargs="?",
568
+ choices=("select", "plan", "execute"),
569
+ default="select",
570
+ )
96
571
  parser.add_argument("--input", required=True, type=Path)
97
572
  parser.add_argument("--out", type=Path)
98
573
  parser.add_argument("--json", action="store_true")
99
574
  args = parser.parse_args(argv)
100
- result = select_verifications(
101
- json.loads(args.input.read_text(encoding="utf-8-sig"))
102
- )
575
+ payload = json.loads(args.input.read_text(encoding="utf-8-sig"))
576
+ if args.command == "execute":
577
+ result = execute_verifications(payload)
578
+ elif args.command == "plan":
579
+ result = schedule_verifications(payload)
580
+ else:
581
+ result = select_verifications(payload)
103
582
  if args.out:
104
583
  args.out.parent.mkdir(parents=True, exist_ok=True)
105
584
  args.out.write_text(
@@ -107,7 +586,7 @@ def main(argv: list[str] | None = None) -> int:
107
586
  encoding="utf-8",
108
587
  )
109
588
  print(json.dumps(result, ensure_ascii=False, indent=2))
110
- return 0
589
+ return 0 if result.get("ok") else 1
111
590
 
112
591
 
113
592
  if __name__ == "__main__":
@@ -2,5 +2,5 @@
2
2
  "schemaVersion": 1,
3
3
  "overlay": "java",
4
4
  "agent": "claude-code",
5
- "coreHash": "1260a12cd4448626"
5
+ "coreHash": "55942841a9d47387"
6
6
  }