wicked-crew 0.7.13 → 0.7.14

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 (42) hide show
  1. package/dist/api/delivery-cache.d.ts +135 -0
  2. package/dist/api/delivery-cache.d.ts.map +1 -0
  3. package/dist/api/delivery-cache.js +245 -0
  4. package/dist/api/delivery-cache.js.map +1 -0
  5. package/dist/api/delivery-index.d.ts +42 -11
  6. package/dist/api/delivery-index.d.ts.map +1 -1
  7. package/dist/api/delivery-index.js +104 -52
  8. package/dist/api/delivery-index.js.map +1 -1
  9. package/dist/api/endpoint-manifest-live.d.ts.map +1 -1
  10. package/dist/api/endpoint-manifest-live.js +0 -1
  11. package/dist/api/endpoint-manifest-live.js.map +1 -1
  12. package/dist/api/gate-cache.d.ts +24 -0
  13. package/dist/api/gate-cache.d.ts.map +1 -1
  14. package/dist/api/gate-cache.js +35 -0
  15. package/dist/api/gate-cache.js.map +1 -1
  16. package/dist/api/routes.d.ts +14 -7
  17. package/dist/api/routes.d.ts.map +1 -1
  18. package/dist/api/routes.js +60 -13
  19. package/dist/api/routes.js.map +1 -1
  20. package/dist/api/seat-health.d.ts +0 -25
  21. package/dist/api/seat-health.d.ts.map +1 -1
  22. package/dist/api/seat-health.js +6 -81
  23. package/dist/api/seat-health.js.map +1 -1
  24. package/dist/api/server.d.ts +18 -15
  25. package/dist/api/server.d.ts.map +1 -1
  26. package/dist/api/server.js +87 -36
  27. package/dist/api/server.js.map +1 -1
  28. package/dist/api/stall-watchdog.d.ts +40 -3
  29. package/dist/api/stall-watchdog.d.ts.map +1 -1
  30. package/dist/api/stall-watchdog.js +94 -15
  31. package/dist/api/stall-watchdog.js.map +1 -1
  32. package/dist/campaigns/rollup.d.ts +3 -0
  33. package/dist/campaigns/rollup.d.ts.map +1 -1
  34. package/dist/campaigns/rollup.js +17 -2
  35. package/dist/campaigns/rollup.js.map +1 -1
  36. package/dist/campaigns/routes.d.ts +4 -4
  37. package/dist/core/types.d.ts +20 -4
  38. package/dist/core/types.d.ts.map +1 -1
  39. package/dist/core/types.js +20 -1
  40. package/dist/core/types.js.map +1 -1
  41. package/endpoint-manifest.json +3 -2
  42. package/package.json +2 -2
@@ -7,8 +7,12 @@ export interface ExecutingRun {
7
7
  id: string;
8
8
  /** The run's CURSOR unit ord when the caller knows it — what `reassignUnit` must name. */
9
9
  ord?: number;
10
- /** The cursor unit's assigned seat, for reassign-in-place. Absent = let the council pick. */
10
+ /** The cursor unit's assigned seat — the seat a reassign moves AWAY from. Absent = unknown
11
+ * (a reassign then lets the engine's council pick). */
11
12
  cli?: string;
13
+ /** The run's own seat pool (`session.clis`), in roster order — the failover candidates a
14
+ * reassign may route to (perf#4). Absent/empty = no pool known: reassign in place. */
15
+ seats?: string[];
12
16
  }
13
17
  /**
14
18
  * The escalation stage's per-sweep configuration (crew#341), resolved live so a PUT /settings
@@ -37,13 +41,29 @@ export interface StallWatchdogDeps {
37
41
  /** Resolved per sweep; `minutes` absent/0/invalid keeps escalation OFF. */
38
42
  config: () => StallEscalationConfig | undefined | Promise<StallEscalationConfig | undefined>;
39
43
  /**
40
- * Recycle the wedged cursor unit in place (the daemon wires `adapter.reassignUnit`).
41
- * `cli` set = re-dispatch to the same seat; absent = the engine re-runs the council.
44
+ * Recycle the wedged cursor unit (the daemon wires `adapter.reassignUnit`). `cli` names
45
+ * the seat to re-dispatch to — the watchdog passes its failover TARGET (a different seat
46
+ * from the run's pool when one exists, else the current seat recycled in place); absent =
47
+ * the engine re-runs the council.
42
48
  */
43
49
  reassign: (runId: string, ord: number, cli?: string) => Promise<void>;
44
50
  /** Audit sink — the server appends `run.stall.escalated` to the crew audit trail. */
45
51
  audit?: (frame: WorkerStallEscalatedFrame) => void;
46
52
  };
53
+ /**
54
+ * Called when a relayed `unitOutputCaptured` carries `stepStatus: "timed_out"` — the ENGINE's
55
+ * own turn ceiling fired (the run is terminating; the last-resort backstop the silence ladder
56
+ * exists to preempt). The server wires an audit entry + warn log so the timeout is
57
+ * operator-visible as WHAT IT IS rather than as an anonymous cancel. Versioned safely: an
58
+ * older engine never sends the value, so this never fires — and `"cancelled"` (ambiguous on
59
+ * old engines: operator OR timeout) deliberately triggers NOTHING, because acting on an
60
+ * operator's cancel is the failure mode this whole seam exists to prevent.
61
+ */
62
+ onTurnTimeout?: (info: {
63
+ session: string;
64
+ ord?: number;
65
+ attempt?: number;
66
+ }) => void;
47
67
  /** Clock (tests stub it). */
48
68
  now?: () => number;
49
69
  /** Wired to the daemon's warn logger — a stall is an operator-attention signal. */
@@ -61,6 +81,14 @@ export declare class WorkerStallWatchdog {
61
81
  private readonly escalated;
62
82
  /** run id → automatic reassigns consumed (the crew#341 budget). Pruned with the run. */
63
83
  private readonly escalationCount;
84
+ /**
85
+ * run id → seats already stall-reassigned AWAY from on this run, so consecutive escalations
86
+ * rotate through the pool instead of bouncing back to a seat that already wedged (perf#4).
87
+ * WATCHDOG-LOCAL BY DESIGN: a stalled seat is not an errored seat — this memory must never
88
+ * reach the engine's `worker_failed_clis` (resume-path exclusion) or the SeatHealthTracker.
89
+ * Pruned with the run, like the budget.
90
+ */
91
+ private readonly stalledSeats;
64
92
  private readonly now;
65
93
  private readonly log;
66
94
  private handle;
@@ -83,5 +111,14 @@ export declare class WorkerStallWatchdog {
83
111
  private escalationArmed;
84
112
  /** Perform one escalation for `run`, emit its `workerStallEscalated` frame, audit, log. */
85
113
  private escalate;
114
+ /**
115
+ * The failover TARGET for a stall reassign (perf#4): the first seat of the run's own pool
116
+ * that is neither the currently-stalled seat nor one this run already stall-reassigned away
117
+ * from. `undefined` = no distinct candidate (no pool known, a single-seat pool, or every
118
+ * other seat already stalled here) — the caller then recycles in place, which is today's
119
+ * (still safe) behaviour. Pool order is `session.clis` order: deterministic, no health
120
+ * heuristics — the per-run budget bounds how far the rotation can walk.
121
+ */
122
+ private pickFailoverSeat;
86
123
  }
87
124
  //# sourceMappingURL=stall-watchdog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stall-watchdog.d.ts","sourceRoot":"","sources":["../../src/api/stall-watchdog.ts"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AASjG,YAAY,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,CAAC;AAE9D,uFAAuF;AACvF,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAKhD,sFAAsF;AACtF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,0FAA0F;IAC1F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,wFAAwF;IACxF,aAAa,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7C,4FAA4F;IAC5F,SAAS,EAAE,CAAC,KAAK,EAAE,kBAAkB,GAAG,yBAAyB,KAAK,IAAI,CAAC;IAC3E,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACtE;;;OAGG;IACH,UAAU,CAAC,EAAE;QACX,2EAA2E;QAC3E,MAAM,EAAE,MAAM,qBAAqB,GAAG,SAAS,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAAC;QAC7F;;;WAGG;QACH,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACtE,qFAAqF;QACrF,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;KACpD,CAAC;IACF,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,mFAAmF;IACnF,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3B;AAED,qBAAa,mBAAmB;IAgBlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAfjC,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;IAC1C,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,QAAQ,CAAS;gBAEI,IAAI,EAAE,iBAAiB;IAKpD,+FAA+F;IAC/F,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAU9B,8FAA8F;IACxF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuE5B,qFAAqF;IACrF,KAAK,CAAC,UAAU,SAA4B,GAAG,IAAI;IAUnD,IAAI,IAAI,IAAI;IAKZ,sFAAsF;YACxE,WAAW;IAezB;;;;OAIG;YACW,eAAe;IAmC7B,2FAA2F;YAC7E,QAAQ;CAoGvB"}
1
+ {"version":3,"file":"stall-watchdog.d.ts","sourceRoot":"","sources":["../../src/api/stall-watchdog.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  // Worker stall watchdog (crew#287 detection + crew#341 escalation): platform-native liveness
2
- // for executing runs, and — opt-in — recovery when liveness is gone.
2
+ // for executing runs, and — armed by default since perf#4 — recovery when liveness is gone.
3
3
  //
4
4
  // A wedged worker emits nothing — no unitOutputDelta, no gate frames — and its run sits in
5
5
  // `executing` until an operator notices by absence (run 8aa1cd42: a design unit burned 3+ hours
@@ -15,20 +15,31 @@
15
15
  // - once per quiet period: after the frame fires, the run stays alerted until a NEW event for
16
16
  // it arrives; a second quiet period then emits a second frame.
17
17
  //
18
- // THE ESCALATION LADDER (crew#341) — detection now drives action, but only when armed:
18
+ // THE ESCALATION LADDER (crew#341, armed by default since perf#4) — detection drives action:
19
19
  //
20
- // notify (always) → act (opt-in, `workerStallEscalateMinutes` > 0) → fail loud
20
+ // notify (always) → act (default-ON, `workerStallEscalateMinutes`, 0 disarms) → fail loud
21
21
  //
22
- // - OFF BY DEFAULT. The issue's design: automatic recovery on a run that is merely slow rather
23
- // than wedged would be worse than the wedge. `workerStallEscalateMinutes` absent/0 keeps the
24
- // watchdog detection-only — bit-for-bit the crew#287 behaviour.
22
+ // - ON BY DEFAULT (perf#4). crew#341 shipped the ladder OFF, and run 616c8661 then burned the
23
+ // full 2h turn ceiling (106 min of output silence) while the watchdog fired once and watched.
24
+ // `reassignUnit` is safe on a merely-slow run — the superseded turn is not folded as a
25
+ // failure, its late output drops on the attempt guard, queued injects survive — so acting at
26
+ // `DEFAULT_WORKER_STALL_ESCALATE_MINUTES` (30 — ~55% headroom over the recon's slowest
27
+ // legitimate first output of ~19.4 min, still ~4x faster than the 2h ceiling) of TOTAL
28
+ // silence is strictly better than watching. An explicit `workerStallEscalateMinutes: 0`
29
+ // restores detection-only.
25
30
  // - When armed, a run still silent past the escalation threshold (never before the detection
26
31
  // threshold — the ladder notifies before it acts) gets ONE escalation per quiet period:
27
- // - action `reassign` (default): recycle the wedged cursor unit IN PLACE via the engine's
32
+ // - action `reassign` (default): recycle the wedged cursor unit via the engine's
28
33
  // `reassignUnit` — the stale turn is superseded (not folded as a failure), the worker
29
- // session closed, the attempt bumped, the unit re-dispatched to the same seat; queued
30
- // operator injects survive into the fresh turn. This is both of crew#341's candidate
31
- // recoveries in one primitive.
34
+ // session closed, the attempt bumped, the unit re-dispatched; queued operator injects
35
+ // survive into the fresh turn. The re-dispatch is routed to a DIFFERENT seat from the
36
+ // run's own pool when one is available (perf#4): a seat that just sat silent past the
37
+ // escalation threshold is the last seat to hand the retry to. Seats already stall-reassigned away from
38
+ // on this run are skipped too; a single-seat pool falls back to the in-place recycle.
39
+ // NOTE the seat memory is WATCHDOG-LOCAL and per-run: a stalled seat is NOT an errored
40
+ // seat. It is never written to the engine's `worker_failed_clis` (which the resume path
41
+ // reads to permanently exclude seats) and never folded into the SeatHealthTracker — a
42
+ // seat that stalled once under load stays fully eligible for other runs and for resume.
32
43
  // - action `notify`: the fail-loud rung — surface a `needsYou` frame + an audit entry and
33
44
  // leave the run alone.
34
45
  // - A per-run budget (`workerStallMaxEscalations`, default 2) caps AUTOMATIC reassigns: a
@@ -62,6 +73,14 @@ export class WorkerStallWatchdog {
62
73
  escalated = new Set();
63
74
  /** run id → automatic reassigns consumed (the crew#341 budget). Pruned with the run. */
64
75
  escalationCount = new Map();
76
+ /**
77
+ * run id → seats already stall-reassigned AWAY from on this run, so consecutive escalations
78
+ * rotate through the pool instead of bouncing back to a seat that already wedged (perf#4).
79
+ * WATCHDOG-LOCAL BY DESIGN: a stalled seat is not an errored seat — this memory must never
80
+ * reach the engine's `worker_failed_clis` (resume-path exclusion) or the SeatHealthTracker.
81
+ * Pruned with the run, like the budget.
82
+ */
83
+ stalledSeats = new Map();
65
84
  now;
66
85
  log;
67
86
  handle = null;
@@ -81,6 +100,28 @@ export class WorkerStallWatchdog {
81
100
  this.lastOrd.set(session, event.ord);
82
101
  this.alerted.delete(session);
83
102
  this.escalated.delete(session);
103
+ // The engine's own turn ceiling fired (perf#4: `stepStatus: "timed_out"` — a NEW value; the
104
+ // old shared "cancelled" spelling deliberately triggers nothing, because on an old engine it
105
+ // is indistinguishable from an operator's Ctrl-C). Surface it as what it is: the last-resort
106
+ // backstop this ladder exists to preempt.
107
+ if (event.type === 'unitOutputCaptured' &&
108
+ event.stepStatus === 'timed_out') {
109
+ const ord = typeof event.ord === 'number' ? event.ord : undefined;
110
+ const attempt = typeof event.attempt === 'number' ? event.attempt : undefined;
111
+ this.log(`[stall-watchdog] run ${session}${ord !== undefined ? ` (unit ${ord})` : ''} hit the ` +
112
+ `engine's turn ceiling (stepStatus timed_out) — this was the platform's own timeout, ` +
113
+ `NOT an operator cancel; the run is terminating`);
114
+ try {
115
+ this.deps.onTurnTimeout?.({
116
+ session,
117
+ ...(ord !== undefined ? { ord } : {}),
118
+ ...(attempt !== undefined ? { attempt } : {}),
119
+ });
120
+ }
121
+ catch (err) {
122
+ this.log(`[stall-watchdog] turn-timeout sink failed: ${String(err)}`);
123
+ }
124
+ }
84
125
  }
85
126
  /** One detection pass. Public so tests drive it directly; the armed interval calls it too. */
86
127
  async sweep() {
@@ -107,6 +148,7 @@ export class WorkerStallWatchdog {
107
148
  this.alerted.delete(key);
108
149
  this.escalated.delete(key);
109
150
  this.escalationCount.delete(key);
151
+ this.stalledSeats.delete(key);
110
152
  }
111
153
  }
112
154
  const thresholdMs = await this.thresholdMs();
@@ -139,7 +181,7 @@ export class WorkerStallWatchdog {
139
181
  ? ` (detection only: the run was NOT touched; the operator decides)`
140
182
  : ` (escalation armed at ${(escalation.thresholdMs / 60_000).toFixed(1)} min)`));
141
183
  }
142
- // ── stage 2: act (crew#341, opt-in) — never before stage 1's threshold ──────────
184
+ // ── stage 2: act (crew#341, default-ON since perf#4) — never before stage 1 ─────
143
185
  if (escalation !== undefined &&
144
186
  quietForMs >= escalation.thresholdMs &&
145
187
  !this.escalated.has(run.id)) {
@@ -257,15 +299,34 @@ export class WorkerStallWatchdog {
257
299
  // Budget is consumed by the ATTEMPT, success or not — a rejecting engine call must not
258
300
  // be retried indefinitely on the platform's own initiative.
259
301
  this.escalationCount.set(run.id, used + 1);
302
+ // Route the re-dispatch to a DIFFERENT seat when the run's pool offers one (perf#4):
303
+ // the current seat just sat silent past the escalation threshold, and seats this run
304
+ // already stall-reassigned away from are skipped too. No distinct candidate (single-seat
305
+ // pool, or the pool is exhausted) falls back to the in-place recycle — still safe, the
306
+ // engine supersedes the stale turn either way. `run.cli` unknown keeps today's shape:
307
+ // pass nothing and let the engine's council pick.
308
+ const target = this.pickFailoverSeat(run);
309
+ if (run.cli !== undefined) {
310
+ // Remember the stalled seat — watchdog-local, per-run; NEVER an error record (a
311
+ // stalled seat must not be conflated with an errored one for resume exclusion).
312
+ let stalled = this.stalledSeats.get(run.id);
313
+ if (stalled === undefined) {
314
+ stalled = new Set();
315
+ this.stalledSeats.set(run.id, stalled);
316
+ }
317
+ stalled.add(run.cli);
318
+ }
319
+ const seat = target ?? run.cli;
260
320
  try {
261
- await this.deps.escalation?.reassign(run.id, ord, run.cli);
321
+ await this.deps.escalation?.reassign(run.id, ord, seat);
262
322
  frame = {
263
323
  ...base,
264
324
  action: 'reassign',
265
325
  outcome: 'ok',
266
326
  needsYou: false,
267
327
  escalations: used + 1,
268
- ...(run.cli !== undefined ? { cli: run.cli } : {}),
328
+ ...(seat !== undefined ? { cli: seat } : {}),
329
+ ...(run.cli !== undefined ? { previousCli: run.cli } : {}),
269
330
  };
270
331
  }
271
332
  catch (err) {
@@ -294,8 +355,12 @@ export class WorkerStallWatchdog {
294
355
  `needs-you frame broadcast, the run was NOT touched`);
295
356
  }
296
357
  else if (frame.outcome === 'ok') {
297
- this.log(`[stall-watchdog] ESCALATED ${where}: ${quiet} — reassigned in place` +
298
- `${run.cli !== undefined ? ` (seat ${run.cli})` : ''} ` +
358
+ const routing = frame.cli !== undefined && frame.previousCli !== undefined && frame.cli !== frame.previousCli
359
+ ? `failed over ${frame.previousCli} → ${frame.cli}`
360
+ : frame.cli !== undefined
361
+ ? `reassigned in place (seat ${frame.cli})`
362
+ : `reassigned (council re-picks the seat)`;
363
+ this.log(`[stall-watchdog] ESCALATED ${where}: ${quiet} — ${routing} ` +
299
364
  `(automatic recovery ${frame.escalations}/${escalation.maxPerRun}; the stale turn is ` +
300
365
  `superseded and the unit re-dispatched)`);
301
366
  }
@@ -308,5 +373,19 @@ export class WorkerStallWatchdog {
308
373
  `happen (${frame.error ?? 'unknown error'}); needs-you frame broadcast`);
309
374
  }
310
375
  }
376
+ /**
377
+ * The failover TARGET for a stall reassign (perf#4): the first seat of the run's own pool
378
+ * that is neither the currently-stalled seat nor one this run already stall-reassigned away
379
+ * from. `undefined` = no distinct candidate (no pool known, a single-seat pool, or every
380
+ * other seat already stalled here) — the caller then recycles in place, which is today's
381
+ * (still safe) behaviour. Pool order is `session.clis` order: deterministic, no health
382
+ * heuristics — the per-run budget bounds how far the rotation can walk.
383
+ */
384
+ pickFailoverSeat(run) {
385
+ if (run.cli === undefined)
386
+ return undefined; // unknown current seat → council re-pick
387
+ const stalled = this.stalledSeats.get(run.id);
388
+ return (run.seats ?? []).find((s) => s !== run.cli && !(stalled?.has(s) ?? false));
389
+ }
311
390
  }
312
391
  //# sourceMappingURL=stall-watchdog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stall-watchdog.js","sourceRoot":"","sources":["../../src/api/stall-watchdog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stall-watchdog.js","sourceRoot":"","sources":["../../src/api/stall-watchdog.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,9 @@ export interface RollupDeps {
24
24
  deliveryUrlFor: (runId: string) => string | undefined;
25
25
  /** The shared TTL-memoized probes behind `'stranded'`/`'vacuous'`. */
26
26
  vacuity: VacuityProbes;
27
+ /** ERROR-level channel — only a NON-probe derivation throw (a defect) is reported here; the
28
+ * expected probe-unavailable degrade stays quiet (the probe layer already said it). */
29
+ logDefect?: (msg: string) => void;
27
30
  }
28
31
  /** Index a session list by run id — built once per request from ONE `sessionsDetail()` read. */
29
32
  export declare function sessionsById(views: SessionView[]): Map<string, SessionView>;
@@ -1 +1 @@
1
- {"version":3,"file":"rollup.d.ts","sourceRoot":"","sources":["../../src/campaigns/rollup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAEV,QAAQ,EAER,QAAQ,EACR,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,sFAAsF;AACtF,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,qEAAqE;IACrE,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACtD,sEAAsE;IACtE,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAE3E;AA6BD;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9B,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,QAAQ,CAAC,CAwBnB;AAED,6FAA6F;AAC7F,wBAAsB,WAAW,CAC/B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9B,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,QAAQ,EAAE,CAAC,CAarB"}
1
+ {"version":3,"file":"rollup.d.ts","sourceRoot":"","sources":["../../src/campaigns/rollup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAEV,QAAQ,EAER,QAAQ,EACR,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,sFAAsF;AACtF,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,qEAAqE;IACrE,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACtD,sEAAsE;IACtE,OAAO,EAAE,aAAa,CAAC;IACvB;4FACwF;IACxF,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAE3E;AA+CD;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9B,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,QAAQ,CAAC,CAwBnB;AAED,6FAA6F;AAC7F,wBAAsB,WAAW,CAC/B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9B,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,QAAQ,EAAE,CAAC,CAarB"}
@@ -14,7 +14,7 @@
14
14
  * list would silently lose archived siblings. This join reads the full session set, so an
15
15
  * archived node still reports its delivery honestly.
16
16
  */
17
- import { deliveryStateWithVacuity, isDeliverConflictStranded, } from '../api/delivery-index.js';
17
+ import { VacuityProbeUnavailable, deliveryStateOf, deliveryStateWithVacuity, isDeliverConflictStranded, } from '../api/delivery-index.js';
18
18
  /** Index a session list by run id — built once per request from ONE `sessionsDetail()` read. */
19
19
  export function sessionsById(views) {
20
20
  return new Map(views.map((v) => [v.session.id, v]));
@@ -31,7 +31,22 @@ async function deliveryOf(view, deps) {
31
31
  return { delivery: 'delivered', deliverUrl: url };
32
32
  if (isDeliverConflictStranded(view))
33
33
  return { delivery: 'stranded' };
34
- const state = await deliveryStateWithVacuity(view.session, undefined, deps.vacuity);
34
+ let state;
35
+ try {
36
+ state = await deliveryStateWithVacuity(view.session, undefined, deps.vacuity);
37
+ }
38
+ catch (err) {
39
+ // The production probes throw `VacuityProbeUnavailable` when git could not answer — the
40
+ // absence of an answer, not a verdict (PR #435 review). Serve THIS request the stat-only
41
+ // tri-state — the same degrade the run DTOs' cache miss answers — rather than 500 a whole
42
+ // campaign scoreboard over one raced worktree; the next request re-probes past the short
43
+ // failure memo. Any OTHER throw is a DEFECT (a bug, not weather): still degrade — a read
44
+ // endpoint should answer — but say so loudly and distinguishably, never swallow it.
45
+ if (!(err instanceof VacuityProbeUnavailable)) {
46
+ deps.logDefect?.(`[campaigns] DEFECT: delivery derivation for ${view.session.id} threw a non-probe error (served the stat-only label): ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`);
47
+ }
48
+ state = deliveryStateOf(view.session, undefined, deps.vacuity.worktreeExists);
49
+ }
35
50
  return {
36
51
  delivery: state.delivery,
37
52
  ...(state.deliverUrl !== undefined ? { deliverUrl: state.deliverUrl } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"rollup.js","sourceRoot":"","sources":["../../src/campaigns/rollup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAE1B,MAAM,0BAA0B,CAAC;AAYlC,gGAAgG;AAChG,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAiB,EAAE,IAAgB;IAC3D,8FAA8F;IAC9F,gGAAgG;IAChG,6FAA6F;IAC7F,+FAA+F;IAC/F,8FAA8F;IAC9F,oFAAoF;IACpF,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACzE,IAAI,yBAAyB,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpF,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,IAAiB,EACjB,IAAgB;IAEhB,wFAAwF;IACxF,8FAA8F;IAC9F,MAAM,MAAM,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACnF,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAkB,EAClB,IAA8B,EAC9B,IAAgB;IAEhB,sFAAsF;IACtF,6FAA6F;IAC7F,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,CAC7D,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,CAC7C,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAgB,EAAE,IAAI,CAAC,CAAC,CACjF,CAAC;IACF,MAAM,aAAa,GAAyC,EAAE,CAAC;IAC/D,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE;QAClC,aAAa,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAyB,CAAC;IAChE,CAAC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU;SAChC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,0DAA0D;SACzD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC;IACpD,MAAM,aAAa,GAAsB,MAAM,OAAO,CAAC,GAAG,CACxD,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAChC,KAAK;QACL,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAgB,EAAE,IAAI,CAAC,CAAC;KAC1D,CAAC,CAAC,CACJ,CAAC;IACF,OAAO,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AACvD,CAAC;AAED,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAA8B,EAC9B,IAAgB;IAEhB,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAsB,MAAM,OAAO,CAAC,GAAG,CAC/C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK;YACL,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAgB,EAAE,IAAI,CAAC,CAAC;SAC1D,CAAC,CAAC,CACJ,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"rollup.js","sourceRoot":"","sources":["../../src/campaigns/rollup.ts"],"names":[],"mappings":"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"}
@@ -59,10 +59,10 @@ export declare const LaunchCampaignSchema: z.ZodObject<{
59
59
  tool?: {
60
60
  cmd: string[];
61
61
  } | undefined;
62
+ repoRef?: string | undefined;
62
63
  deps?: string[] | undefined;
63
64
  title?: string | undefined;
64
65
  depsCondition?: "on_success" | "on_terminal" | undefined;
65
- repoRef?: string | undefined;
66
66
  }, {
67
67
  id: string;
68
68
  agent?: {
@@ -72,10 +72,10 @@ export declare const LaunchCampaignSchema: z.ZodObject<{
72
72
  tool?: {
73
73
  cmd: string[];
74
74
  } | undefined;
75
+ repoRef?: string | undefined;
75
76
  deps?: string[] | undefined;
76
77
  title?: string | undefined;
77
78
  depsCondition?: "on_success" | "on_terminal" | undefined;
78
- repoRef?: string | undefined;
79
79
  }>, "many">;
80
80
  policy: z.ZodOptional<z.ZodEnum<["fail_fast", "continue_independent", "human_gate_on_failure"]>>;
81
81
  maxConcurrency: z.ZodOptional<z.ZodNumber>;
@@ -92,10 +92,10 @@ export declare const LaunchCampaignSchema: z.ZodObject<{
92
92
  tool?: {
93
93
  cmd: string[];
94
94
  } | undefined;
95
+ repoRef?: string | undefined;
95
96
  deps?: string[] | undefined;
96
97
  title?: string | undefined;
97
98
  depsCondition?: "on_success" | "on_terminal" | undefined;
98
- repoRef?: string | undefined;
99
99
  }[];
100
100
  id?: string | undefined;
101
101
  name?: string | undefined;
@@ -114,10 +114,10 @@ export declare const LaunchCampaignSchema: z.ZodObject<{
114
114
  tool?: {
115
115
  cmd: string[];
116
116
  } | undefined;
117
+ repoRef?: string | undefined;
117
118
  deps?: string[] | undefined;
118
119
  title?: string | undefined;
119
120
  depsCondition?: "on_success" | "on_terminal" | undefined;
120
- repoRef?: string | undefined;
121
121
  }[];
122
122
  id?: string | undefined;
123
123
  name?: string | undefined;
@@ -115,9 +115,25 @@ export interface LaunchRunInput {
115
115
  }
116
116
  /** Default `workerStallMinutes` (crew#287): silent minutes before the stall watchdog fires. */
117
117
  export declare const DEFAULT_WORKER_STALL_MINUTES = 15;
118
+ /**
119
+ * Default `workerStallEscalateMinutes` (perf#4): silent minutes before the watchdog ACTS.
120
+ * The escalation ladder is ON BY DEFAULT as of perf#4 — run 616c8661 sat wedged for a full 2h
121
+ * turn ceiling (106 min of output silence) while the detection-only watchdog fired once and
122
+ * watched; the engine's `reassignUnit` supersedes the wedged turn safely (attempt bump + epoch
123
+ * cancel: the stale turn's late output drops, no double-charge), so acting is strictly better
124
+ * than watching. An explicit `workerStallEscalateMinutes: 0` disarms it (the crew#341 opt-out).
125
+ *
126
+ * WHY 30: the trigger clock (silence since the last CoreEvent) is exactly the clock a slow but
127
+ * legitimate first turn rides — the recon's max legitimate time-to-first-output across 68 units
128
+ * was 1,161s ≈ 19.35 min, which leaves only a 3–6% margin at a 20-minute threshold. 30 minutes
129
+ * gives ~55% headroom over that observed worst case while still recovering ~4x faster than the
130
+ * 2h ceiling. The 15-minute detection (notify) rung is unchanged.
131
+ */
132
+ export declare const DEFAULT_WORKER_STALL_ESCALATE_MINUTES = 30;
118
133
  /**
119
134
  * Default `workerStallEscalateAction` (crew#341) when escalation is armed: recycle the wedged
120
- * cursor unit in place (engine `reassignUnit`).
135
+ * cursor unit via the engine's `reassignUnit` — routed to a DIFFERENT seat from the run's pool
136
+ * when one is available (perf#4), in place otherwise.
121
137
  */
122
138
  export declare const DEFAULT_WORKER_STALL_ESCALATE_ACTION: "reassign";
123
139
  /**
@@ -130,9 +146,9 @@ export declare const DEFAULT_WORKER_STALL_MAX_ESCALATIONS = 2;
130
146
  * (`workerStallMinutes`, crew#287; `workerStallEscalateMinutes` /
131
147
  * `workerStallEscalateAction` / `workerStallMaxEscalations`, crew#341) live in the published
132
148
  * contract as of api-types 0.18.0 and are INHERITED here — what remains local is the
133
- * `studio.*` restatement below. Note the escalation DEFAULT is OFF
134
- * (`workerStallEscalateMinutes` absent/0): automatic recovery on a run that is merely slow
135
- * would be worse than the wedge (crew#341's design).
149
+ * `studio.*` restatement below. Note the escalation ladder is ON BY DEFAULT as of perf#4
150
+ * (`workerStallEscalateMinutes` defaults to [`DEFAULT_WORKER_STALL_ESCALATE_MINUTES`]); an
151
+ * explicit `0` disarms it.
136
152
  */
137
153
  export interface CrewSystemSettings extends SystemSettings {
138
154
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,mBAAmB,uBAAuB,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,8FAA8F;AAC9F,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC;IACf;;;;;;;;;;;;;;OAcG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,+FAA+F;AAC/F,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,oCAAoC,EAAG,UAAmB,CAAC;AAExE;;;GAGG;AACH,eAAO,MAAM,oCAAoC,IAAI,CAAC;AAEtD;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;;;;;;;OASG;IACH,CAAC,GAAG,EAAE,UAAU,MAAM,EAAE,GAAG,OAAO,CAAC;CACpC;AAED,eAAO,MAAM,gBAAgB,EAAE,kBAO9B,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,mBAAmB,uBAAuB,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,8FAA8F;AAC9F,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC;IACf;;;;;;;;;;;;;;OAcG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,+FAA+F;AAC/F,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,qCAAqC,KAAK,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,oCAAoC,EAAG,UAAmB,CAAC;AAExE;;;GAGG;AACH,eAAO,MAAM,oCAAoC,IAAI,CAAC;AAEtD;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;;;;;;;OASG;IACH,CAAC,GAAG,EAAE,UAAU,MAAM,EAAE,GAAG,OAAO,CAAC;CACpC;AAED,eAAO,MAAM,gBAAgB,EAAE,kBAU9B,CAAC"}
@@ -20,9 +20,25 @@
20
20
  */
21
21
  /** Default `workerStallMinutes` (crew#287): silent minutes before the stall watchdog fires. */
22
22
  export const DEFAULT_WORKER_STALL_MINUTES = 15;
23
+ /**
24
+ * Default `workerStallEscalateMinutes` (perf#4): silent minutes before the watchdog ACTS.
25
+ * The escalation ladder is ON BY DEFAULT as of perf#4 — run 616c8661 sat wedged for a full 2h
26
+ * turn ceiling (106 min of output silence) while the detection-only watchdog fired once and
27
+ * watched; the engine's `reassignUnit` supersedes the wedged turn safely (attempt bump + epoch
28
+ * cancel: the stale turn's late output drops, no double-charge), so acting is strictly better
29
+ * than watching. An explicit `workerStallEscalateMinutes: 0` disarms it (the crew#341 opt-out).
30
+ *
31
+ * WHY 30: the trigger clock (silence since the last CoreEvent) is exactly the clock a slow but
32
+ * legitimate first turn rides — the recon's max legitimate time-to-first-output across 68 units
33
+ * was 1,161s ≈ 19.35 min, which leaves only a 3–6% margin at a 20-minute threshold. 30 minutes
34
+ * gives ~55% headroom over that observed worst case while still recovering ~4x faster than the
35
+ * 2h ceiling. The 15-minute detection (notify) rung is unchanged.
36
+ */
37
+ export const DEFAULT_WORKER_STALL_ESCALATE_MINUTES = 30;
23
38
  /**
24
39
  * Default `workerStallEscalateAction` (crew#341) when escalation is armed: recycle the wedged
25
- * cursor unit in place (engine `reassignUnit`).
40
+ * cursor unit via the engine's `reassignUnit` — routed to a DIFFERENT seat from the run's pool
41
+ * when one is available (perf#4), in place otherwise.
26
42
  */
27
43
  export const DEFAULT_WORKER_STALL_ESCALATE_ACTION = 'reassign';
28
44
  /**
@@ -33,6 +49,9 @@ export const DEFAULT_WORKER_STALL_MAX_ESCALATIONS = 2;
33
49
  export const DEFAULT_SETTINGS = {
34
50
  graphNodeLimit: 150,
35
51
  workerStallMinutes: DEFAULT_WORKER_STALL_MINUTES,
52
+ // perf#4 — the escalation ladder is armed by default: 30 silent minutes → reassign the wedged
53
+ // cursor unit to a different seat. An explicit 0 (via PUT /settings or settings.json) disarms.
54
+ workerStallEscalateMinutes: DEFAULT_WORKER_STALL_ESCALATE_MINUTES,
36
55
  // crew#393 — repo-scoped CODE-WORK launches (a def with an `executes_code` phase) DELIVER by
37
56
  // default: a completed code run ends with a PR, or with the operator's explicit
38
57
  // `deliver: 'none'` (or this setting flipped) saying why not.
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAkGH,+FAA+F;AAC/F,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,UAAmB,CAAC;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,CAAC;AAyBtD,MAAM,CAAC,MAAM,gBAAgB,GAAuB;IAClD,cAAc,EAAE,GAAG;IACnB,kBAAkB,EAAE,4BAA4B;IAChD,6FAA6F;IAC7F,gFAAgF;IAChF,8DAA8D;IAC9D,cAAc,EAAE,IAAI;CACrB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAkGH,+FAA+F;AAC/F,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,UAAmB,CAAC;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,CAAC;AAyBtD,MAAM,CAAC,MAAM,gBAAgB,GAAuB;IAClD,cAAc,EAAE,GAAG;IACnB,kBAAkB,EAAE,4BAA4B;IAChD,8FAA8F;IAC9F,+FAA+F;IAC/F,0BAA0B,EAAE,qCAAqC;IACjE,6FAA6F;IAC7F,gFAAgF;IAChF,8DAA8D;IAC9D,cAAc,EAAE,IAAI;CACrB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "apiTypesVersion": "0.19.0",
3
+ "apiTypesVersion": "0.20.0",
4
4
  "endpoints": [
5
5
  {
6
6
  "method": "GET",
@@ -533,7 +533,8 @@
533
533
  "requestType": null,
534
534
  "responseType": "{ runs: SessionView[] }",
535
535
  "statusCodes": [
536
- 200
536
+ 200,
537
+ 400
537
538
  ]
538
539
  },
539
540
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wicked-crew",
3
- "version": "0.7.13",
3
+ "version": "0.7.14",
4
4
  "description": "wicked-crew daemon — thin REST+WS bridge to the wicked-core engine via wicked-core-ts",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,7 +37,7 @@
37
37
  "fastify": "^5.0.0",
38
38
  "pi-acp": "^0.0.32",
39
39
  "wicked-bus": "^2.3.1",
40
- "wicked-core-ts": "^0.7.10",
40
+ "wicked-core-ts": "^0.7.11",
41
41
  "wicked-ledger": "^0.4.0",
42
42
  "zod": "^3.23.0"
43
43
  },