# Capture reproduction

Both real development apps were installed with `vp install` and launched with `T3CODE_DEV_SEED=0 vp run dev` in separate detached worktrees:
- Before: /home/user/wt/pr-33038-cap-before at d1aeed249288585390dbac4fde5b54c35bd5fc06; server 14845, web 6805.
- After: /home/user/wt/pr-33038-cap-after at b78ce3405f725938b6643a2543ae3be33dc3067d; server 14360, web 6320.

Neither app used a database copied from another checkout or live userdata. No paid provider turns were used. Run seed-r2.sh CHECKOUT SIDE after the server is listening; the fixture repository must exist before running concurrent seeds. It creates Minimap A and B with nine completed Replay (dev) turns each. The saved IDs differ by fresh database; messages and dimensions match.

The browser scripts are scratch drivers for T3 preview_evaluate and functions.exec. browser-driver-r2.js and measure-driver.js execute in the page. Replace WORKTREE in rpc-driver.js and guest-harness.js with the checkout path without the first slash, then execute in the page. The run-F11.js, run-F18.js, run-C01.js and capture-still.js drivers execute through functions.exec, with stores tab (owned preview tab id), side (before/after), row (F11/F18/C01), and the page helpers initialized. They write a new timestamped directory each run. selected.json records the chosen directories.

Use the startup pairing flow privately; do not put pairing credentials in artifacts. Both localhost servers set cookies under the same host, so re-pair after changing sides if needed.

Rendering: T3 browser preview, Linux x86_64 Chrome 157, no device emulation, 1440×900 CSS pixels, DPR 2, 100% zoom and default font scaling (16px root), light theme, fine pointer. Full captures are 2880×1800 device pixels. Date is frozen to 2026-11-10T09:00:00Z; performance clocks and timers continue. The browser tool does not expose a reduced-motion override: media query remains false. Before stills, wait for fonts and 500ms resource-idle; pause infinite animations at time zero and finish finite transitions. Capture twice 500ms apart and require ImageMagick AE=0. Recordings retain ordinary animation.

F11 setup: sidebar open; A at distance 0 from bottom; visit B, release follow with evidence.release(), set capture.bottom(300), return to A. Details closed on A and open on B on both sides. Run the same A→B→A sequence without corrective scrolls. Supplemental stills show A after restoration, pointer outside the rail.

F18 setup on A: close sidebar/details. Execute fixtureRpc.ask() and wait for the Replay question to be pending. Set exact bottom (scrollTop 814, scrollHeight 1662, clientHeight 848). Release follow using a synthetic, untrusted upward WheelEvent; it releases follow without scrolling. Queue the long synthetic prompt through the app's normal startTurn command with dispatchMode queue. No DOM footer injection is used. The list footer grows 382px, strip count remains 10, scrollTop remains 814, and zero timeline scroll events occur. This is a controlled detachment stimulus, not an OS-level wheel gesture. End-state stills were recaptured after a fresh browser load at the recorded coordinates to normalize shimmer phase; the recordings are the proof of the no-scroll causal path. Pointer hovers Next turn.

C01 is explicitly a harness: import the actual GuestPage from each running real app and mount it in its own router above the hidden original app root. guest-harness.js provides nine synthetic completed turns and schema-valid synthetic view/snapshot EventSource events; guest fetches receive synthetic 204 responses. The header visibly says C01 HARNESS · synthetic session + EventSource · GuestPage. This verifies GuestPage rendering and local minimap navigation; it does not verify Connect, guest authorization, real session establishment, signed links, or live remote transport. Bottom is scrollTop 777, scrollHeight 1508, clientHeight 731; move 120px above bottom and click Next to return. Pointer hovers the Next location for the stills.

The recording overlay and JSON use their own elapsed performance-clock timestamps. These are the timestamps narrated in the evidence, not the player clock; recorder lead-in and scheduling vary. Do not interpret pair duration differences as application latency measurements.

diff-driver.py uses full-size unmodified selected stills. Diff0 is abs RGB difference ×255 saturated. DiffT8 is white where maximum channel difference >8/255. F11 has 320 changed device pixels, F18 zero, C01 1562. Black F18 diff images are intentional.

All chosen stills and all six diff images were opened and inspected. Every recording was inspected through extracted contact frames spanning its interactions. Rejected setup/motion-phase attempts are not selected evidence. The diagnostic archive includes sanitized logs, chosen measurement JSON and second identical-frame checks; credentials and provider-discovery metadata are redacted.

