@hunter-harness/workflow-harness 0.2.84 → 0.2.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +11 -4
  3. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  4. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  5. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
  6. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +3 -2
  7. package/harness/bundles/general/claude-code/harness-plan/checklist.md +18 -79
  8. package/harness/bundles/general/claude-code/harness-plan/protocols.md +3 -1
  9. package/harness/bundles/general/claude-code/harness-plan/reference.md +37 -8
  10. package/harness/bundles/general/claude-code/harness-pull/SKILL.md +1 -1
  11. package/harness/bundles/general/claude-code/harness-push/SKILL.md +1 -1
  12. package/harness/bundles/general/claude-code/harness-review/SKILL.md +1 -1
  13. package/harness/bundles/general/claude-code/harness-run/SKILL.md +6 -4
  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 +1 -1
  17. package/harness/bundles/general/claude-code/scripts/harness_archive.py +58 -25
  18. package/harness/bundles/general/claude-code/scripts/harness_change.py +25 -7
  19. package/harness/bundles/general/claude-code/scripts/harness_context.py +62 -19
  20. package/harness/bundles/general/claude-code/scripts/harness_fixback.py +4 -0
  21. package/harness/bundles/general/claude-code/scripts/harness_gate.py +208 -72
  22. package/harness/bundles/general/claude-code/scripts/harness_ledger.py +43 -0
  23. package/harness/bundles/general/claude-code/scripts/harness_paths.py +60 -0
  24. package/harness/bundles/general/claude-code/scripts/harness_phase.py +24 -6
  25. package/harness/bundles/general/claude-code/scripts/harness_plan_finalize.py +124 -1
  26. package/harness/bundles/general/claude-code/scripts/harness_review.py +25 -4
  27. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  28. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +11 -4
  29. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  30. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  31. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  32. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +3 -2
  33. package/harness/bundles/general/codebuddy/harness-plan/checklist.md +18 -79
  34. package/harness/bundles/general/codebuddy/harness-plan/protocols.md +3 -1
  35. package/harness/bundles/general/codebuddy/harness-plan/reference.md +37 -8
  36. package/harness/bundles/general/codebuddy/harness-pull/SKILL.md +1 -1
  37. package/harness/bundles/general/codebuddy/harness-push/SKILL.md +1 -1
  38. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
  39. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +6 -4
  40. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
  41. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
  42. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +1 -1
  43. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +58 -25
  44. package/harness/bundles/general/codebuddy/scripts/harness_change.py +25 -7
  45. package/harness/bundles/general/codebuddy/scripts/harness_context.py +62 -19
  46. package/harness/bundles/general/codebuddy/scripts/harness_fixback.py +4 -0
  47. package/harness/bundles/general/codebuddy/scripts/harness_gate.py +208 -72
  48. package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +43 -0
  49. package/harness/bundles/general/codebuddy/scripts/harness_paths.py +60 -0
  50. package/harness/bundles/general/codebuddy/scripts/harness_phase.py +24 -6
  51. package/harness/bundles/general/codebuddy/scripts/harness_plan_finalize.py +124 -1
  52. package/harness/bundles/general/codebuddy/scripts/harness_review.py +25 -4
  53. package/harness/bundles/general/codex/.harness-build.json +1 -1
  54. package/harness/bundles/general/codex/harness-archive/SKILL.md +11 -4
  55. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  56. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
  57. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  58. package/harness/bundles/general/codex/harness-plan/SKILL.md +3 -2
  59. package/harness/bundles/general/codex/harness-plan/checklist.md +18 -79
  60. package/harness/bundles/general/codex/harness-plan/protocols.md +3 -1
  61. package/harness/bundles/general/codex/harness-plan/reference.md +37 -8
  62. package/harness/bundles/general/codex/harness-pull/SKILL.md +1 -1
  63. package/harness/bundles/general/codex/harness-push/SKILL.md +1 -1
  64. package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
  65. package/harness/bundles/general/codex/harness-run/SKILL.md +6 -4
  66. package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
  67. package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
  68. package/harness/bundles/general/codex/harness-test/SKILL.md +1 -1
  69. package/harness/bundles/general/codex/scripts/harness_archive.py +58 -25
  70. package/harness/bundles/general/codex/scripts/harness_change.py +25 -7
  71. package/harness/bundles/general/codex/scripts/harness_context.py +62 -19
  72. package/harness/bundles/general/codex/scripts/harness_fixback.py +4 -0
  73. package/harness/bundles/general/codex/scripts/harness_gate.py +208 -72
  74. package/harness/bundles/general/codex/scripts/harness_ledger.py +43 -0
  75. package/harness/bundles/general/codex/scripts/harness_paths.py +60 -0
  76. package/harness/bundles/general/codex/scripts/harness_phase.py +24 -6
  77. package/harness/bundles/general/codex/scripts/harness_plan_finalize.py +124 -1
  78. package/harness/bundles/general/codex/scripts/harness_review.py +25 -4
  79. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  80. package/harness/bundles/general/cursor/harness-archive/SKILL.md +11 -4
  81. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  82. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  83. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  84. package/harness/bundles/general/cursor/harness-plan/SKILL.md +3 -2
  85. package/harness/bundles/general/cursor/harness-plan/checklist.md +18 -79
  86. package/harness/bundles/general/cursor/harness-plan/protocols.md +3 -1
  87. package/harness/bundles/general/cursor/harness-plan/reference.md +37 -8
  88. package/harness/bundles/general/cursor/harness-pull/SKILL.md +1 -1
  89. package/harness/bundles/general/cursor/harness-push/SKILL.md +1 -1
  90. package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
  91. package/harness/bundles/general/cursor/harness-run/SKILL.md +6 -4
  92. package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
  93. package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
  94. package/harness/bundles/general/cursor/harness-test/SKILL.md +1 -1
  95. package/harness/bundles/general/cursor/scripts/harness_archive.py +58 -25
  96. package/harness/bundles/general/cursor/scripts/harness_change.py +25 -7
  97. package/harness/bundles/general/cursor/scripts/harness_context.py +62 -19
  98. package/harness/bundles/general/cursor/scripts/harness_fixback.py +4 -0
  99. package/harness/bundles/general/cursor/scripts/harness_gate.py +208 -72
  100. package/harness/bundles/general/cursor/scripts/harness_ledger.py +43 -0
  101. package/harness/bundles/general/cursor/scripts/harness_paths.py +60 -0
  102. package/harness/bundles/general/cursor/scripts/harness_phase.py +24 -6
  103. package/harness/bundles/general/cursor/scripts/harness_plan_finalize.py +124 -1
  104. package/harness/bundles/general/cursor/scripts/harness_review.py +25 -4
  105. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  106. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  107. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +11 -4
  108. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  109. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  110. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  111. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  112. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +3 -2
  113. package/harness/bundles/java/claude-code/harness-plan/checklist.md +18 -79
  114. package/harness/bundles/java/claude-code/harness-plan/protocols.md +3 -1
  115. package/harness/bundles/java/claude-code/harness-plan/reference.md +37 -8
  116. package/harness/bundles/java/claude-code/harness-pull/SKILL.md +1 -1
  117. package/harness/bundles/java/claude-code/harness-push/SKILL.md +1 -1
  118. package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
  119. package/harness/bundles/java/claude-code/harness-run/SKILL.md +6 -4
  120. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
  121. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
  122. package/harness/bundles/java/claude-code/harness-test/SKILL.md +1 -1
  123. package/harness/bundles/java/claude-code/scripts/harness_archive.py +58 -25
  124. package/harness/bundles/java/claude-code/scripts/harness_change.py +25 -7
  125. package/harness/bundles/java/claude-code/scripts/harness_context.py +62 -19
  126. package/harness/bundles/java/claude-code/scripts/harness_fixback.py +4 -0
  127. package/harness/bundles/java/claude-code/scripts/harness_gate.py +208 -72
  128. package/harness/bundles/java/claude-code/scripts/harness_ledger.py +43 -0
  129. package/harness/bundles/java/claude-code/scripts/harness_paths.py +60 -0
  130. package/harness/bundles/java/claude-code/scripts/harness_phase.py +24 -6
  131. package/harness/bundles/java/claude-code/scripts/harness_plan_finalize.py +124 -1
  132. package/harness/bundles/java/claude-code/scripts/harness_review.py +25 -4
  133. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  134. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  135. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +11 -4
  136. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  137. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  138. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  139. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  140. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +3 -2
  141. package/harness/bundles/java/codebuddy/harness-plan/checklist.md +18 -79
  142. package/harness/bundles/java/codebuddy/harness-plan/protocols.md +3 -1
  143. package/harness/bundles/java/codebuddy/harness-plan/reference.md +37 -8
  144. package/harness/bundles/java/codebuddy/harness-pull/SKILL.md +1 -1
  145. package/harness/bundles/java/codebuddy/harness-push/SKILL.md +1 -1
  146. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
  147. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +6 -4
  148. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
  149. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
  150. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +1 -1
  151. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +58 -25
  152. package/harness/bundles/java/codebuddy/scripts/harness_change.py +25 -7
  153. package/harness/bundles/java/codebuddy/scripts/harness_context.py +62 -19
  154. package/harness/bundles/java/codebuddy/scripts/harness_fixback.py +4 -0
  155. package/harness/bundles/java/codebuddy/scripts/harness_gate.py +208 -72
  156. package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +43 -0
  157. package/harness/bundles/java/codebuddy/scripts/harness_paths.py +60 -0
  158. package/harness/bundles/java/codebuddy/scripts/harness_phase.py +24 -6
  159. package/harness/bundles/java/codebuddy/scripts/harness_plan_finalize.py +124 -1
  160. package/harness/bundles/java/codebuddy/scripts/harness_review.py +25 -4
  161. package/harness/bundles/java/codex/.harness-build.json +1 -1
  162. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  163. package/harness/bundles/java/codex/harness-archive/SKILL.md +11 -4
  164. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  165. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
  166. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  167. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  168. package/harness/bundles/java/codex/harness-plan/SKILL.md +3 -2
  169. package/harness/bundles/java/codex/harness-plan/checklist.md +18 -79
  170. package/harness/bundles/java/codex/harness-plan/protocols.md +3 -1
  171. package/harness/bundles/java/codex/harness-plan/reference.md +37 -8
  172. package/harness/bundles/java/codex/harness-pull/SKILL.md +1 -1
  173. package/harness/bundles/java/codex/harness-push/SKILL.md +1 -1
  174. package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
  175. package/harness/bundles/java/codex/harness-run/SKILL.md +6 -4
  176. package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
  177. package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
  178. package/harness/bundles/java/codex/harness-test/SKILL.md +1 -1
  179. package/harness/bundles/java/codex/scripts/harness_archive.py +58 -25
  180. package/harness/bundles/java/codex/scripts/harness_change.py +25 -7
  181. package/harness/bundles/java/codex/scripts/harness_context.py +62 -19
  182. package/harness/bundles/java/codex/scripts/harness_fixback.py +4 -0
  183. package/harness/bundles/java/codex/scripts/harness_gate.py +208 -72
  184. package/harness/bundles/java/codex/scripts/harness_ledger.py +43 -0
  185. package/harness/bundles/java/codex/scripts/harness_paths.py +60 -0
  186. package/harness/bundles/java/codex/scripts/harness_phase.py +24 -6
  187. package/harness/bundles/java/codex/scripts/harness_plan_finalize.py +124 -1
  188. package/harness/bundles/java/codex/scripts/harness_review.py +25 -4
  189. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  190. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  191. package/harness/bundles/java/cursor/harness-archive/SKILL.md +11 -4
  192. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  193. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  194. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  195. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  196. package/harness/bundles/java/cursor/harness-plan/SKILL.md +3 -2
  197. package/harness/bundles/java/cursor/harness-plan/checklist.md +18 -79
  198. package/harness/bundles/java/cursor/harness-plan/protocols.md +3 -1
  199. package/harness/bundles/java/cursor/harness-plan/reference.md +37 -8
  200. package/harness/bundles/java/cursor/harness-pull/SKILL.md +1 -1
  201. package/harness/bundles/java/cursor/harness-push/SKILL.md +1 -1
  202. package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
  203. package/harness/bundles/java/cursor/harness-run/SKILL.md +6 -4
  204. package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
  205. package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
  206. package/harness/bundles/java/cursor/harness-test/SKILL.md +1 -1
  207. package/harness/bundles/java/cursor/scripts/harness_archive.py +58 -25
  208. package/harness/bundles/java/cursor/scripts/harness_change.py +25 -7
  209. package/harness/bundles/java/cursor/scripts/harness_context.py +62 -19
  210. package/harness/bundles/java/cursor/scripts/harness_fixback.py +4 -0
  211. package/harness/bundles/java/cursor/scripts/harness_gate.py +208 -72
  212. package/harness/bundles/java/cursor/scripts/harness_ledger.py +43 -0
  213. package/harness/bundles/java/cursor/scripts/harness_paths.py +60 -0
  214. package/harness/bundles/java/cursor/scripts/harness_phase.py +24 -6
  215. package/harness/bundles/java/cursor/scripts/harness_plan_finalize.py +124 -1
  216. package/harness/bundles/java/cursor/scripts/harness_review.py +25 -4
  217. package/harness/manifests/general/claude-code.json +27 -27
  218. package/harness/manifests/general/codebuddy.json +27 -27
  219. package/harness/manifests/general/codex.json +27 -27
  220. package/harness/manifests/general/cursor.json +27 -27
  221. package/harness/manifests/java/claude-code.json +29 -29
  222. package/harness/manifests/java/codebuddy.json +29 -29
  223. package/harness/manifests/java/codex.json +29 -29
  224. package/harness/manifests/java/cursor.json +29 -29
  225. package/hunter-workflow-family.json +4 -4
  226. package/package.json +1 -1
@@ -261,6 +261,127 @@ def scenario_manifest_schema_version(scenarios: list[dict[str, Any]]) -> int:
261
261
  return 1
262
262
 
263
263
 
264
+ # v2 场景键 → 门禁与 ledger 消费的 legacy 键。可执行三元是可选的:缺了只是把
265
+ # manifest 降到 schemaVersion 1(绑不上结构化执行收据),不算缺口。
266
+ _V2_SCENARIO_FIELD_MAP = (
267
+ ("scenario_id", "id"),
268
+ ("priority", "priority"),
269
+ ("required_evidence_kind", "requiredEvidenceKind"),
270
+ ("owner_phase", "ownerPhase"),
271
+ )
272
+ _V2_SCENARIO_OPTIONAL_FIELD_MAP = (
273
+ ("executable_test_id", "executableTestId"),
274
+ ("test_file", "testFile"),
275
+ ("test_title", "testTitle"),
276
+ )
277
+ V2_MANIFEST_UNSUPPORTED = "SCENARIO_MANIFEST_V2_UNSUPPORTED"
278
+
279
+
280
+ def is_v2_scenario_manifest(manifest: Any) -> bool:
281
+ """v2 plan finalize 派生的 scenario_manifest artifact 包装体。
282
+
283
+ 它没有顶层 schemaVersion,场景字段全在 content.scenarios 下且改了名。
284
+ """
285
+ return (
286
+ isinstance(manifest, dict)
287
+ and manifest.get("artifact_type") == "scenario_manifest"
288
+ )
289
+
290
+
291
+ def unpack_v2_scenario_manifest(manifest: Any) -> dict[str, Any] | None:
292
+ """v2 artifact 包装体 → 消费端的 legacy 形状;字段不齐时 fail-closed。
293
+
294
+ 返回 None 表示"这不是 v2 包装体",调用方按 legacy 原样处理。否则返回
295
+ ``{"ok": True, "manifest": {...}}``(已是 legacy 形状,后续判定逻辑对
296
+ v2 与 legacy 完全一致)或 ``{"ok": False, "code": V2_MANIFEST_UNSUPPORTED}``。
297
+
298
+ 这个函数住在 finalizer 里,是因为 legacy manifest 的 schema 本来就由本模块
299
+ 定义(``scenario_manifest_schema_version`` / ``PRIORITY_EVIDENCE_KIND``)。
300
+ 门禁与 ledger 都 import 它,两边不会各推一套解包规则。
301
+
302
+ 为什么必须逐场景校验、不能取键的并集:并集只要有**一条**场景带了
303
+ priority 就算"present",其余缺 priority 的场景会静默落进非必需集,
304
+ ``required_ids`` 随之缩水——那正是把证据门禁悄悄关掉的老路子。
305
+ """
306
+ if not is_v2_scenario_manifest(manifest):
307
+ return None
308
+ content = manifest.get("content")
309
+ raw = content.get("scenarios") if isinstance(content, dict) else None
310
+ if not isinstance(raw, list):
311
+ return {
312
+ "ok": False,
313
+ "code": V2_MANIFEST_UNSUPPORTED,
314
+ "message": "v2 scenario-manifest 的 content.scenarios 必须是数组",
315
+ "missingFields": [legacy for _, legacy in _V2_SCENARIO_FIELD_MAP],
316
+ "artifactType": "scenario_manifest",
317
+ }
318
+ scenarios: list[dict[str, Any]] = []
319
+ missing: set[str] = set()
320
+ for item in raw:
321
+ if not isinstance(item, dict):
322
+ missing.update(legacy for _, legacy in _V2_SCENARIO_FIELD_MAP)
323
+ continue
324
+ mapped: dict[str, Any] = {}
325
+ for source, legacy in _V2_SCENARIO_FIELD_MAP:
326
+ value = item.get(source)
327
+ if not str(value or "").strip():
328
+ missing.add(legacy)
329
+ continue
330
+ mapped[legacy] = value
331
+ for source, legacy in _V2_SCENARIO_OPTIONAL_FIELD_MAP:
332
+ value = item.get(source)
333
+ if str(value or "").strip():
334
+ mapped[legacy] = value
335
+ scenarios.append(mapped)
336
+ if missing:
337
+ return {
338
+ "ok": False,
339
+ "code": V2_MANIFEST_UNSUPPORTED,
340
+ "message": (
341
+ "meta/scenario-manifest.json 是 v2 plan artifact 包装体,"
342
+ "部分场景缺少消费端需要的字段;请在规划阶段补齐后重新发布,"
343
+ "不要手改派生产物"
344
+ ),
345
+ "missingFields": sorted(missing),
346
+ "artifactType": "scenario_manifest",
347
+ }
348
+ return {
349
+ "ok": True,
350
+ "manifest": {
351
+ # 与 legacy 同一条规则判版本,不另立一套。
352
+ "schemaVersion": scenario_manifest_schema_version(scenarios),
353
+ "scenarios": scenarios,
354
+ },
355
+ }
356
+
357
+
358
+ def unpack_v2_implementation_checkpoints(document: Any) -> dict[str, Any] | None:
359
+ """v2 的 implementation_checkpoints artifact 包装体 → 门禁消费的形状。
360
+
361
+ 返回 None 表示"这不是 v2 包装体",调用方按原样处理。
362
+
363
+ v2 的 content 是 ``{tasks, foundation_gate}``,而 ``checkpoint_status`` 找的是
364
+ ``checkpoints: [{id, status}]``——找不到就返回 "missing",``foundation_gate_blocks``
365
+ 随即放行。也就是说 foundation-gate 对**所有 v2 计划**是静默关闭的。信息本身是够
366
+ 的(``foundation_gate`` 就是那个状态),只是形状不同,所以这里解包而不是改文件名
367
+ ——与 scenario-manifest 同一模式。
368
+ """
369
+ if (
370
+ not isinstance(document, dict)
371
+ or document.get("artifact_type") != "implementation_checkpoints"
372
+ ):
373
+ return None
374
+ content = document.get("content")
375
+ content = content if isinstance(content, dict) else {}
376
+ status = str(content.get("foundation_gate") or "").strip() or "pending"
377
+ tasks = content.get("tasks")
378
+ return {
379
+ "schemaVersion": 1,
380
+ "checkpoints": [{"id": "foundation-gate", "status": status, "blocking": True}],
381
+ "tasks": tasks if isinstance(tasks, list) else [],
382
+ }
383
+
384
+
264
385
  def parse_plan_tasks(plan_path: Path) -> list[dict[str, str]]:
265
386
  """C8: parse plan.md task table rows, extracting optional ownerPhase/implementationDoneWhen/verificationPhase columns.
266
387
 
@@ -877,7 +998,9 @@ def _verify_plan_v2(change_dir: Path) -> dict[str, Any] | None:
877
998
  f"plans/{change_dir.name}-plan.md",
878
999
  f"plans/{change_dir.name}-implementation-detail.md",
879
1000
  f"plans/{change_dir.name}-test-scenarios.md",
880
- "meta/gate-policy.json",
1001
+ # v2 发布的是派生视图 meta/plan-profile.json,不是 Python classify 写的
1002
+ # meta/gate-policy.json——后者是 run/test 门禁的权威输入,不能被发布覆盖。
1003
+ "meta/plan-profile.json",
881
1004
  "meta/worktree.json",
882
1005
  }
883
1006
  missing_required = sorted(required - set(ownership_paths))
@@ -194,14 +194,30 @@ def _load_findings(change_dir: Path) -> dict[str, Any] | None:
194
194
 
195
195
 
196
196
  def validate_dispositions(
197
- doc: Any, known_ids: set[str]
197
+ doc: Any, known_ids: set[str], findings_run_id: str | None = None
198
198
  ) -> list[str]:
199
+ """校验处置文档。``findings_run_id`` 给出时,还要求两份 sidecar 同属一轮。
200
+
201
+ runId 以前完全不校验——``write_dispositions`` 直接透传 ``doc.get("runId")``,
202
+ 写 ``None`` 都能落盘,整条 sidecar 的强制力全压在 gate 关门时的一行断言上。
203
+ 而这条断言防的是 fixback 循环里的跨轮重放:sidecar 是 per-change 单文件、不带
204
+ runId 后缀,第二轮 review 关门时磁盘上躺着第一轮那份(finding 全已 FIXED)。
205
+ 在写入端就挡住,比等到关门再拒绝早一整轮。
206
+ """
199
207
  problems: list[str] = []
200
208
  if not isinstance(doc, dict):
201
209
  return ["dispositions document must be an object"]
210
+ run_id = doc.get("runId")
211
+ if not isinstance(run_id, str) or not run_id.strip():
212
+ problems.append("runId is required")
213
+ elif findings_run_id is not None and run_id != findings_run_id:
214
+ problems.append(
215
+ f"runId {run_id} does not match review findings runId {findings_run_id}"
216
+ )
202
217
  dispositions = doc.get("dispositions")
203
218
  if not isinstance(dispositions, list):
204
- return ["dispositions must be a list"]
219
+ problems.append("dispositions must be a list")
220
+ return problems
205
221
  for index, item in enumerate(dispositions):
206
222
  if not isinstance(item, dict):
207
223
  problems.append(f"dispositions[{index}] must be an object")
@@ -226,12 +242,17 @@ def write_dispositions(change_dir: Path, doc: dict[str, Any]) -> dict[str, Any]:
226
242
  f.get("id") for f in (findings_doc or {}).get("findings", [])
227
243
  if isinstance(f, dict)
228
244
  }
229
- problems = validate_dispositions(doc, known_ids)
245
+ findings_run_id = (findings_doc or {}).get("runId")
246
+ problems = validate_dispositions(
247
+ doc,
248
+ known_ids,
249
+ findings_run_id if isinstance(findings_run_id, str) else None,
250
+ )
230
251
  if problems:
231
252
  return {"ok": False, "code": "DISPOSITIONS_INVALID", "problems": problems}
232
253
  payload = {
233
254
  "schemaVersion": 1,
234
- "runId": doc.get("runId"),
255
+ "runId": doc["runId"],
235
256
  "dispositions": doc["dispositions"],
236
257
  }
237
258
  out = dispositions_path(change_dir)
@@ -4,7 +4,7 @@
4
4
  "adapter": "claude-code",
5
5
  "bundle_version": "0.2.73",
6
6
  "requires": {
7
- "minimumCliVersion": "0.2.90",
7
+ "minimumCliVersion": "0.2.92",
8
8
  "capabilities": [
9
9
  "sync@2",
10
10
  "rules-sync@1",
@@ -25,7 +25,7 @@
25
25
  "files": [
26
26
  {
27
27
  "path": ".harness-build.json",
28
- "sha256": "3358db4087b290afedd83a8f3147b34ec4c37e7ac71f073498a74784328c588a"
28
+ "sha256": "3dd6ddcc89f89ab3e51d7b2d1f7415d79ad897c72d29676ed59178b4d5636233"
29
29
  },
30
30
  {
31
31
  "path": "agents/harness-evaluator.md",
@@ -97,7 +97,7 @@
97
97
  },
98
98
  {
99
99
  "path": "harness-archive/SKILL.md",
100
- "sha256": "85d7a0ae2f8ecd8cc0011d774cf3716d8fc630a698e98bbd9b1a09bac739b2e2"
100
+ "sha256": "4ffdd943d3659f3bee25d5d8949b930f8e1eed45069dbf8fae5c5a593eeceef8"
101
101
  },
102
102
  {
103
103
  "path": "harness-archive/templates/summary-data-template.json",
@@ -113,7 +113,7 @@
113
113
  },
114
114
  {
115
115
  "path": "harness-codebase-map/SKILL.md",
116
- "sha256": "5e35f6d514ead2540217097112cf9785ee0ca57ed1022efd6195a349a20b6a41"
116
+ "sha256": "77ea556fce28dd30d5463318c066c1e35d48eb1cd9c0285f4097de7d094f2b29"
117
117
  },
118
118
  {
119
119
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -153,35 +153,35 @@
153
153
  },
154
154
  {
155
155
  "path": "harness-knowledge-ingest/SKILL.md",
156
- "sha256": "10f12aea83581006e00347c3564a94a5949dac1461d61cd1dff585739256c01b"
156
+ "sha256": "67e4f63587f6b2c17820c6c5f9625f702de8b902de1cb38ccbcd2ecf362d44df"
157
157
  },
158
158
  {
159
159
  "path": "harness-knowledge-query/SKILL.md",
160
- "sha256": "d6a68f05edc6b06c76ddecae75d9feb294ecd805a3fd3b6fbf9b545f20837f0b"
160
+ "sha256": "25f165ad7227a348320c6956850584d83bc9bd6267126f32c7f8e2f866a6b885"
161
161
  },
162
162
  {
163
163
  "path": "harness-plan/checklist.md",
164
- "sha256": "31c66e6e08595d6d97e5f57fcd6d99ced5b721b82c122fbb26bb8fba34c23d90"
164
+ "sha256": "42eefa0a350a15efab18d9fe03adb019f17eadf0b6c9d797fb80ad05842a22aa"
165
165
  },
166
166
  {
167
167
  "path": "harness-plan/protocols.md",
168
- "sha256": "9bff7f88fc236adbc1c01db2fcbeb39248399e98f6a172080c8592ee27e742c5"
168
+ "sha256": "ee15618cbe4005ec1efd5ae91b0105920b929a9eedba8dffd29183efadf52485"
169
169
  },
170
170
  {
171
171
  "path": "harness-plan/reference.md",
172
- "sha256": "197f5b764d1054ef401f61f95055b468ab2a0c66ad482efc50a014ab7ea89711"
172
+ "sha256": "a10e417269d4993699a4a1d53ffd4f0c8296231a0c5e468630da3d10809a1d93"
173
173
  },
174
174
  {
175
175
  "path": "harness-plan/SKILL.md",
176
- "sha256": "77f6b5dcd6f743244e726ed51477cf5f01f0790da31bfefb931ec45ae51333ec"
176
+ "sha256": "11d0cf7d378e23d95f561c445cd71f5f4a04bce921955e2e6056d67b3a60f564"
177
177
  },
178
178
  {
179
179
  "path": "harness-pull/SKILL.md",
180
- "sha256": "7450bdc98d30e3212bfcf3e74cc060c5d794f99f880c24a2550edee662fbb983"
180
+ "sha256": "b4c52d0a2479557a9e45c18513c6cb4cbe06e0ef4c0681a7bdcaacad1d403aab"
181
181
  },
182
182
  {
183
183
  "path": "harness-push/SKILL.md",
184
- "sha256": "0730d1d656edbbbed2672202a0d262b4a781a04252214468a34cd2d91a6d9301"
184
+ "sha256": "534bf14d352626ca5d9cd3eb8c8b0873cb45235e142abe8183f7f8292f291091"
185
185
  },
186
186
  {
187
187
  "path": "harness-review/checklist.md",
@@ -197,7 +197,7 @@
197
197
  },
198
198
  {
199
199
  "path": "harness-review/SKILL.md",
200
- "sha256": "a445e9b0dacb41942216766bf49d5811c168955567d5ab6860c8e4a4b7ff24c7"
200
+ "sha256": "339f54dd65a69d2e16eea8a99bd6e44056f6f84f4f4b7fb07ee4943e5273fc83"
201
201
  },
202
202
  {
203
203
  "path": "harness-run/checklist.md",
@@ -213,7 +213,7 @@
213
213
  },
214
214
  {
215
215
  "path": "harness-run/SKILL.md",
216
- "sha256": "177462dc33d595d12450d461d057f8a146efe84697d2625d58b6cc947dff6142"
216
+ "sha256": "3347cd844c41dbf3161375358ee73c1f4d3a804cd8427e58d5ef044c1892141c"
217
217
  },
218
218
  {
219
219
  "path": "harness-submit/checklist.md",
@@ -225,7 +225,7 @@
225
225
  },
226
226
  {
227
227
  "path": "harness-submit/SKILL.md",
228
- "sha256": "2d15400f3ae5408acc716ce693a8ae30c672c8beac6a7a01f7de6643ce2d5ef9"
228
+ "sha256": "e232d9529f4e1c77e757606c3498fd20c44d60a2c81e3478b716fefc9a66c291"
229
229
  },
230
230
  {
231
231
  "path": "harness-sync/reference.md",
@@ -233,7 +233,7 @@
233
233
  },
234
234
  {
235
235
  "path": "harness-sync/SKILL.md",
236
- "sha256": "936f74582d488a03f0d6849e5a1450e3f58bb51bab5dee396d79e459a4040f95"
236
+ "sha256": "81eca1aa726fce88aeeffa513be0b050edc7102a2215fb6c7cd5c601ea048653"
237
237
  },
238
238
  {
239
239
  "path": "harness-test/checklist.md",
@@ -257,7 +257,7 @@
257
257
  },
258
258
  {
259
259
  "path": "harness-test/SKILL.md",
260
- "sha256": "adc8d2245953eb150159cf15b755a56ec4c93d990ec2fdadb33bcf2e896362bf"
260
+ "sha256": "1045385d042fb625bca663068cd2505e73539437e5a7e5e86e4081562df3b630"
261
261
  },
262
262
  {
263
263
  "path": "protocols/archive-report-protocol.md",
@@ -329,11 +329,11 @@
329
329
  },
330
330
  {
331
331
  "path": "scripts/harness_archive.py",
332
- "sha256": "7af276128925b6bf10323dbe477e6f98b81e899221c923138ddd03ec8106cd8e"
332
+ "sha256": "8882a1caf4561d28ad7daf4313010205826139e7c60f909d69271f5bc37d1e67"
333
333
  },
334
334
  {
335
335
  "path": "scripts/harness_change.py",
336
- "sha256": "f4e2d4ab9ee13e93cf200555b6b116342ad044dcdd5dfa25fa7e7ca435dd1882"
336
+ "sha256": "9d35cfb6184028ee03c7d574a6d24b33f8cc437ba5c3dae9a0487d50566bda1f"
337
337
  },
338
338
  {
339
339
  "path": "scripts/harness_check_gate.py",
@@ -341,7 +341,7 @@
341
341
  },
342
342
  {
343
343
  "path": "scripts/harness_context.py",
344
- "sha256": "c7ad3199bda332e853a24e6268fa32dcc253adb6dfe7e0de7aa3b7f0ae7ae312"
344
+ "sha256": "23572ea0c3455812a5998448e4c90afe9ea7d3a37f15c893c718007ad3c5c886"
345
345
  },
346
346
  {
347
347
  "path": "scripts/harness_deploy.py",
@@ -369,11 +369,11 @@
369
369
  },
370
370
  {
371
371
  "path": "scripts/harness_fixback.py",
372
- "sha256": "56a961a8654dd78d31b5e6f875fd15651419266ea9cab7b81fe0106f2d8a2420"
372
+ "sha256": "dda0d6d836fe4aaaf7ba4cbf888f921c9e1800a0d4f17ee8f7e0e3ac19dd4cbc"
373
373
  },
374
374
  {
375
375
  "path": "scripts/harness_gate.py",
376
- "sha256": "aa8527c794ac974e2c2a6d55f72021c67e80f56e919b670f02c268d6048f5908"
376
+ "sha256": "447a7339b87cbf134a570a0119b697766f1ee3e703dce497e5f3763ad016cb68"
377
377
  },
378
378
  {
379
379
  "path": "scripts/harness_headless.py",
@@ -389,7 +389,7 @@
389
389
  },
390
390
  {
391
391
  "path": "scripts/harness_ledger.py",
392
- "sha256": "476832333a63089fe312d9fb288b9e8a51d081a44b30548e1dac9a2b8298e0fb"
392
+ "sha256": "52caa7106480074f1e2ee0122fa6f194cf852805bfd562073ad2fc79ba666514"
393
393
  },
394
394
  {
395
395
  "path": "scripts/harness_migration_head.py",
@@ -401,11 +401,11 @@
401
401
  },
402
402
  {
403
403
  "path": "scripts/harness_paths.py",
404
- "sha256": "4042a0ee0521a3ff26448d63415eaf63dd45161d71d8c54a2b72665a1263e02b"
404
+ "sha256": "bdd20fce04754664f33ceb838a5fa49ddcbf6e507a7017850cacc345b5564a77"
405
405
  },
406
406
  {
407
407
  "path": "scripts/harness_phase.py",
408
- "sha256": "b1e53c1f7becf198195cb9a4bcba835767aed82420450e1842cc07d89febf532"
408
+ "sha256": "7dc52174d1dc1b3ce8d3c4ebb3f61dd5e1058a77b36d44007ed04db949eaa392"
409
409
  },
410
410
  {
411
411
  "path": "scripts/harness_plan_aggregate.py",
@@ -413,7 +413,7 @@
413
413
  },
414
414
  {
415
415
  "path": "scripts/harness_plan_finalize.py",
416
- "sha256": "6f4dcee06f92f7ed7a3bd0ee615e9dd7e8fd921502b132305e37c4871b97537b"
416
+ "sha256": "0cb683d26bb9af86cfe4a9c019d1fc20447fa90eb12fb31377bd1d7e4740c4d3"
417
417
  },
418
418
  {
419
419
  "path": "scripts/harness_preflight.py",
@@ -437,7 +437,7 @@
437
437
  },
438
438
  {
439
439
  "path": "scripts/harness_review.py",
440
- "sha256": "3e14be966ffc0f2e0261f471390d1ed308f2272e1df7e0cb30d7c9ba5e33f858"
440
+ "sha256": "c3c591323846bee24afc13ba0ab4eb275233eff84f57c1bb5d155a453bd127db"
441
441
  },
442
442
  {
443
443
  "path": "scripts/harness_runtime.py",
@@ -4,7 +4,7 @@
4
4
  "adapter": "codebuddy",
5
5
  "bundle_version": "0.2.73",
6
6
  "requires": {
7
- "minimumCliVersion": "0.2.90",
7
+ "minimumCliVersion": "0.2.92",
8
8
  "capabilities": [
9
9
  "sync@2",
10
10
  "rules-sync@1",
@@ -25,7 +25,7 @@
25
25
  "files": [
26
26
  {
27
27
  "path": ".harness-build.json",
28
- "sha256": "2d636df20eaa57762efebbabea4cfddfb548ff3bf2b82f4ddfd896f5722835ae"
28
+ "sha256": "bd64bef93156da6632c8fe134164b0894cf08b6af3cbe10aa3de3d97ce875600"
29
29
  },
30
30
  {
31
31
  "path": "agents/harness-evaluator.md",
@@ -97,7 +97,7 @@
97
97
  },
98
98
  {
99
99
  "path": "harness-archive/SKILL.md",
100
- "sha256": "24d7ca0e9650702928859cd3441d6573fbaa202b6ad81e402dc4c87d814267cf"
100
+ "sha256": "36eb8e3912d2e744f86c4eec8a2ce9dfd0880c415628d8091970d967bc37557c"
101
101
  },
102
102
  {
103
103
  "path": "harness-archive/templates/summary-data-template.json",
@@ -113,7 +113,7 @@
113
113
  },
114
114
  {
115
115
  "path": "harness-codebase-map/SKILL.md",
116
- "sha256": "bf51af0cadfcb7e9d2571027fc0028c5bb80edff7610b5eca0a48195bdf49faf"
116
+ "sha256": "ee20a0b719ff0441dd7d9a9a18d88db0d846498a39337a9b64901a071acc92fa"
117
117
  },
118
118
  {
119
119
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -153,35 +153,35 @@
153
153
  },
154
154
  {
155
155
  "path": "harness-knowledge-ingest/SKILL.md",
156
- "sha256": "a18c82a102f7522fc63250ac2383dcd078cd7dfe80d68e79084e47b7cf918d32"
156
+ "sha256": "a1b6efc2993a19eb4fd53e5a4af8bb5809a3b4d906a64575ad01ed78c18546da"
157
157
  },
158
158
  {
159
159
  "path": "harness-knowledge-query/SKILL.md",
160
- "sha256": "939ff6a89b540f29e6616b8d9acf3fc4e42c5e2173f1ef4c34c2fd3b009d7a3a"
160
+ "sha256": "8e3947f91c3b4ffc18485a29e2204568ab42180b8d4d1552ab842494e917859c"
161
161
  },
162
162
  {
163
163
  "path": "harness-plan/checklist.md",
164
- "sha256": "31c66e6e08595d6d97e5f57fcd6d99ced5b721b82c122fbb26bb8fba34c23d90"
164
+ "sha256": "42eefa0a350a15efab18d9fe03adb019f17eadf0b6c9d797fb80ad05842a22aa"
165
165
  },
166
166
  {
167
167
  "path": "harness-plan/protocols.md",
168
- "sha256": "9bff7f88fc236adbc1c01db2fcbeb39248399e98f6a172080c8592ee27e742c5"
168
+ "sha256": "ee15618cbe4005ec1efd5ae91b0105920b929a9eedba8dffd29183efadf52485"
169
169
  },
170
170
  {
171
171
  "path": "harness-plan/reference.md",
172
- "sha256": "197f5b764d1054ef401f61f95055b468ab2a0c66ad482efc50a014ab7ea89711"
172
+ "sha256": "a10e417269d4993699a4a1d53ffd4f0c8296231a0c5e468630da3d10809a1d93"
173
173
  },
174
174
  {
175
175
  "path": "harness-plan/SKILL.md",
176
- "sha256": "46bd34bc2fae3f87b91e09b91e8374c2f214600452c72c8b143df4ec3ede763f"
176
+ "sha256": "188e5b7e9ee7a67070a382e10f3cbe9e5c23eb0f1b8c450b46d20cce6567dbbf"
177
177
  },
178
178
  {
179
179
  "path": "harness-pull/SKILL.md",
180
- "sha256": "481f1f0217474c6ed8e3202019f115f7f41f7b38a1a41e3eea80a2acef02864b"
180
+ "sha256": "b65b1feda6704671d1c9d5a34b32f86e08a4b9e3985a665047b9f40787a05bb6"
181
181
  },
182
182
  {
183
183
  "path": "harness-push/SKILL.md",
184
- "sha256": "f555b8df475c400c48bd448d849b2af6ab25440f81e336a6659ce7bca49bdfba"
184
+ "sha256": "b61f35e483ac74b17cda851a0250d1b124bf8a6c2b1fbd541cc0e6415aef1ac4"
185
185
  },
186
186
  {
187
187
  "path": "harness-review/checklist.md",
@@ -197,7 +197,7 @@
197
197
  },
198
198
  {
199
199
  "path": "harness-review/SKILL.md",
200
- "sha256": "90f2edc1c3da4ccd626cb55ad96b852b1b079017adf1cc4816a4fcba31846e37"
200
+ "sha256": "adda644d941b3b88c44e7c92f7235b14e56495a3ae73bb839ad62b687e737c8e"
201
201
  },
202
202
  {
203
203
  "path": "harness-run/checklist.md",
@@ -213,7 +213,7 @@
213
213
  },
214
214
  {
215
215
  "path": "harness-run/SKILL.md",
216
- "sha256": "800cf316b1181cbacd82a2dab8c6541b450e878215bc5a245e34017c409d69a9"
216
+ "sha256": "57373fbe692ad3afe24528a09928673211d95e92bbf23e2beb486cf8cc9e8bbb"
217
217
  },
218
218
  {
219
219
  "path": "harness-submit/checklist.md",
@@ -225,7 +225,7 @@
225
225
  },
226
226
  {
227
227
  "path": "harness-submit/SKILL.md",
228
- "sha256": "0901b37d54189a1d5eca1e25b5c2234ef951d3f668c4c1a91797a14f73e62f45"
228
+ "sha256": "1f4034e1885a1569aa5063838b84b3b1ea7e74b63a9808e8898d45b709f7c114"
229
229
  },
230
230
  {
231
231
  "path": "harness-sync/reference.md",
@@ -233,7 +233,7 @@
233
233
  },
234
234
  {
235
235
  "path": "harness-sync/SKILL.md",
236
- "sha256": "03d3049e6d242f2d04cd9fb256b2d8a65f3693af3e091703e0d10b77e8d85c9e"
236
+ "sha256": "f805ffd4bc69284a8813c180f2e1e97e11497108d68b67afee1e3445d5b0027a"
237
237
  },
238
238
  {
239
239
  "path": "harness-test/checklist.md",
@@ -257,7 +257,7 @@
257
257
  },
258
258
  {
259
259
  "path": "harness-test/SKILL.md",
260
- "sha256": "b51d4053213ae340efeaed85514fe88e11a69c8d23ac8da92e5ec30fcb5c90f3"
260
+ "sha256": "0b45992a790946d8ab7e469845f659b7279f160b13bea2968127612ba28c4abf"
261
261
  },
262
262
  {
263
263
  "path": "protocols/archive-report-protocol.md",
@@ -329,11 +329,11 @@
329
329
  },
330
330
  {
331
331
  "path": "scripts/harness_archive.py",
332
- "sha256": "7af276128925b6bf10323dbe477e6f98b81e899221c923138ddd03ec8106cd8e"
332
+ "sha256": "8882a1caf4561d28ad7daf4313010205826139e7c60f909d69271f5bc37d1e67"
333
333
  },
334
334
  {
335
335
  "path": "scripts/harness_change.py",
336
- "sha256": "f4e2d4ab9ee13e93cf200555b6b116342ad044dcdd5dfa25fa7e7ca435dd1882"
336
+ "sha256": "9d35cfb6184028ee03c7d574a6d24b33f8cc437ba5c3dae9a0487d50566bda1f"
337
337
  },
338
338
  {
339
339
  "path": "scripts/harness_check_gate.py",
@@ -341,7 +341,7 @@
341
341
  },
342
342
  {
343
343
  "path": "scripts/harness_context.py",
344
- "sha256": "c7ad3199bda332e853a24e6268fa32dcc253adb6dfe7e0de7aa3b7f0ae7ae312"
344
+ "sha256": "23572ea0c3455812a5998448e4c90afe9ea7d3a37f15c893c718007ad3c5c886"
345
345
  },
346
346
  {
347
347
  "path": "scripts/harness_deploy.py",
@@ -369,11 +369,11 @@
369
369
  },
370
370
  {
371
371
  "path": "scripts/harness_fixback.py",
372
- "sha256": "56a961a8654dd78d31b5e6f875fd15651419266ea9cab7b81fe0106f2d8a2420"
372
+ "sha256": "dda0d6d836fe4aaaf7ba4cbf888f921c9e1800a0d4f17ee8f7e0e3ac19dd4cbc"
373
373
  },
374
374
  {
375
375
  "path": "scripts/harness_gate.py",
376
- "sha256": "aa8527c794ac974e2c2a6d55f72021c67e80f56e919b670f02c268d6048f5908"
376
+ "sha256": "447a7339b87cbf134a570a0119b697766f1ee3e703dce497e5f3763ad016cb68"
377
377
  },
378
378
  {
379
379
  "path": "scripts/harness_headless.py",
@@ -389,7 +389,7 @@
389
389
  },
390
390
  {
391
391
  "path": "scripts/harness_ledger.py",
392
- "sha256": "476832333a63089fe312d9fb288b9e8a51d081a44b30548e1dac9a2b8298e0fb"
392
+ "sha256": "52caa7106480074f1e2ee0122fa6f194cf852805bfd562073ad2fc79ba666514"
393
393
  },
394
394
  {
395
395
  "path": "scripts/harness_migration_head.py",
@@ -401,11 +401,11 @@
401
401
  },
402
402
  {
403
403
  "path": "scripts/harness_paths.py",
404
- "sha256": "4042a0ee0521a3ff26448d63415eaf63dd45161d71d8c54a2b72665a1263e02b"
404
+ "sha256": "bdd20fce04754664f33ceb838a5fa49ddcbf6e507a7017850cacc345b5564a77"
405
405
  },
406
406
  {
407
407
  "path": "scripts/harness_phase.py",
408
- "sha256": "b1e53c1f7becf198195cb9a4bcba835767aed82420450e1842cc07d89febf532"
408
+ "sha256": "7dc52174d1dc1b3ce8d3c4ebb3f61dd5e1058a77b36d44007ed04db949eaa392"
409
409
  },
410
410
  {
411
411
  "path": "scripts/harness_plan_aggregate.py",
@@ -413,7 +413,7 @@
413
413
  },
414
414
  {
415
415
  "path": "scripts/harness_plan_finalize.py",
416
- "sha256": "6f4dcee06f92f7ed7a3bd0ee615e9dd7e8fd921502b132305e37c4871b97537b"
416
+ "sha256": "0cb683d26bb9af86cfe4a9c019d1fc20447fa90eb12fb31377bd1d7e4740c4d3"
417
417
  },
418
418
  {
419
419
  "path": "scripts/harness_preflight.py",
@@ -437,7 +437,7 @@
437
437
  },
438
438
  {
439
439
  "path": "scripts/harness_review.py",
440
- "sha256": "3e14be966ffc0f2e0261f471390d1ed308f2272e1df7e0cb30d7c9ba5e33f858"
440
+ "sha256": "c3c591323846bee24afc13ba0ab4eb275233eff84f57c1bb5d155a453bd127db"
441
441
  },
442
442
  {
443
443
  "path": "scripts/harness_runtime.py",