# Rebuild the evidence state

Before: commit 6d450a4284. After: commit 5c1c8b0004. Use each revision's own checkout and fresh isolated T3 home. Never seed from the VM's live T3 data.

1. Run `vp install` in the before checkout. Run `seed.sh` once to create the public-repository project fixture. `start-servers.py` starts both checkouts with `T3CODE_DEV_SEED=0` and separate scratch homes, records their process group leaders in a private file, and saves logs locally. Read each actual web port and pairing URL from its log. Do not upload those logs or pairing URLs.
2. Use T3 Code's preview browser tools. Open each pairing URL in a separate owned tab, set a 1440×900 freeform viewport, and select dark theme. Add the fixture directory using Add project → Local folder. Open `/pull-requests?involvement=all&state=open&host=github.com`. This GitHub provider filter is essential.
3. Evaluate the trimmed source of `instrument.js` in each loaded page. It freezes browser Date at 2026-10-29T13:30:00Z and observes only pull-request RPCs. Wait until the sidebar's relative time reflects the frozen clock. Refresh and wait for a successful text-free list response before recording. The core live baseline must include the Toast/Cursor identities in its first 99 rows. Public data can change; the manifests preserve the successful response identities from this run.
4. `driver.js` is an async function expression accepting `(tools, config)` in a Codex functions.exec context. `tools` exposes T3 preview tools and `exec_command`/`apply_patch`. Evaluate the file as a function, then call it with `{tabId, side: 'before'|'after', fixture: 'F1'..'F6', outputDir: '<new timestamped scratch directory>'}`. It uses real per-key presses, records the interaction, waits for successful query RPCs, saves sanitized manifests, waits for fonts, and accepts a still only after two screenshots at least 500ms apart compare identically. The current driver also waits for visible menu options and moves the pointer away before stills; these were added while retaking F4.
5. F1 and F3 use live public GitHub responses, with no harness. For each controlled fixture F2/F4/F5/F6, start on the same clean route, evaluate `instrument.js`, set `window.captureFixture = {fixture: 'F2', projectId: '<project UUID from this server>'}`, then evaluate trimmed `harness.js`. Refresh and wait for its synthetic baseline before calling the driver. Prefer a fresh page per fixture so old role-partition caches cannot contaminate the baseline. A visible HARNESS CAPTURE badge identifies controlled answers. The actual page, query parser, debounce, caller gate, grouping, rows, filters, selection and detail panel all run normally. The harness intercepts only forge RPC replies; it never patches production files. Its mutation guard rejects `pullRequests.runAction`.
6. F2 has host H1/H2 plus baseline H1/B3/B4/nonmatch. F4 includes the eligible authored row and five explicit negative controls; its authored server response excludes the other author, while the actual client applies draft/review/label/excluded-label qualifiers. F5 supplies a failing Toast baseline and empty query replies. F6's Checks menu baseline contains only passing rows, with the failing row present solely in the unfiltered control data.
7. `package-evidence.py` copies the accepted runs, creates full-surface comparison sheets, derives review filmstrips, and writes comparison metadata. Diff0 marks any RGB channel difference >0 magenta at full intensity; DiffT uses >16/255. The unchanged context is quarter brightness. Neither image is cropped. Review full captures and diff images before upload.
8. Upload approved media, sanitized manifests and these scripts with `ghdrop upload -m`. Keep the emitted Markdown unchanged. Never upload the private server homes, credentials, cookies, pairing links or raw server logs. Stop the captured process groups and close owned preview tabs. Remove only the before worktree; preserve the lead's after checkout and evidence.md.

Rendering: Linux x86_64, shared preview headless Chrome 156, no device emulation, CSS viewport 1440×900, DPR 2, default 16px font/100% scaling, dark, scroll top, default merge-readiness sort. Preview PNGs are downsampled full-surface 1280×800; original MP4s are 2880×1800. The preview API has no reduced-motion emulation or global network-idle primitive. Successful relevant RPC completion, font readiness, a settle interval and pixel-identical screenshot pairs were used; reduced motion remains false and is recorded explicitly.

Timing: manifest actions and RPC completion timestamps are monotonic browser times relative to `recordOffset`, sampled immediately before recording starts. They approximate video offsets (tool/screencast latency can shift them by about one second). Videos preserve their original timing. F6-after includes a long automation pause between selecting Passing and typing; the baseline response completed at approximately 5s, so that idle period is not a host-search delay.
