# Round 2 mobile evidence reproduction

Evidence only for PR [#27658](https://git.cafe/pingdotgg/t3code/pull/27658). Before [6575ce3250](https://github.com/pingdotgg/t3code/commit/6575ce32508bd7908444241f3719aa33aaf77f90); after [63d02cd849](https://github.com/pingdotgg/t3code/commit/63d02cd849afcc565380bb56b924d2bdb34fecc5). Drivers are adapted copies of round 1. Never execute against live T3 state.

1. Use scratch root `/tmp/lead-27658-r1/evidence-capture-2/`. `prepare-checkouts.sh` creates the detached baseline and installs dependencies/native cached builds. The head worktree is read-only. Keep every agent-device command in `/home/ubuntu/wt/pr-27658` with session `evidence-27658-r2`.
2. Run `start-services.py`, then `seed-checkouts.py`. These create four fresh server homes with `T3CODE_DEV_SEED=0`, sparse synthetic fixture clones, registered source-only and existing-fixture worktrees, and head/baseline Metro at 8081/8082. Fixture repositories reset to [184d915d87](https://github.com/pingdotgg/t3code/commit/184d915d8774615a01ebae0350235a1039852e85), A/main and B/local-feature; B additionally has dev. Wait for each server's HTTP descriptor, then run `seed-servers.py` once. No real database is read or copied.
3. Prepare before leasing: `vp run mobile:install android --prepare`. Connect device-pool proxy, then `agent-device open --platform android --device "Pixel 9" --session evidence-27658-r2`. Install only with `vp run mobile:install android --session evidence-27658-r2 --metro http://fs-27.tail131df4.ts.net:8081`.
4. `agent-device settings animations off --session evidence-27658-r2` sets all three Android scales to 0. Set appearance light and text-size large (the API's large means Android font_scale 1.0; medium is 0.94). Relaunch after changing settings. `switch-side.py after` pairs A/B and renames the connections. `setup-device.py` applies separate grouping, disables last project, and selects light mode through the actual preference atom.
5. Environment UUIDs are run-local. Replace the four UUID literals in these scratch copies with the new server descriptors; deterministic A project ID is e16d433b-4244-56ad-951a-7d782549dbe0. Server authentication must be supplied through EVIDENCE_AUTH_TOKEN; published scripts contain no credential. Keep server, Metro, pairing and raw settings logs private.
6. `app-driver.py init()` freezes JS Date to 2026-11-03T04:20:00Z, hides the native status bar retaining its inset, and uses React DevTools overrideProps to set the two mounted WorkspaceStackNavigator screenOptions.animation to none. Android system scales alone did not suppress React Navigation crossfades. This is an explicit capture instrumentation change, applied to both revisions; no source or on-disk app bundle is edited.
7. The prompt is `Keep.` plus the normal PR context for [#24707](https://github.com/pingdotgg/t3code/pull/24707), equally on both revisions. It was shortened from round 1 to avoid expanded-composer text clipping. The repo/PR/identity/worktree fixtures remain the same. Native add/context icon overlap can still occur during editor remount; see quality-notes.json. Movies containing that overlap are diagnostic and do not pass the strict requested frame-quality gate.
8. `run-series.py after priority` covers F01, F13, H01/H02. F01 starts from an already prepared, settled PR draft, then records selected-A no-op, B, return A. F10–F12, F17, F02 and F20 use the individual scripts or run-after-priority.py. F10 uses a labelled live-provider setWorkspaceMode("local") command on both sides, followed by the normal toggle back. F12 labels the short-dev-base store fixture; it preserves any existing PR reference before the actual UI remote toggle. Arrival-B stills precede those controls and show the Δ.
9. Dark F01: set actual preference themeMode dark, rename B to `Machine B — remote development environment with a long name`, run `capture-core.py after-dark`. Restore light and Machine B afterwards. `runtime-environment.py` records native Dimensions/fontScale and frozen Date.
10. F16: start fixture-download-server.py as a captured process group and append its PID to processes.json. Chrome first run: Use without an account; No thanks. Download both synthetic files via explicit `agent-device open com.android.chrome <url> --session evidence-27658-r2`; retain originals on duplicate-download prompt. Return to the app, wait for Metro CDP to reconnect, then capture-attachments.py after/before and attachment-transcript.py <run-directory>. If initial file picker triggers Expo bundle reload, relaunch and retry a fresh draft; reject the failed take.
11. `run-series.py after guards` covers normal project/branch guards, multiple matches, reconnect, unknown-basename/title, known mismatch, non-Git and scratch. F05 includes labelled dispatchHardwareKeyboardCommand("cycleHost") with only A eligible and exact unchanged draft state. Catalog scripts force-delete only this run's B fixture projects after F20 runtime evidence is saved. F14 stops/restarts only the recorded B process group.
12. `switch-side.py before` installs the baseline native client from the lease-owning head cwd, removes only this lease's synthetic catalog connections, opens baseline Metro, and pairs baseline A/B. Export EVIDENCE_METRO_PORT=8082 for every subsequent driver. Run `run-series.py before priority`, baseline F16, and `run-series.py before baseline-rest`. Baseline F11 checks out main through its actual local-mode picker; the series restores B/local-feature before the next row.
13. Every endpoint uses UI/store milestones then two screenshots 500 ms apart, requiring exact RGB equality. `choose-latest.py` / select-runs.py maintain selected-runs.json; do not select an incomplete/failed take. `qa-selected.py` creates each normal contact sheet plus navigation samples every ~100 ms (actual nearest decoded frame PTS, deduplicating identical sampled frames); inspect all sheets and suspect full-resolution frames before publication. Cold start, branch queries, attachment re-upload, reconnect and Send setup intervals are explicitly narrated.
14. For comparable F20 endpoints, `normalize-f20.py` sets the same explicit Evidence PR handoff title through the normal app metadata command, pops to Chats, reopens the actual thread and repeats settled probes. The original Send movies retain their generated titles. `diffs-r2.py` produces magenta binary amplification at max RGB channel >0 and >16, full-device Before|After pairs and exact counts. `mask-f20.py` produces additional full-device endpoints with the same disclosed clock rectangle masked; retain originals too. Inspect every endpoint, pair and diff; review-atlas.py assists inspection.
15. Public staging excludes raw server/Metro/pairing logs. Upload all captures, diffs, media, scripts and synthetic transcripts with `ghdrop upload -m`; retain verbatim uploader output. Build the full evidence.md and <=60-line pr-evidence.md. No PR body, repository file, commit or push changes.
16. Before releasing the lease, `agent-device settings animations on --session evidence-27658-r2` restores all three scales to 1. Stop every process group in processes.json, close the exact lease, remove `/home/ubuntu/wt/pr-27658-base` with git worktree remove --force, and verify the head is clean at the supplied SHA. Preserve evidence/raw logs until uploaded. Never kill by pattern.
