Evidence capture for [#32434](https://git.cafe/pingdotgg/t3code/pull/32434).

QW uses the test fixture at head [7f09e9f](https://git.cafe/pingdotgg/t3code/commit/7f09e9f3dcd65ec45c74f52213a4ac9fd0714bae) on both sides. The before checkout initially has only packages/provider-opencode/src/server/v2/adapter.ts checked out from [20c3dd3](https://git.cafe/pingdotgg/t3code/commit/20c3dd3689782bfcb1a04332086d08017028c718). Run vp install per checkout, then run-qw.py before and run-qw.py after. The transcripts contain the exact test command and adapter provenance. Before fails at the pending-question assertion; its replay-incomplete error follows that failed assertion. After checks pending form, reply, and turn completion in the same regression test.

QL uses the entire merge-base checkout for before and the entire head checkout for after. After QW, the temporary before checkout was reset to the merge-base before its dev server started. Each T3 dev server starts with T3CODE_DEV_SEED=0 and creates its own .t3 database; no live database is read or seeded.

OpenCode 2 is @opencode/cli@2.2.5, selected by the instance's binaryPath. opencode-ai@2.2.5 returns npm E404. The existing /usr/local/bin/opencode is generation 1 and was not used for QL. prepare-fixture.py records the provisioning commands, using the existing proxy provider options in an isolated native config; credentials are not part of the upload. The native server uses a random generated password. start-native.py starts it on an ephemeral loopback port. One native server serves both T3 instances with separate fresh native sessions.

For each side, start-dev.sh starts vp run dev, records its PID, disables seeding, and enables WS diagnostics. Read the dev-runner ports and startup pairing URL from its private raw log. Pair the Browser panel to that URL. In Settings > Providers, add OpenCode with opencode2-isolated.sh as binaryPath, the native server's URL, and its generated password. Start record-native.py <side> before submitting the prompt; it only subscribes to the real native SSE stream.

In the app, Add project > Local folder and enter the scratch question-fixture directory. Choose OpenCode and a low-cost model through the configured proxy (model metadata withheld from public evidence). Submit: "Use the question tool to ask me which color I prefer: red or blue. Do nothing else."

Use preview_wait_for plus preview_snapshot to establish that the card is fully rendered. Browser panel viewport is 1440x900 CSS px, Chromium 157.0.0.0 on Linux x86_64, light theme. preview_snapshot save=true writes at device scale 2. redact-capture.py downsamples the full window to 1440x900 and masks only the model-selector button rectangle (805,842.75,155,28). Both output PNGs were opened and visually inspected. Select Red and submit the answer; verify form.replied and session.execution.succeeded. Browser click timeouts were checked against actual app state before retrying.

extract-ql.py opens only the two test servers' databases read-only. It combines the committed server event journal with native SSE frames as a native event log, preserving session/form/request/turn IDs. Provider-turn records omit model and usage metadata. No native event is injected; QL is an active-turn integration control and does not reproduce wake-before-continuation timing. QW provides deterministic race proof.

No diff images are needed because no rendered code changed. UF and PW are optional and skipped.

Upload only the four named transcripts, two redacted PNGs, driver scripts, and this runbook. Keep private config, passwords, startup URLs, raw diagnostics and dependency installs out of uploads. Stop the three servers using retained PIDs, close the preview tab, remove the temporary before checkout, and delete the scratch directory after uploads. Leave the after checkout clean.
