# Reproduction notes

Before: [f12bb6229c](https://git.cafe/pingdotgg/t3code/commit/f12bb6229c007a12d24fd2e539222733778ac9ea); after: [43ba10ceb3](https://git.cafe/pingdotgg/t3code/commit/43ba10ceb310dabbc201ea2ab5483cee626ce9c9). No code edits.

Use a new timestamped CAPTURE_ROOT below /tmp/lead-32738-r1/capture-2 for each fixture rebuild. Create its bin directory and provide tea 0.16.0 there. Start start-forgejo.sh; wait for its HTTP API and the initial migrations before seed-forgejo.py. Credentials are fixture-only and excluded from uploads. Start each side with start-app.sh CHECKOUT SIDE and T3CODE_DEV_SEED=0. Run seed-app.py CHECKOUT SIDE for fresh app projects using that side's own CLI; read the generated project/environment IDs from its private seed output. Pair the owned T3 preview tab through that server's local pairing flow; never publish its pairing URL. Full reload with the real Date before pairing a fresh server, since SPA navigation preserves clock overrides.

Set preview viewport to freeform 1440x900 CSS, light. Hide the main sidebar with Ctrl+B and maximize the PR detail panel. R1 uses /pull-requests?selectedEnvironmentId=ENV&selectedProjectId=PROJECT&host=forgejo.127.0.0.1.nip.io%3A33038&selectedHost=forgejo.127.0.0.1.nip.io%3A33038&repository=evidence%2Fff&number=1. Call captureR1(tools, tabId, url, prepareSource, outputPrefix) from capture-r1.js using web-prepare.js as prepareSource; copy the returned owned capture paths to their destinations.

The fixture pins issue creation/update time to 2026-11-10T12:23:00Z. web-prepare.js pins Date to 12:24:00Z while real timers keep working, so all R1 stills and the rebuild say updated 1m ago. It emulates the JS reduced-motion preference and suppresses CSS animation/transition durations; preview does not expose a browser-native media setting. Wait for fonts and one resource-idle second, then save pairs 500ms apart and require AE0. ImageMagick compare -metric AE -fuzz 0%/5%; amplified diff sets every changed pixel to saturated red over white. No masks, crop, or geometry registration are used for the published stills.

The after rebuild stopped both first servers, destroyed only the disposable Forgejo container, seeded a new Forgejo and fresh after database, added projects through the same CLI driver, paired after a real reload, and called the same captureR1 function. R1-rebuilt-* are the accepted rebuilt files; files named R1-rebuild-* are failed pairing attempts and are not proof. Results are in rebuild-results-final.txt. All within-side pairs are AE0. Original/rebuilt idle has 38 changed pixels at zero threshold and 4 at 5%; visually all are raster edge coverage at the top-right restore/actions/checkout icons. Menu original/rebuilt is AE0 at both thresholds. The relative timestamp and all content are identical.

For R5 use an independent success branch from add-success-fixture.py (SUCCESS_BRANCH chooses a new branch name). The accepted before clip uses synthetic pull 5, and the accepted after uses pull 6 from an equivalent subsequent branch; their suffixes differ. Both were open at capture start. Reset Date to the real Date for recordings, retaining motion suppression. Navigate/maximize and settle fonts/resources before success() in capture-web.js. That function uses normal merge clicks, Escape cancellation, expiry, and real host requests. A capture-only focusin listener blurs only the repository button when it receives focus, dismissing its unrelated tooltip synchronously; it neither hides DOM nor changes merge behavior. It is removed at the end. No tooltips are composited out. Inspect-host.py captures the real disposable host result before/after. R5-proof-host-* and R5-after-proof.mp4 are the accepted success artifacts.

Every encoded frame in accepted new videos was decoded and visually inspected before upload, including the entire viewport and the header at readable size. R3/R6/R7's original encoded frames were also re-inspected; no matching repository-tooltip problem appeared. Their advancing clocks are retained and disclosed. Android links and footage are unchanged.

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