# Reasoning preview proof

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

This is a manual real-app capture, not a unit-test or scenario-runner verdict. The scenario documentation excludes performance regressions from its supported proof cases.

Environment: Linux, Chromium 156, development web client and real server, dark theme, 1440 x 850 page viewport; Xvfb screen 1440 x 1000. No CPU throttling. FFmpeg records the X11 display at 30 fps. Its elapsed clock and action captions are painted outside Chromium. The green heartbeat uses the browser's requestAnimationFrame, so it visibly stops when Chromium's renderer blocks. The app's existing activity animation is left unchanged.

Base: 42185a6206245c1cde5368e8ce368b384e7a400a.
Head: 8f71c2a691eb83808a1269d60ffbbb7336abc0b3.

The same generated ACP replay runs through the real provider adapter, orchestrator, persistence, transport and web UI on each commit. It does not emulate the OpenCode protocol or a remote connection. No tracked file is modified. Each server uses a separate fresh home with T3CODE_DEV_SEED=0. No live user database is read or copied.

History: 24 reasoning entries, each 160,037 or 160,039 characters, interleaved with completed synthetic read calls. Text is emitted in chunks of at most 16,000 characters to stay below the ACP per-chunk cap. All 24 full texts were checked in each synthetic database. The browser initially pages history; the driver uses Load earlier turns before opening the work group.

Live: a separate thread starts with a ready message. Sending the next prompt emits a completed context-read tool, then a 160,062-character initial reasoning source in small chunks, then 20 deltas at 500 ms intervals. The final accumulated source is 180,813 characters. The driver first leaves the live group collapsed, then expands, collapses, and expands it while leaving individual entries collapsed. Read-only React prop sampling confirms that the real LiveWorkEntryTimelineRow was active with both expanded=false and expanded=true and the large accumulated source; it does not replace the source or its rendering. The inactive live reasoning variant was not reached.

Captures were inspected as full-size frames and sequential frame contact sheets. Final-paragraph screenshots were saved only after two screenshots 500 ms apart were byte-identical. No unit tests were used as evidence.

Observed: the base history recording visibly stops updating its heartbeat while the independent clock advances. The head opens with a much shorter pause. Driver click-to-paint measurements are supplementary: 2,783 ms on base and 536 ms on head. These are single runs, not a benchmark. The base live video visibly stutters during expanded-group streaming; the head heartbeat advances smoothly. Both final-content images show the terminal paragraph beyond the compact preview. This does not claim to recreate the original approximately five-second freeze on older main.

## Re-run

Pass absolute checkout and scratch-directory paths as arguments; the scripts contain no credentials. Use two installed checkouts at the commits above. All paths below are placeholders. Keep the same scratch root for both sides and run browser captures sequentially.

1. `node prepare.mjs CHECKOUT SCRATCH SIDE` once per side (`base` or `head`). It copies the repository's replay agent to scratch and generates the transcript and isolated settings.
2. Start each checkout with `T3CODE_DEV_SEED=0 T3CODE_AUTO_BOOTSTRAP_PROJECT_FROM_CWD=0 PATH=SCRATCH/SIDE-home/bin:$PATH vp run dev --home-dir SCRATCH/SIDE-home`, writing output to `SCRATCH/SIDE-server.log`. Read actual ports from the log. Do not publish pairing tokens.
3. Create a synthetic git workspace and add it with `node apps/server/src/bin.ts project add WORKSPACE --title 'Reasoning preview evidence' --base-dir SCRATCH/SIDE-home`.
4. Seed history with `node apps/server/src/bin.ts thread start WORKSPACE 'Review synthetic notes' --title 'Large reasoning' --provider reasoningReplay --model showcase --wait --json --base-dir SCRATCH/SIDE-home` on both sides.
5. Start the browser with `xvfb-run -a -s '-screen 0 1440x1000x24' node browser-start.mjs CHECKOUT SCRATCH`. Keep it running during the captures. It writes browser connection details to a private scratch file; never upload that file.
6. Run `node capture.mjs CHECKOUT SCRATCH SIDE history` on each side. It mints a pairing link, opens the app, loads history, records opening the work group, and leaves individual reasoning entries collapsed.
7. Run `node prepare-live.mjs SCRATCH` once after both history seeds. It changes only scratch replay files and provides a ready-then-live sequence for new replay sessions using the todo-list recording ID. It does not alter the already seeded history sessions.
8. On each side create the separate live thread with `node apps/server/src/bin.ts thread start WORKSPACE 'Prepare live reasoning' --title 'Live reasoning' --provider reasoningReplay --model todo-list --wait --json --base-dir SCRATCH/SIDE-home`.
9. Run `node capture.mjs CHECKOUT SCRATCH SIDE live` once per side. The driver sends the live prompt and records group toggles through completion. Use fresh state to repeat, because replay advances through its turns.
10. Run `node capture.mjs CHECKOUT SCRATCH SIDE expanded` to expand the first historical entry and scroll to its final paragraph. Stop the servers and browser after capturing.

The supplied generated transcript and replay script record the final live-enabled fixtures. `prepare.mjs` regenerates history fixtures and `prepare-live.mjs` applies the separate live setup. The observations JSON contains data-length and row-path coverage checks, not the primary visual evidence. Sanitized run logs are included for diagnosis; credentials and local paths have been removed.
