@hunter-harness/workflow-harness 0.2.6 → 0.2.7

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 (194) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/contracts/workflow-policy.json +169 -0
  3. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +3 -1
  4. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  5. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  6. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
  7. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
  8. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +3 -1
  9. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +3 -1
  10. package/harness/bundles/general/claude-code/harness-review/SKILL.md +3 -1
  11. package/harness/bundles/general/claude-code/harness-run/SKILL.md +9 -6
  12. package/harness/bundles/general/claude-code/harness-run/checklist.md +2 -2
  13. package/harness/bundles/general/claude-code/harness-run/reference.md +5 -2
  14. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +7 -5
  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/scripts/harness_apidoc.py +53 -0
  18. package/harness/bundles/general/claude-code/scripts/harness_archive.py +41 -16
  19. package/harness/bundles/general/claude-code/scripts/harness_change.py +854 -0
  20. package/harness/bundles/general/claude-code/scripts/harness_gate.py +1038 -0
  21. package/harness/bundles/general/claude-code/scripts/harness_service.py +34 -1
  22. package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +210 -14
  23. package/harness/bundles/general/claude-code/scripts/harness_workflow_policy.py +160 -0
  24. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  25. package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +169 -0
  26. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +3 -1
  27. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  28. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  29. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
  30. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
  31. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +3 -1
  32. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +3 -1
  33. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +3 -1
  34. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +9 -6
  35. package/harness/bundles/general/codebuddy/harness-run/checklist.md +2 -2
  36. package/harness/bundles/general/codebuddy/harness-run/reference.md +5 -2
  37. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +7 -5
  38. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
  39. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +8 -2
  40. package/harness/bundles/general/codebuddy/scripts/harness_apidoc.py +53 -0
  41. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +41 -16
  42. package/harness/bundles/general/codebuddy/scripts/harness_change.py +854 -0
  43. package/harness/bundles/general/codebuddy/scripts/harness_gate.py +1038 -0
  44. package/harness/bundles/general/codebuddy/scripts/harness_service.py +34 -1
  45. package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +210 -14
  46. package/harness/bundles/general/codebuddy/scripts/harness_workflow_policy.py +160 -0
  47. package/harness/bundles/general/codex/.harness-build.json +1 -1
  48. package/harness/bundles/general/codex/contracts/workflow-policy.json +169 -0
  49. package/harness/bundles/general/codex/harness-archive/SKILL.md +3 -1
  50. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  51. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
  52. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
  53. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
  54. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +3 -1
  55. package/harness/bundles/general/codex/harness-plan/SKILL.md +3 -1
  56. package/harness/bundles/general/codex/harness-review/SKILL.md +3 -1
  57. package/harness/bundles/general/codex/harness-run/SKILL.md +9 -6
  58. package/harness/bundles/general/codex/harness-run/checklist.md +2 -2
  59. package/harness/bundles/general/codex/harness-run/reference.md +5 -2
  60. package/harness/bundles/general/codex/harness-submit/SKILL.md +7 -5
  61. package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
  62. package/harness/bundles/general/codex/harness-test/SKILL.md +8 -2
  63. package/harness/bundles/general/codex/scripts/harness_apidoc.py +53 -0
  64. package/harness/bundles/general/codex/scripts/harness_archive.py +41 -16
  65. package/harness/bundles/general/codex/scripts/harness_change.py +854 -0
  66. package/harness/bundles/general/codex/scripts/harness_gate.py +1038 -0
  67. package/harness/bundles/general/codex/scripts/harness_service.py +34 -1
  68. package/harness/bundles/general/codex/scripts/harness_test_guard.py +210 -14
  69. package/harness/bundles/general/codex/scripts/harness_workflow_policy.py +160 -0
  70. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  71. package/harness/bundles/general/cursor/contracts/workflow-policy.json +169 -0
  72. package/harness/bundles/general/cursor/harness-archive/SKILL.md +3 -1
  73. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  74. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  75. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
  76. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
  77. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +3 -1
  78. package/harness/bundles/general/cursor/harness-plan/SKILL.md +3 -1
  79. package/harness/bundles/general/cursor/harness-review/SKILL.md +3 -1
  80. package/harness/bundles/general/cursor/harness-run/SKILL.md +9 -6
  81. package/harness/bundles/general/cursor/harness-run/checklist.md +2 -2
  82. package/harness/bundles/general/cursor/harness-run/reference.md +5 -2
  83. package/harness/bundles/general/cursor/harness-submit/SKILL.md +7 -5
  84. package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
  85. package/harness/bundles/general/cursor/harness-test/SKILL.md +8 -2
  86. package/harness/bundles/general/cursor/scripts/harness_apidoc.py +53 -0
  87. package/harness/bundles/general/cursor/scripts/harness_archive.py +41 -16
  88. package/harness/bundles/general/cursor/scripts/harness_change.py +854 -0
  89. package/harness/bundles/general/cursor/scripts/harness_gate.py +1038 -0
  90. package/harness/bundles/general/cursor/scripts/harness_service.py +34 -1
  91. package/harness/bundles/general/cursor/scripts/harness_test_guard.py +210 -14
  92. package/harness/bundles/general/cursor/scripts/harness_workflow_policy.py +160 -0
  93. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  94. package/harness/bundles/java/claude-code/contracts/workflow-policy.json +169 -0
  95. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +7 -1
  96. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +3 -1
  97. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  98. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  99. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
  100. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
  101. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +3 -1
  102. package/harness/bundles/java/claude-code/harness-package/SKILL.md +6 -3
  103. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +3 -1
  104. package/harness/bundles/java/claude-code/harness-review/SKILL.md +3 -1
  105. package/harness/bundles/java/claude-code/harness-run/SKILL.md +9 -6
  106. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +7 -5
  107. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
  108. package/harness/bundles/java/claude-code/harness-test/SKILL.md +8 -2
  109. package/harness/bundles/java/claude-code/scripts/harness_apidoc.py +53 -0
  110. package/harness/bundles/java/claude-code/scripts/harness_archive.py +41 -16
  111. package/harness/bundles/java/claude-code/scripts/harness_change.py +854 -0
  112. package/harness/bundles/java/claude-code/scripts/harness_gate.py +1038 -0
  113. package/harness/bundles/java/claude-code/scripts/harness_service.py +34 -1
  114. package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +210 -14
  115. package/harness/bundles/java/claude-code/scripts/harness_workflow_policy.py +160 -0
  116. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  117. package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +169 -0
  118. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +7 -1
  119. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +3 -1
  120. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  121. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  122. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
  123. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
  124. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +3 -1
  125. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +6 -3
  126. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +3 -1
  127. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +3 -1
  128. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +9 -6
  129. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +7 -5
  130. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
  131. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +8 -2
  132. package/harness/bundles/java/codebuddy/scripts/harness_apidoc.py +53 -0
  133. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +41 -16
  134. package/harness/bundles/java/codebuddy/scripts/harness_change.py +854 -0
  135. package/harness/bundles/java/codebuddy/scripts/harness_gate.py +1038 -0
  136. package/harness/bundles/java/codebuddy/scripts/harness_service.py +34 -1
  137. package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +210 -14
  138. package/harness/bundles/java/codebuddy/scripts/harness_workflow_policy.py +160 -0
  139. package/harness/bundles/java/codex/.harness-build.json +1 -1
  140. package/harness/bundles/java/codex/contracts/workflow-policy.json +169 -0
  141. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +7 -1
  142. package/harness/bundles/java/codex/harness-archive/SKILL.md +3 -1
  143. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  144. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
  145. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
  146. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
  147. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +3 -1
  148. package/harness/bundles/java/codex/harness-package/SKILL.md +6 -3
  149. package/harness/bundles/java/codex/harness-plan/SKILL.md +3 -1
  150. package/harness/bundles/java/codex/harness-review/SKILL.md +3 -1
  151. package/harness/bundles/java/codex/harness-run/SKILL.md +9 -6
  152. package/harness/bundles/java/codex/harness-submit/SKILL.md +7 -5
  153. package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
  154. package/harness/bundles/java/codex/harness-test/SKILL.md +8 -2
  155. package/harness/bundles/java/codex/scripts/harness_apidoc.py +53 -0
  156. package/harness/bundles/java/codex/scripts/harness_archive.py +41 -16
  157. package/harness/bundles/java/codex/scripts/harness_change.py +854 -0
  158. package/harness/bundles/java/codex/scripts/harness_gate.py +1038 -0
  159. package/harness/bundles/java/codex/scripts/harness_service.py +34 -1
  160. package/harness/bundles/java/codex/scripts/harness_test_guard.py +210 -14
  161. package/harness/bundles/java/codex/scripts/harness_workflow_policy.py +160 -0
  162. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  163. package/harness/bundles/java/cursor/contracts/workflow-policy.json +169 -0
  164. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +7 -1
  165. package/harness/bundles/java/cursor/harness-archive/SKILL.md +3 -1
  166. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  167. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  168. package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
  169. package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
  170. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +3 -1
  171. package/harness/bundles/java/cursor/harness-package/SKILL.md +6 -3
  172. package/harness/bundles/java/cursor/harness-plan/SKILL.md +3 -1
  173. package/harness/bundles/java/cursor/harness-review/SKILL.md +3 -1
  174. package/harness/bundles/java/cursor/harness-run/SKILL.md +9 -6
  175. package/harness/bundles/java/cursor/harness-submit/SKILL.md +7 -5
  176. package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
  177. package/harness/bundles/java/cursor/harness-test/SKILL.md +8 -2
  178. package/harness/bundles/java/cursor/scripts/harness_apidoc.py +53 -0
  179. package/harness/bundles/java/cursor/scripts/harness_archive.py +41 -16
  180. package/harness/bundles/java/cursor/scripts/harness_change.py +854 -0
  181. package/harness/bundles/java/cursor/scripts/harness_gate.py +1038 -0
  182. package/harness/bundles/java/cursor/scripts/harness_service.py +34 -1
  183. package/harness/bundles/java/cursor/scripts/harness_test_guard.py +210 -14
  184. package/harness/bundles/java/cursor/scripts/harness_workflow_policy.py +160 -0
  185. package/harness/manifests/general/claude-code.json +39 -19
  186. package/harness/manifests/general/codebuddy.json +39 -19
  187. package/harness/manifests/general/codex.json +39 -19
  188. package/harness/manifests/general/cursor.json +39 -19
  189. package/harness/manifests/java/claude-code.json +39 -19
  190. package/harness/manifests/java/codebuddy.json +39 -19
  191. package/harness/manifests/java/codex.json +39 -19
  192. package/harness/manifests/java/cursor.json +39 -19
  193. package/hunter-workflow-family.json +2 -2
  194. package/package.json +1 -1
@@ -359,6 +359,28 @@ def find_review_reports(change_dir: Path) -> list[Path]:
359
359
  return found
360
360
 
361
361
 
362
+ def review_phase_completed(events: list[dict[str, Any]]) -> bool:
363
+ """True only when structured events record a review phase.end (UT-042)."""
364
+ for event in events:
365
+ if event.get("type") != "phase.end":
366
+ continue
367
+ if str(event.get("phase") or "").lower() == "review":
368
+ return True
369
+ return False
370
+
371
+
372
+ def review_evidence_present(
373
+ change_dir: Path,
374
+ events: list[dict[str, Any]] | None = None,
375
+ ) -> bool:
376
+ """Review ran only when report files or review phase.end events exist."""
377
+ if find_review_reports(change_dir):
378
+ return True
379
+ if events is None:
380
+ events = he.load_events(change_dir / "events.ndjson")
381
+ return review_phase_completed(events)
382
+
383
+
362
384
  def git_run(project: Path, *args: str) -> tuple[int, str, str]:
363
385
  try:
364
386
  proc = subprocess.run(
@@ -531,10 +553,9 @@ def check_status(change_dir: Path) -> dict[str, Any]:
531
553
  # --- test / review reports ---
532
554
  test_reports = find_test_reports(change_dir)
533
555
  review_reports = find_review_reports(change_dir)
534
- log_text = load_execution_log(change_dir)
535
- has_review_section = bool(
536
- re.search(r"harness-review|##\s*review", log_text, re.IGNORECASE)
537
- )
556
+ events_path = change_dir / "events.ndjson"
557
+ events = he.load_events(events_path) if events_path.is_file() else []
558
+ review_ran = review_evidence_present(change_dir, events)
538
559
 
539
560
  checks["test_reports"] = [str(p.relative_to(change_dir)) for p in test_reports]
540
561
  checks["review_reports"] = [str(p.relative_to(change_dir)) for p in review_reports]
@@ -555,13 +576,13 @@ def check_status(change_dir: Path) -> dict[str, Any]:
555
576
 
556
577
  if review_reports:
557
578
  checks["review_report_status"] = "present"
558
- elif has_review_section:
579
+ elif review_phase_completed(events):
559
580
  checks["review_report_status"] = "ran-but-not-persisted"
560
581
  warnings.append(
561
582
  {
562
583
  "code": "review-not-persisted",
563
584
  "message": (
564
- "execution-log has review section but no review-report file; "
585
+ "review phase.end recorded but no review-report file; "
565
586
  "prefer persisting report before archive"
566
587
  ),
567
588
  }
@@ -972,10 +993,8 @@ def _stage_status_from_sources(
972
993
  if unit.get("source") == "not-run" and unit.get("run", 0) == 0:
973
994
  status["test"] = "NOT_RUN"
974
995
 
975
- if not find_review_reports(change_dir):
976
- log_text = load_execution_log(change_dir)
977
- if not re.search(r"harness-review|##\s*review", log_text, re.IGNORECASE):
978
- status["review"] = "ADVISORY"
996
+ if not review_evidence_present(change_dir, events):
997
+ status["review"] = "ADVISORY"
979
998
 
980
999
  return status
981
1000
 
@@ -1057,7 +1076,11 @@ def _changed_files_from_git(
1057
1076
  return diff_stat, changed
1058
1077
 
1059
1078
 
1060
- def _review_summary(change_dir: Path, existing: dict[str, Any] | None) -> dict[str, Any]:
1079
+ def _review_summary(
1080
+ change_dir: Path,
1081
+ existing: dict[str, Any] | None,
1082
+ events: list[dict[str, Any]] | None = None,
1083
+ ) -> dict[str, Any]:
1061
1084
  base = {
1062
1085
  "status": "ADVISORY",
1063
1086
  "red": 0,
@@ -1072,10 +1095,8 @@ def _review_summary(change_dir: Path, existing: dict[str, Any] | None) -> dict[s
1072
1095
  merged = dict(base)
1073
1096
  merged.update(existing["reviewSummary"])
1074
1097
  return merged
1075
- if not find_review_reports(change_dir):
1076
- log_text = load_execution_log(change_dir)
1077
- if not re.search(r"harness-review|##\s*review", log_text, re.IGNORECASE):
1078
- base["status"] = "ADVISORY_NOT_RUN"
1098
+ if not review_evidence_present(change_dir, events):
1099
+ base["status"] = "ADVISORY_NOT_RUN"
1079
1100
  return base
1080
1101
 
1081
1102
 
@@ -1363,7 +1384,11 @@ def collect_summary_data(
1363
1384
  if not for_replay:
1364
1385
  data["artifacts"] = _artifacts_from_events(events)
1365
1386
 
1366
- data["reviewSummary"] = _review_summary(change_dir, existing if for_replay else None)
1387
+ data["reviewSummary"] = _review_summary(
1388
+ change_dir,
1389
+ existing if for_replay else None,
1390
+ events,
1391
+ )
1367
1392
  if not for_replay:
1368
1393
  data["timeline"] = _timeline_from_events(event_summary, events)
1369
1394
  else: