# OpenCode failed steer proof

Run the same procedure on base 4a53d80239dfcea6a5701a080c70fc3f2aa0da31 and head 368f13d6c8efa975ed7baa8180c9857802f554d3.

Environment: Linux web development app, Chromium preview browser, 1280 × 800 CSS pixels, light theme, OpenCode 1.19.5, openai/gpt-6-luna. Each app uses a fresh isolated T3 home with T3CODE_DEV_SEED=0. Synthetic project only. The proxy forwards requests and real SSE events to OpenCode. It holds session.idle and idle session.status events while armed, and returns HTTP 503 for prompt submissions after /proof/reject. It never synthesizes provider output or session status.

1. Start `opencode serve --hostname 127.0.0.1 --port 18971`.
2. Start `python3 proxy.py` (listens on 18972).
3. In each checkout, install with `vp i`, then run `T3CODE_DEV_SEED=0 vp run dev`.
4. Enable the OpenCode provider instance and configure its server URL as `http://127.0.0.1:18972`.
5. Add a synthetic Git project using `node apps/server/src/bin.ts project add <synthetic-project> --title 'Failed steer proof' --base-dir .t3`.
6. `curl http://127.0.0.1:18972/proof/arm`.
7. Start a turn: `node apps/server/src/bin.ts thread start <synthetic-project> 'Reply with the single word: hello' --title 'Failed steer comparison' --provider opencode --model openai/gpt-6-luna --base-dir .t3 --json`.
8. Open the returned thread in the paired web client. Close the thread details panel. Wait for real output `hello` and for `/proof/status` to report held idle events. OpenCode `/session/status` is `{}`.
9. Enter `Also say the README is covered.` in the composer.
10. `curl http://127.0.0.1:18972/proof/reject`. Start recording. Click the composer’s Steer message button.
11. Allow retries to settle, then `curl http://127.0.0.1:18972/proof/release`. Verify `/session/status` remains `{}`. Observe the app.

Observed: base sent five refused steer requests and stayed Working after idle release. Head completed the original provider turn after the first refused steer by reconciling the real idle status. Its queued steer subsequently became a separate failed run (also rejected with 503), displaying a provider error; the original `hello` remained preserved and there was no running provider turn or Stop button.

The recordings begin with `hello` already visible and show the same steer interaction. Head was run first; base second. This specifically exercises the refused-HTTP-request branch, not the ambiguous connection-reset/accepted-request branch.
