@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,91 @@
1
+ /**
2
+ * Poll-tick deadline watchdog (TEL-3).
3
+ *
4
+ * The focus poll tick runs under daemon-core's safeInterval, which has NO
5
+ * deadline: it wraps the callback in try/catch and (with skipIfRunning) drops
6
+ * overlapping ticks, but a tick that stops making progress -- hung on a slow
7
+ * DB call, a wedged await -- simply never returns, silently. recordActivity()
8
+ * (the heartbeat) is emitted INSIDE the tick, so a stalled tick also stops the
9
+ * heartbeat: from outside the process a stalled daemon looks exactly like an
10
+ * idle one. Nothing surfaces the difference.
11
+ *
12
+ * This module arms a deadline timer around the tick body. If the body has not
13
+ * settled by `deadlineMs`, it emits a warning-level health event (code
14
+ * `poll.stalled`) naming the tick and its elapsed time -- the external signal
15
+ * that distinguishes stalled from idle. When the body finally settles, a paired
16
+ * recovery is surfaced (resolveByCode) and the elapsed overrun logged. The tick
17
+ * itself cannot be force-aborted in JS (there is no cooperative cancellation on
18
+ * an arbitrary await); safeInterval's skipIfRunning already prevents a pile-up
19
+ * of overlapping ticks while the hung one drains, so surfacing IS the
20
+ * reclamation the daemon can offer: the stall becomes observable and the next
21
+ * clean tick resumes once the hung body returns.
22
+ *
23
+ * The emit/log effects are injected (deps) and the stall decision is a pure
24
+ * function so the whole thing is unit-testable with no real timers.
25
+ */
26
+ import { healthEvents } from '@telora/daemon-core';
27
+ import { createLogger } from '../shell/log.js';
28
+ const log = createLogger({ module: 'tick-deadline' });
29
+ /** Default: a poll tick still running this long past its start is "stalled". */
30
+ export const DEFAULT_TICK_DEADLINE_MS = 90_000;
31
+ /**
32
+ * Pure stall decision: has a tick that started at `startMs` and is observed at
33
+ * `nowMs` exceeded `deadlineMs`? Extracted so the deadline arithmetic is tested
34
+ * without any timer. Returns the elapsed time so callers can log/emit it.
35
+ */
36
+ export function evaluateTickStall(startMs, nowMs, deadlineMs) {
37
+ const elapsedMs = nowMs - startMs;
38
+ return { stalled: elapsedMs >= deadlineMs, elapsedMs };
39
+ }
40
+ function defaultArm(fn, ms) {
41
+ const t = setTimeout(fn, ms);
42
+ // Never keep the process alive just for the watchdog.
43
+ t.unref?.();
44
+ return () => clearTimeout(t);
45
+ }
46
+ function defaultOnStall(label, deadlineMs) {
47
+ log.warn(`[${label}] Poll tick has not completed within ${deadlineMs}ms -- it is STALLED, ` +
48
+ 'not idle. The heartbeat is emitted inside the tick, so the daemon may look ' +
49
+ 'dead from outside; investigate the wedged await (slow DB call / blocked I/O).');
50
+ healthEvents.emit({
51
+ severity: 'warn',
52
+ source: `poll:${label}`,
53
+ code: 'poll.stalled',
54
+ message: `Poll tick '${label}' exceeded its ${deadlineMs}ms deadline and is still ` +
55
+ 'running. A stalled tick is distinct from an idle one: no work is advancing ' +
56
+ 'and the heartbeat has stopped for this cycle.',
57
+ });
58
+ }
59
+ function defaultOnRecover(label, elapsedMs) {
60
+ log.warn(`[${label}] Poll tick recovered after ${elapsedMs}ms (was flagged stalled).`);
61
+ healthEvents.resolveByCode('poll.stalled');
62
+ }
63
+ /**
64
+ * Run `body` under the deadline watchdog. Resolves/rejects exactly as `body`
65
+ * does; the watchdog only observes. If the body overruns `deadlineMs`, the
66
+ * stall is surfaced once; when it settles after a flagged stall, recovery is
67
+ * surfaced. The watchdog timer is always cleared in `finally`, so a fast tick
68
+ * emits nothing.
69
+ */
70
+ export async function runWithTickDeadline(label, deadlineMs, body, deps) {
71
+ const now = deps?.now ?? Date.now;
72
+ const arm = deps?.arm ?? defaultArm;
73
+ const onStall = deps?.onStall ?? defaultOnStall;
74
+ const onRecover = deps?.onRecover ?? defaultOnRecover;
75
+ const startMs = now();
76
+ let stalled = false;
77
+ const cancel = arm(() => {
78
+ stalled = true;
79
+ onStall(label, deadlineMs);
80
+ }, deadlineMs);
81
+ try {
82
+ await body();
83
+ }
84
+ finally {
85
+ cancel();
86
+ if (stalled) {
87
+ onRecover(label, now() - startMs);
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=tick-deadline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick-deadline.js","sourceRoot":"","sources":["../../src/focus/tick-deadline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;AAEtD,gFAAgF;AAChF,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,KAAa,EACb,UAAkB;IAElB,MAAM,SAAS,GAAG,KAAK,GAAG,OAAO,CAAC;IAClC,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC;AACzD,CAAC;AAaD,SAAS,UAAU,CAAC,EAAc,EAAE,EAAU;IAC5C,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7B,sDAAsD;IACrD,CAA4B,CAAC,KAAK,EAAE,EAAE,CAAC;IACxC,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,UAAkB;IACvD,GAAG,CAAC,IAAI,CACN,IAAI,KAAK,wCAAwC,UAAU,uBAAuB;QAChF,6EAA6E;QAC7E,+EAA+E,CAClF,CAAC;IACF,YAAY,CAAC,IAAI,CAAC;QAChB,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,QAAQ,KAAK,EAAE;QACvB,IAAI,EAAE,cAAc;QACpB,OAAO,EACL,cAAc,KAAK,kBAAkB,UAAU,2BAA2B;YAC1E,6EAA6E;YAC7E,+CAA+C;KAClD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,SAAiB;IACxD,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,+BAA+B,SAAS,2BAA2B,CAAC,CAAC;IACvF,YAAY,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAa,EACb,UAAkB,EAClB,IAAyB,EACzB,IAAuB;IAEvB,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,UAAU,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,cAAc,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,gBAAgB,CAAC;IAEtD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IACtB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE;QACtB,OAAO,GAAG,IAAI,CAAC;QACf,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC7B,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC;QACT,IAAI,OAAO,EAAE,CAAC;YACZ,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,36 +1,33 @@
1
1
  /**
2
2
  * Focus workflow lifecycle stage transitions (D2).
3
3
  *
4
- * The "Focus Workflow Lifecycle and Tree Closure" focus introduces a new
5
- * authoritative lifecycle on `product_focuses.stage`:
6
- *
7
- * planning -> queued -> in_progress -> verify -> review -> close_loop -> done
8
- *
9
- * The daemon advances `stage` along this axis based on deterministic checks:
10
- *
11
- * verify -> review unless pipeline_config.review.enabled is explicitly
12
- * false (default-on; Issue 4: auto-enter review on
13
- * verify-stage entry)
14
- *
15
- * review -> close_loop when there are no in-flight remediation deliveries
16
- * (Issue 2: state-based convergence) AND we have not
17
- * exceeded the N-iteration cap.
18
- *
19
- * review -> (escalate) when iteration count exceeds the cap
20
- * (Issue 3: review_nonconvergent escalation, focus
21
- * stays at review until a human intervenes).
4
+ * Historically the daemon advanced a `product_focuses.stage` column along
5
+ * `planning -> queued -> in_progress -> verify -> review -> close_loop -> done`.
6
+ * That machine-driven stage axis is being retired in favour of a single derived
7
+ * lifecycle (`deriveFocusPhase`): review ENTRY is owned by
8
+ * state-cascade.checkAutoReview (`review_requested_at`), and both the machine
9
+ * verify->review advance (TEL-6) and the review->close_loop advance (TEL-4) have
10
+ * been removed. Review completion is derived (`winding_down`), never a
11
+ * stage='close_loop' write; a non-convergent review is bounded by the
12
+ * review-cycle churn meter + review_window_stalled detector, not a permanent
13
+ * stage hold awaiting a human.
22
14
  *
23
15
  * This module owns the poll-loop dispatcher `runStageLifecycleTransitions` and
24
- * re-exports the decomposed transition logic, which lives in three cohesive
16
+ * re-exports the decomposed transition logic, which lives in two cohesive
25
17
  * submodules:
26
18
  *
27
- * - `focus-stage-lifecycle/review-convergence` -- the verify->review and
28
- * review->close_loop transitions plus their pure convergence helpers.
29
19
  * - `focus-stage-lifecycle/planning-release` -- the ratify-to-execute and
30
20
  * writable-focus planning->queued delivery releases.
31
21
  * - `focus-stage-lifecycle/wedge-watchdog` -- the planning-wedge watchdog +
32
22
  * zero-actionable log.
33
23
  *
24
+ * The former `review-convergence` submodule (the machine-driven
25
+ * verify->review and review->close_loop stage advances) was removed: review
26
+ * ENTRY is owned by state-cascade.checkAutoReview (review_requested_at), and
27
+ * review COMPLETION is derived (`winding_down`) rather than written as
28
+ * stage='close_loop'. A non-convergent review is bounded by the review-cycle
29
+ * churn meter + review_window_stalled detector, not a permanent stage hold.
30
+ *
34
31
  * It does not advance `current_workflow_stage_id` directly -- the existing
35
32
  * `syncFocusPhase` does that on the next poll, after the daemon's `stage` write
36
33
  * lands.
@@ -40,10 +37,8 @@
40
37
  import type { DaemonConfig, FocusDeliveryInfo } from '../types/index.js';
41
38
  import { getActiveFocuses as defaultGetActiveFocuses } from '../queries/deliveries.js';
42
39
  import { getFocusDeliveries as defaultGetFocusDeliveries } from '../queries/focuses.js';
43
- import { advanceVerifyToReviewIfEnabled, advanceReviewToCloseLoopIfConverged, type ReviewTransitionOutcome } from './review-convergence.js';
44
40
  import { releaseRatifiedReadOnlyFocus, releaseWritableFocusPlanningDeliveries } from './planning-release.js';
45
41
  import { evaluateFocusWedge, type WedgeOutcome } from './wedge-watchdog.js';
46
- export * from './review-convergence.js';
47
42
  export * from './planning-release.js';
48
43
  export * from './wedge-watchdog.js';
49
44
  /**
@@ -53,8 +48,6 @@ export * from './wedge-watchdog.js';
53
48
  export declare function runStageLifecycleTransitions(config: DaemonConfig, deps?: {
54
49
  getActiveFocuses: typeof defaultGetActiveFocuses;
55
50
  getFocusDeliveries: typeof defaultGetFocusDeliveries;
56
- advanceVerifyToReview: (focus: Parameters<typeof advanceVerifyToReviewIfEnabled>[0]) => Promise<boolean>;
57
- advanceReviewToCloseLoop: (focus: Parameters<typeof advanceReviewToCloseLoopIfConverged>[0]) => Promise<ReviewTransitionOutcome>;
58
51
  releaseRatifiedReadOnly: (focus: Parameters<typeof releaseRatifiedReadOnlyFocus>[0]) => Promise<number>;
59
52
  releaseWritablePlanning: (focus: Parameters<typeof releaseWritableFocusPlanningDeliveries>[0]) => Promise<number>;
60
53
  evaluateWedge: (focus: Parameters<typeof evaluateFocusWedge>[0]) => Promise<WedgeOutcome>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/focus-stage-lifecycle/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,kBAAkB,IAAI,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAExF,OAAO,EACL,8BAA8B,EAC9B,mCAAmC,EACnC,KAAK,uBAAuB,EAC7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,4BAA4B,EAC5B,sCAAsC,EACvC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAElB,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAQ7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AAIpC;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE;IACJ,gBAAgB,EAAE,OAAO,uBAAuB,CAAC;IACjD,kBAAkB,EAAE,OAAO,yBAAyB,CAAC;IACrD,qBAAqB,EAAE,CACrB,KAAK,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,CAAC,CAAC,CAAC,KACxD,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,wBAAwB,EAAE,CACxB,KAAK,EAAE,UAAU,CAAC,OAAO,mCAAmC,CAAC,CAAC,CAAC,CAAC,KAC7D,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACtC,uBAAuB,EAAE,CACvB,KAAK,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,KACtD,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,uBAAuB,EAAE,CACvB,KAAK,EAAE,UAAU,CAAC,OAAO,sCAAsC,CAAC,CAAC,CAAC,CAAC,KAChE,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,aAAa,EAAE,CACb,KAAK,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,KAC5C,OAAO,CAAC,YAAY,CAAC,CAAC;CAS5B,GACA,OAAO,CAAC,IAAI,CAAC,CA2Hf;AAGD,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/focus-stage-lifecycle/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,kBAAkB,IAAI,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EACL,4BAA4B,EAC5B,sCAAsC,EACvC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAElB,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAQ7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AAIpC;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE;IACJ,gBAAgB,EAAE,OAAO,uBAAuB,CAAC;IACjD,kBAAkB,EAAE,OAAO,yBAAyB,CAAC;IACrD,uBAAuB,EAAE,CACvB,KAAK,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,KACtD,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,uBAAuB,EAAE,CACvB,KAAK,EAAE,UAAU,CAAC,OAAO,sCAAsC,CAAC,CAAC,CAAC,CAAC,KAChE,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,aAAa,EAAE,CACb,KAAK,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,KAC5C,OAAO,CAAC,YAAY,CAAC,CAAC;CAO5B,GACA,OAAO,CAAC,IAAI,CAAC,CAuHf;AAGD,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
@@ -1,36 +1,33 @@
1
1
  /**
2
2
  * Focus workflow lifecycle stage transitions (D2).
3
3
  *
4
- * The "Focus Workflow Lifecycle and Tree Closure" focus introduces a new
5
- * authoritative lifecycle on `product_focuses.stage`:
6
- *
7
- * planning -> queued -> in_progress -> verify -> review -> close_loop -> done
8
- *
9
- * The daemon advances `stage` along this axis based on deterministic checks:
10
- *
11
- * verify -> review unless pipeline_config.review.enabled is explicitly
12
- * false (default-on; Issue 4: auto-enter review on
13
- * verify-stage entry)
14
- *
15
- * review -> close_loop when there are no in-flight remediation deliveries
16
- * (Issue 2: state-based convergence) AND we have not
17
- * exceeded the N-iteration cap.
18
- *
19
- * review -> (escalate) when iteration count exceeds the cap
20
- * (Issue 3: review_nonconvergent escalation, focus
21
- * stays at review until a human intervenes).
4
+ * Historically the daemon advanced a `product_focuses.stage` column along
5
+ * `planning -> queued -> in_progress -> verify -> review -> close_loop -> done`.
6
+ * That machine-driven stage axis is being retired in favour of a single derived
7
+ * lifecycle (`deriveFocusPhase`): review ENTRY is owned by
8
+ * state-cascade.checkAutoReview (`review_requested_at`), and both the machine
9
+ * verify->review advance (TEL-6) and the review->close_loop advance (TEL-4) have
10
+ * been removed. Review completion is derived (`winding_down`), never a
11
+ * stage='close_loop' write; a non-convergent review is bounded by the
12
+ * review-cycle churn meter + review_window_stalled detector, not a permanent
13
+ * stage hold awaiting a human.
22
14
  *
23
15
  * This module owns the poll-loop dispatcher `runStageLifecycleTransitions` and
24
- * re-exports the decomposed transition logic, which lives in three cohesive
16
+ * re-exports the decomposed transition logic, which lives in two cohesive
25
17
  * submodules:
26
18
  *
27
- * - `focus-stage-lifecycle/review-convergence` -- the verify->review and
28
- * review->close_loop transitions plus their pure convergence helpers.
29
19
  * - `focus-stage-lifecycle/planning-release` -- the ratify-to-execute and
30
20
  * writable-focus planning->queued delivery releases.
31
21
  * - `focus-stage-lifecycle/wedge-watchdog` -- the planning-wedge watchdog +
32
22
  * zero-actionable log.
33
23
  *
24
+ * The former `review-convergence` submodule (the machine-driven
25
+ * verify->review and review->close_loop stage advances) was removed: review
26
+ * ENTRY is owned by state-cascade.checkAutoReview (review_requested_at), and
27
+ * review COMPLETION is derived (`winding_down`) rather than written as
28
+ * stage='close_loop'. A non-convergent review is bounded by the review-cycle
29
+ * churn meter + review_window_stalled detector, not a permanent stage hold.
30
+ *
34
31
  * It does not advance `current_workflow_stage_id` directly -- the existing
35
32
  * `syncFocusPhase` does that on the next poll, after the daemon's `stage` write
36
33
  * lands.
@@ -40,15 +37,12 @@
40
37
  import { configForProduct } from '../shell/config.js';
41
38
  import { getActiveFocuses as defaultGetActiveFocuses } from '../queries/deliveries.js';
42
39
  import { getFocusDeliveries as defaultGetFocusDeliveries } from '../queries/focuses.js';
43
- import { FOCUS_STAGE } from '@telora/daemon-core';
44
- import { advanceVerifyToReviewIfEnabled, advanceReviewToCloseLoopIfConverged, } from './review-convergence.js';
45
40
  import { releaseRatifiedReadOnlyFocus, releaseWritableFocusPlanningDeliveries, } from './planning-release.js';
46
41
  import { evaluateFocusWedge, pruneWedgeWatchdogState, } from './wedge-watchdog.js';
47
42
  import { createLogger } from '../shell/log.js';
48
43
  const log = createLogger({ module: 'focus-stage-lifecycle' });
49
44
  // Re-export the decomposed surface so every importer + test keeps resolving
50
45
  // these names from './index.js' unchanged.
51
- export * from './review-convergence.js';
52
46
  export * from './planning-release.js';
53
47
  export * from './wedge-watchdog.js';
54
48
  // ── Poll-loop entry point ─────────────────────────────────────────
@@ -59,8 +53,6 @@ export * from './wedge-watchdog.js';
59
53
  export async function runStageLifecycleTransitions(config, deps = {
60
54
  getActiveFocuses: defaultGetActiveFocuses,
61
55
  getFocusDeliveries: defaultGetFocusDeliveries,
62
- advanceVerifyToReview: (f) => advanceVerifyToReviewIfEnabled(f),
63
- advanceReviewToCloseLoop: (f) => advanceReviewToCloseLoopIfConverged(f),
64
56
  releaseRatifiedReadOnly: (f) => releaseRatifiedReadOnlyFocus(f),
65
57
  releaseWritablePlanning: (f) => releaseWritableFocusPlanningDeliveries(f),
66
58
  evaluateWedge: (f) => evaluateFocusWedge(f),
@@ -158,18 +150,14 @@ export async function runStageLifecycleTransitions(config, deps = {
158
150
  log.warn(`[focus-stage-lifecycle] Wedge watchdog tick failed for ` +
159
151
  `"${focus.focus_name}": ${err.message}`);
160
152
  }
161
- try {
162
- if (baseArgs.stage === FOCUS_STAGE.VERIFY) {
163
- await deps.advanceVerifyToReview(baseArgs);
164
- }
165
- else if (baseArgs.stage === FOCUS_STAGE.REVIEW) {
166
- await deps.advanceReviewToCloseLoop(baseArgs);
167
- }
168
- }
169
- catch (err) {
170
- log.warn(`[focus-stage-lifecycle] Tick failed for "${focus.focus_name}": ` +
171
- `${err.message}`);
172
- }
153
+ // Review ENTRY is owned solely by state-cascade.checkAutoReview (which
154
+ // writes review_requested_at, the axis the derived 'reviewing' phase and
155
+ // the review team actually key on). The former verify->review auto-advance
156
+ // (advanceVerifyToReviewIfEnabled, TEL-6) and review->close_loop machine
157
+ // advance (advanceReviewToCloseLoopIfConverged, TEL-4) are both removed:
158
+ // review completion is derived (`winding_down`), never a stage='close_loop'
159
+ // write, and a non-convergent review is bounded by the review-cycle churn
160
+ // meter + review_window_stalled detector rather than a permanent hold.
173
161
  }
174
162
  }
175
163
  // Evict wedge watchdog state for focuses no longer active anywhere, so the
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/focus-stage-lifecycle/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/focus-stage-lifecycle/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The single wedge-cause ARBITER (TEL-3 of "One decision path, one wedge
3
+ * arbiter").
4
+ *
5
+ * A wedged focus can trip up to ~ten independent cap detectors, each of which
6
+ * files its own escalation kind (its "evidence"): team_failure, daemon_gate_stuck,
7
+ * wedged_focus, review_window_stalled, verify_gate_unclearable,
8
+ * respawn_cycle_exhausted, stuck_focus_branch, review_coverage_incomplete,
9
+ * review_cycle_cap_exceeded, review_handoff_exhausted. Before this, the cause a
10
+ * wedge REPORTED was whichever detector's bound crossed FIRST -- so the same
11
+ * underlying wedge got a different label depending on poll timing.
12
+ *
13
+ * This arbiter removes the timing dependence: given the SET of causes whose
14
+ * detectors have fired for a focus (their open escalations), it returns ONE
15
+ * authoritative cause by a STATED PRECEDENCE, independent of the order the bounds
16
+ * crossed. The precedence puts the ROOT blocker above the SYMPTOM: a specific
17
+ * blocker (an unclearable verify gate, a stuck branch, a review that cannot
18
+ * converge) outranks the generic "the team keeps failing" / "respawns halted"
19
+ * symptoms those blockers ultimately produce. So an operator (or a downstream
20
+ * reader) is pointed at the cause to fix, not the loudest or earliest alarm.
21
+ */
22
+ /**
23
+ * Wedge causes highest-precedence (ROOT) first. A cause earlier in this list
24
+ * outranks every cause after it when both are present. Every wedge/stall
25
+ * escalation kind the daemon files appears exactly once; a kind not listed here
26
+ * is not a wedge cause and is ignored by the arbiter.
27
+ */
28
+ export declare const WEDGE_CAUSE_PRECEDENCE: readonly string[];
29
+ /** True when `kind` is a wedge cause the arbiter ranks. */
30
+ export declare function isWedgeCause(kind: string): boolean;
31
+ /**
32
+ * Decide the ONE authoritative wedge cause from the set of causes whose
33
+ * detectors have fired. Deterministic and order-independent: the result depends
34
+ * only on WHICH causes are present, never on the order they were observed or
35
+ * passed in. Non-wedge kinds are ignored. Returns null when no wedge cause is
36
+ * present (an empty or all-non-wedge input).
37
+ */
38
+ export declare function arbitrateWedgeCause(crossedKinds: Iterable<string>): string | null;
39
+ /** IO seam for getFocusWedgeCause (default reaches the real query; tests stub it). */
40
+ export interface WedgeCauseReaderDeps {
41
+ listOpenFocusEscalationKinds: (focusId: string) => Promise<string[]>;
42
+ }
43
+ /**
44
+ * Report the ONE authoritative wedge cause for a focus, arbitrated from the
45
+ * evidence its detectors have filed (its open escalations). Deterministic: the
46
+ * result depends only on WHICH detectors have fired, never on the order they
47
+ * crossed. Returns null when the focus has no open wedge-cause escalation.
48
+ * Best-effort: on a read failure it returns null (the caller degrades to its own
49
+ * local cause) rather than throwing.
50
+ */
51
+ export declare function getFocusWedgeCause(focusId: string, deps: WedgeCauseReaderDeps): Promise<string | null>;
52
+ //# sourceMappingURL=wedge-cause-arbiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wedge-cause-arbiter.d.ts","sourceRoot":"","sources":["../../src/focus-stage-lifecycle/wedge-cause-arbiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAqBnD,CAAC;AAMF,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAYjF;AAED,sFAAsF;AACtF,MAAM,WAAW,oBAAoB;IACnC,4BAA4B,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtE;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * The single wedge-cause ARBITER (TEL-3 of "One decision path, one wedge
3
+ * arbiter").
4
+ *
5
+ * A wedged focus can trip up to ~ten independent cap detectors, each of which
6
+ * files its own escalation kind (its "evidence"): team_failure, daemon_gate_stuck,
7
+ * wedged_focus, review_window_stalled, verify_gate_unclearable,
8
+ * respawn_cycle_exhausted, stuck_focus_branch, review_coverage_incomplete,
9
+ * review_cycle_cap_exceeded, review_handoff_exhausted. Before this, the cause a
10
+ * wedge REPORTED was whichever detector's bound crossed FIRST -- so the same
11
+ * underlying wedge got a different label depending on poll timing.
12
+ *
13
+ * This arbiter removes the timing dependence: given the SET of causes whose
14
+ * detectors have fired for a focus (their open escalations), it returns ONE
15
+ * authoritative cause by a STATED PRECEDENCE, independent of the order the bounds
16
+ * crossed. The precedence puts the ROOT blocker above the SYMPTOM: a specific
17
+ * blocker (an unclearable verify gate, a stuck branch, a review that cannot
18
+ * converge) outranks the generic "the team keeps failing" / "respawns halted"
19
+ * symptoms those blockers ultimately produce. So an operator (or a downstream
20
+ * reader) is pointed at the cause to fix, not the loudest or earliest alarm.
21
+ */
22
+ /**
23
+ * Wedge causes highest-precedence (ROOT) first. A cause earlier in this list
24
+ * outranks every cause after it when both are present. Every wedge/stall
25
+ * escalation kind the daemon files appears exactly once; a kind not listed here
26
+ * is not a wedge cause and is ignored by the arbiter.
27
+ */
28
+ export const WEDGE_CAUSE_PRECEDENCE = [
29
+ // Infra / merge root: nothing in the focus can advance until the branch is
30
+ // un-stuck, so it outranks every downstream symptom.
31
+ 'stuck_focus_branch',
32
+ // Delivery-level root: the verify gate cannot be cleared by re-work.
33
+ 'verify_gate_unclearable',
34
+ // Review roots: the review itself cannot converge / cover / hand off.
35
+ 'review_coverage_incomplete',
36
+ 'review_cycle_cap_exceeded',
37
+ 'review_handoff_exhausted',
38
+ // Review timing: the review window went stale.
39
+ 'review_window_stalled',
40
+ // A generic guard is stuck (operator triages from gate_state).
41
+ 'daemon_gate_stuck',
42
+ // A planning-stage rank-0 block wedges the ready selector.
43
+ 'wedged_focus',
44
+ // Symptoms of a repeatedly-failing focus (lowest precedence): the machine
45
+ // halted respawns / the team keeps giving up. These are what the roots above
46
+ // ultimately CAUSE, so a root, when present, always wins over them.
47
+ 'respawn_cycle_exhausted',
48
+ 'team_failure',
49
+ ];
50
+ const PRECEDENCE_RANK = new Map(WEDGE_CAUSE_PRECEDENCE.map((kind, i) => [kind, i]));
51
+ /** True when `kind` is a wedge cause the arbiter ranks. */
52
+ export function isWedgeCause(kind) {
53
+ return PRECEDENCE_RANK.has(kind);
54
+ }
55
+ /**
56
+ * Decide the ONE authoritative wedge cause from the set of causes whose
57
+ * detectors have fired. Deterministic and order-independent: the result depends
58
+ * only on WHICH causes are present, never on the order they were observed or
59
+ * passed in. Non-wedge kinds are ignored. Returns null when no wedge cause is
60
+ * present (an empty or all-non-wedge input).
61
+ */
62
+ export function arbitrateWedgeCause(crossedKinds) {
63
+ let best = null;
64
+ let bestRank = Number.POSITIVE_INFINITY;
65
+ for (const kind of crossedKinds) {
66
+ const rank = PRECEDENCE_RANK.get(kind);
67
+ if (rank === undefined)
68
+ continue; // not a wedge cause
69
+ if (rank < bestRank) {
70
+ bestRank = rank;
71
+ best = kind;
72
+ }
73
+ }
74
+ return best;
75
+ }
76
+ /**
77
+ * Report the ONE authoritative wedge cause for a focus, arbitrated from the
78
+ * evidence its detectors have filed (its open escalations). Deterministic: the
79
+ * result depends only on WHICH detectors have fired, never on the order they
80
+ * crossed. Returns null when the focus has no open wedge-cause escalation.
81
+ * Best-effort: on a read failure it returns null (the caller degrades to its own
82
+ * local cause) rather than throwing.
83
+ */
84
+ export async function getFocusWedgeCause(focusId, deps) {
85
+ let kinds;
86
+ try {
87
+ kinds = await deps.listOpenFocusEscalationKinds(focusId);
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ return arbitrateWedgeCause(kinds);
93
+ }
94
+ //# sourceMappingURL=wedge-cause-arbiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wedge-cause-arbiter.js","sourceRoot":"","sources":["../../src/focus-stage-lifecycle/wedge-cause-arbiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,2EAA2E;IAC3E,qDAAqD;IACrD,oBAAoB;IACpB,qEAAqE;IACrE,yBAAyB;IACzB,sEAAsE;IACtE,4BAA4B;IAC5B,2BAA2B;IAC3B,0BAA0B;IAC1B,+CAA+C;IAC/C,uBAAuB;IACvB,+DAA+D;IAC/D,mBAAmB;IACnB,2DAA2D;IAC3D,cAAc;IACd,0EAA0E;IAC1E,6EAA6E;IAC7E,oEAAoE;IACpE,yBAAyB;IACzB,cAAc;CACf,CAAC;AAEF,MAAM,eAAe,GAAgC,IAAI,GAAG,CAC1D,sBAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CACnD,CAAC;AAEF,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAA8B;IAChE,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS,CAAC,oBAAoB;QACtD,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;YACpB,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAOD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAe,EACf,IAA0B;IAE1B,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC"}
@@ -10,7 +10,7 @@
10
10
  * @module focus-stage-lifecycle/wedge-watchdog
11
11
  */
12
12
  import { getFocusDeliveries as defaultGetFocusDeliveries } from '../queries/focuses.js';
13
- import { createEscalation as defaultCreateEscalation, hasOpenWedgedFocusEscalation as defaultHasOpenWedgedFocusEscalation } from '../queries/issues.js';
13
+ import { createEscalation as defaultCreateEscalation, hasOpenWedgedFocusEscalation as defaultHasOpenWedgedFocusEscalation, listOpenFocusEscalationKinds as defaultListOpenFocusEscalationKinds } from '../queries/issues.js';
14
14
  /** A delivery as seen by the actionability classifier (rank-ascending walk). */
15
15
  export interface WedgeBlockingDelivery {
16
16
  id: string;
@@ -23,6 +23,12 @@ export interface WedgeBlockingDelivery {
23
23
  * daemon restart cannot reset the wedge clock (review finding, delivery 66c7d4d8).
24
24
  */
25
25
  updatedAt: string | null;
26
+ /**
27
+ * True iff this held delivery carries a HUMAN/EXTERNAL provenance hold
28
+ * (gate_state.operatorHold / externalHold), which exempts it from the wedge
29
+ * escalation. A machine pause (guard block, no hold) is false -> a wedge.
30
+ */
31
+ humanHold: boolean;
26
32
  }
27
33
  /** Pure classification of a focus's deliveries against the ready-focus walk. */
28
34
  export interface FocusActionability {
@@ -54,6 +60,15 @@ export declare function classifyFocusActionability(deliveries: ReadonlyArray<{
54
60
  executionStatus: string | null;
55
61
  priorityRank: number;
56
62
  updatedAt?: string | null;
63
+ /**
64
+ * The delivery's gate_state. Its operatorHold / externalHold fields are the
65
+ * HUMAN/EXTERNAL provenance markers (an operator-blocked escalation, or an
66
+ * irreducibly-external dependency). A pause with neither is machine-produced
67
+ * (a guard block writes `blocking`, not a hold) -- and a machine pause that
68
+ * stays stuck IS a wedge, per TEL-2. Typed `unknown` (the query surfaces the
69
+ * gate_state JSONB untyped); narrowed in hasHumanProvenanceHold.
70
+ */
71
+ gateState?: unknown;
57
72
  }>): FocusActionability;
58
73
  /**
59
74
  * Evict watchdog state for any focus NOT in `liveFocusIds`. A focus that goes
@@ -73,6 +88,8 @@ export declare function __resetWedgeWatchdogState(): void;
73
88
  export interface WedgeWatchdogDeps {
74
89
  getFocusDeliveries: typeof defaultGetFocusDeliveries;
75
90
  hasOpenWedgedFocusEscalation: typeof defaultHasOpenWedgedFocusEscalation;
91
+ /** Evidence for the wedge-cause arbiter (TEL-3): every open escalation kind naming the focus. */
92
+ listOpenFocusEscalationKinds: typeof defaultListOpenFocusEscalationKinds;
76
93
  createEscalation: typeof defaultCreateEscalation;
77
94
  /** Kickoff-window discriminator: a running scoping team means "not a wedge". */
78
95
  hasActiveTeam: (focusId: string) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"wedge-watchdog.d.ts","sourceRoot":"","sources":["../../src/focus-stage-lifecycle/wedge-watchdog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,kBAAkB,IAAI,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EACL,gBAAgB,IAAI,uBAAuB,EAC3C,4BAA4B,IAAI,mCAAmC,EAEpE,MAAM,sBAAsB,CAAC;AA8D9B,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,iHAAiH;IACjH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sGAAsG;IACtG,gBAAgB,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC/C,yFAAyF;IACzF,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,aAAa,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC,GACD,kBAAkB,CAwBpB;AAsED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAE/E;AAED,yDAAyD;AACzD,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAeD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,OAAO,yBAAyB,CAAC;IACrD,4BAA4B,EAAE,OAAO,mCAAmC,CAAC;IACzE,gBAAgB,EAAE,OAAO,uBAAuB,CAAC;IACjD,gFAAgF;IAChF,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAaD,uEAAuE;AACvE,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE;IACL,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,EACD,IAAI,GAAE,iBAA8C,GACnD,OAAO,CAAC,YAAY,CAAC,CA+JvB"}
1
+ {"version":3,"file":"wedge-watchdog.d.ts","sourceRoot":"","sources":["../../src/focus-stage-lifecycle/wedge-watchdog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,kBAAkB,IAAI,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EACL,gBAAgB,IAAI,uBAAuB,EAC3C,4BAA4B,IAAI,mCAAmC,EACnE,4BAA4B,IAAI,mCAAmC,EAEpE,MAAM,sBAAsB,CAAC;AAkF9B,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,iHAAiH;IACjH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sGAAsG;IACtG,gBAAgB,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC/C,yFAAyF;IACzF,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,aAAa,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC,GACD,kBAAkB,CAyBpB;AAsED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAE/E;AAED,yDAAyD;AACzD,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAeD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,OAAO,yBAAyB,CAAC;IACrD,4BAA4B,EAAE,OAAO,mCAAmC,CAAC;IACzE,iGAAiG;IACjG,4BAA4B,EAAE,OAAO,mCAAmC,CAAC;IACzE,gBAAgB,EAAE,OAAO,uBAAuB,CAAC;IACjD,gFAAgF;IAChF,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAcD,uEAAuE;AACvE,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE;IACL,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,EACD,IAAI,GAAE,iBAA8C,GACnD,OAAO,CAAC,YAAY,CAAC,CA+LvB"}