# Rebuild the capture

1. Check out the exact before and after commits listed in recording-plan.json in separate worktrees. Install each with `vp install`.
2. Start each real app using `T3CODE_DEV_SEED=0 vp run dev`; retain the spawned PID. Read its allocated web port and pairing URL from the log. Pair only the test browser. Never use the live T3 database or hard-code a bundle origin.
3. Use T3's Browser panel Chromium (Linux), viewport 1280×900, DPR 2. Set Light via Appearance → Color scheme (`button[aria-label="Use light mode"]`); navigate to `/settings/general`. Wait for the real settings UI and document.fonts.ready.
4. The final wide recordings use capture-driver.js; compact uses capture-driver-r1.js (same event tuples, shorter outcome holds). Evaluate the matching driver, then `Capture.init('before', '<full-before-SHA>', 'light')` or the matching after values. Start the panel recording, retain `startedAt`, then evaluate `void Capture.wide()`.
5. When `Capture.report.complete` is true, evaluate replacement-driver.js and await `Capture.replacement()` while the recording continues. This tests native insertion at the browser editing selection without manually focusing or selecting. Chromium refocuses its retained input for insertText on the before side, appending `font` at the retained caret (`themefont`); after the shortcut selects the whole query, insertion produces `font`. This is a native editing command, not a simulated trusted text key. Stop the recording and copy its MP4 to a new timestamped scratch run directory. Export `JSON.stringify(Capture.report)` as the companion log. Subtract the interval between report.initializedAt and recording.startedAt from event timestamps to obtain clip timestamps.
6. Through the real Appearance page, set Dark (`button[aria-label="Use dark mode"]`), return to General, resize the viewport to 700×900. Evaluate capture-driver.js again and initialize the same side/SHA with theme 'dark'. Start recording; run `void Capture.compact()`. Wait for complete; export report and stop recording.
7. Both scripts use the same real controls and catalog on each side. UI event seeding calls the native input value setter and emits a bubbling input event so React updates its real search state. The real-app popup and keybinding capture are exercised without saving drafts. No component or app event handler is replaced.
8. Synthetic events do not prove native browser Find suppression, OS keyboard switching, Electron routing, or mobile behavior. The cyan outline is an evidence annotation on the actual focused Search settings input; the product's unstyled input has no ring. Date is frozen with a Date shim; performance.now runs for chapter timing. Motion reduction is a matchMedia shim plus disabled CSS animation/transition durations. No standalone still proof is supplied; decoded contact sheets are recording inspection aids.
9. The Latin mismatch negative Ctrl-U opens the app's Usage view through its pre-existing global binding on both commits. The wide script records that outcome, closes Usage and reopens Settings using real UI controls. This is not a search takeover.
10. Upload the recordings, logs and scripts with `ghdrop upload -m`. Stop the retained server processes and remove the before worktree. Do not commit or push.

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

## Delivered recording assembly

The final wide pair consists of the unchanged core chapters from run-20261110T034000, the independently recaptured F09 sequence from run-20261110T035200 using negative-driver-verified.js, and the actual insertion chapter from the core session. Run assemble-proof.py to join those segments in the new run-20261110T035600 directory; per-side edit-map.json records every source interval, and logs retain sourceVideoTimestamp/sourceSegment. The compact sequence only loses its idle tail. Run process-evidence.py on the assembled directory to add MP4 chapter metadata, then inspect-recordings.py to decode inspection sheets. No frames in a retained interaction are accelerated or rearranged.

The verified negative driver focuses the actual nested command popup and presses Escape twice: project-content search returns to command mode on the first Escape, then the second closes it. It asserts that the popup is gone before the next reset. negative-driver.js was an exploratory attempt and is excluded from delivered proof. Global Ctrl-U opens Usage and its real Close button returns to Settings.

Normalize frame rate before trimming when assembling: the panel produces variable frame durations, and trim-before-fps can extend the last retained frame across a join. assemble-proof.py applies fps=10 before trim; source intervals and final event timestamps remain explicit.
