# Rebuild the second evidence capture

Use the original replay guide and downloaded seed as the starting point. Every file, log and synthetic database for this retake lives under /tmp/lead-27587-r1/evidence-capture-2. No live database was read or copied.

Before revision [32ecd717](https://github.com/pingdotgg/t3code/commit/32ecd71726fee16f335484c1f95cbce126d461f6), after revision [03ec49bf](https://github.com/pingdotgg/t3code/commit/03ec49bf7f1b7722a59db840a5ecb27c3fa94655). The base worktree was created at /home/ubuntu/wt/pr-27587-base and installed using global vp install. It was removed after capture. The lead-owned after checkout remains at /home/ubuntu/wt/pr-27587.

Run each revision concurrently with T3CODE_DEV_SEED=0 vp run dev:server --host 0.0.0.0 --port <18789 before / 18788 after> --home-dir <scratch/home-before or home-after>. Run Metro in each owning apps/mobile with REACT_NATIVE_PACKAGER_HOSTNAME=fs-36.tail131df4.ts.net vp run dev:client --port <8083 before / 8082 after>.

The downloaded seed.mts differs only in scratch path from the first round. A scratch node_modules symlink resolves its imports from the after server package; server actions, migrations and source revision belong to each revision's own server. Run EVIDENCE_HOME=<home> node seed.mts <checkout> <backend-port> seed. Both actual catalogs are identical: authenticated real Claude 2.1.303, 13 models, including nine legacy, and Codex 0.163.0. No provider-status fixture was used. Target Opus 4.8 is unselected, unfavorited and unhidden; current Opus 5.5 is selected and favorited. Selected options in both retake clients: Reasoning Medium, Fast Mode off, Runtime Full access; Manage hidden off; All providers; Show legacy initially off.

Connect and open e27587-before from the base worktree and e27587-after from the after worktree. Each uses agent-device connect proxy with SIMLOCK_AGENT_DEVICE_URL, then agent-device open --platform ios --device "iPhone 17 Pro" --session <session>. All later commands run from that same worktree and pass the same session. The pool assigned two distinct iPhone 17 Pro simulators on simbox-1. Get the client only with vp run mobile:install ios --session <session>; both native fingerprints were 953468b560e21a2a7cfb6d86a69eda1e061efb8a.

Open each app against its own Metro with t3code-dev://expo-development-client/?url=<encoded Metro origin>&disableAutoLaunch=1&disableFab=1&disableOnboarding=1. Pair with the existing pair-client.sh and that revision's own server/home. Never publish the credentials or raw pairing output. Resolve the OS launch confirmation before navigating. In this run, redundant prompts remained after activation; Cancel dismissed them while the correct paired app remained underneath.

Run node inspect.mjs <metro-port> simlock 'Date.now=()=>1793610000000;Date.now()' on each JS runtime after loading. The inspector also gathered Dimensions and Platform constants. Native clocks remain live. No real persistent time override was found or used; simultaneous screenshots match the clock instead. No screenshot uses --normalize-status-bar.

On both clients: New chat -> Model search evidence -> model picker -> select current Claude Opus 5.5 -> Save -> reopen. Set both appearances light. From scratch run python3 paired.py iphone-light, set both appearances dark with both-command.py settings appearance dark, then run python3 paired.py iphone-dark. Both phones receive every action through the same shared driver. Exact query variants are followed by broad Claude, a top-anchored membership/ordering frame, a bottom-anchored options frame, and clear. The short before list already fits; the after list scrolls farther to reach its bottom anchor. Use the options frame for unobscured Runtime and Full access. The top membership frame is retained for ordering and the inserted rows; its lowermost options still continue behind the toolbar. The complementary bottom frame contains no text beneath the bottom search toolbar.

pairlib.py takes screenshots in parallel on the two sessions, waits 500 ms after each round completes, takes another round, and retains a pair only if each side's two full RGB images are identical and the unedited status-bar pixels also match across devices. The status-bar comparison is an assertion only: it never edits or masks the output. audit.py preserves hashes and capture dispatch times. Diff0 is full-screen absolute RGB difference at zero threshold multiplied by 32, clipped to 255. DiffT overlays magenta where maximum-channel difference is >8/255. No crop, alignment or registration.

After the dark driver, set both devices light and press the native Close button to collapse blank search. Run python3 f07.py F07-iphone-light. It turns legacy on, searches Opus 4.8, dismisses the keyboard, taps the header and scrolls bottom/top while retaining the query. Both the images and accessibility logs show no Filter and no iOS Catalog legacy alias. Close clears the query and restores Filter. The script then records the checked menu option, turns it off, retypes the query and clears it. This is a recorded unavailability boundary, not a claim that the requested on-to-off interaction with a retained query passed on iPhone. Pixel's first-round direct-toggle evidence remains applicable.

Recordings are original native MP4s, no retiming or editing. Command logs use dispatch times; native capture startup and static-frame encoding affect playback cadence. Six-second contact sheets were decoded and reviewed along with every retained still and diff. The first key-frame pair in F07 and its attempt frame differ only at 198 badge-edge pixels, max channel delta 6/255, and have no >8/255 changes. No status-bar pixel differs in any of the nine pairs.

Run audit.py, diff.py for each pair, linear-sheets.py for every native recording, then package.py and upload.py. upload.py calls ghdrop upload -m with the explicit retained artifact list, saves its stdout verbatim and maps results by input order. No raw configs, homes, credentials, session paths, pairing logs or startup logs are uploaded. build-evidence.py replaces the original iPhone F02/F03/F07 sections, preserves the other evidence and Pixel rows, and updates superseded capture caveats.

Stop each port owner only after confirming its /proc/<pid>/cwd belongs to the owning checkout. Close both agent-device sessions from their owning worktree before removing the base worktree. This run completed those steps. The four ports have no listeners; after checkout is clean at the pinned SHA; 19 GB available.
