@sensigo/realm 0.33.0 → 0.35.0

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 (49) hide show
  1. package/dist/engine/execution-loop.d.ts +22 -1
  2. package/dist/engine/execution-loop.d.ts.map +1 -1
  3. package/dist/engine/execution-loop.js +352 -6
  4. package/dist/engine/execution-loop.js.map +1 -1
  5. package/dist/engine/gate-timing.d.ts +17 -0
  6. package/dist/engine/gate-timing.d.ts.map +1 -0
  7. package/dist/engine/gate-timing.js +19 -0
  8. package/dist/engine/gate-timing.js.map +1 -0
  9. package/dist/engine/reclaim-step.d.ts +8 -0
  10. package/dist/engine/reclaim-step.d.ts.map +1 -1
  11. package/dist/engine/reclaim-step.js +48 -3
  12. package/dist/engine/reclaim-step.js.map +1 -1
  13. package/dist/engine/run-health.d.ts +1 -1
  14. package/dist/engine/run-health.d.ts.map +1 -1
  15. package/dist/engine/run-health.js +99 -2
  16. package/dist/engine/run-health.js.map +1 -1
  17. package/dist/engine/settlement.d.ts +52 -14
  18. package/dist/engine/settlement.d.ts.map +1 -1
  19. package/dist/engine/settlement.js +258 -16
  20. package/dist/engine/settlement.js.map +1 -1
  21. package/dist/index.d.ts +5 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +4 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/store/json-file-store.d.ts.map +1 -1
  26. package/dist/store/json-file-store.js +1 -2
  27. package/dist/store/json-file-store.js.map +1 -1
  28. package/dist/types/response-envelope.d.ts +16 -0
  29. package/dist/types/response-envelope.d.ts.map +1 -1
  30. package/dist/types/run-record.d.ts +108 -0
  31. package/dist/types/run-record.d.ts.map +1 -1
  32. package/dist/types/settlement.d.ts +31 -2
  33. package/dist/types/settlement.d.ts.map +1 -1
  34. package/dist/types/workflow-definition.d.ts +113 -32
  35. package/dist/types/workflow-definition.d.ts.map +1 -1
  36. package/dist/types/workflow-definition.js +20 -0
  37. package/dist/types/workflow-definition.js.map +1 -1
  38. package/dist/workflow/diagnostics.d.ts +1 -1
  39. package/dist/workflow/diagnostics.d.ts.map +1 -1
  40. package/dist/workflow/diagnostics.js +3 -0
  41. package/dist/workflow/diagnostics.js.map +1 -1
  42. package/dist/workflow/structured-output-eligibility.d.ts +81 -0
  43. package/dist/workflow/structured-output-eligibility.d.ts.map +1 -0
  44. package/dist/workflow/structured-output-eligibility.js +359 -0
  45. package/dist/workflow/structured-output-eligibility.js.map +1 -0
  46. package/dist/workflow/yaml-loader.d.ts.map +1 -1
  47. package/dist/workflow/yaml-loader.js +145 -2
  48. package/dist/workflow/yaml-loader.js.map +1 -1
  49. package/package.json +2 -4
@@ -0,0 +1,17 @@
1
+ import type { PendingGate } from '../types/run-record.js';
2
+ /**
3
+ * Read-time due/overdue state for a live gate. `overdue_ms` is present iff `expired`.
4
+ * `next_reminder_due_at` is present iff the gate carries a frozen `reminder_seconds` — the
5
+ * next-undelivered occurrence's scheduled instant (`opened_at + n·reminder_seconds`), computed
6
+ * PURELY from the schedule (no surface here has any record of which reminders were actually
7
+ * delivered — Slack posting is a side effect these read-only surfaces never observe — so this is
8
+ * honestly a SCHEDULE projection, not a delivery-confirmed fact; deliberately no "overdue"
9
+ * boolean on the reminder side for that reason — see the report's design-questions section).
10
+ */
11
+ export interface GateDueState {
12
+ expired: boolean;
13
+ overdue_ms?: number;
14
+ next_reminder_due_at?: string;
15
+ }
16
+ export declare function computeGateDueState(gate: PendingGate, now: Date): GateDueState;
17
+ //# sourceMappingURL=gate-timing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-timing.d.ts","sourceRoot":"","sources":["../../src/engine/gate-timing.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,GAAG,YAAY,CAoB9E"}
@@ -0,0 +1,19 @@
1
+ export function computeGateDueState(gate, now) {
2
+ const nowMs = now.getTime();
3
+ const expiresAtMs = gate.expires_at !== undefined ? new Date(gate.expires_at).getTime() : undefined;
4
+ const expired = expiresAtMs !== undefined && nowMs >= expiresAtMs;
5
+ let nextReminderDueAt;
6
+ if (gate.reminder_seconds !== undefined) {
7
+ const openedAtMs = new Date(gate.opened_at).getTime();
8
+ const reminderMs = gate.reminder_seconds * 1000;
9
+ const elapsedMs = Math.max(0, nowMs - openedAtMs);
10
+ const n = Math.floor(elapsedMs / reminderMs) + 1; // next-undelivered occurrence number
11
+ nextReminderDueAt = new Date(openedAtMs + n * reminderMs).toISOString();
12
+ }
13
+ return {
14
+ expired,
15
+ ...(expired ? { overdue_ms: nowMs - expiresAtMs } : {}),
16
+ ...(nextReminderDueAt !== undefined ? { next_reminder_due_at: nextReminderDueAt } : {}),
17
+ };
18
+ }
19
+ //# sourceMappingURL=gate-timing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-timing.js","sourceRoot":"","sources":["../../src/engine/gate-timing.ts"],"names":[],"mappings":"AAuBA,MAAM,UAAU,mBAAmB,CAAC,IAAiB,EAAE,GAAS;IAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5B,MAAM,WAAW,GACf,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,MAAM,OAAO,GAAG,WAAW,KAAK,SAAS,IAAI,KAAK,IAAI,WAAW,CAAC;IAElE,IAAI,iBAAqC,CAAC;IAC1C,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,qCAAqC;QACvF,iBAAiB,GAAG,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1E,CAAC;IAED,OAAO;QACL,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,GAAG,WAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxF,CAAC;AACJ,CAAC"}
@@ -33,6 +33,14 @@ export interface ReclaimResult {
33
33
  /** The claim state observed at the initial read (for the caller's warning/audit output). */
34
34
  priorState: ClaimState;
35
35
  priorDeadline: string | null;
36
+ /**
37
+ * Issue #291 ([F7]: "reclaim = defer-to-drain WITH advisory — no new plumbing"). Present only
38
+ * when this run ALSO carries an expired, enactable gate (on a DIFFERENT step — the gate's own
39
+ * step is refused above and never reaches here) at the time this result was produced.
40
+ * `reclaimStep` never enacts it itself (no settlement write added to this verb); the advisory
41
+ * points the operator at `realm run drain --expired`, the guaranteed-reachable enactment lever.
42
+ */
43
+ gateAdvisory?: string;
36
44
  }
37
45
  export interface ReclaimStepOptions {
38
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"reclaim-step.d.ts","sourceRoot":"","sources":["../../src/engine/reclaim-step.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAIvE,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEhF,MAAM,MAAM,cAAc;AACxB,6FAA6F;AAC3F,WAAW;AACb,4FAA4F;GAC1F,iBAAiB;AACnB,oGAAoG;GAClG,YAAY;AACd;;;;;;;GAOG;GACD,iBAAiB,CAAC;AAEtB,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,cAAc,CAAC;IACxB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,sBAAsB,GAAG,oBAAoB,CAAC;IACvD,4FAA4F;IAC5F,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAoCD,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,0EAA0E;IAC1E,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAsPD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAuKxB"}
1
+ {"version":3,"file":"reclaim-step.d.ts","sourceRoot":"","sources":["../../src/engine/reclaim-step.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAIvE,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEhF,MAAM,MAAM,cAAc;AACxB,6FAA6F;AAC3F,WAAW;AACb,4FAA4F;GAC1F,iBAAiB;AACnB,oGAAoG;GAClG,YAAY;AACd;;;;;;;GAOG;GACD,iBAAiB,CAAC;AAEtB,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,cAAc,CAAC;IACxB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,sBAAsB,GAAG,oBAAoB,CAAC;IACvD,4FAA4F;IAC5F,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA0DD,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,0EAA0E;IAC1E,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAsPD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAmMxB"}
@@ -2,6 +2,23 @@ import { storeDeclaresSeal } from '../store/trace-buffer-store.js';
2
2
  import { WorkflowError } from '../types/workflow-error.js';
3
3
  import { captureEvidence } from '../evidence/snapshot.js';
4
4
  import { classifyClaim, omitClaim } from './claim-liveness.js';
5
+ /**
6
+ * Issue #291 ([F7] reclaim advisory): builds the defer-to-drain advisory string when `record`
7
+ * carries an expired, enactable gate — undefined otherwise (a finding-only or non-expired gate,
8
+ * or no gate at all, produces no advisory). Pure, read-only; never used to decide reclaim's OWN
9
+ * outcome — purely informational.
10
+ */
11
+ function buildGateExpiryAdvisory(record, now) {
12
+ const gate = record.pending_gate;
13
+ if (gate === undefined ||
14
+ gate.expires_at === undefined ||
15
+ gate.on_expiry === undefined ||
16
+ now.getTime() < new Date(gate.expires_at).getTime()) {
17
+ return undefined;
18
+ }
19
+ return (`this run's gate '${gate.step_name}' has also expired (on_expiry: ${gate.on_expiry}) and is ` +
20
+ `awaiting enactment — 'realm run drain --expired' will enact it.`);
21
+ }
5
22
  /**
6
23
  * issue #221, B2-corrected discriminator: distinguishes a genuinely-settled step from a step with
7
24
  * no active claim that was never provably settled — reused at BOTH membership sites (the direct
@@ -265,6 +282,7 @@ export async function reclaimStep(store, runId, stepName, options) {
265
282
  // Guard — membership: not in_progress → discriminate settled vs no-active-claim (issue #221, B2).
266
283
  if (!run.in_progress_steps.includes(stepName)) {
267
284
  const { outcome, detail } = classifyNoActiveClaim(run, stepName);
285
+ const gateAdvisory = buildGateExpiryAdvisory(run, now);
268
286
  return {
269
287
  run,
270
288
  step: stepName,
@@ -272,6 +290,7 @@ export async function reclaimStep(store, runId, stepName, options) {
272
290
  ...(detail !== undefined ? { detail } : {}),
273
291
  priorState,
274
292
  priorDeadline,
293
+ ...(gateAdvisory !== undefined ? { gateAdvisory } : {}),
275
294
  };
276
295
  }
277
296
  // issue #207 PR-2: a declaring store's clear moves BEFORE the un-claiming update, version-fenced
@@ -300,7 +319,15 @@ export async function reclaimStep(store, runId, stepName, options) {
300
319
  if (!fenced) {
301
320
  await clearStaleWal(traceBufferStore, runId, stepName);
302
321
  }
303
- return { run: updated, step: stepName, outcome: 'reclaimed', priorState, priorDeadline };
322
+ const gateAdvisory = buildGateExpiryAdvisory(updated, now);
323
+ return {
324
+ run: updated,
325
+ step: stepName,
326
+ outcome: 'reclaimed',
327
+ priorState,
328
+ priorDeadline,
329
+ ...(gateAdvisory !== undefined ? { gateAdvisory } : {}),
330
+ };
304
331
  }
305
332
  catch (err) {
306
333
  if (!(err instanceof WorkflowError) || err.code !== 'STATE_SNAPSHOT_MISMATCH')
@@ -317,6 +344,7 @@ export async function reclaimStep(store, runId, stepName, options) {
317
344
  // NOW, after the concurrent write that caused this CAS mismatch, not at the stale decision
318
345
  // read).
319
346
  const { outcome, detail } = classifyNoActiveClaim(reloaded, stepName);
347
+ const gateAdvisory = buildGateExpiryAdvisory(reloaded, now);
320
348
  return {
321
349
  run: reloaded,
322
350
  step: stepName,
@@ -324,11 +352,20 @@ export async function reclaimStep(store, runId, stepName, options) {
324
352
  ...(detail !== undefined ? { detail } : {}),
325
353
  priorState,
326
354
  priorDeadline,
355
+ ...(gateAdvisory !== undefined ? { gateAdvisory } : {}),
327
356
  };
328
357
  }
329
358
  if (classifyClaim(reloaded.claims?.[stepName], now) === 'healthy') {
330
359
  // Re-claimed FRESH (a future deadline) → a live driver took over. Never stomp live work.
331
- return { run: reloaded, step: stepName, outcome: 'taken_over', priorState, priorDeadline };
360
+ const gateAdvisory = buildGateExpiryAdvisory(reloaded, now);
361
+ return {
362
+ run: reloaded,
363
+ step: stepName,
364
+ outcome: 'taken_over',
365
+ priorState,
366
+ priorDeadline,
367
+ ...(gateAdvisory !== undefined ? { gateAdvisory } : {}),
368
+ };
332
369
  }
333
370
  // Still a stale / unknown-age wedge after the concurrent write → re-apply ONCE on the fresh
334
371
  // record. A second mismatch propagates (reclaim loses, abandon-style — no retry loop).
@@ -347,7 +384,15 @@ export async function reclaimStep(store, runId, stepName, options) {
347
384
  if (!fenced) {
348
385
  await clearStaleWal(traceBufferStore, runId, stepName);
349
386
  }
350
- return { run: updated, step: stepName, outcome: 'reclaimed', priorState, priorDeadline };
387
+ const gateAdvisory = buildGateExpiryAdvisory(updated, now);
388
+ return {
389
+ run: updated,
390
+ step: stepName,
391
+ outcome: 'reclaimed',
392
+ priorState,
393
+ priorDeadline,
394
+ ...(gateAdvisory !== undefined ? { gateAdvisory } : {}),
395
+ };
351
396
  }
352
397
  }
353
398
  //# sourceMappingURL=reclaim-step.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reclaim-step.js","sourceRoot":"","sources":["../../src/engine/reclaim-step.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reclaim-step.js","sourceRoot":"","sources":["../../src/engine/reclaim-step.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,SAAS,EAAmB,MAAM,qBAAqB,CAAC;AA4ChF;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,MAAiB,EAAE,GAAS;IAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;IACjC,IACE,IAAI,KAAK,SAAS;QAClB,IAAI,CAAC,UAAU,KAAK,SAAS;QAC7B,IAAI,CAAC,SAAS,KAAK,SAAS;QAC5B,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EACnD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,CACL,oBAAoB,IAAI,CAAC,SAAS,kCAAkC,IAAI,CAAC,SAAS,WAAW;QAC7F,iEAAiE,CAClE,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,qBAAqB,CAC5B,MAAiB,EACjB,QAAgB;IAKhB,IACE,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACzC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACvC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;QACvD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,KAAK,IAAI,CAC1E,CAAC;IACF,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;AACxC,CAAC;AAcD;;kDAEkD;AAClD,SAAS,YAAY,CAAC,GAAc,EAAE,QAAgB,EAAE,GAAS;IAC/D,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,eAAe,CAAC;QACpC,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,GAAG;QAChB,KAAK,EAAE,EAAE;QACT,MAAM,EAAE;YACN,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,gBAAgB;YACxB,WAAW,EAAE,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC;YAC3C,cAAc,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI;YAC5C,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE;SAChC;KACF,CAAC,CAAC;IACH,OAAO;QACL,GAAG,GAAG;QACN,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC;QACtE,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;QACvC,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,KAAK,UAAU,aAAa,CAC1B,gBAA8C,EAC9C,KAAa,EACb,QAAgB;IAEhB,IAAI,gBAAgB,KAAK,SAAS;QAAE,OAAO;IAC3C,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,wDAAwD,KAAK,WAAW,QAAQ,WAAW;YACzF,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,yBAAyB;YACrF,kEAAkE,CACrE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;8FAK8F;AAC9F,MAAM,qBAAsB,SAAQ,KAAK;CAAG;AAW5C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,KAAK,UAAU,mBAAmB,CAChC,KAAe,EACf,gBAAkC,EAClC,KAAa,EACb,QAAgB,EAChB,eAAuB;IAEvB,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACtC,uFAAuF;QACvF,uDAAuD;QACvD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;YACtC,MAAM,IAAI,qBAAqB,CAC7B,yCAAyC,KAAK,uCAAuC;gBACnF,qBAAqB,eAAe,cAAc,KAAK,CAAC,OAAO,GAAG,CACrE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,YAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACrC,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;wEACwE;AACxE,SAAS,sBAAsB,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAyB;IACxF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CACV,uDAAuD,KAAK,WAAW,QAAQ,WAAW;YACxF,oFAAoF;YACpF,wBAAwB,CAC3B,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CACV,mBAAmB,MAAM,CAAC,KAAK,oCAAoC,KAAK,WAAW,QAAQ,IAAI,CAChG,CAAC;IACJ,CAAC;AACH,CAAC;AAcD;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,kBAAkB,CAC/B,KAAe,EACf,gBAAkC,EAClC,KAAa,EACb,QAAgB,EAChB,eAAuB;IAEvB,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;YACtC,MAAM,IAAI,qBAAqB,CAC7B,yCAAyC,KAAK,uCAAuC;gBACnF,qBAAqB,eAAe,cAAc,KAAK,CAAC,OAAO,GAAG,CACrE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,YAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC3E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;QACvE,CAAC;QACD,kDAAkD;QAClD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC1C,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;8EAI8E;AAC9E,SAAS,qBAAqB,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAwB;IACtF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CACV,sDAAsD,KAAK,WAAW,QAAQ,WAAW;YACvF,oFAAoF;YACpF,wBAAwB,CAC3B,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CACV,oFAAoF,KAAK,IAAI;YAC3F,SAAS,QAAQ,IAAI,CACxB,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,CAAC,mBAAmB,KAAK,SAAS,IAAI,MAAM,CAAC,mBAAmB,GAAG,CAAC,EAAE,CAAC;QACtF,OAAO,CAAC,IAAI,CACV,mBAAmB,MAAM,CAAC,mBAAmB,oCAAoC,KAAK,IAAI;YACxF,SAAS,QAAQ,+DAA+D,CACnF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAe,EACf,KAAa,EACb,QAAgB,EAChB,OAA4B;IAE5B,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEvC,0FAA0F;IAC1F,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,IAAI,aAAa,CACrB,gFAAgF,EAChF;YACE,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,OAAO;YACjB,WAAW,EAAE,gBAAgB;YAC7B,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;SAC7B,CACF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEnC,mGAAmG;IACnG,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,IAAI,aAAa,CACrB,QAAQ,KAAK,kBAAkB,GAAG,CAAC,SAAS,6CAA6C,EACzF;YACE,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,OAAO;YACjB,WAAW,EAAE,gBAAgB;YAC7B,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;SACvD,CACF,CAAC;IACJ,CAAC;IAED,kGAAkG;IAClG,mGAAmG;IACnG,6FAA6F;IAC7F,2DAA2D;IAC3D,IAAI,GAAG,CAAC,YAAY,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC7C,MAAM,IAAI,aAAa,CACrB,SAAS,QAAQ,8BAA8B,KAAK,oCAAoC;YACtF,iDAAiD,EACnD;YACE,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,OAAO;YACjB,WAAW,EAAE,gBAAgB;YAC7B,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;SAC7B,CACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,UAAU,EAAE,QAAQ,IAAI,IAAI,CAAC;IAEnD,kGAAkG;IAClG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvD,OAAO;YACL,GAAG;YACH,IAAI,EAAE,QAAQ;YACd,OAAO;YACP,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,UAAU;YACV,aAAa;YACb,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;IAED,iGAAiG;IACjG,8FAA8F;IAC9F,+FAA+F;IAC/F,gGAAgG;IAChG,sFAAsF;IACtF,EAAE;IACF,4FAA4F;IAC5F,gGAAgG;IAChG,wFAAwF;IACxF,uEAAuE;IACvE,MAAM,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,CAAC;IACnD,MAAM,MAAM,GACV,gBAAgB,KAAK,SAAS,IAAI,OAAO,gBAAgB,CAAC,YAAY,KAAK,UAAU,CAAC;IACxF,MAAM,WAAW,GAAG,MAAM,IAAI,iBAAiB,CAAC,gBAAiB,CAAC,CAAC;IAEnE,IAAI,CAAC;QACH,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,MAAM,kBAAkB,CACzC,KAAK,EACL,gBAAiB,EACjB,KAAK,EACL,QAAQ,EACR,GAAG,CAAC,OAAO,CACZ,CAAC;YACF,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAC3C,KAAK,EACL,gBAAiB,EACjB,KAAK,EACL,QAAQ,EACR,GAAG,CAAC,OAAO,CACZ,CAAC;YACF,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,aAAa,CAAC,gBAAgB,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3D,OAAO;YACL,GAAG,EAAE,OAAO;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,WAAW;YACpB,UAAU;YACV,aAAa;YACb,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,YAAY,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,yBAAyB;YAAE,MAAM,GAAG,CAAC;QAEzF,uFAAuF;QACvF,+FAA+F;QAC/F,uFAAuF;QACvF,gGAAgG;QAChG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAExC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,mFAAmF;YACnF,4FAA4F;YAC5F,4FAA4F;YAC5F,2FAA2F;YAC3F,SAAS;YACT,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACtE,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC5D,OAAO;gBACL,GAAG,EAAE,QAAQ;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO;gBACP,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,UAAU;gBACV,aAAa;gBACb,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD,CAAC;QACJ,CAAC;QACD,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAClE,yFAAyF;YACzF,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC5D,OAAO;gBACL,GAAG,EAAE,QAAQ;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,YAAY;gBACrB,UAAU;gBACV,aAAa;gBACb,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD,CAAC;QACJ,CAAC;QACD,4FAA4F;QAC5F,uFAAuF;QACvF,0FAA0F;QAC1F,yFAAyF;QACzF,iBAAiB;QACjB,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,MAAM,kBAAkB,CACzC,KAAK,EACL,gBAAiB,EACjB,KAAK,EACL,QAAQ,EACR,QAAQ,CAAC,OAAO,CACjB,CAAC;YACF,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAC3C,KAAK,EACL,gBAAiB,EACjB,KAAK,EACL,QAAQ,EACR,QAAQ,CAAC,OAAO,CACjB,CAAC;YACF,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,aAAa,CAAC,gBAAgB,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3D,OAAO;YACL,GAAG,EAAE,OAAO;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,WAAW;YACpB,UAAU;YACV,aAAa;YACb,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -13,7 +13,7 @@ export declare const DEFAULT_IDLE_THRESHOLD_MS: number;
13
13
  * renders from.
14
14
  */
15
15
  export interface RunHealthFinding {
16
- kind: 'never_claimed_idle' | 'stale_claim' | 'wedged_gate_sibling' | 'capability_block' | 'terminal_pending_finalizer' | 'terminal_with_stale_gate' | 'gate_corruption' | 'resolved_gate_with_eligible_guard';
16
+ kind: 'never_claimed_idle' | 'stale_claim' | 'wedged_gate_sibling' | 'capability_block' | 'terminal_pending_finalizer' | 'terminal_with_stale_gate' | 'gate_corruption' | 'resolved_gate_with_eligible_guard' | 'completed_with_failed_steps' | 'gate_expired_awaiting_drive' | 'structured_output_downgraded';
17
17
  /** The affected step, when the finding is step-scoped. Absent for `never_claimed_idle` — a
18
18
  * run-level observation (no step is claimed at all). */
19
19
  step?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"run-health.d.ts","sourceRoot":"","sources":["../../src/engine/run-health.ts"],"names":[],"mappings":"AAyEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAK1E;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,QAAsB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EACA,oBAAoB,GACpB,aAAa,GACb,qBAAqB,GACrB,kBAAkB,GAClB,4BAA4B,GAE5B,0BAA0B,GAC1B,iBAAiB,GACjB,mCAAmC,CAAC;IACxC;6DACyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;yCAEqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf;;;;4DAIwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;kDAC8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;mEAG+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AA+BD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,SAAS,EACd,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAC/E,gBAAgB,EAAE,CA+GpB"}
1
+ {"version":3,"file":"run-health.d.ts","sourceRoot":"","sources":["../../src/engine/run-health.ts"],"names":[],"mappings":"AAuFA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAK1E;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,QAAsB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EACA,oBAAoB,GACpB,aAAa,GACb,qBAAqB,GACrB,kBAAkB,GAClB,4BAA4B,GAE5B,0BAA0B,GAC1B,iBAAiB,GACjB,mCAAmC,GAGnC,6BAA6B,GAM7B,6BAA6B,GAK7B,8BAA8B,CAAC;IACnC;6DACyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;yCAEqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf;;;;4DAIwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;kDAC8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;mEAG+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AA2ED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,SAAS,EACd,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAC/E,gBAAgB,EAAE,CAwKpB"}
@@ -1,6 +1,6 @@
1
1
  import { classifyInProgressClaims } from './claim-liveness.js';
2
2
  import { findCapabilityBlockedSteps } from './capability.js';
3
- import { findEligibleSteps, findEligibleGuardSteps } from './eligibility.js';
3
+ import { findEligibleSteps, findEligibleGuardSteps, deriveRunPhase } from './eligibility.js';
4
4
  /**
5
5
  * Default age threshold for the `never_claimed_idle` finding (issue #221) — 24 hours. Engine-
6
6
  * minted so detection never REQUIRES an operator-supplied threshold; callers (surfaces) may
@@ -37,6 +37,50 @@ function findGateCorruption(run) {
37
37
  }
38
38
  return undefined;
39
39
  }
40
+ /**
41
+ * issue #316: `structured_output_downgraded` — ONE aggregated finding per run (the #304 shape:
42
+ * one finding carrying the list, never one per step), covering every `EvidenceSnapshot` in
43
+ * `run.evidence` whose `diagnostics.structured_output.downgrade_reason` is present and is NOT
44
+ * `'external_agent'`. That exclusion is LOAD-BEARING, not belt-and-braces: the three synthesized
45
+ * stamps execution-loop.ts mints when a declared step arrives with no `stepMeta.structuredOutput`
46
+ * at all (an external agent driving `execute_step` over MCP directly) all set
47
+ * `sent: false, downgrade_reason: 'external_agent'` — without this exclusion, EVERY MCP-driven
48
+ * declared run would fire this finding regardless of whether strict was ever actually attempted.
49
+ *
50
+ * Dedup'd per step: a step retried N times with the SAME reason across attempts contributes that
51
+ * reason once; a step that saw DIFFERENT reasons across distinct attempts (e.g. `api_rejected_schema`
52
+ * on attempt 1, `service_unavailable` on a retry) lists every distinct reason it saw, in
53
+ * first-seen order — never conflated into one bucket, never silently dropped to "the last one".
54
+ * Checked from BOTH branches of {@link classifyRunHealth}, mirroring {@link findGateCorruption}'s
55
+ * own dual-branch pattern — a live run's evidence and a terminal run's evidence are read exactly
56
+ * the same way; only WHERE the caller is standing differs.
57
+ */
58
+ function findStructuredOutputDowngrades(run) {
59
+ const reasonsByStep = new Map();
60
+ for (const entry of run.evidence) {
61
+ const meta = entry.diagnostics?.structured_output;
62
+ if (meta === undefined)
63
+ continue;
64
+ if (meta.downgrade_reason === undefined || meta.downgrade_reason === 'external_agent')
65
+ continue;
66
+ const reasons = reasonsByStep.get(entry.step_id) ?? new Set();
67
+ reasons.add(meta.downgrade_reason);
68
+ reasonsByStep.set(entry.step_id, reasons);
69
+ }
70
+ if (reasonsByStep.size === 0)
71
+ return undefined;
72
+ const steps = [...reasonsByStep.entries()].map(([step, reasons]) => ({
73
+ step,
74
+ reasons: [...reasons],
75
+ }));
76
+ const stepSummaries = steps.map((s) => `${s.step}: ${s.reasons.join(', ')}`);
77
+ return {
78
+ kind: 'structured_output_downgraded',
79
+ reason: `${steps.length} step(s) requested strict structured output but ran without it ` +
80
+ `(${stepSummaries.join('; ')}) — outputs were validated post-hoc (L1), not grammar-constrained`,
81
+ evidence: { steps },
82
+ };
83
+ }
40
84
  /**
41
85
  * Classifies a run's health into zero or more typed findings. Pure, read-only, definition-
42
86
  * optional, `now`-injectable. See the module doc above for the full branch-conditioning table
@@ -82,9 +126,31 @@ export function classifyRunHealth(run, opts) {
82
126
  const terminalGateCorruption = findGateCorruption(run);
83
127
  if (terminalGateCorruption !== undefined)
84
128
  pendingFindings.push(terminalGateCorruption);
129
+ // issue #302 (disclosure gaps, item 6 above): a completed seal that still carries failed_steps
130
+ // — designed recovery behavior, informational only. Keyed on the DERIVED phase (never the
131
+ // persisted run_phase field, never the byte-equivalent direct terminal_reason check).
132
+ if (deriveRunPhase(run) === 'completed' && run.failed_steps.length > 0) {
133
+ pendingFindings.push({
134
+ kind: 'completed_with_failed_steps',
135
+ reason: `completed with ${run.failed_steps.length} failed step(s): ${run.failed_steps.join(', ')} ` +
136
+ `— fail-triggered finalizers do not run on a completed seal unless the workflow opts ` +
137
+ `into the 'completed_with_failed_steps' trigger`,
138
+ evidence: { failed_steps: run.failed_steps },
139
+ });
140
+ }
141
+ // issue #316: structured_output_downgraded on the terminal path — the run is sealed, but its
142
+ // permanent evidence still records any strict-downgrade that happened before it sealed. This
143
+ // is the ONLY surface a downgrade on a run's final step reaches (get_run_state hard-zeroes
144
+ // run_health on a terminal run, the frozen #279-R3 guard below — see the module doc).
145
+ const terminalDowngrade = findStructuredOutputDowngrades(run);
146
+ if (terminalDowngrade !== undefined)
147
+ pendingFindings.push(terminalDowngrade);
85
148
  if (pendingFindings.length > 0)
86
149
  return pendingFindings;
87
- return []; // terminal ∧ no pending ledger entries [] (byte-identical to pre-#279 behavior)
150
+ // terminal ∧ no pending ledger entries not completed-with-failed-steps no recorded
151
+ // structured-output downgrade ⇒ [] (byte-identical to pre-#279 behavior for every OTHER class
152
+ // of terminal record).
153
+ return [];
88
154
  }
89
155
  const idleThresholdMs = opts?.idleThresholdMs ?? DEFAULT_IDLE_THRESHOLD_MS;
90
156
  const findings = [];
@@ -117,6 +183,37 @@ export function classifyRunHealth(run, opts) {
117
183
  const gateCorruption = findGateCorruption(run);
118
184
  if (gateCorruption !== undefined)
119
185
  findings.push(gateCorruption);
186
+ // issue #316: structured_output_downgraded on the live path too — this is the run-health
187
+ // watchdog scenario the issue was filed for: a poller sees the downgrade WHILE the run is still
188
+ // in flight, via get_run_state's run_health + its warning line, without waiting for a terminal
189
+ // seal (which, per the module doc, get_run_state never surfaces run_health for at all).
190
+ const structuredOutputDowngrade = findStructuredOutputDowngrades(run);
191
+ if (structuredOutputDowngrade !== undefined)
192
+ findings.push(structuredOutputDowngrade);
193
+ // issue #291: gate_expired_awaiting_drive — record-fields-only (never the definition), fires
194
+ // for BOTH an enactable gate AND a finding-only one (expires_at present, on_expiry absent) —
195
+ // the finding-only payload names its own disposition as 'finding_only' rather than omitting
196
+ // the finding entirely (a finding-only gate is STILL awaiting a human drive; the operator
197
+ // should still see it). Unreachable on a terminal record by construction (the terminal branch,
198
+ // above, returns before this line is ever reached).
199
+ if (run.pending_gate !== undefined &&
200
+ run.pending_gate.expires_at !== undefined &&
201
+ now.getTime() >= new Date(run.pending_gate.expires_at).getTime()) {
202
+ const overdueMs = now.getTime() - new Date(run.pending_gate.expires_at).getTime();
203
+ findings.push({
204
+ kind: 'gate_expired_awaiting_drive',
205
+ step: run.pending_gate.step_name,
206
+ reason: run.pending_gate.on_expiry !== undefined
207
+ ? `gate expired — awaiting enactment of the declared ${run.pending_gate.on_expiry}`
208
+ : 'gate expired — finding-only (no on_expiry declared), awaiting a human response',
209
+ evidence: {
210
+ gate_id: run.pending_gate.gate_id,
211
+ expires_at: run.pending_gate.expires_at,
212
+ overdue_ms: overdueMs,
213
+ disposition: run.pending_gate.on_expiry ?? 'finding_only',
214
+ },
215
+ });
216
+ }
120
217
  // issue #279 (increment 2, PR-D, design record §9, N8's surface): resolved-gate-with-eligible-
121
218
  // guard. findEligibleGuardSteps ALREADY self-filters both a terminal run and an open gate
122
219
  // (eligibility.ts), so no extra gating is needed beyond requiring a definition.
@@ -1 +1 @@
1
- {"version":3,"file":"run-health.js","sourceRoot":"","sources":["../../src/engine/run-health.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-health.js","sourceRoot":"","sources":["../../src/engine/run-health.ts"],"names":[],"mappings":"AAyFA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE7F;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAsD7D;;;;;;;;;;GAUG;AACH,SAAS,kBAAkB,CAAC,GAAc;IACxC,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACrD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACvD,OAAO;gBACL,IAAI,EAAE,iBAAiB;gBACvB,IAAI;gBACJ,MAAM,EACJ,kFAAkF;oBAClF,yBAAyB;gBAC3B,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;aAC9B,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,8BAA8B,CAAC,GAAc;IACpD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;IACrD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,iBAAiB,CAAC;QAClD,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,KAAK,gBAAgB;YAAE,SAAS;QAChG,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE/C,MAAM,KAAK,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI;QACJ,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;KACtB,CAAC,CAAC,CAAC;IACJ,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,MAAM,EACJ,GAAG,KAAK,CAAC,MAAM,iEAAiE;YAChF,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mEAAmE;QACjG,QAAQ,EAAE,EAAE,KAAK,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAc,EACd,IAAgF;IAEhF,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEpC,+FAA+F;IAC/F,gGAAgG;IAChG,yFAAyF;IACzF,kEAAkE;IAClE,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,eAAe,GAAuB,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE,CAAC;YACvE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS;YACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC;YACvF,MAAM,YAAY,GAAG,QAAQ,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,cAAe,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC5F,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC;YAC1F,eAAe,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,4BAA4B;gBAClC,IAAI,EAAE,IAAI;gBACV,MAAM;gBACN,QAAQ,EAAE;oBACR,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,GAAG,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxF;aACF,CAAC,CAAC;QACL,CAAC;QACD,wFAAwF;QACxF,8FAA8F;QAC9F,0EAA0E;QAC1E,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACnC,eAAe,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,0BAA0B;gBAChC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,SAAS;gBAChC,MAAM,EACJ,sFAAsF;gBACxF,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;QACD,qFAAqF;QACrF,kCAAkC;QAClC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,sBAAsB,KAAK,SAAS;YAAE,eAAe,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACvF,+FAA+F;QAC/F,0FAA0F;QAC1F,sFAAsF;QACtF,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,WAAW,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvE,eAAe,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,6BAA6B;gBACnC,MAAM,EACJ,kBAAkB,GAAG,CAAC,YAAY,CAAC,MAAM,oBAAoB,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBAC3F,sFAAsF;oBACtF,gDAAgD;gBAClD,QAAQ,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE;aAC7C,CAAC,CAAC;QACL,CAAC;QACD,6FAA6F;QAC7F,6FAA6F;QAC7F,2FAA2F;QAC3F,sFAAsF;QACtF,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,iBAAiB,KAAK,SAAS;YAAE,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7E,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,eAAe,CAAC;QACvD,uFAAuF;QACvF,8FAA8F;QAC9F,uBAAuB;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,EAAE,eAAe,IAAI,yBAAyB,CAAC;IAC3E,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,gFAAgF;IAChF,KAAK,MAAM,CAAC,IAAI,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QACpC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,YAAY,EAAE,SAAS;YAAE,SAAS,CAAC,uCAAuC;QAC7F,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,GAAG,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,aAAa;YAC9E,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,KAAK;YACf,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;SACnD,CAAC,CAAC;IACL,CAAC;IAED,6FAA6F;IAC7F,6EAA6E;IAC7E,KAAK,MAAM,CAAC,IAAI,0BAA0B,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,KAAK,EAAE,CAAC,CAAC,EAAE;YACX,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SACvD,CAAC,CAAC;IACL,CAAC;IAED,gGAAgG;IAChG,+FAA+F;IAC/F,MAAM,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,cAAc,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAEhE,yFAAyF;IACzF,gGAAgG;IAChG,+FAA+F;IAC/F,wFAAwF;IACxF,MAAM,yBAAyB,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;IACtE,IAAI,yBAAyB,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAEtF,6FAA6F;IAC7F,6FAA6F;IAC7F,4FAA4F;IAC5F,0FAA0F;IAC1F,+FAA+F;IAC/F,oDAAoD;IACpD,IACE,GAAG,CAAC,YAAY,KAAK,SAAS;QAC9B,GAAG,CAAC,YAAY,CAAC,UAAU,KAAK,SAAS;QACzC,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAChE,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAClF,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,6BAA6B;YACnC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,SAAS;YAChC,MAAM,EACJ,GAAG,CAAC,YAAY,CAAC,SAAS,KAAK,SAAS;gBACtC,CAAC,CAAC,qDAAqD,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE;gBACnF,CAAC,CAAC,gFAAgF;YACtF,QAAQ,EAAE;gBACR,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,OAAO;gBACjC,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,UAAU;gBACvC,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,GAAG,CAAC,YAAY,CAAC,SAAS,IAAI,cAAc;aAC1D;SACF,CAAC,CAAC;IACL,CAAC;IAED,+FAA+F;IAC/F,0FAA0F;IAC1F,gFAAgF;IAChF,IAAI,IAAI,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,MAAM,SAAS,IAAI,sBAAsB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YACrE,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,mCAAmC;gBACzC,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,yBAAyB,SAAS,yBAAyB;aACpE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,+FAA+F;IAC/F,4BAA4B;IAC5B,IACE,GAAG,CAAC,SAAS,KAAK,SAAS;QAC3B,GAAG,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC;QAClC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,IAAI,eAAe,EACrE,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,mCAAmC;YAC3C,KAAK,EAAE,GAAG,CAAC,UAAU;YACrB,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;YAC3D,QAAQ,EAAE;gBACR,iBAAiB,EAAE,eAAe;gBAClC,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;oBAChC,CAAC,CAAC,EAAE,cAAc,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;oBAC7D,CAAC,CAAC,EAAE,CAAC;aACR;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,17 +1,48 @@
1
1
  import type { RunRecord } from '../types/run-record.js';
2
- import type { WorkflowDefinition } from '../types/workflow-definition.js';
2
+ import type { WorkflowDefinition, FinalizerTrigger } from '../types/workflow-definition.js';
3
3
  import type { SettlementDelta, SettlementResult, SettleStepOutcome } from '../types/settlement.js';
4
4
  /**
5
- * Selects the finalizer steps that fire for a terminal `outcome`, in the drain order (design
6
- * record §4/§6; extracted from `buildFinalizedSeal`'s selection, execution-loop.ts :3117-3126):
7
- * Group A (rank precedence) — `on_outcome` contains `outcome` (the specific catch/complete arm);
8
- * Group B — `on_outcome` contains `'always'` but NOT `outcome` (a finalizer listing both runs
9
- * once, in Group A). Each group in `Object.entries` declaration order; Group A then Group B.
5
+ * Selects the finalizer steps that fire for a terminal outcome, in the drain order (design
6
+ * record §4/§6, widened by #302's S2 fold; extracted from `buildFinalizedSeal`'s selection,
7
+ * execution-loop.ts :3117-3126): Group A (rank precedence) — the finalizer's OWN declared
8
+ * `on_outcome` set intersects the EFFECTIVE trigger set non-emptily; Group B — `on_outcome`
9
+ * contains `'always'` but the finalizer missed Group A (a finalizer listing both runs once, in
10
+ * Group A). Each group in `Object.entries` declaration order; Group A then Group B.
10
11
  * `settledStepNames` excludes any finalizer already at-most-once settled (resume/re-drive safety)
11
12
  * — pass `completed_steps ∪ failed_steps`, NEVER the `RunRecord.settled` map (a different,
12
13
  * per-step-outcome-keyed structure this selection does not consult).
14
+ *
15
+ * `outcome` accepts EITHER shape (issue #302, S2 — `selectFinalizers` is a PUBLIC export,
16
+ * `index.ts`, so widening the param rather than replacing it is an API-compat requirement, not a
17
+ * style choice):
18
+ * - a bare `SettleStepOutcome` string — every pre-#302 caller's shape, normalized internally to
19
+ * a singleton set; BYTE-IDENTICAL selection to the pre-widening behavior (pinned by the
20
+ * string-form compat test) and supported INDEFINITELY — this is not a deprecated compat shim.
21
+ * - a pre-derived `ReadonlySet<FinalizerTrigger>` (via {@link deriveEffectiveTriggers}) — the
22
+ * #302 call shape both engine chokepoints (`mintFresh`, `buildFinalizedSeal`) now use, letting
23
+ * a seal satisfy more than one trigger at once (e.g. `{'complete', 'completed_with_failed_steps'}`).
24
+ * Semver: additive or (minor) — no existing call site's behavior changes.
25
+ */
26
+ export declare function selectFinalizers(definition: WorkflowDefinition, settledStepNames: ReadonlySet<string>, outcome: SettleStepOutcome | ReadonlySet<FinalizerTrigger>): string[];
27
+ /**
28
+ * Derives the full set of finalizer triggers a terminal `outcome` satisfies for `record` (issue
29
+ * #302, design record §Mechanics-1): `{outcome}` — always — plus `'completed_with_failed_steps'`
30
+ * when `outcome === 'complete' ∧ record.failed_steps.length > 0` (a "mixed complete" seal — the
31
+ * SAME class #304's `completed_with_failed_steps` run-health finding already surfaces at read
32
+ * time; this is the mint-time trigger, sharing that one predicate).
33
+ *
34
+ * Uniform across epochs (design record M1, deliberate): a second-epoch complete seal whose ONLY
35
+ * `failed_steps` scar is a PRIOR epoch's finalizer self-failure (unresumable, so it never leaves
36
+ * `failed_steps`) still fires this trigger — no exclusion of finalizer-declared step names. The
37
+ * alternative (excluding finalizer names from the predicate) buys mint-time purity at the cost of
38
+ * diverging from the read-time #304 finding's own uniform predicate; this design keeps ONE
39
+ * predicate for both surfaces, deliberately.
40
+ *
41
+ * Pure; this ONE function is the seam a future authorable tolerance threshold (SFN-style: fire
42
+ * only when `failed_steps.length` exceeds some declared N) would extend — banked, not built
43
+ * (design record R2).
13
44
  */
14
- export declare function selectFinalizers(definition: WorkflowDefinition, settledStepNames: ReadonlySet<string>, outcome: SettleStepOutcome): string[];
45
+ export declare function deriveEffectiveTriggers(outcome: SettleStepOutcome, record: Pick<RunRecord, 'failed_steps'>): ReadonlySet<FinalizerTrigger>;
15
46
  /**
16
47
  * Applies one {@link SettlementDelta} against `fresh` — pure, synchronous, no I/O, no registry
17
48
  * (design record §7 CS-purity: `options` carries VALUES only). `definition` is passed per call
@@ -27,12 +58,19 @@ export declare function applySettlement(fresh: RunRecord, delta: SettlementDelta
27
58
  /**
28
59
  * Named constant (issue #279, increment 2, PR-C; design record §4.3) tying reclaim-step.ts's own
29
60
  * open-gate refusal (`reclaimStep`, ~line 389: "the claim is legitimately pinned by a human gate")
30
- * to this design's "unfenced-release soundness rests on reclaim" premise: `settle_step` abort's
31
- * cancel-gate write (`applyAbortEdge`, above) is the ONLY path that may release an open gate's
32
- * claim; `reclaimStep`/`isAutoReclaimable` must NEVER also release it, or the two paths could race
33
- * and double-release the same claim. Referenced (not asserted via) by this invariant's two
34
- * existing pinning tests (`reclaim-step.test.ts` + the CLI's `reclaim.test.ts`) so a future reader
35
- * can grep this name to find both, and reclaim-step.ts's own SOURCE stays untouched by this PR.
61
+ * to this design's "unfenced-release soundness rests on reclaim" premise. **Reworded (issue #291,
62
+ * [F6]):** the ORIGINAL text claimed `applyAbortEdge`'s cancel-gate write was "the ONLY path that
63
+ * may release an open gate's claim" issue #291's `applyExpireGate` (both dispositions) ALSO
64
+ * releases it now, making that literal claim false. The invariant this constant actually protects
65
+ * `reclaimStep`/`isAutoReclaimable` must NEVER release an open gate's claim, or a concurrent
66
+ * release could race and double-release the same claim still holds exactly; the closed set of
67
+ * paths that MAY release it is now: `settle_step` abort's cancel-gate write (another step's
68
+ * handler-abort), and `expire_gate`'s settle_default/abort dispositions (the gate's OWN step,
69
+ * enforce-clock-driven) — all three live inside `applySettlement`, under the SAME store lock,
70
+ * which is exactly WHY they can never race `reclaimStep`'s own (separate) CAS write. Referenced
71
+ * (not asserted via) by this invariant's two existing pinning tests (`reclaim-step.test.ts` +
72
+ * the CLI's `reclaim.test.ts`) so a future reader can grep this name to find both, and
73
+ * reclaim-step.ts's own SOURCE stays untouched by this PR.
36
74
  */
37
- export declare const RECLAIM_REFUSES_GATE_STEP = "reclaim never releases the open-gate claim (design record design-d5-increment2.md \u00A74.3, unfenced-release soundness)";
75
+ export declare const RECLAIM_REFUSES_GATE_STEP: string;
38
76
  //# sourceMappingURL=settlement.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settlement.d.ts","sourceRoot":"","sources":["../../src/engine/settlement.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAoB,MAAM,iCAAiC,CAAC;AAC5F,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAEhB,iBAAiB,EAOlB,MAAM,wBAAwB,CAAC;AA4GhC;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,kBAAkB,EAC9B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,EACrC,OAAO,EAAE,iBAAiB,GACzB,MAAM,EAAE,CAWV;AAuyBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,kBAAkB,EAC9B,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACvB,gBAAgB,CAkBlB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,6HACiF,CAAC"}
1
+ {"version":3,"file":"settlement.d.ts","sourceRoot":"","sources":["../../src/engine/settlement.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAEhB,iBAAiB,EAQlB,MAAM,wBAAwB,CAAC;AA4GhC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,kBAAkB,EAC9B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,EACrC,OAAO,EAAE,iBAAiB,GAAG,WAAW,CAAC,gBAAgB,CAAC,GACzD,MAAM,EAAE,CAoBV;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,GACtC,WAAW,CAAC,gBAAgB,CAAC,CAM/B;AA8/BD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,kBAAkB,EAC9B,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACvB,gBAAgB,CAoBlB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,yBAAyB,QAIE,CAAC"}