# Android capture procedure

PR [#33199](https://git.cafe/pingdotgg/t3code/pull/33199). After client: [ad38094ff5](https://git.cafe/pingdotgg/t3code/commit/ad38094ff5ff1e74128cecdfaf3c689985006b41). Before client: [bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9).

1. Created detached base worktree and ran `vp install`. Prepared the Android native client in both checkouts with `vp run mobile:install android --prepare`; both returned native fingerprint `832d41716ea2dfac7350605db3fd07914f87d6ef`.
2. Connected session `pr33199-android-r2` to the configured device pool and requested Pixel 9. First open failed at 11:25:38 UTC; one retry at 11:26:49 succeeded. All subsequent device commands used this session from `/home/user/t3code`, its original workspace.
3. `processes.py start head` started an isolated H1 backend at port 19101 and head Metro at 8085. A tracked TCP forwarder at 19102 preserves HTTP and WebSocket traffic to H1. State lives only in this step's timestamped scratch run. `T3CODE_DEV_SEED=0`; no live userdata, no seed, no provider turns, no VITE origin overrides.
4. Installed the prepared client with the PR's `mobile-native-client.ts` installer, invoked from the session-owning workspace. The first invocation from the PR worktree hit a workspace ownership conflict. Corrected invocation succeeded in 241 seconds. This is the same installer as `vp run mobile:install`, with an absolute script path to retain the PR checkout's source and the device session's working directory.
5. Used dev-only pairing prefill for initial A, then submitted the actual Add environment form. Navigated Settings → Environments → H1 detail → Add route; filled B and submitted through the actual form. A = `http://100.73.218.5:19101/`, B = `http://100.73.218.5:19102/`. Independent labelled sessions; UI verified A route 1 In use and B route 2. No atom or presentation injection.
6. Exchanged an independent Z bootstrap for an admin session using `admin.py`. Read only this isolated H1 database to match the exact A session label. Revoked A with authenticated `/api/auth/clients/revoke`. Client automatically moved to B; H1 logged `Rejected authenticated session credential`. A rendered Sign-in refused and the full hint.
7. Recorded in Android dark. Opened Add route, cancelled and observed warning retained; reopened, entered exactly A's address with a fresh A-repair code, included Gboard-up form, submitted and observed A In use, warning absent, exactly two routes. A daemon failure at 11:40:57 interrupted submit; one retry after a minute succeeded. The video retains that wait. Android split the source into two chunks at its 180-second limit; `process-video.py` joins them, masks the code field, and adds elapsed timestamps. No TalkBack spoken-output claim.
8. Captured after dark, then revoked the new A-repair session and captured after light. Both accepted pairs had ImageMagick AE=0 with a 500ms pause between screenshot commands. Took the native JSON hierarchy while S01 after dark was visible; its route label includes the full hint. Native metadata reports density 2.625 and viewport 1080×2424. Font-size settings reports platformValue 1.0.
9. Started base Metro at 8086 from the detached base checkout, then opened the same installed native client against it. Both native fingerprints are identical, so the binary is shared; JavaScript source is independently bundled from each exact checkout. Retained the same saved routes and revoked A-repair credential against the same isolated H1 backend. Navigated the same Settings path at scroll top. Base shows B In use and no A badge/hint. Each accepted base theme pair has AE=0. Rejected light attempts crossed the system-clock minute boundary and remain in private scratch.
10. `diffs-android.py` generates unmodified full-frame Diff0 and DiffT at 16/255. Status-bar time/signal and minor font edge rasterization differ between captures; these are not hidden or normalized. New hint height shifts subsequent content. Before/after sheets are supplemental; full captures remain available.
11. Inspected every accepted screenshot and diff; reviewed source and redacted recording through contact sheets. Original credential-bearing media/logs remain private. Only reviewed synthetic/sanitized outputs are uploaded. S05 relay/addressless native harness was not created; no relay transport or addressless rendering proof is claimed.

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