# PDF chip visual evidence

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

Two detached worktrees were used: base f86e21f7cce7324119dadf61064965d83c539455 and head 232c908b0ae4d851f99fb0239aa7c8d3f67454dc. Fetching origin failed twice with HTTP 503, so the base is the merge-base with the existing origin/main reference.

Run `vp i` in each checkout, then `python3 seed.py CHECKOUT SCRATCH`. The seed creates the same valid synthetic PDF and replaces only the development replay agent's reply text with a PDF markdown link. It does not change rendering code. Start each web app with `T3CODE_DEV_SEED=0 vp run dev`; pair its own browser tab. No production database is used.

Evaluate `evidence-driver.js` as a function with the T3 preview tools object and config `{tabId, origin, pdfPath, failedPdfPath, outputDir, side}`. Use a new output directory for each run. The driver creates a synthetic thread through normal app commands, uploads the PDF through the file input, waits for upload completion, captures the composer, sends, waits for the replay reply, and captures the sent chip and markdown PDF link. It repeats in standard light and dark appearances, then in a custom light theme with a blue message surface and white message foreground. It finally redirects only attachment-upload requests to a missing endpoint and captures the real failed-upload state in both appearances. The title is set through the normal metadata command to remove generated-title variation.

Every still requires two byte-identical screenshots 500 ms apart. All final images were opened and visually inspected. This is a static colour fix; no timing behaviour is claimed.

For Electron, run `vp pack` separately in apps/server and apps/desktop in each checkout, and install its Electron runtime with `node node_modules/electron/install.js` from apps/desktop. Launch the actual built main process with `headless-desktop`, `--no-sandbox --disable-gpu`, and a unique remote-debugging port. Use isolated T3CODE_HOME and XDG directories, T3CODE_DEV_SEED=0, and VITE_DEV_SERVER_URL pointing at that checkout's Vite server. `desktop-launch.cjs` loads the checkout's actual Electron main process; provide EVIDENCE_CHECKOUT and EVIDENCE_STATUS. Complete onboarding with project-history import unchecked. Keep the native pointer outside the app before capture.

Run `node electron-driver.mjs PORT CHECKOUT OUTPUT SIDE evidence-driver.js PDF FAILED_PDF`. The adapter reloads the native app, waits for its environment snapshot, creates a synthetic project through app RPC, configures the same free development replay agent, and runs the same evidence driver against Electron's real webContents. It adapts the app's hash routes and moves away from hover targets before capture. Both public driver files were downloaded again and executed for the final native pairs; the public evidence driver was also downloaded and rerun for the final web head images.

Observed: base uses red names/sizes for successful PDFs; head uses ordinary text while retaining the red PDF icon. The reply PDF file link changes the same way. Failed uploads remain red on both commits. Matched frames differ only inside the successful PDF text bounds.

Qualification: the contrasting theme sets --context-chip-message to white, but these actual PDF chips render with data-slot=tooltip-trigger. Therefore the ancestor data-slot=context-chip selector does not give them the message-ink override. The blue-bubble captures show real rendering; they do not prove the otherwise-expected white text/icon override branch.
