# Reproduce PR 27798 evidence

Target: [#27798](https://git.cafe/pingdotgg/t3code/pull/27798). Before 71646e031a6dc9db1309b3b9dff597f872cf2fd3; after dc9eff340c. Read-only public source [microsoft/TypeScript](https://github.com/microsoft/TypeScript), detail [#65119](https://github.com/microsoft/TypeScript/pull/65119). No PR mutations or provider runs.

1. Add detached sibling worktrees at the two SHAs; `vp install` in each. Create a fresh public shallow clone of TypeScript and check it out fully. Every server uses `T3CODE_DEV_SEED=0`; never migrate/copy the VM's live DB. Run `seed.sh before|after` to add the project. Ports in these scripts are the ports reported in this run, adjust to fresh runner output.
2. Run `T3CODE_DEV_SEED=0 vp run dev --host 0.0.0.0` in each checkout. This run used before Vite 8634/backend 16674, after Vite 6311/backend 14351. `capture-proxy.mjs 18081 8634 16674` and `... 18082 6311 14351` inject `page-driver.js` before app code. Pair the preview browser through the standard app flow without uploading its credential. The proxy changes only the display clock and delivery time of PR RPC replies, not data.
3. Web: use the real app `/pull-requests`, filter TypeScript + author `jakebailey` + open, limit99 (51 entries in this run), involvement all. Warm one load. `browser-actions.js` documents the exact hold/release and row-pass actions. `page-driver.js` logs requests, replies and rendered row counts; `captureP3()` drives Summary/Timeline/Code/Expand/return Summary. Capture native preview tool recordings; no device emulation; 1440x900 dark/light or 390x844 light, DPR2, font100%. Tool has no reduced-motion switch. Clear legacy `t3.pullRequests*` localStorage keys on both reloads, retain IndexedDB. Only after has `query` in `t3code:connection-runtime`.
4. P2: hover real #65119 row, dwell, click. Read RPC/HTTP traces together; detail was naturally fast enough to arrive before the after click. The separate `passRows()` probe dispatches over/out 50ms apart on two real rows, a HARNESS input probe. Neither side sends a detail RPC during it. It is not a claim of physical-cursor timing.
5. P4/P5: inject `seed-thread.js` in the paired page; call `seedEvidenceThread(projectId)` and allow read-only sync. Never start a turn. Navigate to `<environmentId>/evidence-27798-thread`. P4 reloads with PR replies held. For P5 call `seedEvidenceChip(environmentId)` (HARNESS unsent context draft), hover the actual composer context chip with preview trigger, hold PR preview reply, then release. Preview's opened-time appears only after release and supersedes known summary.
6. Desktop: `node node_modules/electron/install.js`; build server/desktop/web with owning workspace build scripts. Seed separate `.t3-desktop` homes. Launch actual bundled Electron under `headless-desktop`, with `GH_CONFIG_DIR=/home/ubuntu/.config/gh`, isolated `XDG_CONFIG_HOME`, `T3CODE_HOME=<own>/.t3-desktop`, `T3CODE_DEV_SEED=0`, `T3CODE_PORT=18674|18351`, `--no-sandbox --disable-gpu --remote-debugging-port=19221|19222`. No Vite URL. `x11-window.py` sets real native window1440x900; update DISPLAY/XAUTHORITY in `desktop-capture.mjs` to launcher output. Filter search `readability filename`, state all, open #65119. Driver warms all tabs/diff, clears legacy LS, holds reload RPC replies, runs captureP3. Playwright controls actual native Electron via CDP; ImageMagick import takes X11 stills and ffmpeg x11grab records. DPR1, font100%, light, reduced motion reduce.
7. Mobile: `mobile-actions.sh` lists native actions. Prepare/install dev client only through `vp run mobile:install ios`. Same cached native fingerprint on both SHAs. Lease iPhone17Pro through device-pool and use the same named agent-device session on all commands. Run one Metro per checkout (8081/8082 on all interfaces), open with VM IP URL, pair to its own fresh backend and disable other environment. `instrument-mobile.py` adds identical `mobile-driver.js` to both app entries: app clock frozen; incoming detail replies delayed6000ms after arrival, safe RPC timing logged. Actual native Git > More > Linked PR row provides entry; no component harness. `seed-mobile-message.py` was an unsuccessful HARNESS attempt (message projection alone does not create visible history); it is not used by this entry path. No provider starts. iOS dark, Dynamic Type medium, default native font scaling (Dynamic Type medium), viewport402x874points, DPR3; plain still status bar (normalization animates charging icon). Initial recordings use default motion/transparency; replacement stills use iOS Accessibility Reduce Motion and Reduce Transparency. Recorder keeps actual OS time; plain replacement stills preserve the OS clock; its value must match within the pair.
8. Stills: wait for network idle / all PR reads and fonts, then two frames >=500ms apart; only identical pairs accepted. `make-diffs.py` creates per-channel binary-amplified diff0 (>0) and diff8 (>8/255), black unchanged. `assemble.py` builds labeled four-up sheets and timestamped video contact sheets. Raw failed attempts are superseded, explicitly not evidence.

The display clock is 2026-11-03T00:00:00Z. GitHub data remains live: #65119 was merged by its maintainer during the run at00:47:49Z, independently of this agent; both frames within each pair have the same state. Earlier P2/P3-web pair is open, later P3-desktop/P4/P5/P6 pair is merged.

Native final stills are run-20261103T010800Z/P6-before-plain2-{a,b}.png and P6-after-plain3-{a,b}.png. Each pair is RGB-identical, >=500ms apart. OS clock is5:18 on both; only the app clock is frozen. Remaining native diffs are glass toolbar/home-indicator edges, not content or geometry. Initial Expo launcher diagnostic is omitted from the raw archive because it lists pre-existing development-server addresses unrelated to this fixture.

Checks supplement: `checks-driver.js` is evaluated after the Summary controls mount, following the same warm-Checks/close, hold, reload sequence. It waits3s, attempts expand, holds3s, releases, opens if needed, and waits2.5s. `checks-desktop.mjs` records native Electron; final run is run-20261103T013300Z. The previous run-20261103T012800Z desktop recording used swapped Xvfb displays and is discarded. Web supplement lives in that earlier directory but is valid; navigation timestamps are in web-traces.json. The final expanded list is scrollable; captures show its top and traces enumerate all34 entries.
