@telora/daemon 0.18.33 → 0.18.37

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 (44) hide show
  1. package/build-info.json +5 -3
  2. package/dist/completion/event-escalations.d.ts.map +1 -1
  3. package/dist/completion/event-escalations.js +25 -17
  4. package/dist/completion/event-escalations.js.map +1 -1
  5. package/dist/completion/event.d.ts +3 -12
  6. package/dist/completion/event.d.ts.map +1 -1
  7. package/dist/completion/event.js +50 -31
  8. package/dist/completion/event.js.map +1 -1
  9. package/dist/completion/progress-snapshot.d.ts +35 -0
  10. package/dist/completion/progress-snapshot.d.ts.map +1 -0
  11. package/dist/completion/progress-snapshot.js +105 -0
  12. package/dist/completion/progress-snapshot.js.map +1 -0
  13. package/dist/listener.d.ts.map +1 -1
  14. package/dist/listener.js +4 -0
  15. package/dist/listener.js.map +1 -1
  16. package/dist/queries/focuses.d.ts.map +1 -1
  17. package/dist/queries/focuses.js +1 -0
  18. package/dist/queries/focuses.js.map +1 -1
  19. package/dist/queries/issues.d.ts +12 -0
  20. package/dist/queries/issues.d.ts.map +1 -1
  21. package/dist/queries/issues.js +27 -0
  22. package/dist/queries/issues.js.map +1 -1
  23. package/dist/queries/schemas.d.ts +2 -0
  24. package/dist/queries/schemas.d.ts.map +1 -1
  25. package/dist/queries/schemas.js +1 -0
  26. package/dist/queries/schemas.js.map +1 -1
  27. package/dist/spawn-sandbox.d.ts +12 -8
  28. package/dist/spawn-sandbox.d.ts.map +1 -1
  29. package/dist/spawn-sandbox.js +25 -17
  30. package/dist/spawn-sandbox.js.map +1 -1
  31. package/dist/stall-detector-config.d.ts +24 -0
  32. package/dist/stall-detector-config.d.ts.map +1 -0
  33. package/dist/stall-detector-config.js +44 -0
  34. package/dist/stall-detector-config.js.map +1 -0
  35. package/dist/stall-detectors.d.ts +108 -0
  36. package/dist/stall-detectors.d.ts.map +1 -0
  37. package/dist/stall-detectors.js +225 -0
  38. package/dist/stall-detectors.js.map +1 -0
  39. package/dist/state-cascade.d.ts.map +1 -1
  40. package/dist/state-cascade.js +21 -0
  41. package/dist/state-cascade.js.map +1 -1
  42. package/dist/types/focus.d.ts +21 -0
  43. package/dist/types/focus.d.ts.map +1 -1
  44. package/package.json +2 -2
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Targeted daemon-owned stall detectors.
3
+ *
4
+ * The lifecycle-aware no-progress predicate (completion/event.ts) makes the
5
+ * generic watchdog PATIENT: it no longer trips on healthy review/verify/requeue
6
+ * latency. That patience is only safe if the genuinely-wedged daemon-owned
7
+ * cases it would otherwise have (noisily) surfaced are caught by dedicated
8
+ * detectors with their own actionable reasons. This module is that safety
9
+ * backfill:
10
+ *
11
+ * 1. verify_failed cycle cap -- a delivery whose verify_failed re-code cycle
12
+ * count (iteration_count) exceeds TELORA_VERIFY_FAILED_ITERATION_CAP is
13
+ * stuck in an unbounded re-code loop the verify gate will never clear. File
14
+ * ONE verify_gate_unclearable escalation (needs_operator) carrying the
15
+ * gate_state / last failing condition -- not a generic no-progress ping.
16
+ *
17
+ * 2. review-window staleness -- a focus stuck in the `reviewing` phase whose
18
+ * review_requested_at has sat past TELORA_REVIEW_WINDOW_STALE_HOURS with no
19
+ * active review team (a completed review would have cleared
20
+ * review_requested_at) is wedged. File ONE review_window_stalled escalation
21
+ * (needs_operator).
22
+ *
23
+ * BOTH detectors are PER-FOCUS and operate on state the caller already has --
24
+ * they do NOT fan out their own getActiveFocuses / getFocusDeliveries pass.
25
+ * They are driven from state-cascade.ts's runCascadeChecks loop, which already
26
+ * iterates active focuses, fetches each focus's deliveries, and computes the
27
+ * review phase: the detectors RIDE that existing review-handling seam (so there
28
+ * is no redundant per-poll fan-out, and the review-window detector is wired into
29
+ * the same review handling that owns review_requested_at). Each files AT MOST
30
+ * ONE open escalation per entity (per delivery / per focus), mirroring the
31
+ * merge-back stuck_focus_branch idempotency: the dedup queries the DB so it
32
+ * survives a daemon restart. Pure over injected deps so the four cases
33
+ * (under-cap, over-cap, fresh window, stale window) unit-test without
34
+ * Supabase/MCP.
35
+ */
36
+ import type { FocusDeliveryInfo } from './types.js';
37
+ import { type CreateEscalationParams } from './queries/issues.js';
38
+ /**
39
+ * escalation_kind discriminators for the two stall detectors. Declared as
40
+ * daemon-local string constants (not imported from @telora/daemon-core's
41
+ * ESCALATION_KINDS) on purpose: the daemon consumes the registry-PUBLISHED
42
+ * daemon-core, so it cannot reference newly-added enum members until a build
43
+ * that depends on a daemon-core publish carrying them. They ARE now in
44
+ * daemon-core (ESCALATION_KINDS.VERIFY_GATE_UNCLEARABLE / .REVIEW_WINDOW_STALLED)
45
+ * for other consumers, but the daemon keeps the local strings so this code does
46
+ * not depend on publish ordering. The DB CHECK -- loosened by the
47
+ * agent_escalations_kind_stall_detectors migration -- is the real constraint.
48
+ */
49
+ export declare const VERIFY_GATE_UNCLEARABLE_KIND = "verify_gate_unclearable";
50
+ export declare const REVIEW_WINDOW_STALLED_KIND = "review_window_stalled";
51
+ /** The per-focus context both detectors need to anchor an escalation. */
52
+ export interface FocusStallContext {
53
+ organizationId: string;
54
+ focusId: string;
55
+ focusName: string;
56
+ }
57
+ export interface VerifyFailedCapDeps {
58
+ hasOpenEscalationForDelivery: (deliveryId: string, escalationKind: string) => Promise<boolean>;
59
+ createEscalation: (params: CreateEscalationParams) => Promise<{
60
+ escalationId: string | null;
61
+ } | void>;
62
+ /** Override the cap for tests; defaults to the resolved env-config value. */
63
+ cap?: number;
64
+ }
65
+ /**
66
+ * Pure decision: does this delivery exceed the verify_failed re-code cap?
67
+ * A terminal delivery (done/cancelled) is never escalated -- it has stopped
68
+ * cycling. Exported for direct unit testing.
69
+ */
70
+ export declare function exceedsVerifyFailedCap(delivery: Pick<FocusDeliveryInfo, 'executionStatus' | 'iterationCount'>, cap: number): boolean;
71
+ /**
72
+ * Check ONE focus's ALREADY-FETCHED deliveries for any whose iteration_count
73
+ * exceeds the verify_failed re-code cap, filing a verify_gate_unclearable
74
+ * escalation (needs_operator) for each -- at most one open per delivery.
75
+ * Operates on the deliveries the caller (runCascadeChecks) already loaded; it
76
+ * does NOT fetch.
77
+ */
78
+ export declare function checkVerifyFailedCapForFocus(ctx: FocusStallContext, deliveries: FocusDeliveryInfo[], deps?: VerifyFailedCapDeps): Promise<void>;
79
+ export interface ReviewWindowDeps {
80
+ hasOpenFocusEscalation: (focusId: string, escalationKind: string) => Promise<boolean>;
81
+ createEscalation: (params: CreateEscalationParams) => Promise<{
82
+ escalationId: string | null;
83
+ } | void>;
84
+ /** Focus IDs that currently have an active REVIEW team. Defaults to live teams. */
85
+ activeReviewFocusIds: () => Set<string>;
86
+ /** Current epoch ms; injectable for tests. Defaults to Date.now. */
87
+ now: () => number;
88
+ /** Override the staleness threshold (hours) for tests; defaults to env-config. */
89
+ thresholdHours?: number;
90
+ }
91
+ /** Focus IDs that currently have an active REVIEW team (live default). */
92
+ export declare function activeReviewFocusIds(): Set<string>;
93
+ /**
94
+ * Pure decision: is this focus's review window stale? True when a
95
+ * review_requested_at exists, is older than `thresholdMs`, and the focus has no
96
+ * active review team. A completed review clears review_requested_at, so a
97
+ * still-set timestamp older than the threshold with no active review team means
98
+ * the review never ran (or never finished). Exported for direct unit testing.
99
+ */
100
+ export declare function isReviewWindowStale(reviewRequestedAt: string | null, hasActiveReview: boolean, nowMs: number, thresholdMs: number): boolean;
101
+ /**
102
+ * Check ONE focus for a stale review window and file a review_window_stalled
103
+ * escalation (needs_operator) -- at most one open per focus. The caller
104
+ * (runCascadeChecks) passes the focus's review_requested_at, so this rides the
105
+ * existing review-handling seam rather than fanning out its own focus scan.
106
+ */
107
+ export declare function checkReviewWindowStaleForFocus(ctx: FocusStallContext, reviewRequestedAt: string | null, deps?: ReviewWindowDeps): Promise<void>;
108
+ //# sourceMappingURL=stall-detectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stall-detectors.d.ts","sourceRoot":"","sources":["../src/stall-detectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAK7B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,4BAA4B,CAAC;AACtE,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAElE,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,WAAW,mBAAmB;IAClC,4BAA4B,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/F,gBAAgB,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACtG,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAOD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,gBAAgB,CAAC,EACvE,GAAG,EAAE,MAAM,GACV,OAAO,CAGT;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,iBAAiB,EACtB,UAAU,EAAE,iBAAiB,EAAE,EAC/B,IAAI,GAAE,mBAAgD,GACrD,OAAO,CAAC,IAAI,CAAC,CA0Df;AAID,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,gBAAgB,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACtG,mFAAmF;IACnF,oBAAoB,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,oEAAoE;IACpE,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,IAAI,GAAG,CAAC,MAAM,CAAC,CAMlD;AASD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,eAAe,EAAE,OAAO,EACxB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAMT;AAED;;;;;GAKG;AACH,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,iBAAiB,EACtB,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,IAAI,GAAE,gBAA0C,GAC/C,OAAO,CAAC,IAAI,CAAC,CA8Df"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Targeted daemon-owned stall detectors.
3
+ *
4
+ * The lifecycle-aware no-progress predicate (completion/event.ts) makes the
5
+ * generic watchdog PATIENT: it no longer trips on healthy review/verify/requeue
6
+ * latency. That patience is only safe if the genuinely-wedged daemon-owned
7
+ * cases it would otherwise have (noisily) surfaced are caught by dedicated
8
+ * detectors with their own actionable reasons. This module is that safety
9
+ * backfill:
10
+ *
11
+ * 1. verify_failed cycle cap -- a delivery whose verify_failed re-code cycle
12
+ * count (iteration_count) exceeds TELORA_VERIFY_FAILED_ITERATION_CAP is
13
+ * stuck in an unbounded re-code loop the verify gate will never clear. File
14
+ * ONE verify_gate_unclearable escalation (needs_operator) carrying the
15
+ * gate_state / last failing condition -- not a generic no-progress ping.
16
+ *
17
+ * 2. review-window staleness -- a focus stuck in the `reviewing` phase whose
18
+ * review_requested_at has sat past TELORA_REVIEW_WINDOW_STALE_HOURS with no
19
+ * active review team (a completed review would have cleared
20
+ * review_requested_at) is wedged. File ONE review_window_stalled escalation
21
+ * (needs_operator).
22
+ *
23
+ * BOTH detectors are PER-FOCUS and operate on state the caller already has --
24
+ * they do NOT fan out their own getActiveFocuses / getFocusDeliveries pass.
25
+ * They are driven from state-cascade.ts's runCascadeChecks loop, which already
26
+ * iterates active focuses, fetches each focus's deliveries, and computes the
27
+ * review phase: the detectors RIDE that existing review-handling seam (so there
28
+ * is no redundant per-poll fan-out, and the review-window detector is wired into
29
+ * the same review handling that owns review_requested_at). Each files AT MOST
30
+ * ONE open escalation per entity (per delivery / per focus), mirroring the
31
+ * merge-back stuck_focus_branch idempotency: the dedup queries the DB so it
32
+ * survives a daemon restart. Pure over injected deps so the four cases
33
+ * (under-cap, over-cap, fresh window, stale window) unit-test without
34
+ * Supabase/MCP.
35
+ */
36
+ import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS, withRetry, } from '@telora/daemon-core';
37
+ import { createEscalation as defaultCreateEscalation, hasOpenEscalationForDelivery as defaultHasOpenEscalationForDelivery, hasOpenFocusEscalation as defaultHasOpenFocusEscalation, } from './queries/issues.js';
38
+ import { getActiveTeams } from './focus-executor.js';
39
+ import { isStatusTerminal } from './stage-classifier.js';
40
+ import { resolveVerifyFailedCap, resolveReviewWindowStaleHours } from './stall-detector-config.js';
41
+ /**
42
+ * escalation_kind discriminators for the two stall detectors. Declared as
43
+ * daemon-local string constants (not imported from @telora/daemon-core's
44
+ * ESCALATION_KINDS) on purpose: the daemon consumes the registry-PUBLISHED
45
+ * daemon-core, so it cannot reference newly-added enum members until a build
46
+ * that depends on a daemon-core publish carrying them. They ARE now in
47
+ * daemon-core (ESCALATION_KINDS.VERIFY_GATE_UNCLEARABLE / .REVIEW_WINDOW_STALLED)
48
+ * for other consumers, but the daemon keeps the local strings so this code does
49
+ * not depend on publish ordering. The DB CHECK -- loosened by the
50
+ * agent_escalations_kind_stall_detectors migration -- is the real constraint.
51
+ */
52
+ export const VERIFY_GATE_UNCLEARABLE_KIND = 'verify_gate_unclearable';
53
+ export const REVIEW_WINDOW_STALLED_KIND = 'review_window_stalled';
54
+ /** Render gate_state compactly for the escalation body. */
55
+ function formatGateState(gateState) {
56
+ if (gateState == null)
57
+ return '(none recorded)';
58
+ try {
59
+ return JSON.stringify(gateState);
60
+ }
61
+ catch {
62
+ return '(unserializable)';
63
+ }
64
+ }
65
+ const defaultVerifyFailedCapDeps = {
66
+ hasOpenEscalationForDelivery: defaultHasOpenEscalationForDelivery,
67
+ createEscalation: defaultCreateEscalation,
68
+ };
69
+ /**
70
+ * Pure decision: does this delivery exceed the verify_failed re-code cap?
71
+ * A terminal delivery (done/cancelled) is never escalated -- it has stopped
72
+ * cycling. Exported for direct unit testing.
73
+ */
74
+ export function exceedsVerifyFailedCap(delivery, cap) {
75
+ if (isStatusTerminal(delivery.executionStatus ?? ''))
76
+ return false;
77
+ return (delivery.iterationCount ?? 0) > cap;
78
+ }
79
+ /**
80
+ * Check ONE focus's ALREADY-FETCHED deliveries for any whose iteration_count
81
+ * exceeds the verify_failed re-code cap, filing a verify_gate_unclearable
82
+ * escalation (needs_operator) for each -- at most one open per delivery.
83
+ * Operates on the deliveries the caller (runCascadeChecks) already loaded; it
84
+ * does NOT fetch.
85
+ */
86
+ export async function checkVerifyFailedCapForFocus(ctx, deliveries, deps = defaultVerifyFailedCapDeps) {
87
+ const cap = deps.cap ?? resolveVerifyFailedCap();
88
+ for (const delivery of deliveries) {
89
+ if (!exceedsVerifyFailedCap(delivery, cap))
90
+ continue;
91
+ try {
92
+ if (await deps.hasOpenEscalationForDelivery(delivery.id, VERIFY_GATE_UNCLEARABLE_KIND)) {
93
+ continue;
94
+ }
95
+ await withRetry(() => deps.createEscalation({
96
+ organizationId: ctx.organizationId,
97
+ sessionId: '',
98
+ issueId: null,
99
+ reasonType: ESCALATION_REASONS.BLOCKED_BY_EXTERNAL,
100
+ // Operator triages the unclearable gate condition from gate_state.
101
+ disposition: ESCALATION_DISPOSITIONS.NEEDS_OPERATOR,
102
+ anchor: { deliveryId: delivery.id, focusId: ctx.focusId },
103
+ escalationKind: VERIFY_GATE_UNCLEARABLE_KIND,
104
+ description: `Delivery "${delivery.name}" has been through ${delivery.iterationCount ?? 0} ` +
105
+ `verify_failed re-code cycles (cap ${cap}) without clearing the verify gate. ` +
106
+ `The gate keeps rejecting the work -- the loop will not converge on its own.\n\n` +
107
+ `**Focus:** ${ctx.focusName}\n` +
108
+ `**Focus ID:** ${ctx.focusId}\n` +
109
+ `**Delivery:** "${delivery.name}" (${delivery.id})\n` +
110
+ `**Status:** ${delivery.executionStatus ?? 'unknown'}\n` +
111
+ `**iteration_count:** ${delivery.iterationCount ?? 0}\n` +
112
+ `**gate_state:** ${formatGateState(delivery.gateState)}\n\n` +
113
+ `Inspect the gate_state / last failing condition above. See docs/runbook-verify-gate.md.`,
114
+ whatWasTried: `The delivery re-entered verify_failed ${delivery.iterationCount ?? 0} times; ` +
115
+ `each verify pass was rejected by the gate and re-queued.`,
116
+ helpNeeded: `Resolve the blocking gate condition (relax the gate, fix the underlying defect ` +
117
+ `manually, or cancel the delivery if it cannot pass).`,
118
+ metadata: {
119
+ cause: VERIFY_GATE_UNCLEARABLE_KIND,
120
+ deliveryName: delivery.name,
121
+ executionStatus: delivery.executionStatus,
122
+ iterationCount: delivery.iterationCount ?? 0,
123
+ cap,
124
+ gateState: delivery.gateState ?? null,
125
+ },
126
+ }), { maxAttempts: 3, label: `escalation-verify-gate-unclearable-${delivery.id}` });
127
+ console.log(`[stall-detectors] Filed verify_gate_unclearable escalation for delivery "${delivery.name}" ` +
128
+ `(iteration_count ${delivery.iterationCount ?? 0} > cap ${cap})`);
129
+ }
130
+ catch (err) {
131
+ console.warn(`[stall-detectors] verify-failed-cap: failed to file escalation for delivery "${delivery.name}":`, err.message);
132
+ }
133
+ }
134
+ }
135
+ /** Focus IDs that currently have an active REVIEW team (live default). */
136
+ export function activeReviewFocusIds() {
137
+ const ids = new Set();
138
+ for (const [focusId, team] of getActiveTeams()) {
139
+ if (team.sessionType === 'review')
140
+ ids.add(focusId);
141
+ }
142
+ return ids;
143
+ }
144
+ const defaultReviewWindowDeps = {
145
+ hasOpenFocusEscalation: defaultHasOpenFocusEscalation,
146
+ createEscalation: defaultCreateEscalation,
147
+ activeReviewFocusIds,
148
+ now: () => Date.now(),
149
+ };
150
+ /**
151
+ * Pure decision: is this focus's review window stale? True when a
152
+ * review_requested_at exists, is older than `thresholdMs`, and the focus has no
153
+ * active review team. A completed review clears review_requested_at, so a
154
+ * still-set timestamp older than the threshold with no active review team means
155
+ * the review never ran (or never finished). Exported for direct unit testing.
156
+ */
157
+ export function isReviewWindowStale(reviewRequestedAt, hasActiveReview, nowMs, thresholdMs) {
158
+ if (!reviewRequestedAt)
159
+ return false;
160
+ if (hasActiveReview)
161
+ return false;
162
+ const requestedMs = Date.parse(reviewRequestedAt);
163
+ if (Number.isNaN(requestedMs))
164
+ return false;
165
+ return nowMs - requestedMs > thresholdMs;
166
+ }
167
+ /**
168
+ * Check ONE focus for a stale review window and file a review_window_stalled
169
+ * escalation (needs_operator) -- at most one open per focus. The caller
170
+ * (runCascadeChecks) passes the focus's review_requested_at, so this rides the
171
+ * existing review-handling seam rather than fanning out its own focus scan.
172
+ */
173
+ export async function checkReviewWindowStaleForFocus(ctx, reviewRequestedAt, deps = defaultReviewWindowDeps) {
174
+ const thresholdHours = deps.thresholdHours ?? resolveReviewWindowStaleHours();
175
+ const thresholdMs = thresholdHours * 3_600_000;
176
+ const nowMs = deps.now();
177
+ const hasActiveReview = deps.activeReviewFocusIds().has(ctx.focusId);
178
+ if (!isReviewWindowStale(reviewRequestedAt, hasActiveReview, nowMs, thresholdMs)) {
179
+ return;
180
+ }
181
+ try {
182
+ if (await deps.hasOpenFocusEscalation(ctx.focusId, REVIEW_WINDOW_STALLED_KIND)) {
183
+ return;
184
+ }
185
+ const ageHours = Math.floor((nowMs - Date.parse(reviewRequestedAt)) / 3_600_000);
186
+ await withRetry(() => deps.createEscalation({
187
+ organizationId: ctx.organizationId,
188
+ sessionId: '',
189
+ issueId: null,
190
+ reasonType: ESCALATION_REASONS.BLOCKED_BY_EXTERNAL,
191
+ // Operator triages a review that was requested but never ran/finished.
192
+ disposition: ESCALATION_DISPOSITIONS.NEEDS_OPERATOR,
193
+ anchor: { focusId: ctx.focusId },
194
+ escalationKind: REVIEW_WINDOW_STALLED_KIND,
195
+ description: `Focus "${ctx.focusName}" requested a review ~${ageHours}h ago ` +
196
+ `(threshold ${thresholdHours}h) but no review is running and none has completed ` +
197
+ `(a completed review clears review_requested_at). The focus is wedged in the ` +
198
+ `review window -- its verify deliveries will never route to done/verify_failed ` +
199
+ `on their own.\n\n` +
200
+ `**Focus:** ${ctx.focusName}\n` +
201
+ `**Focus ID:** ${ctx.focusId}\n` +
202
+ `**review_requested_at:** ${reviewRequestedAt}\n\n` +
203
+ `Either re-spawn the review (clear and re-request the review window) or clear the ` +
204
+ `stale request via telora_product_focus update clearReviewRequest=true.`,
205
+ whatWasTried: `The review window was opened (review_requested_at set ~${ageHours}h ago) but no ` +
206
+ `review team is active and review_requested_at was never cleared by a completion.`,
207
+ helpNeeded: `Re-trigger the review or clear the stale review_requested_at ` +
208
+ `(telora_product_focus update clearReviewRequest=true) so the verify deliveries ` +
209
+ `can route forward.`,
210
+ metadata: {
211
+ cause: REVIEW_WINDOW_STALLED_KIND,
212
+ focusName: ctx.focusName,
213
+ reviewRequestedAt,
214
+ ageHours,
215
+ thresholdHours,
216
+ },
217
+ }), { maxAttempts: 3, label: `escalation-review-window-stalled-${ctx.focusId}` });
218
+ console.log(`[stall-detectors] Filed review_window_stalled escalation for focus "${ctx.focusName}" ` +
219
+ `(review_requested_at ~${ageHours}h old > ${thresholdHours}h)`);
220
+ }
221
+ catch (err) {
222
+ console.warn(`[stall-detectors] review-window: failed to file escalation for focus "${ctx.focusName}":`, err.message);
223
+ }
224
+ }
225
+ //# sourceMappingURL=stall-detectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stall-detectors.js","sourceRoot":"","sources":["../src/stall-detectors.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"state-cascade.d.ts","sourceRoot":"","sources":["../src/state-cascade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASpD,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG9E,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtE,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAgCD;;;GAGG;AACH,wBAAgB,iCAAiC,IAAI,IAAI,CAExD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,mBAAmB,EAC1B,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA2Cf;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,mBAAmB,EAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC1E"}
1
+ {"version":3,"file":"state-cascade.d.ts","sourceRoot":"","sources":["../src/state-cascade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASpD,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI9E,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtE,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAgCD;;;GAGG;AACH,wBAAgB,iCAAiC,IAAI,IAAI,CAExD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,mBAAmB,EAC1B,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA2Cf;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,mBAAmB,EAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D1E"}
@@ -34,6 +34,7 @@ import { configForProduct } from './config.js';
34
34
  import { emitLoopTrigger } from './loop-event-bus.js';
35
35
  import { deriveFocusPhase } from './focus-phase.js';
36
36
  import { isReviewEnabled } from './pipeline-config.js';
37
+ import { checkVerifyFailedCapForFocus, checkReviewWindowStaleForFocus } from './stall-detectors.js';
37
38
  const defaultDeps = {
38
39
  getFocusDeliveries: _getFocusDeliveries,
39
40
  setReviewRequestedAt: _setReviewRequestedAt,
@@ -165,6 +166,26 @@ export async function runCascadeChecks(config) {
165
166
  });
166
167
  await checkAutoReview(focus.focus_id, phase, focus.pipeline_config, focus.review_requested_at, deliveries);
167
168
  await clearStaleReviewRequest(focus.focus_id, phase, focus.review_requested_at);
169
+ // Targeted daemon-owned stall detectors RIDE this same review-handling
170
+ // seam: they reuse the deliveries + review phase + review_requested_at
171
+ // already loaded above instead of fanning out a second per-poll
172
+ // getActiveFocuses/getFocusDeliveries pass.
173
+ const stallCtx = {
174
+ organizationId: pc.organizationId,
175
+ focusId: focus.focus_id,
176
+ focusName: focus.focus_name,
177
+ };
178
+ // (1) verify_failed re-code cap -> verify_gate_unclearable (per delivery).
179
+ await checkVerifyFailedCapForFocus(stallCtx, deliveries);
180
+ // (2) review-window staleness -> review_window_stalled (per focus).
181
+ // Gated on the cascade's own derived `reviewing` phase: a focus stuck
182
+ // in the review window is exactly phase === 'reviewing' with
183
+ // review_requested_at still set. (clearStaleReviewRequest above only
184
+ // clears on a coding/kickoff regression, so a still-'reviewing' phase
185
+ // means the request was not cleared this tick.)
186
+ if (phase === 'reviewing') {
187
+ await checkReviewWindowStaleForFocus(stallCtx, focus.review_requested_at);
188
+ }
168
189
  }
169
190
  catch (err) {
170
191
  console.warn(`[state-cascade] Cascade pass failed for focus ${focus.focus_id}:`, err.message);
@@ -1 +1 @@
1
- {"version":3,"file":"state-cascade.js","sourceRoot":"","sources":["../src/state-cascade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state-cascade.js","sourceRoot":"","sources":["../src/state-cascade.ts"],"names":[],"mappings":"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"}
@@ -197,6 +197,20 @@ export interface ProgressSnapshot {
197
197
  deliveryStatuses: Record<string, string>;
198
198
  /** Total number of issues across all deliveries. */
199
199
  totalIssueCount: number;
200
+ /**
201
+ * Map of delivery ID -> a stable fingerprint of its gate_state. Daemon-owned
202
+ * advancement: when the verify gate re-evaluates and the blocking conditions
203
+ * change, the fingerprint moves even though execution_status stays `verify`.
204
+ * Counting that as progress keeps the no-progress watchdog from climbing
205
+ * during healthy gate latency. Empty string when gate_state is null.
206
+ */
207
+ deliveryGateFingerprints: Record<string, string>;
208
+ /**
209
+ * Map of delivery ID -> iteration_count. Daemon-owned advancement: the count
210
+ * increments each time a delivery enters verify_failed (a re-code cycle), so
211
+ * a moving count is forward motion the daemon drove, not a team stall.
212
+ */
213
+ deliveryIterations: Record<string, number>;
200
214
  }
201
215
  /**
202
216
  * Summary info about a delivery within the focus.
@@ -222,6 +236,13 @@ export interface FocusDeliveryInfo {
222
236
  * the delivery is daemon-gate-stuck rather than team-stuck.
223
237
  */
224
238
  gateState?: unknown | null;
239
+ /**
240
+ * Number of verify_failed re-code cycles this delivery has been through.
241
+ * Incremented by the DB trigger each time the delivery enters verify_failed.
242
+ * Read by the lifecycle-aware no-progress snapshot (a moving count is
243
+ * daemon-owned progress) and the verify_failed iteration-cap detector.
244
+ */
245
+ iterationCount?: number;
225
246
  }
226
247
  /**
227
248
  * Cross-delivery CG dependency declaration from planning output.
@@ -1 +1 @@
1
- {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../src/types/focus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../src/types/focus.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telora/daemon",
3
- "version": "0.18.33",
3
+ "version": "0.18.37",
4
4
  "description": "Agent orchestration daemon for Telora - spawns and manages Claude Code instances",
5
5
  "type": "module",
6
6
  "bin": {
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "//testRunner": "Uses Node.js built-in test runner (node:test) via tsx for TypeScript support. The root package uses Vitest; this is a deliberate choice for the daemon package to avoid framework dependencies. See src/__tests__/ for test files.",
38
38
  "dependencies": {
39
- "@telora/daemon-core": "^0.2.48",
39
+ "@telora/daemon-core": "^0.2.49",
40
40
  "@telora/mcp-products": "^0.22.80",
41
41
  "commander": "^14.0.3",
42
42
  "yaml": "^2.4.0",