# Workspace preview evidence driver

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

Environment: Linux; real T3 Code server and Vite web client from each commit in a separate worktree; server-owned Chromium; 1280 x 800 CSS viewport, device scale factor 2; light app UI. Each server starts with T3CODE_DEV_SEED=0 and a fresh database. The same synthetic fixture is shared by both runs; no live database is copied.

Base: 871b00907d0bcf2705224de6c6e90de925c7cbb9
Head: 48f0d800aed7d313df31192a0e8e71ee2d2a0fa1

## Scope

This is a deterministic adaptation of the network failure, not the complete two-machine Tailscale/reverse-proxy reproduction. The client is opened through its local dev URL. The driver calls the real web app openFileInPreview helper with https://preview-unreachable.invalid as the client asset origin. That domain does not resolve in the server browser. Both commits receive the same helper call, signed workspace grant, and synthetic files. The context-menu click and a publicly reachable reverse proxy are not verified.

## Run

1. Install each worktree with vp i. Start each with T3CODE_DEV_SEED=0 vp run dev. Read each actual web port from its dev-runner output. Pair a Browser panel tab to each web client using its startup URL, keeping credentials private.
2. Run python3 seed.py <absolute-synthetic-workspace> once to create the shared six-file fixture.
3. Evaluate browser-driver.js in each web client using preview_evaluate; then call proofSeed({workspace:<absolute-synthetic-workspace>}). Use the returned environmentId to navigate that client to /<environmentId>/preview-proof-thread. Seed only once in each fresh database.
4. Call proofPrepare() to start a blank integrated server-browser tab. Hide the main sidebar on both sides. Set both outer browser viewports to 1280 x 800 and appearance light.
5. Start recording the outer client tab. Call proofOpen({workspace:<absolute-synthetic-workspace>,checkoutRoot:<absolute-worktree-root>}). Click Maximize panel. Wait for the result to settle.
6. Inspect HTML, relative CSS, JavaScript, SVG image and iframe. Click at CSS coordinates (180,550), the fixture's target=_blank link when the document loads. On base there is no document or link; the identical click leaves the error page unchanged. On head a new integrated tab displays next.html and its relative stylesheet and image.
7. Stop recording. For final stills, take two screenshots at least 500 ms apart and retain them only after byte comparison succeeds. Uploaded PNGs and videos are resized from 2560 x 1600 pixels to 1280 x 800. Black masks remove signed asset tokens; environment labels are added. No content area is edited.

## Observed

Base displays This site can't be reached, DNS address could not be found, ERR_NAME_NOT_RESOLVED. Head renders all relative dependencies and opens next.html in a new tab, keeping the unreachable HTTPS hostname in the integrated address bar. No tests are offered as evidence.
