@hunter-harness/workflow-harness 0.2.27 → 0.2.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/contracts/workflow-policy.json +34 -2
  3. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +1 -1
  4. package/harness/bundles/general/claude-code/harness-archive/templates/render-summary.mjs +25 -6
  5. package/harness/bundles/general/claude-code/harness-archive/templates/summary-data-template.json +44 -0
  6. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  7. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  8. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  9. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
  10. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
  11. package/harness/bundles/general/claude-code/harness-review/SKILL.md +1 -1
  12. package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
  13. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
  14. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
  15. package/harness/bundles/general/claude-code/harness-test/SKILL.md +26 -2
  16. package/harness/bundles/general/claude-code/harness-test/checklist.md +15 -0
  17. package/harness/bundles/general/claude-code/harness-test/reference.md +28 -4
  18. package/harness/bundles/general/claude-code/scripts/harness_archive.py +2061 -187
  19. package/harness/bundles/general/claude-code/scripts/harness_events.py +43 -9
  20. package/harness/bundles/general/claude-code/scripts/harness_gate.py +491 -7
  21. package/harness/bundles/general/claude-code/scripts/harness_integration.py +232 -0
  22. package/harness/bundles/general/claude-code/scripts/harness_phase.py +758 -1
  23. package/harness/bundles/general/claude-code/scripts/harness_plan_finalize.py +74 -0
  24. package/harness/bundles/general/claude-code/scripts/harness_retry.py +175 -0
  25. package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +702 -22
  26. package/harness/bundles/general/claude-code/scripts/harness_test_runner.py +974 -0
  27. package/harness/bundles/general/claude-code/scripts/harness_workflow_policy.py +87 -0
  28. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  29. package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +34 -2
  30. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
  31. package/harness/bundles/general/codebuddy/harness-archive/templates/render-summary.mjs +25 -6
  32. package/harness/bundles/general/codebuddy/harness-archive/templates/summary-data-template.json +44 -0
  33. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  34. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  35. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  36. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  37. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
  38. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
  39. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
  40. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
  41. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
  42. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +26 -2
  43. package/harness/bundles/general/codebuddy/harness-test/checklist.md +15 -0
  44. package/harness/bundles/general/codebuddy/harness-test/reference.md +28 -4
  45. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +2061 -187
  46. package/harness/bundles/general/codebuddy/scripts/harness_events.py +43 -9
  47. package/harness/bundles/general/codebuddy/scripts/harness_gate.py +491 -7
  48. package/harness/bundles/general/codebuddy/scripts/harness_integration.py +232 -0
  49. package/harness/bundles/general/codebuddy/scripts/harness_phase.py +758 -1
  50. package/harness/bundles/general/codebuddy/scripts/harness_plan_finalize.py +74 -0
  51. package/harness/bundles/general/codebuddy/scripts/harness_retry.py +175 -0
  52. package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +702 -22
  53. package/harness/bundles/general/codebuddy/scripts/harness_test_runner.py +974 -0
  54. package/harness/bundles/general/codebuddy/scripts/harness_workflow_policy.py +87 -0
  55. package/harness/bundles/general/codex/.harness-build.json +1 -1
  56. package/harness/bundles/general/codex/contracts/workflow-policy.json +34 -2
  57. package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
  58. package/harness/bundles/general/codex/harness-archive/templates/render-summary.mjs +25 -6
  59. package/harness/bundles/general/codex/harness-archive/templates/summary-data-template.json +44 -0
  60. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  61. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
  62. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  63. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  64. package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
  65. package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
  66. package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
  67. package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
  68. package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
  69. package/harness/bundles/general/codex/harness-test/SKILL.md +26 -2
  70. package/harness/bundles/general/codex/harness-test/checklist.md +15 -0
  71. package/harness/bundles/general/codex/harness-test/reference.md +28 -4
  72. package/harness/bundles/general/codex/scripts/harness_archive.py +2061 -187
  73. package/harness/bundles/general/codex/scripts/harness_events.py +43 -9
  74. package/harness/bundles/general/codex/scripts/harness_gate.py +491 -7
  75. package/harness/bundles/general/codex/scripts/harness_integration.py +232 -0
  76. package/harness/bundles/general/codex/scripts/harness_phase.py +758 -1
  77. package/harness/bundles/general/codex/scripts/harness_plan_finalize.py +74 -0
  78. package/harness/bundles/general/codex/scripts/harness_retry.py +175 -0
  79. package/harness/bundles/general/codex/scripts/harness_test_guard.py +702 -22
  80. package/harness/bundles/general/codex/scripts/harness_test_runner.py +974 -0
  81. package/harness/bundles/general/codex/scripts/harness_workflow_policy.py +87 -0
  82. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  83. package/harness/bundles/general/cursor/contracts/workflow-policy.json +34 -2
  84. package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
  85. package/harness/bundles/general/cursor/harness-archive/templates/render-summary.mjs +25 -6
  86. package/harness/bundles/general/cursor/harness-archive/templates/summary-data-template.json +44 -0
  87. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  88. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  89. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  90. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  91. package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
  92. package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
  93. package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
  94. package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
  95. package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
  96. package/harness/bundles/general/cursor/harness-test/SKILL.md +26 -2
  97. package/harness/bundles/general/cursor/harness-test/checklist.md +15 -0
  98. package/harness/bundles/general/cursor/harness-test/reference.md +28 -4
  99. package/harness/bundles/general/cursor/scripts/harness_archive.py +2061 -187
  100. package/harness/bundles/general/cursor/scripts/harness_events.py +43 -9
  101. package/harness/bundles/general/cursor/scripts/harness_gate.py +491 -7
  102. package/harness/bundles/general/cursor/scripts/harness_integration.py +232 -0
  103. package/harness/bundles/general/cursor/scripts/harness_phase.py +758 -1
  104. package/harness/bundles/general/cursor/scripts/harness_plan_finalize.py +74 -0
  105. package/harness/bundles/general/cursor/scripts/harness_retry.py +175 -0
  106. package/harness/bundles/general/cursor/scripts/harness_test_guard.py +702 -22
  107. package/harness/bundles/general/cursor/scripts/harness_test_runner.py +974 -0
  108. package/harness/bundles/general/cursor/scripts/harness_workflow_policy.py +87 -0
  109. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  110. package/harness/bundles/java/claude-code/contracts/workflow-policy.json +34 -2
  111. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  112. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
  113. package/harness/bundles/java/claude-code/harness-archive/templates/render-summary.mjs +25 -6
  114. package/harness/bundles/java/claude-code/harness-archive/templates/summary-data-template.json +44 -0
  115. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  116. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  117. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  118. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  119. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  120. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
  121. package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
  122. package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
  123. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
  124. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
  125. package/harness/bundles/java/claude-code/harness-test/SKILL.md +26 -2
  126. package/harness/bundles/java/claude-code/scripts/harness_archive.py +2061 -187
  127. package/harness/bundles/java/claude-code/scripts/harness_events.py +43 -9
  128. package/harness/bundles/java/claude-code/scripts/harness_gate.py +491 -7
  129. package/harness/bundles/java/claude-code/scripts/harness_integration.py +232 -0
  130. package/harness/bundles/java/claude-code/scripts/harness_phase.py +758 -1
  131. package/harness/bundles/java/claude-code/scripts/harness_plan_finalize.py +74 -0
  132. package/harness/bundles/java/claude-code/scripts/harness_retry.py +175 -0
  133. package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +702 -22
  134. package/harness/bundles/java/claude-code/scripts/harness_test_runner.py +974 -0
  135. package/harness/bundles/java/claude-code/scripts/harness_workflow_policy.py +87 -0
  136. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  137. package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +34 -2
  138. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  139. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
  140. package/harness/bundles/java/codebuddy/harness-archive/templates/render-summary.mjs +25 -6
  141. package/harness/bundles/java/codebuddy/harness-archive/templates/summary-data-template.json +44 -0
  142. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  143. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  144. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  145. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  146. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  147. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
  148. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
  149. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
  150. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
  151. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
  152. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +26 -2
  153. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +2061 -187
  154. package/harness/bundles/java/codebuddy/scripts/harness_events.py +43 -9
  155. package/harness/bundles/java/codebuddy/scripts/harness_gate.py +491 -7
  156. package/harness/bundles/java/codebuddy/scripts/harness_integration.py +232 -0
  157. package/harness/bundles/java/codebuddy/scripts/harness_phase.py +758 -1
  158. package/harness/bundles/java/codebuddy/scripts/harness_plan_finalize.py +74 -0
  159. package/harness/bundles/java/codebuddy/scripts/harness_retry.py +175 -0
  160. package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +702 -22
  161. package/harness/bundles/java/codebuddy/scripts/harness_test_runner.py +974 -0
  162. package/harness/bundles/java/codebuddy/scripts/harness_workflow_policy.py +87 -0
  163. package/harness/bundles/java/codex/.harness-build.json +1 -1
  164. package/harness/bundles/java/codex/contracts/workflow-policy.json +34 -2
  165. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  166. package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
  167. package/harness/bundles/java/codex/harness-archive/templates/render-summary.mjs +25 -6
  168. package/harness/bundles/java/codex/harness-archive/templates/summary-data-template.json +44 -0
  169. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  170. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
  171. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  172. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  173. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  174. package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
  175. package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
  176. package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
  177. package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
  178. package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
  179. package/harness/bundles/java/codex/harness-test/SKILL.md +26 -2
  180. package/harness/bundles/java/codex/scripts/harness_archive.py +2061 -187
  181. package/harness/bundles/java/codex/scripts/harness_events.py +43 -9
  182. package/harness/bundles/java/codex/scripts/harness_gate.py +491 -7
  183. package/harness/bundles/java/codex/scripts/harness_integration.py +232 -0
  184. package/harness/bundles/java/codex/scripts/harness_phase.py +758 -1
  185. package/harness/bundles/java/codex/scripts/harness_plan_finalize.py +74 -0
  186. package/harness/bundles/java/codex/scripts/harness_retry.py +175 -0
  187. package/harness/bundles/java/codex/scripts/harness_test_guard.py +702 -22
  188. package/harness/bundles/java/codex/scripts/harness_test_runner.py +974 -0
  189. package/harness/bundles/java/codex/scripts/harness_workflow_policy.py +87 -0
  190. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  191. package/harness/bundles/java/cursor/contracts/workflow-policy.json +34 -2
  192. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  193. package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
  194. package/harness/bundles/java/cursor/harness-archive/templates/render-summary.mjs +25 -6
  195. package/harness/bundles/java/cursor/harness-archive/templates/summary-data-template.json +44 -0
  196. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  197. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  198. package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  199. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  200. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  201. package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
  202. package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
  203. package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
  204. package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
  205. package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
  206. package/harness/bundles/java/cursor/harness-test/SKILL.md +26 -2
  207. package/harness/bundles/java/cursor/scripts/harness_archive.py +2061 -187
  208. package/harness/bundles/java/cursor/scripts/harness_events.py +43 -9
  209. package/harness/bundles/java/cursor/scripts/harness_gate.py +491 -7
  210. package/harness/bundles/java/cursor/scripts/harness_integration.py +232 -0
  211. package/harness/bundles/java/cursor/scripts/harness_phase.py +758 -1
  212. package/harness/bundles/java/cursor/scripts/harness_plan_finalize.py +74 -0
  213. package/harness/bundles/java/cursor/scripts/harness_retry.py +175 -0
  214. package/harness/bundles/java/cursor/scripts/harness_test_guard.py +702 -22
  215. package/harness/bundles/java/cursor/scripts/harness_test_runner.py +974 -0
  216. package/harness/bundles/java/cursor/scripts/harness_workflow_policy.py +87 -0
  217. package/harness/manifests/general/claude-code.json +34 -26
  218. package/harness/manifests/general/codebuddy.json +34 -26
  219. package/harness/manifests/general/codex.json +34 -26
  220. package/harness/manifests/general/cursor.json +34 -26
  221. package/harness/manifests/java/claude-code.json +34 -26
  222. package/harness/manifests/java/codebuddy.json +34 -26
  223. package/harness/manifests/java/codex.json +34 -26
  224. package/harness/manifests/java/cursor.json +34 -26
  225. package/hunter-workflow-family.json +2 -2
  226. package/package.json +1 -1
@@ -988,26 +988,40 @@ def _seal_timestamp_for_attempt(
988
988
  cutoff_ts: str | None,
989
989
  next_attempt_start: Any = None,
990
990
  ) -> tuple[Any, str | None]:
991
- """Pick INCOMPLETE seal time: next start, recovery, or report cutoff."""
991
+ """Pick a typed terminal and seal time for an unclosed attempt."""
992
992
  recovery_ts = None
993
+ explicit_terminal: tuple[Any, str] | None = None
993
994
  for event in events_in:
994
- if str(event.get("type") or "").lower() in {
995
+ event_type = str(event.get("type") or "").lower()
996
+ if event_type in {
995
997
  "recovery",
996
998
  "phase.recovery",
997
999
  "attempt.recovery",
998
1000
  }:
999
1001
  recovery_ts = event.get("timestamp") or recovery_ts
1002
+ terminal = {
1003
+ "attempt.abandoned": "ABANDONED",
1004
+ "phase.abandoned": "ABANDONED",
1005
+ "attempt.interrupted": "INTERRUPTED",
1006
+ "phase.interrupted": "INTERRUPTED",
1007
+ "attempt.orphaned": "ORPHANED",
1008
+ "phase.orphaned": "ORPHANED",
1009
+ }.get(event_type)
1010
+ if terminal and event.get("timestamp"):
1011
+ explicit_terminal = (event.get("timestamp"), terminal)
1012
+ if explicit_terminal is not None:
1013
+ return explicit_terminal
1000
1014
  if next_attempt_start:
1001
- return next_attempt_start, "INCOMPLETE"
1015
+ return next_attempt_start, "RECOVERED"
1002
1016
  if recovery_ts:
1003
- return recovery_ts, "INCOMPLETE"
1017
+ return recovery_ts, "RECOVERED"
1004
1018
  if cutoff_ts:
1005
- return cutoff_ts, "INCOMPLETE"
1019
+ return cutoff_ts, "INCOMPLETE_AT_CUTOFF"
1006
1020
  # Fall back to last event timestamp so wall clock is not silently dropped.
1007
1021
  for event in reversed(events_in):
1008
1022
  if event.get("timestamp"):
1009
- return event.get("timestamp"), "INCOMPLETE"
1010
- return None, "INCOMPLETE"
1023
+ return event.get("timestamp"), "INTERRUPTED"
1024
+ return None, "ORPHANED"
1011
1025
 
1012
1026
 
1013
1027
  def attempt_invocations(
@@ -1027,6 +1041,7 @@ def attempt_invocations(
1027
1041
  start_ts = None
1028
1042
  end_ts = None
1029
1043
  status = None
1044
+ terminal_status = None
1030
1045
  closed_by_end = False
1031
1046
  for event in events_in:
1032
1047
  if event.get("type") == "phase.start" and start_ts is None:
@@ -1035,7 +1050,9 @@ def attempt_invocations(
1035
1050
  end_ts = event.get("timestamp")
1036
1051
  if "status" in event:
1037
1052
  status = event.get("status")
1053
+ terminal_status = str(event.get("status") or "").upper() or None
1038
1054
  closed_by_end = True
1055
+ missing_start = start_ts is None
1039
1056
  sealed_incomplete = False
1040
1057
  if not closed_by_end:
1041
1058
  next_start = None
@@ -1052,7 +1069,12 @@ def attempt_invocations(
1052
1069
  if seal_ts is not None:
1053
1070
  end_ts = seal_ts
1054
1071
  status = seal_status
1072
+ terminal_status = seal_status
1055
1073
  sealed_incomplete = True
1074
+ elif missing_start:
1075
+ terminal_status = "ORPHANED"
1076
+ status = "ORPHANED"
1077
+ sealed_incomplete = True
1056
1078
  duration = None
1057
1079
  if start_ts and end_ts:
1058
1080
  duration = duration_ms_between(start_ts, end_ts)
@@ -1062,9 +1084,13 @@ def attempt_invocations(
1062
1084
  {
1063
1085
  "attempt": attempt.get("attempt"),
1064
1086
  "status": status,
1087
+ "terminalStatus": terminal_status,
1088
+ "startedAt": start_ts,
1089
+ "endedAt": end_ts,
1065
1090
  "durationMs": duration,
1066
1091
  "activeEligible": active_eligible,
1067
1092
  "sealedIncomplete": sealed_incomplete,
1093
+ "warnings": list(attempt.get("warnings") or []),
1068
1094
  }
1069
1095
  )
1070
1096
  return invocations
@@ -1080,7 +1106,13 @@ def phase_final_state(phase_events: list[dict[str, Any]]) -> dict[str, Any]:
1080
1106
  "attempt": latest.get("attempt"),
1081
1107
  "status": latest.get("status"),
1082
1108
  "durationMs": latest.get("durationMs"),
1083
- "closed": latest.get("status") is not None and latest.get("status") != "INCOMPLETE",
1109
+ "closed": latest.get("terminalStatus") not in {
1110
+ None,
1111
+ "INCOMPLETE",
1112
+ "INCOMPLETE_AT_CUTOFF",
1113
+ "ORPHANED",
1114
+ "INTERRUPTED",
1115
+ },
1084
1116
  }
1085
1117
 
1086
1118
 
@@ -1114,7 +1146,8 @@ def canonical_phase_timing(
1114
1146
  unclosed = sum(
1115
1147
  1
1116
1148
  for invocation in invocations
1117
- if invocation.get("sealedIncomplete") or invocation.get("status") == "INCOMPLETE"
1149
+ if invocation.get("terminalStatus")
1150
+ in {"INCOMPLETE", "INCOMPLETE_AT_CUTOFF", "ORPHANED", "INTERRUPTED"}
1118
1151
  )
1119
1152
  return {
1120
1153
  "activeExecutionMs": active,
@@ -1122,6 +1155,7 @@ def canonical_phase_timing(
1122
1155
  "lateEventCount": late["lateEventCount"],
1123
1156
  "lateEventSpanMs": late["lateEventSpanMs"],
1124
1157
  "unclosedAttemptCount": unclosed,
1158
+ "attempts": invocations,
1125
1159
  }
1126
1160
 
1127
1161