diff --git a/docs/opencode-parity.md b/docs/opencode-parity.md index 90620217..74212af2 100644 --- a/docs/opencode-parity.md +++ b/docs/opencode-parity.md @@ -67,6 +67,21 @@ These are live defects, not missing features. Each makes OpenCode less usable th | B7 | **Latent spurious `cut-off`.** `resume-cursor` defaults `model` to `claude-code`; `endTurnIfAgentIsGone` then asks the Claude sidecar about a key it never had, gets `false`, and appends a durable "agent went away" row to a live turn. Currently masked only because the client always happens to send `model` alongside `sessionId`. | `websocket.ts:607,621,749-757` | A permanent, reload-surviving false error row. | | B8 | **In-flight `opencode run` children survive sidecar shutdown** and are not tracked, so their output is lost. Separately, `sweepStaleServes` is `/proc`-based and therefore a no-op on macOS — orphaned serves accumulate on this machine. | `index.ts:197-209`, `:41-75` | | +**Status, 2026-08-10: B1–B7 are fixed. B8 is the only one left.** + +B1–B6 in phases 0 and 1 (`22bcd7d`, `492509a`, `013e629`, `7774a25`) — see `docs/opencode-phase1-report.md`. +B7 fixed separately, after the review: `decideResume` in `websocket.ts` replaces `msg.model || DEFAULT_MODEL`. + +B7's write-up above understates it. The spurious `cut-off` was the visible half; the same default also +sent the session to `adoptOrphanedSession` as a Claude one, which subscribes it to the wrong sidecar's +bus (so an OpenCode turn's output never arrives) and pins `session.model`, so stopping it calls +`killClaude` on a key that sidecar never held — a stop button that silently does nothing. All three had +the one cause, and all three were masked by the client always sending `model`. + +Also fixed after the review, and not in this table because it was found by reviewing the fix for B5/B6: +a superseded OpenCode turn ran its whole completion path against the turn that replaced it. See +`docs/opencode-phase1-review.md`. + --- ## Bucket 1 — Claude has it, OpenCode does not