|
1 | 1 | # Changelog |
2 | 2 |
|
| 3 | +## 0.5.11 — 2026-07-12 |
| 4 | + |
| 5 | +### SDK |
| 6 | + |
| 7 | +- **Zombie turns now self-settle.** When the Copilot CLI subprocess died |
| 8 | + mid-turn (e.g. V8 heap OOM), `session.idle` never arrived and |
| 9 | + `ManagedSession.runTurn` awaited forever — the durable `runTurn` activity |
| 10 | + stayed in-flight permanently and the session wedged while its message queue |
| 11 | + backed up. Two worker-side guards now settle the turn (no orchestration |
| 12 | + change; an explicit `0` disables either): |
| 13 | + - **Inactivity watchdog** (`turnInactivityTimeoutMs`, default 5 minutes): a |
| 14 | + live turn emits a steady event stream, so total silence means the |
| 15 | + subprocess is dead or wedged. Settles as a retryable transport-loss error |
| 16 | + whose message matches the connection-closed classifier, riding the |
| 17 | + existing recovery path — release affinity, retry on a fresh subprocess, |
| 18 | + bounded lossy-handoff fallback. |
| 19 | + - **Wall-clock turn cap** (`turnTimeoutMs`, default 10 minutes): the |
| 20 | + pre-existing timeout race was dead code — nothing ever set it. It is now |
| 21 | + on by default as the blunt backstop. |
| 22 | + - Guard timers are cleared when the turn settles and their rejections are |
| 23 | + pre-handled; both guards also cover the text-tool-call correction loop's |
| 24 | + idle waits. |
| 25 | +- **A stale cron timer fire after `cron(action="cancel")` no longer kills the |
| 26 | + session.** Cancel clears the schedule, but the already-armed durable timer |
| 27 | + for the next tick cannot be retracted. When it fired, `processTimer`'s |
| 28 | + `cron` branch dereferenced the missing schedule and threw a `TypeError` |
| 29 | + that surfaced as a non-retryable `OrchestrationFailed` — permanently |
| 30 | + failing the session and orphaning its sub-agents. The stale fire is now |
| 31 | + ignored (traced, no `session.cron_fired`), matching the guard the `cron_at` |
| 32 | + branch already had. |
| 33 | + |
| 34 | +### Tests |
| 35 | + |
| 36 | +- `turn-inactivity-watchdog.test.js` — the incident shape (subprocess acks |
| 37 | + `send()` then goes silent forever) must settle as a transport-loss error |
| 38 | + the orchestration's connection-closed classifier accepts; steady event flow |
| 39 | + past the threshold must never trip the watchdog; defaults-on behavior; |
| 40 | + `0`-disables contract; no armed timers after a clean turn. |
| 41 | +- `orchestration-stale-cron-timer.test.mjs` — a stale cron fire after cancel |
| 42 | + is a no-op (no throw, no `session.cron_fired`); an active cron fire still |
| 43 | + records `session.cron_fired` first. |
| 44 | + |
3 | 45 | ## 0.5.10 — 2026-07-12 |
4 | 46 |
|
5 | 47 | ### SDK |
|
0 commit comments