@telora/daemon 0.21.83 → 0.21.134

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 (267) hide show
  1. package/build-info.json +10 -3
  2. package/dist/audit/audit-hooks.d.ts +106 -0
  3. package/dist/audit/audit-hooks.d.ts.map +1 -1
  4. package/dist/audit/audit-hooks.js +149 -17
  5. package/dist/audit/audit-hooks.js.map +1 -1
  6. package/dist/ci/ci-sensor-loop.d.ts +6 -0
  7. package/dist/ci/ci-sensor-loop.d.ts.map +1 -1
  8. package/dist/ci/ci-sensor-loop.js +50 -3
  9. package/dist/ci/ci-sensor-loop.js.map +1 -1
  10. package/dist/ci/ci-status.d.ts +63 -11
  11. package/dist/ci/ci-status.d.ts.map +1 -1
  12. package/dist/ci/ci-status.js +94 -27
  13. package/dist/ci/ci-status.js.map +1 -1
  14. package/dist/completion/coverage-drift-state.d.ts +29 -2
  15. package/dist/completion/coverage-drift-state.d.ts.map +1 -1
  16. package/dist/completion/coverage-drift-state.js +42 -2
  17. package/dist/completion/coverage-drift-state.js.map +1 -1
  18. package/dist/completion/coverage-stabilized.d.ts +58 -0
  19. package/dist/completion/coverage-stabilized.d.ts.map +1 -0
  20. package/dist/completion/coverage-stabilized.js +84 -0
  21. package/dist/completion/coverage-stabilized.js.map +1 -0
  22. package/dist/completion/delivery-advancement-guard.d.ts +21 -0
  23. package/dist/completion/delivery-advancement-guard.d.ts.map +1 -1
  24. package/dist/completion/delivery-advancement-guard.js +31 -3
  25. package/dist/completion/delivery-advancement-guard.js.map +1 -1
  26. package/dist/completion/event-escalations.d.ts +15 -0
  27. package/dist/completion/event-escalations.d.ts.map +1 -1
  28. package/dist/completion/event-escalations.js +42 -4
  29. package/dist/completion/event-escalations.js.map +1 -1
  30. package/dist/completion/event-phases.d.ts.map +1 -1
  31. package/dist/completion/event-phases.js +10 -5
  32. package/dist/completion/event-phases.js.map +1 -1
  33. package/dist/completion/machine-remediable-demotion.d.ts +74 -0
  34. package/dist/completion/machine-remediable-demotion.d.ts.map +1 -0
  35. package/dist/completion/machine-remediable-demotion.js +147 -0
  36. package/dist/completion/machine-remediable-demotion.js.map +1 -0
  37. package/dist/completion/review-exit-escalations.d.ts +36 -1
  38. package/dist/completion/review-exit-escalations.d.ts.map +1 -1
  39. package/dist/completion/review-exit-escalations.js +81 -0
  40. package/dist/completion/review-exit-escalations.js.map +1 -1
  41. package/dist/completion/review-exit-phase.d.ts +4 -2
  42. package/dist/completion/review-exit-phase.d.ts.map +1 -1
  43. package/dist/completion/review-exit-phase.js +49 -54
  44. package/dist/completion/review-exit-phase.js.map +1 -1
  45. package/dist/completion/settle-injection-sweep.d.ts +55 -0
  46. package/dist/completion/settle-injection-sweep.d.ts.map +1 -0
  47. package/dist/completion/settle-injection-sweep.js +88 -0
  48. package/dist/completion/settle-injection-sweep.js.map +1 -0
  49. package/dist/completion/state-cascade.d.ts.map +1 -1
  50. package/dist/completion/state-cascade.js +41 -0
  51. package/dist/completion/state-cascade.js.map +1 -1
  52. package/dist/completion/status-advance-phase.d.ts.map +1 -1
  53. package/dist/completion/status-advance-phase.js +28 -30
  54. package/dist/completion/status-advance-phase.js.map +1 -1
  55. package/dist/completion/team-lifecycle.d.ts +42 -0
  56. package/dist/completion/team-lifecycle.d.ts.map +1 -1
  57. package/dist/completion/team-lifecycle.js +79 -2
  58. package/dist/completion/team-lifecycle.js.map +1 -1
  59. package/dist/delivery/delivery-lifecycle.d.ts +19 -33
  60. package/dist/delivery/delivery-lifecycle.d.ts.map +1 -1
  61. package/dist/delivery/delivery-lifecycle.js +26 -160
  62. package/dist/delivery/delivery-lifecycle.js.map +1 -1
  63. package/dist/delivery/delivery-merge-ops.d.ts +46 -0
  64. package/dist/delivery/delivery-merge-ops.d.ts.map +1 -0
  65. package/dist/delivery/delivery-merge-ops.js +154 -0
  66. package/dist/delivery/delivery-merge-ops.js.map +1 -0
  67. package/dist/delivery/delivery-reconciler-apply.d.ts +108 -66
  68. package/dist/delivery/delivery-reconciler-apply.d.ts.map +1 -1
  69. package/dist/delivery/delivery-reconciler-apply.js +87 -61
  70. package/dist/delivery/delivery-reconciler-apply.js.map +1 -1
  71. package/dist/delivery/delivery-reconciler.d.ts +7 -2
  72. package/dist/delivery/delivery-reconciler.d.ts.map +1 -1
  73. package/dist/delivery/delivery-reconciler.js +34 -5
  74. package/dist/delivery/delivery-reconciler.js.map +1 -1
  75. package/dist/delivery/external-hold-surface.d.ts +32 -0
  76. package/dist/delivery/external-hold-surface.d.ts.map +1 -0
  77. package/dist/delivery/external-hold-surface.js +67 -0
  78. package/dist/delivery/external-hold-surface.js.map +1 -0
  79. package/dist/delivery/external-hold.d.ts +38 -0
  80. package/dist/delivery/external-hold.d.ts.map +1 -1
  81. package/dist/delivery/external-hold.js +69 -6
  82. package/dist/delivery/external-hold.js.map +1 -1
  83. package/dist/delivery/operator-hold.d.ts +1 -2
  84. package/dist/delivery/operator-hold.d.ts.map +1 -1
  85. package/dist/delivery/operator-hold.js +1 -2
  86. package/dist/delivery/operator-hold.js.map +1 -1
  87. package/dist/delivery/paused-revival.d.ts +140 -0
  88. package/dist/delivery/paused-revival.d.ts.map +1 -0
  89. package/dist/delivery/paused-revival.js +229 -0
  90. package/dist/delivery/paused-revival.js.map +1 -0
  91. package/dist/delivery/wait-reachability.d.ts +149 -0
  92. package/dist/delivery/wait-reachability.d.ts.map +1 -0
  93. package/dist/delivery/wait-reachability.js +193 -0
  94. package/dist/delivery/wait-reachability.js.map +1 -0
  95. package/dist/directive/close-loop-dispatcher.d.ts +16 -263
  96. package/dist/directive/close-loop-dispatcher.d.ts.map +1 -1
  97. package/dist/directive/close-loop-dispatcher.js +21 -259
  98. package/dist/directive/close-loop-dispatcher.js.map +1 -1
  99. package/dist/directive/directive-dispatch.d.ts +19 -0
  100. package/dist/directive/directive-dispatch.d.ts.map +1 -1
  101. package/dist/directive/directive-dispatch.js +18 -0
  102. package/dist/directive/directive-dispatch.js.map +1 -1
  103. package/dist/directive/directive-executor.d.ts +1 -3
  104. package/dist/directive/directive-executor.d.ts.map +1 -1
  105. package/dist/directive/directive-executor.js +23 -21
  106. package/dist/directive/directive-executor.js.map +1 -1
  107. package/dist/directive/phase-sync.d.ts +28 -15
  108. package/dist/directive/phase-sync.d.ts.map +1 -1
  109. package/dist/directive/phase-sync.js +28 -36
  110. package/dist/directive/phase-sync.js.map +1 -1
  111. package/dist/directive/resolver-dispatch.d.ts +19 -92
  112. package/dist/directive/resolver-dispatch.d.ts.map +1 -1
  113. package/dist/directive/resolver-dispatch.js +19 -65
  114. package/dist/directive/resolver-dispatch.js.map +1 -1
  115. package/dist/focus/focus-engine.d.ts.map +1 -1
  116. package/dist/focus/focus-engine.js +26 -0
  117. package/dist/focus/focus-engine.js.map +1 -1
  118. package/dist/focus/focus-executor.d.ts.map +1 -1
  119. package/dist/focus/focus-executor.js +290 -256
  120. package/dist/focus/focus-executor.js.map +1 -1
  121. package/dist/focus/focus-loop-registry.d.ts.map +1 -1
  122. package/dist/focus/focus-loop-registry.js +43 -1
  123. package/dist/focus/focus-loop-registry.js.map +1 -1
  124. package/dist/focus/focus-respawn-guard.d.ts.map +1 -1
  125. package/dist/focus/focus-respawn-guard.js +11 -2
  126. package/dist/focus/focus-respawn-guard.js.map +1 -1
  127. package/dist/focus/focus-team-state.d.ts +11 -0
  128. package/dist/focus/focus-team-state.d.ts.map +1 -1
  129. package/dist/focus/focus-team-state.js +17 -0
  130. package/dist/focus/focus-team-state.js.map +1 -1
  131. package/dist/focus/listener-auto-advance.d.ts +13 -1
  132. package/dist/focus/listener-auto-advance.d.ts.map +1 -1
  133. package/dist/focus/listener-auto-advance.js +112 -76
  134. package/dist/focus/listener-auto-advance.js.map +1 -1
  135. package/dist/focus/listener.d.ts.map +1 -1
  136. package/dist/focus/listener.js +141 -75
  137. package/dist/focus/listener.js.map +1 -1
  138. package/dist/focus/tick-deadline.d.ts +55 -0
  139. package/dist/focus/tick-deadline.d.ts.map +1 -0
  140. package/dist/focus/tick-deadline.js +91 -0
  141. package/dist/focus/tick-deadline.js.map +1 -0
  142. package/dist/focus-stage-lifecycle/index.d.ts +18 -25
  143. package/dist/focus-stage-lifecycle/index.d.ts.map +1 -1
  144. package/dist/focus-stage-lifecycle/index.js +26 -38
  145. package/dist/focus-stage-lifecycle/index.js.map +1 -1
  146. package/dist/focus-stage-lifecycle/wedge-cause-arbiter.d.ts +52 -0
  147. package/dist/focus-stage-lifecycle/wedge-cause-arbiter.d.ts.map +1 -0
  148. package/dist/focus-stage-lifecycle/wedge-cause-arbiter.js +94 -0
  149. package/dist/focus-stage-lifecycle/wedge-cause-arbiter.js.map +1 -0
  150. package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +18 -1
  151. package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
  152. package/dist/focus-stage-lifecycle/wedge-watchdog.js +57 -7
  153. package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
  154. package/dist/git/merge.d.ts.map +1 -1
  155. package/dist/git/merge.js +12 -3
  156. package/dist/git/merge.js.map +1 -1
  157. package/dist/guard/condition-evaluators.d.ts +9 -0
  158. package/dist/guard/condition-evaluators.d.ts.map +1 -1
  159. package/dist/guard/condition-evaluators.js +15 -0
  160. package/dist/guard/condition-evaluators.js.map +1 -1
  161. package/dist/guard/guard-evaluator.d.ts +17 -1
  162. package/dist/guard/guard-evaluator.d.ts.map +1 -1
  163. package/dist/guard/guard-evaluator.js +61 -2
  164. package/dist/guard/guard-evaluator.js.map +1 -1
  165. package/dist/guard/trigger-executor.d.ts +30 -18
  166. package/dist/guard/trigger-executor.d.ts.map +1 -1
  167. package/dist/guard/trigger-executor.js +55 -31
  168. package/dist/guard/trigger-executor.js.map +1 -1
  169. package/dist/prompt/team-prompt-base.d.ts +1 -1
  170. package/dist/prompt/team-prompt-base.d.ts.map +1 -1
  171. package/dist/prompt/team-prompt-base.js +1 -1
  172. package/dist/prompt/team-prompt-base.js.map +1 -1
  173. package/dist/prompt-sections/persona-sections.d.ts +0 -32
  174. package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
  175. package/dist/prompt-sections/persona-sections.js +19 -88
  176. package/dist/prompt-sections/persona-sections.js.map +1 -1
  177. package/dist/queries/deliveries.d.ts +33 -0
  178. package/dist/queries/deliveries.d.ts.map +1 -1
  179. package/dist/queries/deliveries.js +7 -0
  180. package/dist/queries/deliveries.js.map +1 -1
  181. package/dist/queries/focuses.d.ts +46 -0
  182. package/dist/queries/focuses.d.ts.map +1 -1
  183. package/dist/queries/focuses.js +60 -0
  184. package/dist/queries/focuses.js.map +1 -1
  185. package/dist/queries/guards.d.ts +10 -0
  186. package/dist/queries/guards.d.ts.map +1 -1
  187. package/dist/queries/guards.js +14 -1
  188. package/dist/queries/guards.js.map +1 -1
  189. package/dist/queries/issues.d.ts +65 -1
  190. package/dist/queries/issues.d.ts.map +1 -1
  191. package/dist/queries/issues.js +135 -2
  192. package/dist/queries/issues.js.map +1 -1
  193. package/dist/queries/schemas.d.ts +53 -0
  194. package/dist/queries/schemas.d.ts.map +1 -1
  195. package/dist/queries/schemas.js +38 -0
  196. package/dist/queries/schemas.js.map +1 -1
  197. package/dist/queries/verification.d.ts +5 -6
  198. package/dist/queries/verification.d.ts.map +1 -1
  199. package/dist/queries/verification.js +5 -6
  200. package/dist/queries/verification.js.map +1 -1
  201. package/dist/resolvers/loop-persona.d.ts +1 -11
  202. package/dist/resolvers/loop-persona.d.ts.map +1 -1
  203. package/dist/resolvers/loop-persona.js +2 -16
  204. package/dist/resolvers/loop-persona.js.map +1 -1
  205. package/dist/shell/heartbeat.d.ts +7 -0
  206. package/dist/shell/heartbeat.d.ts.map +1 -1
  207. package/dist/shell/heartbeat.js +1 -1
  208. package/dist/shell/heartbeat.js.map +1 -1
  209. package/dist/shell/unified-shell-provisioning.d.ts +40 -0
  210. package/dist/shell/unified-shell-provisioning.d.ts.map +1 -1
  211. package/dist/shell/unified-shell-provisioning.js +72 -0
  212. package/dist/shell/unified-shell-provisioning.js.map +1 -1
  213. package/dist/shell/unified-shell.d.ts.map +1 -1
  214. package/dist/shell/unified-shell.js +18 -1
  215. package/dist/shell/unified-shell.js.map +1 -1
  216. package/dist/spawn/helpers.d.ts.map +1 -1
  217. package/dist/spawn/helpers.js +6 -1
  218. package/dist/spawn/helpers.js.map +1 -1
  219. package/dist/spawn/process-spawn.d.ts.map +1 -1
  220. package/dist/spawn/process-spawn.js +7 -0
  221. package/dist/spawn/process-spawn.js.map +1 -1
  222. package/dist/spawn/respawn-cycle-escalation.d.ts +41 -0
  223. package/dist/spawn/respawn-cycle-escalation.d.ts.map +1 -0
  224. package/dist/spawn/respawn-cycle-escalation.js +83 -0
  225. package/dist/spawn/respawn-cycle-escalation.js.map +1 -0
  226. package/dist/spawn/spawn-cooldown.d.ts +119 -2
  227. package/dist/spawn/spawn-cooldown.d.ts.map +1 -1
  228. package/dist/spawn/spawn-cooldown.js +120 -10
  229. package/dist/spawn/spawn-cooldown.js.map +1 -1
  230. package/dist/spawn/spawn-decision.d.ts.map +1 -1
  231. package/dist/spawn/spawn-decision.js +33 -1
  232. package/dist/spawn/spawn-decision.js.map +1 -1
  233. package/dist/testing/fixtures/index.d.ts +64 -0
  234. package/dist/testing/fixtures/index.d.ts.map +1 -0
  235. package/dist/testing/fixtures/index.js +220 -0
  236. package/dist/testing/fixtures/index.js.map +1 -0
  237. package/dist/update/build-info.d.ts +1 -0
  238. package/dist/update/build-info.d.ts.map +1 -1
  239. package/dist/update/build-info.js +1 -1
  240. package/dist/update/build-info.js.map +1 -1
  241. package/dist/verify/stall-detector-config.d.ts +8 -0
  242. package/dist/verify/stall-detector-config.d.ts.map +1 -1
  243. package/dist/verify/stall-detector-config.js +40 -0
  244. package/dist/verify/stall-detector-config.js.map +1 -1
  245. package/dist/verify/stall-detectors.d.ts +57 -14
  246. package/dist/verify/stall-detectors.d.ts.map +1 -1
  247. package/dist/verify/stall-detectors.js +72 -55
  248. package/dist/verify/stall-detectors.js.map +1 -1
  249. package/dist/verify/verification-feedback.d.ts +3 -4
  250. package/dist/verify/verification-feedback.d.ts.map +1 -1
  251. package/dist/verify/verification-feedback.js +3 -12
  252. package/dist/verify/verification-feedback.js.map +1 -1
  253. package/dist/workflow/gate-failure-policy.d.ts +48 -0
  254. package/dist/workflow/gate-failure-policy.d.ts.map +1 -0
  255. package/dist/workflow/gate-failure-policy.js +57 -0
  256. package/dist/workflow/gate-failure-policy.js.map +1 -0
  257. package/dist/workflow/pipeline-config.d.ts +2 -2
  258. package/dist/workflow/pipeline-config.js +2 -2
  259. package/package.json +3 -3
  260. package/dist/directive/close-loop-stage.d.ts +0 -50
  261. package/dist/directive/close-loop-stage.d.ts.map +0 -1
  262. package/dist/directive/close-loop-stage.js +0 -210
  263. package/dist/directive/close-loop-stage.js.map +0 -1
  264. package/dist/focus-stage-lifecycle/review-convergence.d.ts +0 -133
  265. package/dist/focus-stage-lifecycle/review-convergence.d.ts.map +0 -1
  266. package/dist/focus-stage-lifecycle/review-convergence.js +0 -237
  267. package/dist/focus-stage-lifecycle/review-convergence.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-hold-surface.js","sourceRoot":"","sources":["../../src/delivery/external-hold-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;AAEtD,oFAAoF;AACpF,MAAM,CAAC,MAAM,uCAAuC,GAAG,oCAAoC,CAAC;AAE5F;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE7C,wCAAwC;AACxC,MAAM,UAAU,kCAAkC;IAChD,kBAAkB,CAAC,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qCAAqC,CACnD,UAAkB,EAClB,YAAoB,EACpB,kBAA2B,EAC3B,IAA+E;IAE/E,IAAI,kBAAkB,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,OAAO;QAC/C,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACnC,GAAG,CAAC,IAAI,CACN,6BAA6B,YAAY,MAAM,UAAU,kCAAkC;YAC3F,mBAAmB,IAAI,CAAC,UAAU,4DAA4D;YAC9F,4BAA4B,uCAAuC,GAAG,CACvE,CAAC;QACF,YAAY,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,YAAY,UAAU,EAAE;YAChC,IAAI,EAAE,uCAAuC;YAC7C,OAAO,EACL,aAAa,YAAY,0DAA0D;gBACnF,KAAK,IAAI,CAAC,SAAS,mBAAmB,IAAI,CAAC,UAAU,cAAc,IAAI,CAAC,UAAU,cAAc;gBAChG,iGAAiG;gBACjG,oFAAoF;SACvF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,iFAAiF;IACjF,gDAAgD;IAChD,IAAI,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,YAAY,CAAC,aAAa,CAAC,uCAAuC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
@@ -29,6 +29,18 @@
29
29
  * @module external-hold
30
30
  */
31
31
  import type { ExternalHoldState, updateDeliveryStatus } from '../queries/deliveries.js';
32
+ /**
33
+ * Pure decision: is this held, reference-less external hold now STALE (age-bounded)?
34
+ *
35
+ * True when the hold is reference-less -- its wait is UNREACHABLE (nothing the
36
+ * daemon can re-read will ever fire it: crossProductRequestWait over an empty
37
+ * reference set classifies as not-`canStillFire`) -- AND it has been declared
38
+ * longer ago than the bound. This is the live branch on the wait-reachability
39
+ * verdict (previously render-only): a reachable wait (a hold with a re-readable
40
+ * request reference) is NEVER stale-surfaced, because it self-clears when the
41
+ * request closes. Exported for direct unit testing (no clock, no daemon-core).
42
+ */
43
+ export declare function isReferenceLessHoldStale(hold: Pick<ExternalHoldState, 'declaredAt' | 'clearsWhenRequestsClosed'>, nowMs: number, boundMs?: number): boolean;
32
44
  /** The slice of deps this gate needs (structural, so no import cycle). */
33
45
  export interface ExternalHoldDeps {
34
46
  updateDeliveryStatus: typeof updateDeliveryStatus;
@@ -82,6 +94,23 @@ export type RequestStatusReader = (requestIds: string[]) => Promise<Array<{
82
94
  * from the reader propagates the same way.
83
95
  */
84
96
  export declare function makeRequestClosureEvaluator(readStatuses: RequestStatusReader): ExternalConditionEvaluator;
97
+ /**
98
+ * The production external-condition evaluator wired at every verify->done hold
99
+ * gate: re-read the cross-product requests a hold references via
100
+ * queries/requests.ts and clear only when all have reached closure.
101
+ *
102
+ * The request query is loaded with a DEFERRED dynamic `import()` rather than a
103
+ * static top-of-module import on purpose: queries/requests.js -> queries/shared.js
104
+ * pulls a bare `@telora/daemon-core` VALUE import that mis-resolves under the
105
+ * node:test module-mock loader, so a load-time static import would poison every
106
+ * mocked listener/review-exit test that transitively loads this module. The
107
+ * dynamic import resolves ONLY when a request-referenced hold is actually re-read
108
+ * (never in mocked tests that carry no such hold); behavior is identical in
109
+ * production. This is the single definition of that evaluator, shared by the
110
+ * discovery-only auto-advance path (listener-auto-advance) and the review-exit
111
+ * path (review-exit-phase) so the deferred-import boilerplate lives in one place.
112
+ */
113
+ export declare function makeDeferredRequestClosureEvaluator(productId: string): ExternalConditionEvaluator;
85
114
  /** The resolved external-hold state for one delivery. */
86
115
  export interface ExternalHold {
87
116
  /** True when an unmet external hold is present on the delivery. */
@@ -99,6 +128,15 @@ export interface ExternalHold {
99
128
  * not held, when cleared, or when the hold carries a reference.
100
129
  */
101
130
  referenceLess?: boolean;
131
+ /**
132
+ * True when the hold is reference-less AND has been held past the staleness
133
+ * age bound (isReferenceLessHoldStale): it can never self-clear and has now sat
134
+ * long enough to be SURFACED so a human re-declares it with a clearing reference
135
+ * or clears it. The caller emits the operator-visible signal (this module stays
136
+ * free of the @telora/daemon-core value import health surfacing needs). Absent/
137
+ * false when not held, reference-less but within the bound, or reference-bearing.
138
+ */
139
+ staleReferenceLess?: boolean;
102
140
  }
103
141
  /** Narrow a delivery's `gate_state` JSONB to its externalHold, if any. */
104
142
  export declare function readExternalHoldState(gateState: unknown): ExternalHoldState | null;
@@ -1 +1 @@
1
- {"version":3,"file":"external-hold.d.ts","sourceRoot":"","sources":["../../src/delivery/external-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAqB,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAwB3G,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;CACnD;AAED;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG,CACvC,IAAI,EAAE,iBAAiB,KACpB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,EAAE,0BAAwC,CAAC;AAElF;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,UAAU,EAAE,MAAM,EAAE,KACjB,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAErD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,mBAAmB,GAChC,0BAA0B,CAe5B;AAED,yDAAyD;AACzD,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,IAAI,EAAE,OAAO,CAAC;IACd,4DAA4D;IAC5D,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/B,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAmBlF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACzG,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,OAAO,EAClB,iBAAiB,EAAE,0BAA0B,EAC7C,KAAK,GAAE,MAAM,MAAuC,GACnD,OAAO,CAAC,YAAY,CAAC,CAoCvB;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAY/D"}
1
+ {"version":3,"file":"external-hold.d.ts","sourceRoot":"","sources":["../../src/delivery/external-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAqB,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAyC3G;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,0BAA0B,CAAC,EACxE,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAqC,GAC7C,OAAO,CAMT;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;CACnD;AAED;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG,CACvC,IAAI,EAAE,iBAAiB,KACpB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,EAAE,0BAAwC,CAAC;AAElF;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,UAAU,EAAE,MAAM,EAAE,KACjB,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAErD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,mBAAmB,GAChC,0BAA0B,CAe5B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mCAAmC,CAAC,SAAS,EAAE,MAAM,GAAG,0BAA0B,CAKjG;AAED,yDAAyD;AACzD,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,IAAI,EAAE,OAAO,CAAC;IACd,4DAA4D;IAC5D,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/B,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAmBlF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACzG,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,OAAO,EAClB,iBAAiB,EAAE,0BAA0B,EAC7C,KAAK,GAAE,MAAM,MAAuC,GACnD,OAAO,CAAC,YAAY,CAAC,CA2CvB;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAmB/D"}
@@ -29,6 +29,8 @@
29
29
  * @module external-hold
30
30
  */
31
31
  import { createLogger } from '../shell/log.js';
32
+ import { classifyWaitReachability, describeWaitReachability, crossProductRequestWait, canStillFire, } from './wait-reachability.js';
33
+ import { safetyGateFailsClosed } from '../workflow/gate-failure-policy.js';
32
34
  const log = createLogger({ module: 'external-hold' });
33
35
  // The `verify` status re-asserted by a gate_state write. Daemon-local literal
34
36
  // for the same reason as operator-hold.ts's VERIFY_STATUS: this module is
@@ -47,6 +49,35 @@ const VERIFY_STATUS = 'verify';
47
49
  // is non-terminal-for-the-source and 'declined' is a terminal exit that is NOT
48
50
  // closure -- neither clears the hold, only 'closed' does.
49
51
  const REQUEST_STATUS_CLOSED = 'closed';
52
+ /**
53
+ * How long a REFERENCE-LESS external hold may sit before it is surfaced as stale.
54
+ * A reference-less hold has nothing for the daemon to re-read, so it can NEVER
55
+ * self-clear; left silent it withholds the delivery from done -- and the focus
56
+ * from winding_down -- forever. After this age it is surfaced (age-bounded) so a
57
+ * human can re-declare it with a clearing reference or clear it. Daemon-local
58
+ * (this module avoids a bare @telora/daemon-core VALUE import; see VERIFY_STATUS).
59
+ */
60
+ const REFERENCE_LESS_HOLD_STALE_MS = 24 * 3_600_000;
61
+ /**
62
+ * Pure decision: is this held, reference-less external hold now STALE (age-bounded)?
63
+ *
64
+ * True when the hold is reference-less -- its wait is UNREACHABLE (nothing the
65
+ * daemon can re-read will ever fire it: crossProductRequestWait over an empty
66
+ * reference set classifies as not-`canStillFire`) -- AND it has been declared
67
+ * longer ago than the bound. This is the live branch on the wait-reachability
68
+ * verdict (previously render-only): a reachable wait (a hold with a re-readable
69
+ * request reference) is NEVER stale-surfaced, because it self-clears when the
70
+ * request closes. Exported for direct unit testing (no clock, no daemon-core).
71
+ */
72
+ export function isReferenceLessHoldStale(hold, nowMs, boundMs = REFERENCE_LESS_HOLD_STALE_MS) {
73
+ const wait = crossProductRequestWait(hold.clearsWhenRequestsClosed ?? []);
74
+ if (canStillFire(wait))
75
+ return false; // has a re-readable reference -> self-clears
76
+ const declaredMs = Date.parse(hold.declaredAt);
77
+ if (Number.isNaN(declaredMs))
78
+ return false;
79
+ return nowMs - declaredMs >= boundMs;
80
+ }
50
81
  /**
51
82
  * The default production evaluator: an irreducibly-external dependency does not
52
83
  * auto-clear from its free-text condition -- there is no generic probe for
@@ -93,6 +124,28 @@ export function makeRequestClosureEvaluator(readStatuses) {
93
124
  return true; // every referenced request closed -> dependency met
94
125
  };
95
126
  }
127
+ /**
128
+ * The production external-condition evaluator wired at every verify->done hold
129
+ * gate: re-read the cross-product requests a hold references via
130
+ * queries/requests.ts and clear only when all have reached closure.
131
+ *
132
+ * The request query is loaded with a DEFERRED dynamic `import()` rather than a
133
+ * static top-of-module import on purpose: queries/requests.js -> queries/shared.js
134
+ * pulls a bare `@telora/daemon-core` VALUE import that mis-resolves under the
135
+ * node:test module-mock loader, so a load-time static import would poison every
136
+ * mocked listener/review-exit test that transitively loads this module. The
137
+ * dynamic import resolves ONLY when a request-referenced hold is actually re-read
138
+ * (never in mocked tests that carry no such hold); behavior is identical in
139
+ * production. This is the single definition of that evaluator, shared by the
140
+ * discovery-only auto-advance path (listener-auto-advance) and the review-exit
141
+ * path (review-exit-phase) so the deferred-import boilerplate lives in one place.
142
+ */
143
+ export function makeDeferredRequestClosureEvaluator(productId) {
144
+ return makeRequestClosureEvaluator(async (ids) => {
145
+ const { listOutgoingRequestStatuses } = await import('../queries/requests.js');
146
+ return listOutgoingRequestStatuses(productId, ids);
147
+ });
148
+ }
96
149
  /** Narrow a delivery's `gate_state` JSONB to its externalHold, if any. */
97
150
  export function readExternalHoldState(gateState) {
98
151
  if (gateState === null || typeof gateState !== 'object')
@@ -181,14 +234,19 @@ export async function resolveExternalHold(deps, deliveryId, gateState, evaluateC
181
234
  // for the daemon to re-read, so it cannot self-clear -- surface it rather than
182
235
  // let it read as a normal, self-clearing hold.
183
236
  const referenceLess = !hold.clearsWhenRequestsClosed || hold.clearsWhenRequestsClosed.length === 0;
237
+ // Age-bound the reference-less hold (branches on the wait-reachability verdict,
238
+ // previously render-only): once it has sat past REFERENCE_LESS_HOLD_STALE_MS it
239
+ // is surfaced by the caller so it is never a silent permanent hold.
240
+ const staleReferenceLess = isReferenceLessHoldStale(hold, Date.parse(clock()));
184
241
  let conditionMet = false;
185
242
  try {
186
243
  conditionMet = await evaluateCondition(hold);
187
244
  }
188
245
  catch (err) {
189
- log.warn(`[external-hold] condition re-evaluation failed for delivery ${deliveryId} -- ` +
190
- `holding verify->done (fail-closed): ${err.message}`);
191
- return { held: true, hold, cleared: false, referenceLess };
246
+ // SAFETY GATE (the external-hold verify->done gate) -> FAIL CLOSED per the
247
+ // stated per-class policy: hold. A missed external hold lets an
248
+ // externally-blocked delivery reach done -- the failure this focus fights.
249
+ return safetyGateFailsClosed(`external-hold verify->done delivery ${deliveryId}`, err, { held: true, hold, cleared: false, referenceLess, staleReferenceLess });
192
250
  }
193
251
  if (conditionMet) {
194
252
  try {
@@ -203,7 +261,7 @@ export async function resolveExternalHold(deps, deliveryId, gateState, evaluateC
203
261
  }
204
262
  return { held: false, hold, cleared: true };
205
263
  }
206
- return { held: true, hold, cleared: false, referenceLess };
264
+ return { held: true, hold, cleared: false, referenceLess, staleReferenceLess };
207
265
  }
208
266
  /** Human-readable hold reason for an exit/advance log line. */
209
267
  export function describeExternalHold(hold) {
@@ -211,12 +269,17 @@ export function describeExternalHold(hold) {
211
269
  return 'external hold cleared (condition re-evaluated true)';
212
270
  if (hold.hold) {
213
271
  const base = `external hold: ${hold.hold.condition} (clears when: ${hold.hold.clearsWhen})`;
272
+ // An external dependency is a wait on ANOTHER ACTOR (a third party / peer
273
+ // product) -- carry the shared reachability marker so this hold is legible
274
+ // in the same vocabulary as every other wait, and distinguishable from a
275
+ // wait blocked on itself or on a recorded fact.
276
+ const marker = describeWaitReachability(classifyWaitReachability(crossProductRequestWait(hold.hold.clearsWhenRequestsClosed ?? [])));
214
277
  // Name the reference-less case so it is not mistaken for a self-clearing
215
278
  // hold: nothing references what would clear it, so the daemon cannot re-read
216
279
  // it to done -- it needs a reality change or a re-declaration with a reference.
217
280
  return hold.referenceLess
218
- ? `${base} [no machine-readable clearing reference -- will not self-clear]`
219
- : base;
281
+ ? `${base} [${marker}; no machine-readable clearing reference -- will not self-clear]`
282
+ : `${base} [${marker}]`;
220
283
  }
221
284
  return 'not held';
222
285
  }
@@ -1 +1 @@
1
- {"version":3,"file":"external-hold.js","sourceRoot":"","sources":["../../src/delivery/external-hold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"external-hold.js","sourceRoot":"","sources":["../../src/delivery/external-hold.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,7 @@
12
12
  *
13
13
  * Sibling of the shortfall hold (completion/review-exit-shortfall.ts) -- the same
14
14
  * shape: resolve the hold async, and gate the write DOWNSTREAM of the reconciler's
15
- * target decision (the reconciler models neither hold; feeding it one would emit
16
- * spurious [reconciler-divergence] logs). Two differences from the shortfall hold:
15
+ * target decision (the reconciler models neither hold). Two differences from the shortfall hold:
17
16
  * it is per-DELIVERY (escalations anchor to a delivery, not a focus), and its
18
17
  * failure direction is the inverse -- see resolveOperatorHold.
19
18
  *
@@ -1 +1 @@
1
- {"version":3,"file":"operator-hold.d.ts","sourceRoot":"","sources":["../../src/delivery/operator-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,+BAA+B,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAaxF,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,IAAI,EAAE,OAAO,CAAC;IACd,8EAA8E;IAC9E,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC1C,kFAAkF;IAClF,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B,EAAE,OAAO,+BAA+B,CAAC;IACxE,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;CACnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAWvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAO/D"}
1
+ {"version":3,"file":"operator-hold.d.ts","sourceRoot":"","sources":["../../src/delivery/operator-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,+BAA+B,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAaxF,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,IAAI,EAAE,OAAO,CAAC;IACd,8EAA8E;IAC9E,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC1C,kFAAkF;IAClF,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B,EAAE,OAAO,+BAA+B,CAAC;IACxE,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;CACnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAWvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAO/D"}
@@ -12,8 +12,7 @@
12
12
  *
13
13
  * Sibling of the shortfall hold (completion/review-exit-shortfall.ts) -- the same
14
14
  * shape: resolve the hold async, and gate the write DOWNSTREAM of the reconciler's
15
- * target decision (the reconciler models neither hold; feeding it one would emit
16
- * spurious [reconciler-divergence] logs). Two differences from the shortfall hold:
15
+ * target decision (the reconciler models neither hold). Two differences from the shortfall hold:
17
16
  * it is per-DELIVERY (escalations anchor to a delivery, not a focus), and its
18
17
  * failure direction is the inverse -- see resolveOperatorHold.
19
18
  *
@@ -1 +1 @@
1
- {"version":3,"file":"operator-hold.js","sourceRoot":"","sources":["../../src/delivery/operator-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;AAEtD,iFAAiF;AACjF,8EAA8E;AAC9E,8EAA8E;AAC9E,gFAAgF;AAChF,2EAA2E;AAC3E,uFAAuF;AACvF,MAAM,aAAa,GAAG,QAAQ,CAAC;AAkB/B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAsB,EACtB,UAAkB,EAClB,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,uEAAuE,UAAU,MAAM;YACvF,uCAAwC,GAAa,CAAC,OAAO,EAAE,CAChE,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAsB,EACtB,UAAkB,EAClB,IAAkB;IAElB,MAAM,SAAS,GAAsB;QACnC,uEAAuE;QACvE,0EAA0E;QAC1E,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,YAAY,EAAE,IAAI,CAAC,UAAU;YAC3B,CAAC,CAAC;gBACE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;gBAChC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc;gBAC9C,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;aACzC;YACH,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;KACtF,CAAC;IACF,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,oBAAoB,CAC7B,UAAU,EACV,aAAa,EACb,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,CACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,yEAAyE,UAAU,GAAG;YACtF,uDAAwD,GAAa,CAAC,OAAO,EAAE,CAChF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,oBAAoB,CAAC,IAAkB;IACrD,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,yCAAyC,CAAC;IACtE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,QAAQ,IAAI,CAAC,UAAU,CAAC,WAAW,eAAe,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE;YAC3E,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"operator-hold.js","sourceRoot":"","sources":["../../src/delivery/operator-hold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;AAEtD,iFAAiF;AACjF,8EAA8E;AAC9E,8EAA8E;AAC9E,gFAAgF;AAChF,2EAA2E;AAC3E,uFAAuF;AACvF,MAAM,aAAa,GAAG,QAAQ,CAAC;AAkB/B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAsB,EACtB,UAAkB,EAClB,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,uEAAuE,UAAU,MAAM;YACvF,uCAAwC,GAAa,CAAC,OAAO,EAAE,CAChE,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAsB,EACtB,UAAkB,EAClB,IAAkB;IAElB,MAAM,SAAS,GAAsB;QACnC,uEAAuE;QACvE,0EAA0E;QAC1E,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,YAAY,EAAE,IAAI,CAAC,UAAU;YAC3B,CAAC,CAAC;gBACE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;gBAChC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc;gBAC9C,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;aACzC;YACH,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;KACtF,CAAC;IACF,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,oBAAoB,CAC7B,UAAU,EACV,aAAa,EACb,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,CACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,yEAAyE,UAAU,GAAG;YACtF,uDAAwD,GAAa,CAAC,OAAO,EAAE,CAChF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,oBAAoB,CAAC,IAAkB;IACrD,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,yCAAyC,CAAC;IACtE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,QAAQ,IAAI,CAAC,UAAU,CAAC,WAAW,eAAe,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE;YAC3E,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Paused-delivery revival -- the daemon-traversable EXIT from `paused` (TEL-1:
3
+ * "Every path into `paused` has a daemon-traversable exit or a named human-act
4
+ * hold").
5
+ *
6
+ * A `paused` delivery is a guard BLOCK on a transition (coding->verify or
7
+ * verify->done), written with an open `transition_blocks` row carrying the
8
+ * blocked transition and its human decision_paths (retry / override). Before
9
+ * this consumer, that block row was written but "nothing read it back": a paused
10
+ * delivery was skipped by every actionable-status pass, never re-evaluated, and
11
+ * -- because paused BLOCKS lower-ranked deliveries -- it wedged the whole ranked
12
+ * queue until a human re-queued it. On an ARMED focus that human never comes
13
+ * (2026-07-28 ruling: an armed focus reaches its terminal without a human;
14
+ * decide-and-record, reversibility as tiebreaker).
15
+ *
16
+ * This module reads the block row back. Each sweep, for every paused delivery it
17
+ * re-evaluates the SAME blocked transition's guards and routes the fresh verdict
18
+ * through the single-writer reconciler (delivery-reconciler `paused` case):
19
+ * - guard CLEARED -> revive `paused` -> `queued` (the canonical revival edge);
20
+ * the normal walk re-drives and re-hits the gate. This is
21
+ * the daemon-traversable exit.
22
+ * - guard STILL blocks -> hold. The pause stays a NAMED human-act hold (its
23
+ * gate_state blocking conditions + the block's `override`
24
+ * decision path name the act only a human can perform), and
25
+ * the wedge watchdog surfaces it. The daemon never OVERRIDES
26
+ * an unclear gate -- that irreversible act is the human's.
27
+ *
28
+ * A paused delivery with NO open block row is NOT abandoned: the blocked FORWARD
29
+ * transition (coding->verify / verify->done) is recovered from the delivery's
30
+ * preserved source stage and re-evaluated the same way -- so a hard-guard pause
31
+ * that wrote no block_transition row still gets a daemon-traversable exit. Only a
32
+ * pause whose stage yields no recoverable forward transition (unknown/ambiguous)
33
+ * stays `no-block` for the watchdog.
34
+ *
35
+ * DI-first: `reconcilePausedDelivery` + `checkPausedDeliveriesForRevival` take a
36
+ * deps object so they unit-test with plain stubs (no `mock.module`, which would
37
+ * poison the daemon-core bare-import loader). `buildDefaultPausedRevivalDeps`
38
+ * wires the real query/guard functions for the listener.
39
+ */
40
+ /** The minimal paused-delivery shape this consumer reads. */
41
+ export interface PausedDeliveryInfo {
42
+ id: string;
43
+ name: string;
44
+ executionStatus: string | null;
45
+ /**
46
+ * The delivery's workflow stage id. A pause PRESERVES this at the SOURCE stage
47
+ * of the blocked advance (delivery-lifecycle sets deliveryStageId=currentStageId
48
+ * on a guard block), so it recovers the blocked FORWARD transition even when no
49
+ * transition_blocks row was written (a hard guard with no block_transition
50
+ * trigger). Absent => the derived-transition fallback is skipped.
51
+ */
52
+ currentWorkflowStageId?: string | null;
53
+ }
54
+ /** Per-delivery revival deps (the I/O seam). */
55
+ export interface PausedRevivalDeps {
56
+ /**
57
+ * The open (unresolved) transition block for a paused delivery, yielding the
58
+ * blocked transition id. null when the paused delivery has no block row
59
+ * (nothing to re-evaluate).
60
+ */
61
+ getActiveTransitionBlock(deliveryId: string): Promise<{
62
+ id: string;
63
+ transitionId: string;
64
+ } | null>;
65
+ /**
66
+ * Fallback transition recovery for a paused delivery with NO open block row:
67
+ * derive the blocked FORWARD transition (coding->verify / verify->done) from
68
+ * the delivery's preserved source stage. Returns the transition id, or null
69
+ * when the stage is unknown/ambiguous (then the delivery stays paused for the
70
+ * watchdog). Only consulted when getActiveTransitionBlock returns null.
71
+ */
72
+ resolveForwardTransitionId(deliveryId: string, currentStageId: string | null | undefined): Promise<string | null>;
73
+ /**
74
+ * Re-evaluate the blocked transition's guards. Returns whether they STILL
75
+ * block (true = still blocked, false = cleared). Pure measurement -- MUST NOT
76
+ * write the delivery's execution_status.
77
+ */
78
+ reEvaluateGuardBlocked(deliveryId: string, organizationId: string, transitionId: string): Promise<boolean>;
79
+ /** Resolve the workflow stage id for a status name on this delivery's effective workflow. */
80
+ resolveStageId(deliveryId: string, statusName: string): Promise<string | undefined>;
81
+ /**
82
+ * The single physical writer (queries/deliveries.updateDeliveryStatus). Param
83
+ * order mirrors the real writer: (id, status, stageId, gateState,
84
+ * completionArtifacts, transition). Revival passes null gateState +
85
+ * completionArtifacts (clearing the block's gate_state on the way out).
86
+ */
87
+ updateDeliveryStatus(deliveryId: string, status: string, stageId: string | null | undefined, gateState: unknown, completionArtifacts: unknown, transition: {
88
+ organizationId: string;
89
+ fromStatus: string;
90
+ }): Promise<void>;
91
+ /**
92
+ * Close out the transition block this revival acted on (stamps decided_at +
93
+ * decision_path, decided_by stays NULL). Called ONLY on a successful revival
94
+ * that read an open block row; a derived-forward revival (no block row) has
95
+ * nothing to close. Best-effort: a failure is logged, never blocks the
96
+ * already-decided revival.
97
+ */
98
+ resolveTransitionBlock(blockId: string, decisionPath: string): Promise<boolean>;
99
+ }
100
+ export type PausedRevivalOutcome = 'revived' | 'held' | 'no-block';
101
+ /**
102
+ * Re-evaluate one paused delivery's blocking guard and, if it has cleared,
103
+ * traverse it out of paused via the single-writer reconciler. Returns the
104
+ * outcome for sweep accounting. Never throws for an expected I/O failure -- a
105
+ * guard-reeval failure holds the delivery (safe: stays paused) rather than
106
+ * risking a wrong revival.
107
+ */
108
+ export declare function reconcilePausedDelivery(delivery: PausedDeliveryInfo, organizationId: string, deps: PausedRevivalDeps): Promise<PausedRevivalOutcome>;
109
+ /** Sweep deps: per-delivery deps plus the focus/delivery fetchers. */
110
+ export interface PausedRevivalSweepDeps extends PausedRevivalDeps {
111
+ getActiveFocuses(organizationId: string, productId: string): Promise<Array<{
112
+ focus_id: string;
113
+ }>>;
114
+ getFocusDeliveries(focusId: string): Promise<PausedDeliveryInfo[]>;
115
+ }
116
+ /**
117
+ * Sweep every active focus's paused deliveries and revive the ones whose
118
+ * blocking guard has cleared. Runs on TEAMLESS focuses too (a paused delivery
119
+ * wedges the queue so no team spawns) -- hence it iterates active focuses, not
120
+ * activeTeams. Best-effort per focus/delivery: one failure never aborts the
121
+ * sweep.
122
+ */
123
+ export declare function checkPausedDeliveriesForRevival(config: {
124
+ organizationId: string;
125
+ productId: string;
126
+ }, deps: PausedRevivalSweepDeps): Promise<{
127
+ revived: number;
128
+ held: number;
129
+ noBlock: number;
130
+ }>;
131
+ /**
132
+ * Wire the real query + guard functions into a sweep-deps object for the
133
+ * listener. Kept as thin adapters (not direct assignments) so the wide,
134
+ * strictly-typed writer/query signatures reduce to this consumer's narrow seam.
135
+ * `reEvaluateGuardBlocked` is PURE measurement: evaluateGuardsAtTransition
136
+ * fetches guards + builds context and returns a verdict; it does NOT write the
137
+ * delivery's execution_status (that stays the reconciler's job here).
138
+ */
139
+ export declare function buildDefaultPausedRevivalDeps(): PausedRevivalSweepDeps;
140
+ //# sourceMappingURL=paused-revival.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paused-revival.d.ts","sourceRoot":"","sources":["../../src/delivery/paused-revival.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAgBH,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAwBD,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACnG;;;;;;OAMG;IACH,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClH;;;;OAIG;IACH,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3G,6FAA6F;IAC7F,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpF;;;;;OAKG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,SAAS,EAAE,OAAO,EAClB,mBAAmB,EAAE,OAAO,EAC5B,UAAU,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;;;OAMG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjF;AAED,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnE;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,kBAAkB,EAC5B,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,oBAAoB,CAAC,CAwE/B;AAED,sEAAsE;AACtE,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAClG,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CACpE;AAED;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,MAAM,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACrD,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAwC7D;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,IAAI,sBAAsB,CA4CtE"}