# What else changed

Beyond the title's recovering root, the captures show changed settlement timing, native-child outcomes, explicit summarize settlement, and failure precedence. One additional observation is not covered by the title: **with a context overflow pending, an explicit `/compact` whose summary also overflows now emits a completed "Context compacted" item and then fails the turn with the pending overflow** (R11; failure-item ordinal 201→202). Before, that turn failed at the overflow with no compaction item. Proof audit pass 2 reproduced it against real OpenCode 1.18.18 with controlled SDK/SSE delivery ([audit2-report.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/eb8494d80cc52d19/audit2-report.md), [supplemental proof](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6fb9c7a478a42c60/audit2-supplemental-proof.tar.gz)): OpenCode's summarize HTTP call returns `true` without publishing `session.compacted` when the summary itself overflows. An adjacent race where summarize success is consumed before the overflow error occurs on both SHAs and predates this change.

| Row | Every normalized outcome difference, before → after |
|---|---|
| R1 LIVE | Failed on native overflow → running at overflow/compaction, completed at idle. Summary and continuation assistant items plus the completed compaction item now attach to the same original turn; they were absent from baseline T3 outcomes although native OpenCode continued. Session error/overflow lastError → ready/null; terminal failure object → null. One terminal on both sides. |
| R2 LIVE | Same failed overflow payload and reusable disposition, but active at the overflow boundary until idle. Two overflow-related session error updates → one at settlement; the transient immediate error disappears. |
| R3 LIVE | Failure moves from first overflow to idle and retains the second/native summary overflow message. Session lastError follows that final error, and redundant immediate error updates disappear. |
| R4 LIVE | Interrupt call fails because old turn is already finalized → acknowledged stop; baseline native compaction/continuation proceeds → native MessageAbortedError/idle. Failed overflow terminal → interrupted/null failure, ready/null-error session. |
| R5 UNIT | Original overflow/reusable terminal → stream EOF transport_error/broken terminal. Session lastError becomes stream failure; error update sequence changes. New turns rejected on both sides after EOF. |
| R6 UNIT | No differences: late overflow updates session error without rewriting the settled turn; late compaction/idle adds no terminal. |
| R7 UNIT | Owned pending overflow now waits through foreign/related-only error and compaction until owned idle; transient and duplicate session errors disappear. Foreign events still neither fail nor clear the owned turn. Final failure payload/disposition are unchanged. |
| R8 UNIT | No differences: missing session ID immediately broadcasts failed ContextOverflowError/broken; no deferral. |
| R9 LIVE+UNIT | Ordinary live APIError, missing payload, name fallback and MessageAbortedError controls are unchanged. Only the overflow→ordinary-error variant changes: original ContextOverflowError terminal → APIError terminal with the actual later message. The immediate overflow session error is removed. |
| R10 UNIT | Recovering child fails at overflow → stays active, retains compaction/text on its child turn, then completes its turn/root-turn node at child idle. Uncompacted child still fails but only at idle. Root outcome remains independently completed. No child root terminal/failure object exists on either side. |
| R11 UNIT (+ LIVE reproduction in audit 2) | Successful explicit compact remains completed. Pending-overflow explicit compact fails at summarize settlement instead of immediately. Summarize returning success with no native `session.compacted` (reachable with real OpenCode when the summary overflows) emits an extra completed compaction item before failure and advances failureItemOrdinal 201→202; one instead of two overflow session errors. |
| R12 UNIT | No differences across ordinary success, healthy compaction in the second turn, and late inactive compaction. Both turns complete with null failures. |
| R13 UNIT | O1→O2 fails with O2 rather than O1; O1→compacted→O2 also fails with O2, retains the compaction item and advances failure-item ordinal; two clears complete/null rather than failing O1. Session/lastError and retained item histories follow these outcomes, and immediate/duplicate overflow errors disappear. |
| R14 UNIT | Pending-admission overflow no longer finalizes before early idle/receipt/acceptance. Reconciliation fails with retained overflow, or completes/null after compaction (retaining the completed compaction item). Provider-assigned assistant completion plus legacy idle settles later instead of at overflow: the `Provider-assigned receipt` assistant item (running → completed) is now retained on the turn before the failure, and failureItemOrdinal moves 101→102. Immediate/duplicate session errors disappear; no duplicate terminal. |
| R15 UNIT | Pending overflow no longer hides later SDK prompt/command/timeout/summarize failures; those use the existing generic provider_error mapping (message `Provider turn failed.`, code null, session error with lastError null). Stream EOF racing summarize success wins as transport_error/broken; no completed compaction item. Interrupt followed by overflow remains interrupted/null with the transient overflow session error removed; subsequent EOF now overrides that still-active recovery as transport_error/broken. |

No other normalized outcome differences were observed. The per-row diffs retain all recorded T3 turn/session status changes, failure payloads, terminal counts/dispositions, assistant/compaction items, native-child root-turn nodes, relevant failure-item ordinals, admission checkpoints, and live adapter readbacks; identifiers and timestamps are normalized. Native SSE and complete emitted events remain in the raw recordings.
