## Evidence

Captured **4 / 4 scoped rows (R1–R4)** for [#32921](https://git.cafe/pingdotgg/t3code/pull/32921). BEFORE [bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9); every AFTER capture is [e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6), after restarting that checkout’s own dev server. Captures predate the later uncommitted popup edits. R5-popup was withdrawn by the lead.

Environment for every capture: Google Chrome 151.0.7922.108, Linux/Xvfb, desktop mouse, no device emulation, **1440×1000 CSS px, DPR 1, 100% font scaling and zoom, light theme**. Integrated server browser: headless Chrome 157.0.8103.38, 960×640 CSS px, capture scale 2. Both sides use fresh checkout-local databases with `T3CODE_DEV_SEED=0`, identical synthetic files, project, thread, and canceled-before-provider message. R1/R2 client Date is frozen at 2026-11-10T10:30:00Z after auth; R3/R4 use real Date in a fresh context with no visible clock. Server time stays real. 390px and dark were outside the required capture set because there is no UI diff. HTTP only; HTTPS is unverified.

Only the client resolves `repro-box.tailnet-repro.ts.net` through Chromium host-resolver rules. The server returns ENOTFOUND for that hostname. The exact public client origin is allowed through `T3CODE_DEV_ALLOWED_ORIGINS`; IPv4-to-IPv6 loopback relays preserve the URL. BEFORE web/server ports: 6034/14074; AFTER: 6035/14075.

**R1 — client-only hostname · report.html — 1440×1000, light**

| Before | After | Diff0 | DiffT |
|---|---|---|---|
| ![R1-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1c3ae73b0cfaf94b/R1-before.png)<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) | ![R1-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0ae855d7a5dd6dd9/R1-after.png)<br>[e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6) | ![R1-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2edc88ebfee29fa9/R1-Diff0.png)<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6) | ![R1-DiffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0c8816fb0fcfc7e4/R1-DiffT.png)<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6) |

[R1-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/465b6d0d324f5e69/R1-transcript.txt)

**R2 — localhost control · AFTER only — 1440×1000, light**

| Before | After | Diff0 | DiffT |
|---|---|---|---|
| Not requested | ![R2-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/544726a0cd53a20c/R2-after.png)<br>[e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6) | Not applicable | Not applicable |

[R2-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/77b1227cce4ad87e/R2-transcript.txt)

**R3 — relative CSS, JS, image and iframe — 1440×1000, light**

| Before | After | Diff0 | DiffT |
|---|---|---|---|
| ![R3-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/75ba394234c9431c/R3-before.png)<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) | ![R3-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/13993f60bd24be05/R3-after.png)<br>[e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6) | ![R3-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7cbbc4d438f8b65f/R3-Diff0.png)<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6) | ![R3-DiffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dd18a706b092d24b/R3-DiffT.png)<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6) |

[R3-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/94e1a1177df1df58/R3-transcript.txt)

**R4 — workspace PDF pages — 1440×1000, light**

| Before | After | Diff0 | DiffT |
|---|---|---|---|
| ![R4-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ff3205385edf9f92/R4-before.png)<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) | ![R4-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0314e41fd7d543d6/R4-after.png)<br>[e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6) | ![R4-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c84a881a3f8e4b13/R4-Diff0.png)<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6) | ![R4-DiffT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/96fa8a9a422da065/R4-DiffT.png)<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [e66d82919a](https://git.cafe/pingdotgg/t3code/commit/e66d82919a27f1842525840588f5ad8ec8b496e6) |

[R4-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bdaa7d86a4daf840/R4-transcript.txt)

R1 retains the public hostname in the integrated address bar: BEFORE `ERR_NAME_NOT_RESOLVED`; AFTER the report renders. R2 navStatus is `Success` at localhost. R3 AFTER has green CSS, JS-written text, blue/gold image and purple iframe; the server transcript records HTTP 200 for dependencies.html, style.css, app.js, pixel.png and frame.html. BEFORE fails before any asset HTTP request reaches the server. R4 AFTER shows the native PDF viewer, page 1/1, thumbnail and the PDF’s actual text; BEFORE shows the DNS error.

Every still waits for network idle and fonts, then accepts only two pixel-identical screenshots 500 ms apart. Every final still and diff was opened and visually inspected. Diff0 uses ImageMagick `compare -fuzz 0%`; every unequal pixel is amplified to red on white. DiffT uses the same command at `-fuzz 5%`. Full commands, pixel counts, screenshot SHA-256 hashes and settled-frame results are attached.

**What else changed**

- Across R1/R3/R4, the browser DNS error icon, heading, explanatory text, error code, Details and Reload controls are replaced by the loaded document. HTML background colors, margins, borders and text are the synthetic document’s own styles.
- Tab titles change from the hostname to Workspace report, Workspace dependencies, or guide.pdf; tab widths and the adjacent + button move accordingly.
- The existing Dimensions/Responsive/960×640 toolbar appears once a page loads; it is blank in the failed state. R1’s back/history control and address-bar action availability also change with the successful navigation.
- Address bars retain the same public hostname. Isolated server ports differ (6034 → 6035), and signed asset tokens differ. Tokens are redacted as <token> in transcripts.
- R3 adds the green CSS panel, executed-JS text, blue/gold image and purple iframe content, including all document borders and spacing.
- R4 adds the native PDF toolbar, dark viewer background, page count 1/1, 100% zoom, thumbnail, scrollbar and visible page contents. The page extends below the viewport normally; all proof text is visible.
- R1 recordings have small timing differences and server-created message timestamps differ (10:44 vs 10:45 UTC). Both have the same synthetic message, canceled run and Replay Showcase fixture. Initial project-menu/sync UI is transient during the recording pre-roll; settled stills contain neither.
- No additional unintended difference was found in the settled frames.

**R1 recordings — same interaction**

BEFORE: 00:00 synthetic links ready; 00:01.00 right-click report.html; 00:01.05 choose “Open in integrated browser”; 00:01.49 navigation fails; 00:01.54 maximize; 00:03.19 settled still.

AFTER: 00:00 synthetic links ready; 00:01.00 right-click report.html; 00:01.04 choose “Open in integrated browser”; approximately 00:01–00:03 document settles; 00:03.84 settled still. The driver’s early navigation marker is informational; the accepted still waits for identical frames.

[R1-before.webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b16cb6766b1abaf2/R1-before.webm)

[R1-after.webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8d3595e2b02638f7/R1-after.webm)

**Seed and drivers**

[seed.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/323b14db1e3294b1/seed.py) · [run-capture.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4db10046d39ec410/run-capture.mjs) · [client-loopback-relay.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6bc19763a244e14c/client-loopback-relay.mjs) · [make-diffs.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a35d2994f2a73388/make-diffs.mjs) · [prepare-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2579664967a59307/prepare-evidence.py) · [publish-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/339397ac2c72a825/publish-evidence.py)

Synthetic source files: [synthetic-workspace.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/47439427b4e742be/synthetic-workspace.tar.gz)

Exploratory helper scripts (not needed for the final capture driver):

[control.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6525211bd8381955/control.mjs) · [debug-client.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ad2c3cdf1d067293/debug-client.mjs) · [inspect-all.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/19e7e9352f813007/inspect-all.mjs) · [inspect.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/af093d26aa2f8a50/inspect.mjs) · [maximize.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bf37d161333a71a9/maximize.js) · [navigate-thread.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3da5a818284ee82c/navigate-thread.mjs) · [open-report.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/38fb7e6c61181709/open-report.mjs) · [probe.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a9f353346b92d32a/probe.mjs) · [rpc-init.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5bdac32fa08369e4/rpc-init.js) · [seed-message.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f8c715798ca653dc/seed-message.js) · [seed-thread.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9bfae8677970c388/seed-thread.js) · [state.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4e2edc3e9349b195/state.js) · [ws-debug.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a580c347853452c8/ws-debug.mjs)

[rendering-notes.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/98bdcb24783c64dd/rendering-notes.txt) · [capture-provenance.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5966cdd3fd65fc66/capture-provenance.json) · [diff-metrics.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2816a9e0d1950174/diff-metrics.json)

Unverified: HTTPS public origin only. No scoped row is missing. Both owned dev servers, client Chromium, Xvfb and relays were stopped; the temporary BEFORE worktree was removed. The supplied AFTER worktree and its implementer’s edits were left untouched.
