@telora/daemon 0.17.36 → 0.17.40

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 (266) hide show
  1. package/build-info.json +4 -3
  2. package/dist/assembly-engine.d.ts +6 -0
  3. package/dist/assembly-engine.d.ts.map +1 -1
  4. package/dist/assembly-engine.js +19 -0
  5. package/dist/assembly-engine.js.map +1 -1
  6. package/dist/assembly-resolvers.d.ts +17 -8
  7. package/dist/assembly-resolvers.d.ts.map +1 -1
  8. package/dist/assembly-resolvers.js +19 -8
  9. package/dist/assembly-resolvers.js.map +1 -1
  10. package/dist/cli/session-state.d.ts +10 -0
  11. package/dist/cli/session-state.d.ts.map +1 -1
  12. package/dist/cli/session-state.js +31 -0
  13. package/dist/cli/session-state.js.map +1 -1
  14. package/dist/completion/completion-decision.d.ts +83 -0
  15. package/dist/completion/completion-decision.d.ts.map +1 -0
  16. package/dist/completion/completion-decision.js +48 -0
  17. package/dist/completion/completion-decision.js.map +1 -0
  18. package/dist/completion/event-escalations.d.ts +97 -0
  19. package/dist/completion/event-escalations.d.ts.map +1 -0
  20. package/dist/completion/event-escalations.js +213 -0
  21. package/dist/completion/event-escalations.js.map +1 -0
  22. package/dist/completion/event.d.ts +1 -72
  23. package/dist/completion/event.d.ts.map +1 -1
  24. package/dist/completion/event.js +148 -322
  25. package/dist/completion/event.js.map +1 -1
  26. package/dist/completion/exit-classification.d.ts +82 -0
  27. package/dist/completion/exit-classification.d.ts.map +1 -0
  28. package/dist/completion/exit-classification.js +61 -0
  29. package/dist/completion/exit-classification.js.map +1 -0
  30. package/dist/completion/index.d.ts +14 -5
  31. package/dist/completion/index.d.ts.map +1 -1
  32. package/dist/completion/index.js +14 -5
  33. package/dist/completion/index.js.map +1 -1
  34. package/dist/completion/merge-phase.d.ts +114 -0
  35. package/dist/completion/merge-phase.d.ts.map +1 -0
  36. package/dist/completion/merge-phase.js +198 -0
  37. package/dist/completion/merge-phase.js.map +1 -0
  38. package/dist/completion/review-exit-phase.d.ts +82 -0
  39. package/dist/completion/review-exit-phase.d.ts.map +1 -0
  40. package/dist/completion/review-exit-phase.js +228 -0
  41. package/dist/completion/review-exit-phase.js.map +1 -0
  42. package/dist/completion/status-advance-phase.d.ts +61 -0
  43. package/dist/completion/status-advance-phase.d.ts.map +1 -0
  44. package/dist/completion/status-advance-phase.js +182 -0
  45. package/dist/completion/status-advance-phase.js.map +1 -0
  46. package/dist/completion/team-completion.d.ts +28 -269
  47. package/dist/completion/team-completion.d.ts.map +1 -1
  48. package/dist/completion/team-completion.js +145 -676
  49. package/dist/completion/team-completion.js.map +1 -1
  50. package/dist/daemon-process.d.ts +18 -2
  51. package/dist/daemon-process.d.ts.map +1 -1
  52. package/dist/daemon-process.js +7 -2
  53. package/dist/daemon-process.js.map +1 -1
  54. package/dist/directive/close-loop-stage.d.ts +50 -0
  55. package/dist/directive/close-loop-stage.d.ts.map +1 -0
  56. package/dist/directive/close-loop-stage.js +196 -0
  57. package/dist/directive/close-loop-stage.js.map +1 -0
  58. package/dist/directive/directive-assembly.d.ts +33 -0
  59. package/dist/directive/directive-assembly.d.ts.map +1 -0
  60. package/dist/directive/directive-assembly.js +77 -0
  61. package/dist/directive/directive-assembly.js.map +1 -0
  62. package/dist/directive/directive-dispatch.d.ts +103 -0
  63. package/dist/directive/directive-dispatch.d.ts.map +1 -0
  64. package/dist/directive/directive-dispatch.js +279 -0
  65. package/dist/directive/directive-dispatch.js.map +1 -0
  66. package/dist/directive/phase-sync.d.ts +89 -0
  67. package/dist/directive/phase-sync.d.ts.map +1 -0
  68. package/dist/directive/phase-sync.js +173 -0
  69. package/dist/directive/phase-sync.js.map +1 -0
  70. package/dist/directive-executor.d.ts +21 -223
  71. package/dist/directive-executor.d.ts.map +1 -1
  72. package/dist/directive-executor.js +28 -687
  73. package/dist/directive-executor.js.map +1 -1
  74. package/dist/focus-engine.d.ts.map +1 -1
  75. package/dist/focus-engine.js +8 -0
  76. package/dist/focus-engine.js.map +1 -1
  77. package/dist/focus-executor.d.ts +29 -8
  78. package/dist/focus-executor.d.ts.map +1 -1
  79. package/dist/focus-executor.js +29 -10
  80. package/dist/focus-executor.js.map +1 -1
  81. package/dist/focus-stage-lifecycle.d.ts +7 -5
  82. package/dist/focus-stage-lifecycle.d.ts.map +1 -1
  83. package/dist/focus-stage-lifecycle.js +11 -6
  84. package/dist/focus-stage-lifecycle.js.map +1 -1
  85. package/dist/index.js +8 -0
  86. package/dist/index.js.map +1 -1
  87. package/dist/pipeline-config.d.ts +13 -0
  88. package/dist/pipeline-config.d.ts.map +1 -1
  89. package/dist/pipeline-config.js +15 -0
  90. package/dist/pipeline-config.js.map +1 -1
  91. package/dist/resolvers/agent-escalations.d.ts +8 -1
  92. package/dist/resolvers/agent-escalations.d.ts.map +1 -1
  93. package/dist/resolvers/agent-escalations.js +25 -22
  94. package/dist/resolvers/agent-escalations.js.map +1 -1
  95. package/dist/resolvers/agent-session-summaries.d.ts +8 -1
  96. package/dist/resolvers/agent-session-summaries.d.ts.map +1 -1
  97. package/dist/resolvers/agent-session-summaries.js +21 -18
  98. package/dist/resolvers/agent-session-summaries.js.map +1 -1
  99. package/dist/resolvers/delivery-acceptance-criteria.d.ts +7 -1
  100. package/dist/resolvers/delivery-acceptance-criteria.d.ts.map +1 -1
  101. package/dist/resolvers/delivery-acceptance-criteria.js +14 -11
  102. package/dist/resolvers/delivery-acceptance-criteria.js.map +1 -1
  103. package/dist/resolvers/delivery-description.d.ts +7 -1
  104. package/dist/resolvers/delivery-description.d.ts.map +1 -1
  105. package/dist/resolvers/delivery-description.js +14 -11
  106. package/dist/resolvers/delivery-description.js.map +1 -1
  107. package/dist/resolvers/delivery-issues.d.ts +8 -1
  108. package/dist/resolvers/delivery-issues.d.ts.map +1 -1
  109. package/dist/resolvers/delivery-issues.js +51 -48
  110. package/dist/resolvers/delivery-issues.js.map +1 -1
  111. package/dist/resolvers/delivery-listing.d.ts +16 -1
  112. package/dist/resolvers/delivery-listing.d.ts.map +1 -1
  113. package/dist/resolvers/delivery-listing.js +36 -33
  114. package/dist/resolvers/delivery-listing.js.map +1 -1
  115. package/dist/resolvers/delivery-tech-context.d.ts +7 -1
  116. package/dist/resolvers/delivery-tech-context.d.ts.map +1 -1
  117. package/dist/resolvers/delivery-tech-context.js +14 -11
  118. package/dist/resolvers/delivery-tech-context.js.map +1 -1
  119. package/dist/resolvers/deployment-profile.d.ts +8 -1
  120. package/dist/resolvers/deployment-profile.d.ts.map +1 -1
  121. package/dist/resolvers/deployment-profile.js +20 -17
  122. package/dist/resolvers/deployment-profile.js.map +1 -1
  123. package/dist/resolvers/focus-anchoring-injections.d.ts +26 -1
  124. package/dist/resolvers/focus-anchoring-injections.d.ts.map +1 -1
  125. package/dist/resolvers/focus-anchoring-injections.js +91 -88
  126. package/dist/resolvers/focus-anchoring-injections.js.map +1 -1
  127. package/dist/resolvers/focus-context.d.ts +9 -1
  128. package/dist/resolvers/focus-context.d.ts.map +1 -1
  129. package/dist/resolvers/focus-context.js +38 -35
  130. package/dist/resolvers/focus-context.js.map +1 -1
  131. package/dist/resolvers/focus-injections.d.ts +13 -1
  132. package/dist/resolvers/focus-injections.d.ts.map +1 -1
  133. package/dist/resolvers/focus-injections.js +60 -57
  134. package/dist/resolvers/focus-injections.js.map +1 -1
  135. package/dist/resolvers/focus-last-review-report.d.ts +2 -1
  136. package/dist/resolvers/focus-last-review-report.d.ts.map +1 -1
  137. package/dist/resolvers/focus-last-review-report.js +33 -30
  138. package/dist/resolvers/focus-last-review-report.js.map +1 -1
  139. package/dist/resolvers/focus-reality-tree.d.ts +15 -1
  140. package/dist/resolvers/focus-reality-tree.d.ts.map +1 -1
  141. package/dist/resolvers/focus-reality-tree.js +35 -32
  142. package/dist/resolvers/focus-reality-tree.js.map +1 -1
  143. package/dist/resolvers/git-diff-against-base.d.ts +8 -1
  144. package/dist/resolvers/git-diff-against-base.d.ts.map +1 -1
  145. package/dist/resolvers/git-diff-against-base.js +33 -30
  146. package/dist/resolvers/git-diff-against-base.js.map +1 -1
  147. package/dist/resolvers/guards-evaluation-results.d.ts +7 -1
  148. package/dist/resolvers/guards-evaluation-results.d.ts.map +1 -1
  149. package/dist/resolvers/guards-evaluation-results.js +25 -22
  150. package/dist/resolvers/guards-evaluation-results.js.map +1 -1
  151. package/dist/resolvers/index.d.ts +22 -40
  152. package/dist/resolvers/index.d.ts.map +1 -1
  153. package/dist/resolvers/index.js +112 -41
  154. package/dist/resolvers/index.js.map +1 -1
  155. package/dist/resolvers/loop-context.d.ts +18 -1
  156. package/dist/resolvers/loop-context.d.ts.map +1 -1
  157. package/dist/resolvers/loop-context.js +21 -18
  158. package/dist/resolvers/loop-context.js.map +1 -1
  159. package/dist/resolvers/loop-delivery-index.d.ts +17 -1
  160. package/dist/resolvers/loop-delivery-index.d.ts.map +1 -1
  161. package/dist/resolvers/loop-delivery-index.js +51 -48
  162. package/dist/resolvers/loop-delivery-index.js.map +1 -1
  163. package/dist/resolvers/loop-documents.d.ts +9 -1
  164. package/dist/resolvers/loop-documents.d.ts.map +1 -1
  165. package/dist/resolvers/loop-documents.js +22 -19
  166. package/dist/resolvers/loop-documents.js.map +1 -1
  167. package/dist/resolvers/loop-expected-effects.d.ts +11 -1
  168. package/dist/resolvers/loop-expected-effects.d.ts.map +1 -1
  169. package/dist/resolvers/loop-expected-effects.js +53 -50
  170. package/dist/resolvers/loop-expected-effects.js.map +1 -1
  171. package/dist/resolvers/loop-frt-statement.d.ts +11 -1
  172. package/dist/resolvers/loop-frt-statement.d.ts.map +1 -1
  173. package/dist/resolvers/loop-frt-statement.js +28 -25
  174. package/dist/resolvers/loop-frt-statement.js.map +1 -1
  175. package/dist/resolvers/loop-injection.d.ts +10 -1
  176. package/dist/resolvers/loop-injection.d.ts.map +1 -1
  177. package/dist/resolvers/loop-injection.js +38 -35
  178. package/dist/resolvers/loop-injection.js.map +1 -1
  179. package/dist/resolvers/loop-persona.d.ts +20 -1
  180. package/dist/resolvers/loop-persona.d.ts.map +1 -1
  181. package/dist/resolvers/loop-persona.js +20 -17
  182. package/dist/resolvers/loop-persona.js.map +1 -1
  183. package/dist/resolvers/loop-questions.d.ts +8 -1
  184. package/dist/resolvers/loop-questions.d.ts.map +1 -1
  185. package/dist/resolvers/loop-questions.js +39 -36
  186. package/dist/resolvers/loop-questions.js.map +1 -1
  187. package/dist/resolvers/loop-upstream-udes.d.ts +11 -1
  188. package/dist/resolvers/loop-upstream-udes.d.ts.map +1 -1
  189. package/dist/resolvers/loop-upstream-udes.js +74 -71
  190. package/dist/resolvers/loop-upstream-udes.js.map +1 -1
  191. package/dist/resolvers/prd-context.d.ts +2 -0
  192. package/dist/resolvers/prd-context.d.ts.map +1 -1
  193. package/dist/resolvers/prd-context.js +16 -13
  194. package/dist/resolvers/prd-context.js.map +1 -1
  195. package/dist/resolvers/prd-persona.d.ts +2 -0
  196. package/dist/resolvers/prd-persona.d.ts.map +1 -1
  197. package/dist/resolvers/prd-persona.js +6 -3
  198. package/dist/resolvers/prd-persona.js.map +1 -1
  199. package/dist/resolvers/reality-metrics.d.ts +8 -1
  200. package/dist/resolvers/reality-metrics.d.ts.map +1 -1
  201. package/dist/resolvers/reality-metrics.js +73 -70
  202. package/dist/resolvers/reality-metrics.js.map +1 -1
  203. package/dist/resolvers/reality-projections.d.ts +7 -1
  204. package/dist/resolvers/reality-projections.d.ts.map +1 -1
  205. package/dist/resolvers/reality-projections.js +35 -32
  206. package/dist/resolvers/reality-projections.js.map +1 -1
  207. package/dist/resolvers/reality-tree-snapshot.d.ts +10 -1
  208. package/dist/resolvers/reality-tree-snapshot.d.ts.map +1 -1
  209. package/dist/resolvers/reality-tree-snapshot.js +34 -31
  210. package/dist/resolvers/reality-tree-snapshot.js.map +1 -1
  211. package/dist/resolvers/retired-injections.d.ts +10 -1
  212. package/dist/resolvers/retired-injections.d.ts.map +1 -1
  213. package/dist/resolvers/retired-injections.js +68 -65
  214. package/dist/resolvers/retired-injections.js.map +1 -1
  215. package/dist/resolvers/review-outcomes.d.ts +11 -1
  216. package/dist/resolvers/review-outcomes.d.ts.map +1 -1
  217. package/dist/resolvers/review-outcomes.js +27 -24
  218. package/dist/resolvers/review-outcomes.js.map +1 -1
  219. package/dist/resolvers/security-advisory.d.ts +2 -1
  220. package/dist/resolvers/security-advisory.d.ts.map +1 -1
  221. package/dist/resolvers/security-advisory.js +47 -44
  222. package/dist/resolvers/security-advisory.js.map +1 -1
  223. package/dist/resolvers/wiki-search.d.ts +8 -1
  224. package/dist/resolvers/wiki-search.d.ts.map +1 -1
  225. package/dist/resolvers/wiki-search.js +17 -14
  226. package/dist/resolvers/wiki-search.js.map +1 -1
  227. package/dist/resolvers/wiki-topic.d.ts +9 -1
  228. package/dist/resolvers/wiki-topic.d.ts.map +1 -1
  229. package/dist/resolvers/wiki-topic.js +21 -18
  230. package/dist/resolvers/wiki-topic.js.map +1 -1
  231. package/dist/resolvers/workflow-stages.d.ts +7 -1
  232. package/dist/resolvers/workflow-stages.d.ts.map +1 -1
  233. package/dist/resolvers/workflow-stages.js +20 -17
  234. package/dist/resolvers/workflow-stages.js.map +1 -1
  235. package/dist/self-update.d.ts +6 -0
  236. package/dist/self-update.d.ts.map +1 -1
  237. package/dist/self-update.js +6 -1
  238. package/dist/self-update.js.map +1 -1
  239. package/dist/spawner/index.d.ts +2 -1
  240. package/dist/spawner/index.d.ts.map +1 -1
  241. package/dist/spawner/index.js +2 -1
  242. package/dist/spawner/index.js.map +1 -1
  243. package/dist/spawner/spawn-team.d.ts +14 -52
  244. package/dist/spawner/spawn-team.d.ts.map +1 -1
  245. package/dist/spawner/spawn-team.js +14 -469
  246. package/dist/spawner/spawn-team.js.map +1 -1
  247. package/dist/staleness.d.ts +124 -0
  248. package/dist/staleness.d.ts.map +1 -0
  249. package/dist/staleness.js +215 -0
  250. package/dist/staleness.js.map +1 -0
  251. package/dist/state-cascade.d.ts +3 -2
  252. package/dist/state-cascade.d.ts.map +1 -1
  253. package/dist/state-cascade.js +7 -3
  254. package/dist/state-cascade.js.map +1 -1
  255. package/dist/types/focus.d.ts +5 -4
  256. package/dist/types/focus.d.ts.map +1 -1
  257. package/dist/types/session.d.ts +2 -3
  258. package/dist/types/session.d.ts.map +1 -1
  259. package/dist/unified-shell.d.ts.map +1 -1
  260. package/dist/unified-shell.js +21 -12
  261. package/dist/unified-shell.js.map +1 -1
  262. package/package.json +2 -2
  263. package/dist/session-lifecycle.d.ts +0 -78
  264. package/dist/session-lifecycle.d.ts.map +0 -1
  265. package/dist/session-lifecycle.js +0 -382
  266. package/dist/session-lifecycle.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Review-exit phase of the team completion flow.
3
+ *
4
+ * Routes verify deliveries when a team exits while the focus has
5
+ * review_requested_at set: open work -> verify_failed, explicit report ->
6
+ * done, clean review session -> auto-approved done. Clears
7
+ * review_requested_at and emits review_completed when anything routed.
8
+ * Invoked by the phase sequencer in team-completion.ts and deterministically
9
+ * from completion/event.ts on a review pass completion. Extracted from
10
+ * completion/team-completion.ts; bodies verbatim.
11
+ */
12
+ import { getDeliveryIssues, fetchEffectiveWorkflow, updateDeliveryStatus, markDeliveryAutoApproved, getActiveFocuses } from '../supabase.js';
13
+ import { hasPendingSpawnDirective } from '../directive/directive-queue.js';
14
+ import { emitLoopTrigger } from '../loop-event-bus.js';
15
+ import { getFocusDeliveries, getFocusIssues, clearReviewRequestedAt, getFocusReviewReportForSession } from '../queries/focuses.js';
16
+ import { createEscalation } from '../queries/issues.js';
17
+ /**
18
+ * Dependencies for runReviewExitHandler. Defaults to real implementations;
19
+ * overridable in tests via the optional `deps` argument.
20
+ */
21
+ export interface ReviewExitDeps {
22
+ getActiveFocuses: typeof getActiveFocuses;
23
+ getFocusDeliveries: typeof getFocusDeliveries;
24
+ getFocusIssues: typeof getFocusIssues;
25
+ getDeliveryIssues: typeof getDeliveryIssues;
26
+ fetchEffectiveWorkflow: typeof fetchEffectiveWorkflow;
27
+ updateDeliveryStatus: typeof updateDeliveryStatus;
28
+ markDeliveryAutoApproved: typeof markDeliveryAutoApproved;
29
+ clearReviewRequestedAt: typeof clearReviewRequestedAt;
30
+ hasPendingSpawnDirective: typeof hasPendingSpawnDirective;
31
+ emitLoopTrigger: typeof emitLoopTrigger;
32
+ getFocusReviewReportForSession: typeof getFocusReviewReportForSession;
33
+ createEscalation: typeof createEscalation;
34
+ }
35
+ export interface ReviewExitParams {
36
+ focusId: string;
37
+ focusName: string;
38
+ organizationId: string;
39
+ productId: string;
40
+ sessionId: string;
41
+ sessionType: 'coding' | 'review';
42
+ succeeded: boolean;
43
+ }
44
+ /**
45
+ * Handle a team exit when the focus has review_requested_at set.
46
+ *
47
+ * Routing is asymmetric in the downward direction (toward intent) -- open
48
+ * work on a verify delivery means the work isn't done, so it routes to
49
+ * verify_failed unconditionally. Closing a verify delivery to `done` is
50
+ * the other direction; it now happens via two paths: an explicit
51
+ * focus_reviews approval, OR a clean review session exit (auto-approve,
52
+ * reversible via the later unapprove affordance).
53
+ *
54
+ * Routing rules:
55
+ * 1. No review_requested_at -> nothing to do.
56
+ * 2. A spawn directive is pending -> defer to the incoming team.
57
+ * 3. For each verify delivery:
58
+ * - open work issues -> verify_failed (always, no evidence gate)
59
+ * - no open work + reportExists -> done (explicit approval)
60
+ * - no open work + no report + review session succeeded ->
61
+ * done (auto-approve; tagged with auto_approved_at /
62
+ * auto_approved_by_session for surfacing + unapprove)
63
+ * - no open work + non-review session (or failed review) ->
64
+ * leave in verify (next auto-review poll re-triggers)
65
+ * 4. If anything routed -> clear review_requested_at + emit
66
+ * review_completed event so phase re-derives on the next poll.
67
+ * 5. If routed via issue evidence (no report present), file a soft
68
+ * review_missing_report notice -- the loop continues regardless.
69
+ * 6. If nothing routed AND no evidence at all -> warn-and-leave. The
70
+ * strict gate no longer escalates: an idle focus with no work and no
71
+ * report is ambiguous, not failed; humans clear it via the MCP
72
+ * clear-review-request path.
73
+ *
74
+ * The independent "evidence" signals (focus_reviews row + review-filed
75
+ * issues) still feed into the issue-evidence notice and the warn-and-leave
76
+ * messaging, but they no longer gate routing -- open work on a delivery
77
+ * is its own evidence that the work isn't done.
78
+ *
79
+ * Exported with injectable deps for unit testing.
80
+ */
81
+ export declare function runReviewExitHandler(params: ReviewExitParams, deps?: ReviewExitDeps): Promise<void>;
82
+ //# sourceMappingURL=review-exit-phase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-exit-phase.d.ts","sourceRoot":"","sources":["../../src/completion/review-exit-phase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,8BAA8B,EAC/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,cAAc,EAAE,OAAO,cAAc,CAAC;IACtC,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,wBAAwB,EAAE,OAAO,wBAAwB,CAAC;IAC1D,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD,wBAAwB,EAAE,OAAO,wBAAwB,CAAC;IAC1D,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,8BAA8B,EAAE,OAAO,8BAA8B,CAAC;IACtE,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;CAC3C;AAiBD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE,cAAsC,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Kf"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Review-exit phase of the team completion flow.
3
+ *
4
+ * Routes verify deliveries when a team exits while the focus has
5
+ * review_requested_at set: open work -> verify_failed, explicit report ->
6
+ * done, clean review session -> auto-approved done. Clears
7
+ * review_requested_at and emits review_completed when anything routed.
8
+ * Invoked by the phase sequencer in team-completion.ts and deterministically
9
+ * from completion/event.ts on a review pass completion. Extracted from
10
+ * completion/team-completion.ts; bodies verbatim.
11
+ */
12
+ import { filterWorkIssues, ACTIVE_WORK_STATUSES } from '../constants.js';
13
+ import { getDeliveryIssues, fetchEffectiveWorkflow, updateDeliveryStatus, markDeliveryAutoApproved, getActiveFocuses, } from '../supabase.js';
14
+ import { hasPendingSpawnDirective } from '../directive/directive-queue.js';
15
+ import { ESCALATION_REASONS, DELIVERY_STATUS } from '@telora/daemon-core';
16
+ import { emitLoopTrigger } from '../loop-event-bus.js';
17
+ import { getFocusDeliveries, getFocusIssues, clearReviewRequestedAt, getFocusReviewReportForSession, } from '../queries/focuses.js';
18
+ import { createEscalation } from '../queries/issues.js';
19
+ import { reviewFiledIssueExists } from '../review-defect-detector.js';
20
+ const defaultReviewExitDeps = {
21
+ getActiveFocuses,
22
+ getFocusDeliveries,
23
+ getFocusIssues,
24
+ getDeliveryIssues,
25
+ fetchEffectiveWorkflow,
26
+ updateDeliveryStatus,
27
+ markDeliveryAutoApproved,
28
+ clearReviewRequestedAt,
29
+ hasPendingSpawnDirective,
30
+ emitLoopTrigger,
31
+ getFocusReviewReportForSession,
32
+ createEscalation,
33
+ };
34
+ /**
35
+ * Handle a team exit when the focus has review_requested_at set.
36
+ *
37
+ * Routing is asymmetric in the downward direction (toward intent) -- open
38
+ * work on a verify delivery means the work isn't done, so it routes to
39
+ * verify_failed unconditionally. Closing a verify delivery to `done` is
40
+ * the other direction; it now happens via two paths: an explicit
41
+ * focus_reviews approval, OR a clean review session exit (auto-approve,
42
+ * reversible via the later unapprove affordance).
43
+ *
44
+ * Routing rules:
45
+ * 1. No review_requested_at -> nothing to do.
46
+ * 2. A spawn directive is pending -> defer to the incoming team.
47
+ * 3. For each verify delivery:
48
+ * - open work issues -> verify_failed (always, no evidence gate)
49
+ * - no open work + reportExists -> done (explicit approval)
50
+ * - no open work + no report + review session succeeded ->
51
+ * done (auto-approve; tagged with auto_approved_at /
52
+ * auto_approved_by_session for surfacing + unapprove)
53
+ * - no open work + non-review session (or failed review) ->
54
+ * leave in verify (next auto-review poll re-triggers)
55
+ * 4. If anything routed -> clear review_requested_at + emit
56
+ * review_completed event so phase re-derives on the next poll.
57
+ * 5. If routed via issue evidence (no report present), file a soft
58
+ * review_missing_report notice -- the loop continues regardless.
59
+ * 6. If nothing routed AND no evidence at all -> warn-and-leave. The
60
+ * strict gate no longer escalates: an idle focus with no work and no
61
+ * report is ambiguous, not failed; humans clear it via the MCP
62
+ * clear-review-request path.
63
+ *
64
+ * The independent "evidence" signals (focus_reviews row + review-filed
65
+ * issues) still feed into the issue-evidence notice and the warn-and-leave
66
+ * messaging, but they no longer gate routing -- open work on a delivery
67
+ * is its own evidence that the work isn't done.
68
+ *
69
+ * Exported with injectable deps for unit testing.
70
+ */
71
+ export async function runReviewExitHandler(params, deps = defaultReviewExitDeps) {
72
+ const { focusId, focusName, organizationId, productId, sessionId, sessionType, succeeded } = params;
73
+ const focuses = await deps.getActiveFocuses(organizationId, productId);
74
+ const current = focuses.find(s => s.focus_id === focusId);
75
+ if (!current?.review_requested_at) {
76
+ // Nothing review-related to do.
77
+ return;
78
+ }
79
+ const reviewRequestedAt = current.review_requested_at;
80
+ // NOTE: a pending spawn directive no longer short-circuits the handler.
81
+ // Delivery finalization (auto-approve verify->done, done-via-report, and
82
+ // verify_failed on open work) plus clearing review_requested_at and emitting
83
+ // review_completed must run unconditionally on a session exit -- otherwise a
84
+ // transiently-pending spawn strands the verify delivery and feeds the
85
+ // per-poll re-fire spin. The pending-spawn signal is consulted ONLY in the
86
+ // non-routed branch below, where leaving the flag set for an incoming team is
87
+ // the legitimate behavior.
88
+ // ── Gather evidence ──────────────────────────────────────────────
89
+ let reportExists = false;
90
+ try {
91
+ const report = await deps.getFocusReviewReportForSession(focusId, sessionId);
92
+ reportExists = report.exists;
93
+ }
94
+ catch (err) {
95
+ console.warn(`[focus-executor] getFocusReviewReportForSession failed for "${focusName}" session ${sessionId}: ${err.message}`);
96
+ // Treat read failure the same as missing.
97
+ }
98
+ let hasIssueEvidence = false;
99
+ try {
100
+ const focusIssues = await deps.getFocusIssues(focusId);
101
+ hasIssueEvidence = reviewFiledIssueExists(focusIssues, reviewRequestedAt);
102
+ }
103
+ catch (err) {
104
+ console.warn(`[focus-executor] getFocusIssues failed for "${focusName}": ${err.message}`);
105
+ // Treat read failure as no evidence -- only affects the warn-and-leave
106
+ // message and the issue-evidence notice; routing runs regardless.
107
+ }
108
+ // ── Route verify deliveries ──────────────────────────────────────
109
+ // Runs unconditionally: open work routes to verify_failed even when no
110
+ // review evidence is present. This is the self-healing path -- a coding
111
+ // team that left pre-existing open work behind no longer needs the review
112
+ // agent to file fresh defects before the loop can correct itself.
113
+ const reviewDeliveries = await deps.getFocusDeliveries(focusId);
114
+ let routedAny = false;
115
+ for (const d of reviewDeliveries) {
116
+ if (d.executionStatus !== DELIVERY_STATUS.VERIFY)
117
+ continue;
118
+ try {
119
+ const [issues, dWorkflow] = await Promise.all([
120
+ deps.getDeliveryIssues(d.id),
121
+ deps.fetchEffectiveWorkflow(d.id),
122
+ ]);
123
+ const workIssues = filterWorkIssues(issues);
124
+ const openWork = workIssues.filter(i => ACTIVE_WORK_STATUSES.has(i.status));
125
+ if (openWork.length > 0) {
126
+ const awaitingVerifyStage = dWorkflow.stages.find(s => s.name === 'verify_failed');
127
+ await deps.updateDeliveryStatus(d.id, 'verify_failed', awaitingVerifyStage?.id ?? null, undefined, undefined, { organizationId, fromStatus: 'verify' });
128
+ console.log(`[focus-executor] Delivery "${d.name}" moved from verify to verify_failed: ${openWork.length} open issue(s)`);
129
+ routedAny = true;
130
+ }
131
+ else if (reportExists) {
132
+ const doneStage = dWorkflow.stages.find(s => s.name === 'done');
133
+ await deps.updateDeliveryStatus(d.id, 'done', doneStage?.id ?? null, undefined, undefined, { organizationId, fromStatus: 'verify' });
134
+ console.log(`[focus-executor] Delivery "${d.name}" moved from verify to done (review passed)`);
135
+ routedAny = true;
136
+ }
137
+ else if (sessionType === 'review' && succeeded) {
138
+ // Clean review session: review agent exited without filing defects
139
+ // and without writing a focus_reviews row. Per the auto-approve-
140
+ // with-visibility direction (memory/feedback_auto_approve_with_visibility),
141
+ // promote verify -> done and tag the delivery with auto-approval
142
+ // metadata so the (later) dashboard/MCP unapprove path can surface
143
+ // it for human reversal. Reversible by construction.
144
+ const doneStage = dWorkflow.stages.find(s => s.name === 'done');
145
+ await deps.markDeliveryAutoApproved(d.id, sessionId, doneStage?.id ?? null);
146
+ console.log(`[focus-executor] Delivery "${d.name}" auto-approved verify -> done ` +
147
+ `(clean review session ${sessionId.slice(0, 8)}, no defects filed)`);
148
+ routedAny = true;
149
+ }
150
+ else {
151
+ // Non-review session exit, or review session that didn't succeed --
152
+ // no signal to auto-approve. Leave in verify; the next state-cascade
153
+ // poll will re-trigger auto-review via checkAutoReview.
154
+ const reason = sessionType !== 'review'
155
+ ? `${sessionType} session exited (not eligible for auto-approve)`
156
+ : 'review session did not succeed';
157
+ console.log(`[focus-executor] Delivery "${d.name}" left in verify: ${reason} ` +
158
+ `(verify-cycling; next auto-review poll will re-trigger).`);
159
+ }
160
+ }
161
+ catch (err) {
162
+ console.warn(`[focus-executor] Failed to route delivery "${d.name}" after review: ${err.message}`);
163
+ }
164
+ }
165
+ if (routedAny) {
166
+ await deps.clearReviewRequestedAt(focusId);
167
+ console.log(`[focus-executor] Review complete for "${focusName}" -- review_requested_at cleared ` +
168
+ `(reportExists=${reportExists}, issueEvidence=${hasIssueEvidence})`);
169
+ const routeVia = reportExists
170
+ ? 'report'
171
+ : hasIssueEvidence
172
+ ? 'issue-evidence'
173
+ : sessionType === 'review' && succeeded
174
+ ? 'auto-approve'
175
+ : 'open-work';
176
+ deps.emitLoopTrigger({
177
+ type: 'review_completed',
178
+ focusId,
179
+ detail: `review complete -- "${focusName}" routed via ${routeVia}`,
180
+ });
181
+ }
182
+ else if (deps.hasPendingSpawnDirective(focusId)) {
183
+ // Nothing routed AND a spawn directive is pending: the team was torn down
184
+ // to make room for an incoming team (e.g., the directive executor spawning
185
+ // a review team). Leave review_requested_at set so the incoming team's exit
186
+ // performs the routing. This is the ONLY case the pending-spawn signal
187
+ // gates -- it never blocks the finalization above.
188
+ console.log(`[focus-executor] "${focusName}" review exit routed nothing and a spawn directive ` +
189
+ `is pending -- leaving review_requested_at set for the incoming team.`);
190
+ }
191
+ else if (!reportExists && !hasIssueEvidence) {
192
+ // Strict gate: no routing happened AND no evidence. Warn-and-leave --
193
+ // the focus may simply be idle (no verify deliveries to route, no
194
+ // review report) or awaiting human handling. We deliberately no longer
195
+ // escalate here: an idle focus with no report is not a missing report,
196
+ // it's an idle focus. Recovery is via MCP clear-review-request.
197
+ const reason = sessionType !== 'review'
198
+ ? `${sessionType} team exited (not a review team)`
199
+ : !succeeded
200
+ ? 'review team did not succeed'
201
+ : 'no verify deliveries to route (clean review sessions auto-approve verify deliveries; this focus had none)';
202
+ console.warn(`[focus-executor] "${focusName}" has review_requested_at set but ${reason}; ` +
203
+ `phase remains 'reviewing' until a review team runs, work is queued, ` +
204
+ `or review_requested_at is cleared via MCP.`);
205
+ }
206
+ // Surface that the agent skipped review_complete even though the loop healed.
207
+ // Only fire when we actually routed something via issue evidence; otherwise
208
+ // the notice misleads (it claims the loop continued when nothing moved).
209
+ if (routedAny && !reportExists && hasIssueEvidence) {
210
+ try {
211
+ await deps.createEscalation({
212
+ organizationId,
213
+ sessionId,
214
+ issueId: null,
215
+ reasonType: ESCALATION_REASONS.BLOCKED_BY_EXTERNAL,
216
+ description: 'Review session filed issues but did not call focus_review_complete. ' +
217
+ 'Deliveries routed via issue evidence; review_requested_at cleared. ' +
218
+ 'Tighten the review directive so the agent always stamps an outcome.',
219
+ escalationKind: 'review_missing_report',
220
+ metadata: { focus_id: focusId, session_id: sessionId, routed_via: 'issue_evidence' },
221
+ });
222
+ }
223
+ catch (err) {
224
+ console.warn(`[focus-executor] createEscalation (issue-evidence notice) failed for "${focusName}": ${err.message}`);
225
+ }
226
+ }
227
+ }
228
+ //# sourceMappingURL=review-exit-phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-exit-phase.js","sourceRoot":"","sources":["../../src/completion/review-exit-phase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Status-advance phase of the team completion flow.
3
+ *
4
+ * Advances delivery statuses from issue completion after a team exits:
5
+ * re-queues deliveries with open work, auto-closes Context Groups, sweeps
6
+ * Verified / In Review issues to Done, steps queued/verify_failed -> coding,
7
+ * and advances via the workflow (coding -> verify -> done). Invoked by the
8
+ * phase sequencer in team-completion.ts and by the wake-cycle self-heal in
9
+ * completion/event.ts. Extracted from completion/team-completion.ts; bodies
10
+ * verbatim.
11
+ */
12
+ import type { DaemonConfig, FocusTeamState, FocusDeliveryInfo, Workflow, PolicyFailureMode } from '../types.js';
13
+ import { updateDeliveryStatus } from '../supabase.js';
14
+ import type { StageAdvanceResult } from '../delivery-lifecycle.js';
15
+ /**
16
+ * External dependencies for advanceDeliveryStatuses.
17
+ * Defaults to real implementations; overridable in tests.
18
+ */
19
+ export interface AdvanceDeliveryDeps {
20
+ getFocusDeliveries: (focusId: string) => Promise<FocusDeliveryInfo[]>;
21
+ getDeliveryIssues: (deliveryId: string) => Promise<Array<{
22
+ id: string;
23
+ title: string;
24
+ status: string;
25
+ issueType: string;
26
+ }>>;
27
+ getDeliverySessionCount: (deliveryId: string) => Promise<number>;
28
+ updateIssueStatus: (issueId: string, status: string) => Promise<void>;
29
+ fetchEffectiveWorkflow: (deliveryId: string) => Promise<Workflow>;
30
+ updateDeliveryStatus: typeof updateDeliveryStatus;
31
+ advanceDeliveryStage: (params: {
32
+ deliveryId: string;
33
+ deliveryName: string;
34
+ organizationId: string;
35
+ workflow: Workflow;
36
+ currentStageId: string;
37
+ fromStatus?: string | null;
38
+ exitCode: number;
39
+ openIssueCount: number;
40
+ sessionCount: number;
41
+ policyFailureMode: PolicyFailureMode;
42
+ sessionId: string | null;
43
+ focusId?: string;
44
+ config?: DaemonConfig;
45
+ }) => Promise<StageAdvanceResult>;
46
+ }
47
+ /**
48
+ * Advance delivery statuses after team completion.
49
+ *
50
+ * Re-queries all deliveries for the focus from the database rather
51
+ * than relying on the spawn-time snapshot in teamState.knownDeliveryIds.
52
+ * This ensures deliveries added mid-flight (after the team was spawned)
53
+ * are discovered and advanced, and that stale deliveryStageIds don't
54
+ * cause deliveries to be skipped.
55
+ *
56
+ * For each delivery in 'coding' status:
57
+ * - All issues Done (or no issues): advance via workflow (coding -> verify -> done)
58
+ * - Open issues remain: re-queue to 'queued' so the next team session picks it up
59
+ */
60
+ export declare function advanceDeliveryStatuses(config: DaemonConfig, teamState: FocusTeamState, sessionId: string, deps?: AdvanceDeliveryDeps): Promise<void>;
61
+ //# sourceMappingURL=status-advance-phase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-advance-phase.d.ts","sourceRoot":"","sources":["../../src/completion/status-advance-phase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAKL,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAQnE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtE,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC5H,uBAAuB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,sBAAsB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,oBAAoB,EAAE,CAAC,MAAM,EAAE;QAC7B,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,QAAQ,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,iBAAiB,CAAC;QACrC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,YAAY,CAAC;KACvB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACnC;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,mBAAiC,GACtC,OAAO,CAAC,IAAI,CAAC,CAoJf"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Status-advance phase of the team completion flow.
3
+ *
4
+ * Advances delivery statuses from issue completion after a team exits:
5
+ * re-queues deliveries with open work, auto-closes Context Groups, sweeps
6
+ * Verified / In Review issues to Done, steps queued/verify_failed -> coding,
7
+ * and advances via the workflow (coding -> verify -> done). Invoked by the
8
+ * phase sequencer in team-completion.ts and by the wake-cycle self-heal in
9
+ * completion/event.ts. Extracted from completion/team-completion.ts; bodies
10
+ * verbatim.
11
+ */
12
+ import { filterWorkIssues, filterContextGroups, TERMINAL_ISSUE_STATUSES, planDeliveryCloseSweep } from '../constants.js';
13
+ import { getDeliveryIssues, getDeliverySessionCount, updateIssueStatus, fetchEffectiveWorkflow, updateDeliveryStatus, } from '../supabase.js';
14
+ import { advanceDeliveryStage, ensureWorktreeCommittedBeforeAdvance } from '../delivery-lifecycle.js';
15
+ import { DELIVERY_STATUS } from '@telora/daemon-core';
16
+ import { emitLoopTrigger } from '../loop-event-bus.js';
17
+ import { getFocusDeliveries } from '../queries/focuses.js';
18
+ import { isStatusAgentActionable } from '../stage-classifier.js';
19
+ const defaultDeps = {
20
+ getFocusDeliveries,
21
+ getDeliveryIssues,
22
+ getDeliverySessionCount,
23
+ updateIssueStatus,
24
+ fetchEffectiveWorkflow,
25
+ updateDeliveryStatus,
26
+ advanceDeliveryStage,
27
+ };
28
+ /**
29
+ * Advance delivery statuses after team completion.
30
+ *
31
+ * Re-queries all deliveries for the focus from the database rather
32
+ * than relying on the spawn-time snapshot in teamState.knownDeliveryIds.
33
+ * This ensures deliveries added mid-flight (after the team was spawned)
34
+ * are discovered and advanced, and that stale deliveryStageIds don't
35
+ * cause deliveries to be skipped.
36
+ *
37
+ * For each delivery in 'coding' status:
38
+ * - All issues Done (or no issues): advance via workflow (coding -> verify -> done)
39
+ * - Open issues remain: re-queue to 'queued' so the next team session picks it up
40
+ */
41
+ export async function advanceDeliveryStatuses(config, teamState, sessionId, deps = defaultDeps) {
42
+ // Re-query deliveries fresh from the DB to discover mid-flight additions
43
+ let deliveries;
44
+ try {
45
+ deliveries = await deps.getFocusDeliveries(teamState.focusId);
46
+ }
47
+ catch (err) {
48
+ console.warn(`[focus-executor] Failed to fetch deliveries for focus ${teamState.focusId}:`, err.message);
49
+ return;
50
+ }
51
+ for (const delivery of deliveries) {
52
+ // Skip deliveries that were already merged mid-flight
53
+ if (teamState.mergedDeliveryIds.has(delivery.id)) {
54
+ continue;
55
+ }
56
+ // Only advance deliveries in agent-actionable status.
57
+ if (!isStatusAgentActionable(delivery.executionStatus ?? '')) {
58
+ continue;
59
+ }
60
+ try {
61
+ const [issues, sessionCount, workflow] = await Promise.all([
62
+ deps.getDeliveryIssues(delivery.id),
63
+ deps.getDeliverySessionCount(delivery.id),
64
+ deps.fetchEffectiveWorkflow(delivery.id),
65
+ ]);
66
+ // Context Groups are reference material, not actionable work — exclude from open count
67
+ const workIssues = filterWorkIssues(issues);
68
+ const contextGroups = filterContextGroups(issues);
69
+ const openCount = workIssues.filter(i => !TERMINAL_ISSUE_STATUSES.has(i.status)).length;
70
+ const totalWork = workIssues.length;
71
+ // Use currentWorkflowStageId from the fresh query, falling back to
72
+ // the teamState cache for deliveries known at spawn time
73
+ const currentStageId = delivery.currentWorkflowStageId
74
+ ?? teamState.deliveryStageIds.get(delivery.id)
75
+ ?? null;
76
+ if (!currentStageId) {
77
+ console.warn(`[focus-executor] Delivery ${delivery.id}: no workflow stage ID, skipping advance`);
78
+ continue;
79
+ }
80
+ // Re-queue deliveries with open work issues so the next team picks them up
81
+ if (totalWork > 0 && openCount > 0) {
82
+ // Already queued — leave it there
83
+ if (delivery.executionStatus === DELIVERY_STATUS.QUEUED) {
84
+ continue;
85
+ }
86
+ const queuedStage = workflow.stages.find(s => s.name === 'queued');
87
+ if (queuedStage) {
88
+ console.log(`[focus-executor] Delivery ${delivery.id}: ${openCount}/${totalWork} work issues still open, re-queuing`);
89
+ await deps.updateDeliveryStatus(delivery.id, 'queued', queuedStage.id, undefined, undefined, { organizationId: teamState.organizationId, fromStatus: delivery.executionStatus });
90
+ teamState.deliveryStageIds.set(delivery.id, queuedStage.id);
91
+ }
92
+ else {
93
+ console.warn(`[focus-executor] Delivery ${delivery.id}: ${openCount}/${totalWork} work issues still open, no queued stage in workflow — leaving in ${delivery.executionStatus}`);
94
+ }
95
+ continue;
96
+ }
97
+ // Auto-close Context Groups when all work issues are done
98
+ for (const cg of contextGroups) {
99
+ if (cg.status !== 'Done') {
100
+ try {
101
+ await deps.updateIssueStatus(cg.id, 'Done');
102
+ console.log(`[focus-executor] Auto-closed Context Group "${cg.title}" (all work issues done)`);
103
+ }
104
+ catch (err) {
105
+ console.warn(`[focus-executor] Failed to auto-close Context Group "${cg.title}":`, err.message);
106
+ }
107
+ }
108
+ }
109
+ // Sweep Verified and In Review issues to Done before advancing.
110
+ // 'Verified': review agent confirmed the fix but used Verified instead of Done.
111
+ // 'In Review': dev signalled completion; no review agent ran before close.
112
+ // Both collapse to Done for a clean terminal record.
113
+ const sweepIds = planDeliveryCloseSweep(workIssues);
114
+ for (const issueId of sweepIds) {
115
+ try {
116
+ await deps.updateIssueStatus(issueId, 'Done');
117
+ console.log(`[focus-executor] Swept issue ${issueId} to Done before delivery advance`);
118
+ }
119
+ catch (err) {
120
+ console.warn(`[focus-executor] Failed to sweep issue ${issueId} to Done:`, err.message);
121
+ }
122
+ }
123
+ // If delivery is queued or verify_failed, step through coding first
124
+ // (workflow doesn't allow queued/verify_failed -> verify directly).
125
+ // Update the stage ID for the subsequent advance call.
126
+ let effectiveStageId = currentStageId;
127
+ // from_status fed to the subsequent advanceDeliveryStage call: defaults to
128
+ // the delivery's current status, but becomes 'coding' once we step there.
129
+ let effectiveFromStatus = delivery.executionStatus ?? null;
130
+ if (delivery.executionStatus === DELIVERY_STATUS.QUEUED || delivery.executionStatus === DELIVERY_STATUS.VERIFY_FAILED) {
131
+ const codingStage = workflow.stages.find(s => s.name === 'coding');
132
+ if (codingStage) {
133
+ console.log(`[focus-executor] Delivery ${delivery.id}: stepping ${delivery.executionStatus} -> coding before verify advance`);
134
+ await deps.updateDeliveryStatus(delivery.id, 'coding', codingStage.id, undefined, undefined, { organizationId: teamState.organizationId, fromStatus: delivery.executionStatus });
135
+ effectiveStageId = codingStage.id;
136
+ effectiveFromStatus = 'coding';
137
+ }
138
+ }
139
+ console.log(`[focus-executor] Delivery ${delivery.id}: ${totalWork === 0 ? 'no issues' : `all ${totalWork} work issues done`}, advancing via workflow`);
140
+ const precheck = await ensureWorktreeCommittedBeforeAdvance({
141
+ deliveryId: delivery.id,
142
+ deliveryName: delivery.name,
143
+ focusId: teamState.focusId,
144
+ organizationId: teamState.organizationId,
145
+ sessionId,
146
+ });
147
+ if (!precheck.ok) {
148
+ console.log(`[focus-executor] Delivery ${delivery.id}: skip advance -- ${precheck.reason}`);
149
+ continue;
150
+ }
151
+ const result = await deps.advanceDeliveryStage({
152
+ deliveryId: delivery.id,
153
+ deliveryName: delivery.name,
154
+ organizationId: teamState.organizationId,
155
+ workflow,
156
+ currentStageId: effectiveStageId,
157
+ fromStatus: effectiveFromStatus,
158
+ exitCode: 0,
159
+ openIssueCount: openCount,
160
+ sessionCount,
161
+ policyFailureMode: config.policyFailureMode,
162
+ sessionId,
163
+ focusId: teamState.focusId,
164
+ config,
165
+ });
166
+ // Track the new stage ID for potential future advances
167
+ teamState.deliveryStageIds.set(delivery.id, result.deliveryStageId ?? null);
168
+ // Notify loop engine of delivery completion (verify or done)
169
+ if (result.advanced && (result.deliveryStatus === 'verify' || result.deliveryStatus === 'done')) {
170
+ emitLoopTrigger({
171
+ type: 'delivery_completed',
172
+ focusId: teamState.focusId,
173
+ detail: `${delivery.name} -> ${result.deliveryStatus}`,
174
+ });
175
+ }
176
+ }
177
+ catch (err) {
178
+ console.warn(`[focus-executor] Failed to check/advance delivery ${delivery.id}:`, err.message);
179
+ }
180
+ }
181
+ }
182
+ //# sourceMappingURL=status-advance-phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-advance-phase.js","sourceRoot":"","sources":["../../src/completion/status-advance-phase.ts"],"names":[],"mappings":"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"}