# Rebuilding the evidence

Use seed.sh to create the two real-app checkouts and install dependencies. Start each with T3CODE_DEV_SEED=0. No live userdata is read or copied. Pair a separate Preview browser tab to each startup pairing URL; keep those URLs private. The automatic onboarding supplies one project named server and one idle New thread. No send or provider turn occurs.

All drivers execute through Codex functions.exec and the installed T3 preview tools. The tool names are the mcp__t3_code__preview_* names in the scripts. Seed these tool-session store values: beforetab, aftertab, and run (a fresh timestamped directory under the assigned scratch path). Copy the freeze and inspect expressions from final-manifest.json into store('freeze', expression) and store('inspect', expression). Evaluate the freeze expression once in each tab after every full-page navigation. It freezes Date at 2026-10-29T23:35:30.000Z; real timers and caret blink keep running.

Set both tabs to 1280x900 with preview_resize, and use preview_set_appearance colorScheme dark. Default theme identifier is system; there is no custom palette. Close the thread details and main sidebar using their toolbar buttons. Settings > Chat > Rich text composer controls rich/plain mode. Set it ON for R1/R3 and OFF for R2, then close Settings and return to the existing New thread. Do not remain on a draft route, because focus redirect requires an active thread. Sidebar must be closed on both sides.

To execute a driver file, read it using tools.exec_command with cat, then run its output with `new (Object.getPrototypeOf(async function(){}).constructor)('tools','store','load','text','setTimeout', source)(tools,store,load,text,setTimeout)` inside functions.exec. This uses the same browser automation tool client as the manual calls; there is no component harness or alternate browser.

For recordings, set side to before/after and rowToRun to R1/R2/R3, then execute capture-driver.js. The driver captures the whole surface, inserts exact clipboard bytes with DataTransfer and ClipboardEvent, and uses native preview key actions for Up/Down. Visible recording narration updates its timestamp to ensure static baseline pages retain wall-clock duration. No overlay caret is drawn. The captureLog and transcripts arrays in the store contain steps/timestamps and escaped document inspection. R3 is created by typing three backticks and pressing Enter in the real composer.

For stills, set side, stillRow (R1/R2/R3), stillWidth and stillTheme, then execute still-driver.js. R1 requires 1440 and 390, light and dark. Supplemental settled end states for R1/R2/R3 use 1280 dark. Height is always 900 CSS pixels. Set rich mode correctly before each row. The driver waits for fonts and a 600ms interval with no completed resource loads, retaining the persistent WebSocket, then takes two screenshots with a 500ms wait between calls. Before each screenshot it uses Left then Right to reset the unmodified native caret blink phase without changing the final selection. Compare decoded pixels, including the caret. Every accepted pair is identical.

Preview's screenshot API caps PNG width to 1280 pixels: 1440x900 CSS yields a 1280x800 PNG; 1280x900 yields 1280x900; 390x900 at DPR 2 yields 780x1800. Recordings retain 2560x1800 pixels for 1280x900 CSS at DPR 2. No device emulation, zoom 1, font scale 100%, Linux Chromium 156.0.0.0, root font 16px, composer 14px Inter Variable/system sans. Reduced-motion emulation is unavailable in Preview; default panel animation duration is zero and captures are settled. No CSS is altered to fake a caret.

Save final-manifest.json from the captureLog, transcripts, and latest stills data (deduplicated by output filename). Run derive-evidence.py, review-recordings.py, and assemble-caret-sheets.py. Zero threshold compares the maximum absolute RGB-channel delta against 0; thresholded compares against 16/255. Both masks amplify changed pixels to full magenta on black. Whole-surface sheets contain both originals and both diffs. Caret sheets are supplemental crops sampled from the full-surface recordings; they do not replace recordings.

Open every original capture, diff, and review sheet before upload. upload-evidence.py invokes ghdrop upload -m and retains its stdout verbatim, plus parsed URLs. Its raw-captures archive preserves all frames and probes. Startup logs contain pairing tokens and must never be uploaded unchanged. No evidence or scripts belong in git.
