@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.
- package/build-info.json +10 -3
- package/dist/audit/audit-hooks.d.ts +106 -0
- package/dist/audit/audit-hooks.d.ts.map +1 -1
- package/dist/audit/audit-hooks.js +149 -17
- package/dist/audit/audit-hooks.js.map +1 -1
- package/dist/ci/ci-sensor-loop.d.ts +6 -0
- package/dist/ci/ci-sensor-loop.d.ts.map +1 -1
- package/dist/ci/ci-sensor-loop.js +50 -3
- package/dist/ci/ci-sensor-loop.js.map +1 -1
- package/dist/ci/ci-status.d.ts +63 -11
- package/dist/ci/ci-status.d.ts.map +1 -1
- package/dist/ci/ci-status.js +94 -27
- package/dist/ci/ci-status.js.map +1 -1
- package/dist/completion/coverage-drift-state.d.ts +29 -2
- package/dist/completion/coverage-drift-state.d.ts.map +1 -1
- package/dist/completion/coverage-drift-state.js +42 -2
- package/dist/completion/coverage-drift-state.js.map +1 -1
- package/dist/completion/coverage-stabilized.d.ts +58 -0
- package/dist/completion/coverage-stabilized.d.ts.map +1 -0
- package/dist/completion/coverage-stabilized.js +84 -0
- package/dist/completion/coverage-stabilized.js.map +1 -0
- package/dist/completion/delivery-advancement-guard.d.ts +21 -0
- package/dist/completion/delivery-advancement-guard.d.ts.map +1 -1
- package/dist/completion/delivery-advancement-guard.js +31 -3
- package/dist/completion/delivery-advancement-guard.js.map +1 -1
- package/dist/completion/event-escalations.d.ts +15 -0
- package/dist/completion/event-escalations.d.ts.map +1 -1
- package/dist/completion/event-escalations.js +42 -4
- package/dist/completion/event-escalations.js.map +1 -1
- package/dist/completion/event-phases.d.ts.map +1 -1
- package/dist/completion/event-phases.js +10 -5
- package/dist/completion/event-phases.js.map +1 -1
- package/dist/completion/machine-remediable-demotion.d.ts +74 -0
- package/dist/completion/machine-remediable-demotion.d.ts.map +1 -0
- package/dist/completion/machine-remediable-demotion.js +147 -0
- package/dist/completion/machine-remediable-demotion.js.map +1 -0
- package/dist/completion/review-exit-escalations.d.ts +36 -1
- package/dist/completion/review-exit-escalations.d.ts.map +1 -1
- package/dist/completion/review-exit-escalations.js +81 -0
- package/dist/completion/review-exit-escalations.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts +4 -2
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +49 -54
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/settle-injection-sweep.d.ts +55 -0
- package/dist/completion/settle-injection-sweep.d.ts.map +1 -0
- package/dist/completion/settle-injection-sweep.js +88 -0
- package/dist/completion/settle-injection-sweep.js.map +1 -0
- package/dist/completion/state-cascade.d.ts.map +1 -1
- package/dist/completion/state-cascade.js +41 -0
- package/dist/completion/state-cascade.js.map +1 -1
- package/dist/completion/status-advance-phase.d.ts.map +1 -1
- package/dist/completion/status-advance-phase.js +28 -30
- package/dist/completion/status-advance-phase.js.map +1 -1
- package/dist/completion/team-lifecycle.d.ts +42 -0
- package/dist/completion/team-lifecycle.d.ts.map +1 -1
- package/dist/completion/team-lifecycle.js +79 -2
- package/dist/completion/team-lifecycle.js.map +1 -1
- package/dist/delivery/delivery-lifecycle.d.ts +19 -33
- package/dist/delivery/delivery-lifecycle.d.ts.map +1 -1
- package/dist/delivery/delivery-lifecycle.js +26 -160
- package/dist/delivery/delivery-lifecycle.js.map +1 -1
- package/dist/delivery/delivery-merge-ops.d.ts +46 -0
- package/dist/delivery/delivery-merge-ops.d.ts.map +1 -0
- package/dist/delivery/delivery-merge-ops.js +154 -0
- package/dist/delivery/delivery-merge-ops.js.map +1 -0
- package/dist/delivery/delivery-reconciler-apply.d.ts +108 -66
- package/dist/delivery/delivery-reconciler-apply.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler-apply.js +87 -61
- package/dist/delivery/delivery-reconciler-apply.js.map +1 -1
- package/dist/delivery/delivery-reconciler.d.ts +7 -2
- package/dist/delivery/delivery-reconciler.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler.js +34 -5
- package/dist/delivery/delivery-reconciler.js.map +1 -1
- package/dist/delivery/external-hold-surface.d.ts +32 -0
- package/dist/delivery/external-hold-surface.d.ts.map +1 -0
- package/dist/delivery/external-hold-surface.js +67 -0
- package/dist/delivery/external-hold-surface.js.map +1 -0
- package/dist/delivery/external-hold.d.ts +38 -0
- package/dist/delivery/external-hold.d.ts.map +1 -1
- package/dist/delivery/external-hold.js +69 -6
- package/dist/delivery/external-hold.js.map +1 -1
- package/dist/delivery/operator-hold.d.ts +1 -2
- package/dist/delivery/operator-hold.d.ts.map +1 -1
- package/dist/delivery/operator-hold.js +1 -2
- package/dist/delivery/operator-hold.js.map +1 -1
- package/dist/delivery/paused-revival.d.ts +140 -0
- package/dist/delivery/paused-revival.d.ts.map +1 -0
- package/dist/delivery/paused-revival.js +229 -0
- package/dist/delivery/paused-revival.js.map +1 -0
- package/dist/delivery/wait-reachability.d.ts +149 -0
- package/dist/delivery/wait-reachability.d.ts.map +1 -0
- package/dist/delivery/wait-reachability.js +193 -0
- package/dist/delivery/wait-reachability.js.map +1 -0
- package/dist/directive/close-loop-dispatcher.d.ts +16 -263
- package/dist/directive/close-loop-dispatcher.d.ts.map +1 -1
- package/dist/directive/close-loop-dispatcher.js +21 -259
- package/dist/directive/close-loop-dispatcher.js.map +1 -1
- package/dist/directive/directive-dispatch.d.ts +19 -0
- package/dist/directive/directive-dispatch.d.ts.map +1 -1
- package/dist/directive/directive-dispatch.js +18 -0
- package/dist/directive/directive-dispatch.js.map +1 -1
- package/dist/directive/directive-executor.d.ts +1 -3
- package/dist/directive/directive-executor.d.ts.map +1 -1
- package/dist/directive/directive-executor.js +23 -21
- package/dist/directive/directive-executor.js.map +1 -1
- package/dist/directive/phase-sync.d.ts +28 -15
- package/dist/directive/phase-sync.d.ts.map +1 -1
- package/dist/directive/phase-sync.js +28 -36
- package/dist/directive/phase-sync.js.map +1 -1
- package/dist/directive/resolver-dispatch.d.ts +19 -92
- package/dist/directive/resolver-dispatch.d.ts.map +1 -1
- package/dist/directive/resolver-dispatch.js +19 -65
- package/dist/directive/resolver-dispatch.js.map +1 -1
- package/dist/focus/focus-engine.d.ts.map +1 -1
- package/dist/focus/focus-engine.js +26 -0
- package/dist/focus/focus-engine.js.map +1 -1
- package/dist/focus/focus-executor.d.ts.map +1 -1
- package/dist/focus/focus-executor.js +290 -256
- package/dist/focus/focus-executor.js.map +1 -1
- package/dist/focus/focus-loop-registry.d.ts.map +1 -1
- package/dist/focus/focus-loop-registry.js +43 -1
- package/dist/focus/focus-loop-registry.js.map +1 -1
- package/dist/focus/focus-respawn-guard.d.ts.map +1 -1
- package/dist/focus/focus-respawn-guard.js +11 -2
- package/dist/focus/focus-respawn-guard.js.map +1 -1
- package/dist/focus/focus-team-state.d.ts +11 -0
- package/dist/focus/focus-team-state.d.ts.map +1 -1
- package/dist/focus/focus-team-state.js +17 -0
- package/dist/focus/focus-team-state.js.map +1 -1
- package/dist/focus/listener-auto-advance.d.ts +13 -1
- package/dist/focus/listener-auto-advance.d.ts.map +1 -1
- package/dist/focus/listener-auto-advance.js +112 -76
- package/dist/focus/listener-auto-advance.js.map +1 -1
- package/dist/focus/listener.d.ts.map +1 -1
- package/dist/focus/listener.js +141 -75
- package/dist/focus/listener.js.map +1 -1
- package/dist/focus/tick-deadline.d.ts +55 -0
- package/dist/focus/tick-deadline.d.ts.map +1 -0
- package/dist/focus/tick-deadline.js +91 -0
- package/dist/focus/tick-deadline.js.map +1 -0
- package/dist/focus-stage-lifecycle/index.d.ts +18 -25
- package/dist/focus-stage-lifecycle/index.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/index.js +26 -38
- package/dist/focus-stage-lifecycle/index.js.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.d.ts +52 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.d.ts.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.js +94 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.js.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +18 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +57 -7
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/git/merge.d.ts.map +1 -1
- package/dist/git/merge.js +12 -3
- package/dist/git/merge.js.map +1 -1
- package/dist/guard/condition-evaluators.d.ts +9 -0
- package/dist/guard/condition-evaluators.d.ts.map +1 -1
- package/dist/guard/condition-evaluators.js +15 -0
- package/dist/guard/condition-evaluators.js.map +1 -1
- package/dist/guard/guard-evaluator.d.ts +17 -1
- package/dist/guard/guard-evaluator.d.ts.map +1 -1
- package/dist/guard/guard-evaluator.js +61 -2
- package/dist/guard/guard-evaluator.js.map +1 -1
- package/dist/guard/trigger-executor.d.ts +30 -18
- package/dist/guard/trigger-executor.d.ts.map +1 -1
- package/dist/guard/trigger-executor.js +55 -31
- package/dist/guard/trigger-executor.js.map +1 -1
- package/dist/prompt/team-prompt-base.d.ts +1 -1
- package/dist/prompt/team-prompt-base.d.ts.map +1 -1
- package/dist/prompt/team-prompt-base.js +1 -1
- package/dist/prompt/team-prompt-base.js.map +1 -1
- package/dist/prompt-sections/persona-sections.d.ts +0 -32
- package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
- package/dist/prompt-sections/persona-sections.js +19 -88
- package/dist/prompt-sections/persona-sections.js.map +1 -1
- package/dist/queries/deliveries.d.ts +33 -0
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +7 -0
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/focuses.d.ts +46 -0
- package/dist/queries/focuses.d.ts.map +1 -1
- package/dist/queries/focuses.js +60 -0
- package/dist/queries/focuses.js.map +1 -1
- package/dist/queries/guards.d.ts +10 -0
- package/dist/queries/guards.d.ts.map +1 -1
- package/dist/queries/guards.js +14 -1
- package/dist/queries/guards.js.map +1 -1
- package/dist/queries/issues.d.ts +65 -1
- package/dist/queries/issues.d.ts.map +1 -1
- package/dist/queries/issues.js +135 -2
- package/dist/queries/issues.js.map +1 -1
- package/dist/queries/schemas.d.ts +53 -0
- package/dist/queries/schemas.d.ts.map +1 -1
- package/dist/queries/schemas.js +38 -0
- package/dist/queries/schemas.js.map +1 -1
- package/dist/queries/verification.d.ts +5 -6
- package/dist/queries/verification.d.ts.map +1 -1
- package/dist/queries/verification.js +5 -6
- package/dist/queries/verification.js.map +1 -1
- package/dist/resolvers/loop-persona.d.ts +1 -11
- package/dist/resolvers/loop-persona.d.ts.map +1 -1
- package/dist/resolvers/loop-persona.js +2 -16
- package/dist/resolvers/loop-persona.js.map +1 -1
- package/dist/shell/heartbeat.d.ts +7 -0
- package/dist/shell/heartbeat.d.ts.map +1 -1
- package/dist/shell/heartbeat.js +1 -1
- package/dist/shell/heartbeat.js.map +1 -1
- package/dist/shell/unified-shell-provisioning.d.ts +40 -0
- package/dist/shell/unified-shell-provisioning.d.ts.map +1 -1
- package/dist/shell/unified-shell-provisioning.js +72 -0
- package/dist/shell/unified-shell-provisioning.js.map +1 -1
- package/dist/shell/unified-shell.d.ts.map +1 -1
- package/dist/shell/unified-shell.js +18 -1
- package/dist/shell/unified-shell.js.map +1 -1
- package/dist/spawn/helpers.d.ts.map +1 -1
- package/dist/spawn/helpers.js +6 -1
- package/dist/spawn/helpers.js.map +1 -1
- package/dist/spawn/process-spawn.d.ts.map +1 -1
- package/dist/spawn/process-spawn.js +7 -0
- package/dist/spawn/process-spawn.js.map +1 -1
- package/dist/spawn/respawn-cycle-escalation.d.ts +41 -0
- package/dist/spawn/respawn-cycle-escalation.d.ts.map +1 -0
- package/dist/spawn/respawn-cycle-escalation.js +83 -0
- package/dist/spawn/respawn-cycle-escalation.js.map +1 -0
- package/dist/spawn/spawn-cooldown.d.ts +119 -2
- package/dist/spawn/spawn-cooldown.d.ts.map +1 -1
- package/dist/spawn/spawn-cooldown.js +120 -10
- package/dist/spawn/spawn-cooldown.js.map +1 -1
- package/dist/spawn/spawn-decision.d.ts.map +1 -1
- package/dist/spawn/spawn-decision.js +33 -1
- package/dist/spawn/spawn-decision.js.map +1 -1
- package/dist/testing/fixtures/index.d.ts +64 -0
- package/dist/testing/fixtures/index.d.ts.map +1 -0
- package/dist/testing/fixtures/index.js +220 -0
- package/dist/testing/fixtures/index.js.map +1 -0
- package/dist/update/build-info.d.ts +1 -0
- package/dist/update/build-info.d.ts.map +1 -1
- package/dist/update/build-info.js +1 -1
- package/dist/update/build-info.js.map +1 -1
- package/dist/verify/stall-detector-config.d.ts +8 -0
- package/dist/verify/stall-detector-config.d.ts.map +1 -1
- package/dist/verify/stall-detector-config.js +40 -0
- package/dist/verify/stall-detector-config.js.map +1 -1
- package/dist/verify/stall-detectors.d.ts +57 -14
- package/dist/verify/stall-detectors.d.ts.map +1 -1
- package/dist/verify/stall-detectors.js +72 -55
- package/dist/verify/stall-detectors.js.map +1 -1
- package/dist/verify/verification-feedback.d.ts +3 -4
- package/dist/verify/verification-feedback.d.ts.map +1 -1
- package/dist/verify/verification-feedback.js +3 -12
- package/dist/verify/verification-feedback.js.map +1 -1
- package/dist/workflow/gate-failure-policy.d.ts +48 -0
- package/dist/workflow/gate-failure-policy.d.ts.map +1 -0
- package/dist/workflow/gate-failure-policy.js +57 -0
- package/dist/workflow/gate-failure-policy.js.map +1 -0
- package/dist/workflow/pipeline-config.d.ts +2 -2
- package/dist/workflow/pipeline-config.js +2 -2
- package/package.json +3 -3
- package/dist/directive/close-loop-stage.d.ts +0 -50
- package/dist/directive/close-loop-stage.d.ts.map +0 -1
- package/dist/directive/close-loop-stage.js +0 -210
- package/dist/directive/close-loop-stage.js.map +0 -1
- package/dist/focus-stage-lifecycle/review-convergence.d.ts +0 -133
- package/dist/focus-stage-lifecycle/review-convergence.d.ts.map +0 -1
- package/dist/focus-stage-lifecycle/review-convergence.js +0 -237
- 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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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":"AAAA
|
|
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;
|
|
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"}
|