# OpenCode interrupt timeout reproduction

Use a separate checkout and fresh T3 home for each revision. Install dependencies with `vp i`. Start each app with `T3CODE_DEV_SEED=0 vp run dev`. Web viewport: 1280 x 800 CSS pixels, light theme. No live database is copied.

Install `@opencode/cli@2.2.3` into an isolated directory. Start that binary with `serve --hostname 127.0.0.1 --port 17401`, keeping its output in a private log. Start `node interrupt-proxy.cjs <private-server-log>`; it listens on 17402 and authenticates upstream using the password in the log. It forwards requests and streams responses, except POST session interrupt, which it deliberately leaves unanswered. Do not upload that private log.

Create an empty git project containing the accompanying executable build.sh. Register it using `node apps/server/src/bin.ts project add --base-dir .t3 --title 'Build interruption' "$PROJECT_DIR"`.

Configure the worktree's OpenCode provider instance with driver `opencode`, enabled true, the installed binaryPath, and serverUrl `http://127.0.0.1:17402`. The proof used the same available tool-capable model for both runs; choose it through the private PROOF_MODEL environment variable.

Start a thread using:

```sh
node apps/server/src/bin.ts thread start --base-dir .t3 --provider opencode --model "$PROOF_MODEL" --title 'Build interruption' "$PROJECT_DIR" 'Run ./build.sh in the foreground using the shell tool. Do not background it. Wait for it to finish.' --json
```

Open the thread in the paired web app. Close the thread details panel and dismiss any stale provider-health alert before recording, so no host identity is visible. Wait until build.pid and worker.pid exist and both processes are alive. Start a tab recording and click Stop generation. Keep recording beyond ten seconds. Inspect the UI and the exact PIDs written by build.sh. Do not infer process termination from the UI.

Base observed: after ten seconds, Run interrupted / Stopped by user, idle composer, no Force stop, both processes alive.
Head observed: after ten seconds, Agent not responding to Stop, Force stop offered, turn and command remain running, both processes alive. Separately pressing Force stop on head terminalized the T3 run but did not kill this externally hosted process tree.

The videos redact only the composer model selector; the behavior and controls under test are preserved. The process transcript contains synthetic process details only. Recordings were inspected at one frame per second and at the outcome frames before upload.

AI-assisted; verified with the tests and tools listed above.
