# Current-head desktop evidence reproduction

PR [#29023](https://git.cafe/pingdotgg/t3code/pull/29023). Before [cefb544af3](https://git.cafe/pingdotgg/t3code/commit/cefb544af3c98224874419198c0359b652ca3c94); after [fdd40f40bd](https://git.cafe/pingdotgg/t3code/commit/fdd40f40bd90c7503b23387c59d451c2354548a1).

All data is synthetic. Neither live databases nor another lead's state were read or seeded. No tracked files changed. `T3CODE_DEV_SEED=0` was set for both desktop dev runners.

1. Keep the after checkout at `/home/ubuntu/wt/pr-29023`. Create before using `git -C /home/ubuntu/t3code worktree add /home/ubuntu/wt/pr-29023-before cefb544af3c98224874419198c0359b652ca3c94`; `vp install` there. Fetch Electron with `node node_modules/electron/install.js` from each checkout's `apps/desktop`.
2. Extract this round's scripts archive so scripts live in `/tmp/lead-29023-r2/evidence-capture/scripts`. The archive also retains predecessor scripts as audit history; the active seed is `seed-reproduction.js` and active driver is `capture.mjs`. Create `fixture-project/fixture.txt` with `Synthetic focus fixture for PR 29023.\nThreads A and B contain no user data.\n` and `git init` the fixture directory. Make `scripts/pi-scope-fixture.py` executable. This fixture only maintains the legitimate Pi RPC caller scope, with no preview implementation.
3. Start the real app on each revision using `T3CODE_DEV_SEED=0 T3CODE_DESKTOP_REMOTE_DEBUGGING_PORT=19223 headless-desktop vp run dev:desktop` (19224 before). Give before a separate `XDG_CONFIG_HOME` below scratch. Retain every spawned PID/session. Read backend/Vite ports from logs; this run allocated after 15503/7463, before 14171/6131.
4. The repository dev launcher omits `--disable-gpu`. Pause its captured dev-electron launcher PID and terminate only its captured Electron child. `scripts/launch-electron.mjs <launcher-pid> <renderer-debug-port> <main-inspector-port>` reuses that launcher's full isolated environment and starts the same built real app with `--no-sandbox --disable-gpu`; main inspector ports 19323/19324. It gives both sides separate XDG_CONFIG_HOME under scratch. `relaunch-electron.mjs` is retained as a failed predecessor: Electron rewrites /proc/cmdline into one argument on this version, so use launch-electron.mjs.
5. Run `node scripts/setup-app.mjs <renderer-debug-port>` to complete first-run Continue, Continue, Do not import projects. Those clicks were executed through the equivalent `ui.mjs` commands in the actual run. Then `node scripts/cdp.mjs <port> @<absolute>/scripts/seed-reproduction.js`. Run `fix-theme.js` through cdp to apply dark synchronously. Run `prepare-renderer.js` to freeze only host renderer Date at 2026-11-03T12:55:00Z and disable CSS motion; main-process monotonic time remains live. Server-created message times remain real and match at minute precision in the retained frames.
6. Run `native-observer.js` through main inspector cdp (19323/19324). It sizes the actual window to 1440x1000 at (0,0), closes DevTools, sets zoom=1, and adds transparent logging wrappers around CDP dispatch/window-open callbacks. It never assigns focus, background, disposition, tab state, or handler return values. New guest callbacks are observed too. `lastDispatchAgeMs` is the last qualifying native debugger dispatch observed, not a replacement of the production predicate clock.
7. Start `node scripts/fixture-server.mjs`. The Pi fixture writes a mode-0600 private MCP credential file per backend port. Never upload these files. Use `node scripts/mcp.mjs <private-file> preview_open '{"url":"http://127.0.0.1:18923/"}'` and save its full response as after-final-open.json / before-final-open.json. Initial source opening uses the real scoped MCP tool.
8. Run `node scripts/capture.mjs <before|after> <row>`. Set EVIDENCE_APP_CONFIG JSON if debug/backend ports, Xvfb display or Xauthority differ. This run's displays were after :99, before :100. Read real XAUTHORITY from the retained process environment. Each take writes a new timestamped directory. The driver explicitly resets both drafts per row, then primes A/B with deterministic sentinel text; it does not rely on any earlier row's draft. It closes other browser tabs, resets panel state, and sets the row's composer via normal renderer stores/UI. Source Browser and Files retain native production hosting.
9. A1/A2/S1/S2 use production scoped MCP preview_act and native xdotool suffix typing without refocus. H1/B1 wait >5s with no guest CDP commands then use OS left/middle click. H2 uses agent click then OS person click in <5s. T1's fixture schedules window.open at 6500ms; no intervening source CDP messages are sent. S4 is a labelled harness: delay only delivery of the real preview-open command result for 2000ms, and OS-click the real sibling tab while pending. No event classification, focus or browser selection is stubbed. R1 is driven by the second-client procedure in `scripts/r1-web-transcript.md`.
10. Main clips show the entire 1440x1000 app plus a 480px timing/focus sidebar on 1920x1080 Xvfb. Final app stills use ImageMagick import, document.fonts.ready, reduced-motion emulation/CSS suppression, no caret, and two full captures 500ms apart with AE=0. Loading states are awaited through app navigation state; the active synthetic provider's stable Working/Thinking status is intentional fixture state. Separate destination-inspection clips run only after the main outcome. Their contact sheets are video excerpts, not substitutes for settled app stills. R1 web viewer recordings use real tool Chromium, 1440x1000 CSS, DPR2; both auxiliary viewer final stills were also verified AE=0 across consecutive captures.
11. `scripts/make-diffs.py` uses signed int32 RGB subtraction and x255 amplification before clipping, so one-level differences are visible without integer overflow. DiffT marks max-channel difference >16/255 in magenta over a dim After. It builds recording contact sheets and 10 row sheets. `scripts/make-viewer-sheets.py` does the same for the two R1 viewer clips. Inspect all row sheets, full final frames, diffs, main/inspection/viewer contact sheets before publishing. `selected-runs.json` names retained successful takes; exploratory light frames, the blocked T1 attempt, and the first incomplete R1 viewer take are not evidence.
12. Upload using `ghdrop upload -m`; preserve its exact Markdown in uploads.md. Upload all actual seeds/drivers, runtime logs, captures, diffs and clips without credentials. Stop fixture scopes with normal thread RPC, terminate only retained spawned processes, remove the before worktree, and remove generated `.t3` and build outputs from after. Keep the lead's after checkout and scratch root. No PR body is edited.

Scope is Linux desktop native activation. No macOS/Windows native claim. No light/390 captures: current matrix explicitly requires only dark at 1440x1000 because no rendered components changed. H2 is intentionally head-only; A3/S3 are collapsed and U1/D1 code-covered in the matrix, not missing capture rows.
