# Rebuild issue 19688 evidence

Before: becf853defb6127dbe4447860383777d69346b6f. After: a2af027edb6810a1c1c639ac9555ffff1b5a0325.

Use fresh checkouts for each SHA. Install with `vp install`. Copy seed.py and start-server.py into a new scratch directory. Run seed.py from its file (`python3 /absolute/path/seed.py`), then start-server.py before and after. Update only the two checkout paths in start-server.py if rebuilding elsewhere. Each side gets a fresh T3 home, empty Codex sessions and Claude projects, and its own copy of three synthetic OpenCode assistant messages. Never copy a real T3 database. Do not reuse a home from a previous rebuild.

The original capture used explicit scratch homes to leave the lead's existing .t3 untouched. `T3CODE_DEV_SEED=0` was set for both. Read the actual `[dev-runner]` ports and pair a fresh browser tab with each server's pairing URL. Do not publish startup logs: they contain one-use pairing tokens.

Browser preparation, once per side:

1. Navigate to `/usage`; select Cost. Open All providers, uncheck All providers, check OpenCode, Escape. Wait for the sole `glm-5.3` breakdown row with Unpriced. Refresh usage if seeding happened after startup.
2. Through preview_evaluate, freeze only browser Date using the following expression. Do this after navigation, before capture, on both tabs:

```js
(()=>{const NativeDate=Date;const frozen=1793059200000;window.Date=class extends NativeDate{constructor(...a){super(...(a.length?a:[frozen]))}static now(){return frozen}};return document.fonts.ready})()
```

3. Keep default 16 px interface text / 100% font scaling. DPR was 2. No device or UA emulation was used. Use the preview tools for viewport and forced color scheme. Every clip starts from Usage with no custom price dialog open and no custom rows saved.

`capture-driver.js` contains the exact workflow function bodies used by the executor. `replay-driver.mjs` packages them into `capture({tools,tab,side,fixture,width,theme,mode,extra,parent})` for an agent executor exposing the same tool adapter. It writes a new timestamped directory per invocation. This module is an execution wrapper around the captured functions; the original run also saved its tool-owned raw files under raw-20261027 before selecting final outputs. `tools` uses the enabled `mcp__t3_code__preview_*` methods and `exec_command`; this is not a standalone browser harness or an isolated component rendering.

Run **record and stills separately**. The preview recorder changes frame scale when a preview_snapshot is taken during a recording. The authoritative videos were retaken with the recording-only checkpoint implementation, which waits 1.8 seconds and records a timestamp without taking screenshots. The still mode waits for fonts/resource readiness, settles for 800 ms, then compares two images 500 ms apart and refuses a non-identical pair.

Core cases: C1 and C2, widths 1280x900, 390x844 and the additional 1440x900; each light/dark. Run with `extra:true` only at 1280/dark. C1 extra covers C5/C9 and whitespace C6. C2 extra covers C4/C7/C8/E1/E3/T1. Run C2 extra last because it persists proof-priced; reset that saved row and save before running another empty-table fixture.

C1 records Usage -> glm-5.3 -> Set price; untouched model; focus/Tab/blur; Input=2; clear Input. Narrow runs scroll left before the untouched checkpoint and across the table/back after edits. C2 records environment menu -> Model prices; empty table; + empty row; proof-new model only; focus/blur and narrow horizontal scrolling. The narrow empty-table checkpoint scrolls 210 CSS px so the entire empty message is visible.

The full interaction timestamps are in recording-timelines.json. They are relative to the recorder's actual startedAt and reflect tool latency; they do not pretend the two clocks ran at identical automation speed. Browser Date and synthetic usage time were fixed at 2026-10-27T00:00:00.000Z. The real server clocks were not overridden.

Preview exposes no reduced-motion or network-idle emulation method. Fonts and completed Usage data were awaited, resource readiness checked, and every still passed the pixel-identity settle check; reduced-motion was not emulated. These are real app captures, with no DOM/CSS visual substitutions. Horizontal overflow at 390 is the app's existing table behavior, shown by the recordings.

Use make-diffs.py next to the final before-*.png/after-*.png assets. It produces RGB max-channel binary diffs: >0 and >8/255, with changed pixels amplified to full magenta. No crop, geometric registration, masking, or color correction is applied. The 12 sheets contain whole surfaces. make-video-review.py extracts checkpoint frames from every authoritative recording. upload-assets.py runs ghdrop upload -m on approved files and preserves its stdout verbatim.

Stop only the server process groups captured in before-pid.txt/after-pid.txt. Remove only your own before checkout. No product source edits, commits, test substitution, PR creation or forge writes are part of this evidence task.
