## Android

PR [#33199](https://git.cafe/pingdotgg/t3code/pull/33199). Before client [bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9); after client [ad38094ff5](https://git.cafe/pingdotgg/t3code/commit/ad38094ff5ff1e74128cecdfaf3c689985006b41). **Captured:** S01 real-app light/dark before/after, after native accessibility, and R02 + R05 after dark. **Unverified:** S05 native relay/addressless harness; before R02/R05 recording. No broader Android matrix coverage is claimed.

**Environment:** leased Pixel 9 Android emulator (`emulator-5588`), portrait, 1080×2424 screenshot pixels, density 2.625 (420 dpi), system font scale 1.0, Gboard. Approximate full-screen logical size 411.43×923.43 dp, calculated from pixels/density. Same installed native binary/fingerprint for both revisions; independent Metro bundles from their exact checkouts. Same synthetic H1 server, saved A/B routes and scroll-top Settings detail screen. A = `http://100.73.218.5:19101/` (Tailscale), B = `http://100.73.218.5:19102/` (VPN). Separate A/B/Z credentials. H1's visible label is fs-87. No real agent turns or live developer userdata.

**Settling/inspection:** each of the four accepted stills has an identical second screenshot (ImageMagick AE=0), with at least a 500ms pause between screenshot commands; remote capture adds latency. Base light attempts that crossed a clock minute were rejected. Every accepted image/diff was opened and inspected; the joined/redacted recording was reviewed via contact sheets, including the redaction boundary. Full images are unmodified. Status time/signal and small text rasterization differences remain visible in Diff0; the new hint increases route height and shifts following sections. No other visible fixture data or scroll position changed. After dark uses the original revoked A session; after light and both base themes use the revoked A-repair session, with the same A address and unchanged B session.

| Configuration | Before<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) | After<br>[ad38094ff5](https://git.cafe/pingdotgg/t3code/commit/ad38094ff5ff1e74128cecdfaf3c689985006b41) | Diff0<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [ad38094ff5](https://git.cafe/pingdotgg/t3code/commit/ad38094ff5ff1e74128cecdfaf3c689985006b41) | DiffT<br>[bcee0f5d28](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [ad38094ff5](https://git.cafe/pingdotgg/t3code/commit/ad38094ff5ff1e74128cecdfaf3c689985006b41) |
| --- | --- | --- | --- | --- |
| S01 · Pixel 9 · light | ![S01-before-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9c10c8338218ed68/S01-before-light.png) | ![S01-after-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8887ad8aedd5d97b/S01-after-light.png) | ![S01-android-light-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/071146f43356987e/S01-android-light-diff0.png) | ![S01-android-light-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d419aea4b3d59a2b/S01-android-light-diff16.png) |
| S01 · Pixel 9 · dark | ![S01-before-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3ea2f8b5f636db0a/S01-before-dark.png) | ![S01-after-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1de489d834a2ef64/S01-after-dark.png) | ![S01-android-dark-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ab24f97e4c6b0584/S01-android-dark-diff0.png) | ![S01-android-dark-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0b5e7a69e1d23abc/S01-android-dark-diff16.png) |

Diff0: absolute channel difference amplified with threshold 0. DiffT: threshold 16/255 (6.2745098%). Black means no difference.

![S01-android-light-before-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6bc149013c6e162e/S01-android-light-before-after.png)

![S01-android-dark-before-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f7d24dc097789e94/S01-android-dark-before-after.png)

**Accessibility:** [S01-after-dark-accessibility.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/09dd2fc8efa95d4d/S01-after-dark-accessibility.json)

The actual native route group label is: `Tailscale, http://100.73.218.5:19101/, Sign-in refused, Route 1 of 2, The host refused this device's sign-in. Pair this address again with Add route.` B alone has `In use`. This is hierarchy proof; TalkBack speech was not recorded.

**R02 + R05, after dark (214.04 seconds):** [R02-R05-android-dark-redacted.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/40c51788e99dd778/R02-R05-android-dark-redacted.mp4)

[R02-R05-timestamps.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1ba0fc8a87e786fb/R02-R05-timestamps.md) · [revocation-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/79f47b1e58cc14f8/revocation-transcript.txt) · [host-refusal-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/587f2cef110e6190/host-refusal-transcript.txt)

The video shows healthy A, Z revocation, automatic B fallback with A flagged, Add route → cancel with warning retained → reopen, exact-address re-pair with fresh code and native keyboard, then A In use and exactly two routes. A daemon error interrupted submit; a retry after a minute succeeded, and that wait remains in the recording. Android split the original at its 180-second limit; the public file joins both chunks and masks the pairing-code field. The wall-clock window was 218.1 seconds; platform capture gaps total about four seconds. Only the after interaction recording was captured; base stills provide the no-badge comparison.

![repair-keyboard-redacted.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/eaa033c97d8dbbf0/repair-keyboard-redacted.png)

![R05-after-repair.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d58503c57c18942a/R05-after-repair.png)

**Procedure, scripts, and settling:** [capture-procedure-android.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/03b97ff1b8b072ff/capture-procedure-android.md) · [settling-verification.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d81f9951e7f515ef/settling-verification.json)

**Remaining native gap:** S05 is unverified. No quick labelled native relay/addressless component harness was available; no real relay transport was provisioned. A web harness is not native proof. All other rows outside this brief remain with the lead’s existing coverage status.

**Cleanup:** pool session closed successfully at 11:49:28 UTC. Stopped only tracked groups 2068249 (H1), 2068250 (head Metro), 2091032 (TCP forwarder), and 2128742 (base Metro). Removed only the detached base worktree created for this task. PR worktree remains clean; no commits, pushes, PR edits or comments. 242 GB available at teardown. Scratch retained for the lead.

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

### Upload output (verbatim)

![S01-before-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9c10c8338218ed68/S01-before-light.png)
![S01-after-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8887ad8aedd5d97b/S01-after-light.png)
![S01-before-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3ea2f8b5f636db0a/S01-before-dark.png)
![S01-after-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1de489d834a2ef64/S01-after-dark.png)
![S01-android-light-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/071146f43356987e/S01-android-light-diff0.png)
![S01-android-light-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d419aea4b3d59a2b/S01-android-light-diff16.png)
![S01-android-dark-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ab24f97e4c6b0584/S01-android-dark-diff0.png)
![S01-android-dark-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0b5e7a69e1d23abc/S01-android-dark-diff16.png)
![S01-android-light-before-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6bc149013c6e162e/S01-android-light-before-after.png)
![S01-android-dark-before-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f7d24dc097789e94/S01-android-dark-before-after.png)
[S01-after-dark-accessibility.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/09dd2fc8efa95d4d/S01-after-dark-accessibility.json)
[R02-R05-android-dark-redacted.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/40c51788e99dd778/R02-R05-android-dark-redacted.mp4)
![R02-R05-redacted-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/16d5136b30314def/R02-R05-redacted-review.png)
![redaction-edge-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c30ab874d6ceba8f/redaction-edge-review.png)
![repair-keyboard-redacted.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/eaa033c97d8dbbf0/repair-keyboard-redacted.png)
![R05-after-repair.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d58503c57c18942a/R05-after-repair.png)
![tooling-launcher-only.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6caaf3a1c7918f65/tooling-launcher-only.png)
![tooling-empty-app.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7afe4926efa658d3/tooling-empty-app.png)
[R02-R05-timestamps.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1ba0fc8a87e786fb/R02-R05-timestamps.md)
[capture-procedure-android.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/03b97ff1b8b072ff/capture-procedure-android.md)
[revocation-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/79f47b1e58cc14f8/revocation-transcript.txt)
[host-refusal-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/587f2cef110e6190/host-refusal-transcript.txt)
[settling-verification.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d81f9951e7f515ef/settling-verification.json)
[admin.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d623ee7eb892a430/admin.py)
[processes.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/03b74e1a419b2642/processes.py)
[forward.cjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/67ff401461433d8b/forward.cjs)
[pair-route.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/215d2daaaa978e24/pair-route.py)
[fill-pair.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/12674373ea7a6e39/fill-pair.py)
[capture-still.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ed29eadd82130e90/capture-still.py)
[diffs-android.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c53879145d1dee4a/diffs-android.py)
[process-video.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d3403c9ec0c47e0f/process-video.py)
[redact-media.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/11adf7d7d92b1696/redact-media.py)
[sanitize-diagnostics.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/79752515fb2af359/sanitize-diagnostics.py)
[process-cleanup.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bd9ec1b07d1e3885/process-cleanup.log)
[app-snapshot.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/91fd6dba58194f0d/app-snapshot.public.log)
[base-install.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1fcea76cd6538f54/base-install.public.log)
[base-prepare.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/48f680b05a35436d/base-prepare.public.log)
[device-open-1.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2444697a9bc0dfa4/device-open-1.public.log)
[device-open-2.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/753b290eaa5b4b9e/device-open-2.public.log)
[font-size-json.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e8e59b2c1423260e/font-size-json.public.log)
[head-install-2.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/31731a89adc67b3b/head-install-2.public.log)
[head-install.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/62f6523a032ce967/head-install.public.log)
[head-prepare.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d8afe914de2c7eae/head-prepare.public.log)
[repair-submit-retry.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9b8ef4f79c4add22/repair-submit-retry.public.log)
[repair-submit.public.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/25bf22e231bf1bc5/repair-submit.public.log)

### Friction

FRICTION:
- tool | Intermittent pool daemon failures at 11:25:38, 11:40:57 and 11:48:17 UTC; one-minute retries recovered and close succeeded | A consistently reachable gateway/worker.
- tool | Snapshot helper initially returned INSTRUMENTATION_FAILED; it worked once the native app was installed | Warm the helper before capture.
- other | First install used a different workspace from the lease and hit DEVICE_IN_USE; corrected installer succeeded in 241 seconds | Invoke installer from the lease-owning workspace.
- tool | Initial upload batch included an empty cleanup log and was rejected | Skip zero-byte files before batch upload.
- runbook | Native status clock changed between early base light frames, so they were rejected | Capture pairs clear of the minute boundary or provide status-bar clock control.

### Additional upload output (verbatim)

[upload-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dcd324a9a3baf499/upload-evidence.py)
[build-index.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/23afabb82c348098/build-index.py)
[cleanup-verification.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/365bb75fce59324e/cleanup-verification.json)
[device-close.private.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c34d7a576bf7a00a/device-close.private.log)

Route IDs inferred from the saved addresses and the production [route ID helper](https://git.cafe/pingdotgg/t3code/blob/ad38094ff5ff1e74128cecdfaf3c689985006b41/packages/client-runtime/src/connection/routes.ts#L155) are `bearer:http://100.73.218.5:19101` (A) and `bearer:http://100.73.218.5:19102` (B). A raw native catalog dump was not captured. The UI hierarchy directly verifies the saved origins, order, warning, and active route; revocation transcripts identify the independent A sessions.
