# Android evidence — takeover PR 21088

Scope: [#21088](https://git.cafe/pingdotgg/t3code/pulls/21088). Before = [3cc31ed27c](https://github.com/pingdotgg/t3code/commit/3cc31ed27c8956b36cee35a50509fb7c6869592b). After = [0b086662f3](https://github.com/pingdotgg/t3code/commit/0b086662f350c79b19295e6ceec12169a6422bdf).

Actual Android app com.t3tools.t3code.dev, locally built compatible x86_64 APK reused for both revisions; Android 16/API36 emulator-5572, Pixel 7 portrait 1080×2400 physical, density420, logical viewport about411.43×914.29dp, fontscale1, light theme, animations0. Captured using adb; no T3 preview recorder. Synthetic fixtures only. Backend15734 isolated /tmp/ev-21088/web-home; fixture HTTP18088; Metro8089. Never opened live T3 state. Four mobile changed files temporarily replaced from base, then restored exact git-show HEAD bytes. No commits or other production edits. No web files touched by this capture agent. Native APK, backend, data, fixture bytes and device unchanged between revisions; Metro restarted/cache-cleared per revision; app cold-launched to avoid reload lifecycle issues. Connection grants changed only for controls (explicitly noted below).

## Accepted results and exact coverage

- M1 complete paired settled stills and native accessibility: baseline generic Video unavailable and disabled Play Denied video; replacement complete pairing explanation and disabled name+explanation. Existing image explanation unchanged. M1/M2 all static stability pairs have zero changed pixels at amplitude0. M1 B/A diff16778 pixels above20; M2 B/A diff16746 above20, only explanation text changes.
- M2 complete paired fullscreen stills, accessibility dumps, captioned recordings. Same scripted open→tap unavailable→close→reopen→close. Save/share disabled on both; replacement disabled player announces demo.mp4 plus explanation. Accepted baseline/replacement videos have no crash frames. Android screenrecord omits trailing static time; captioned copies extend the final unchanged frame to24s; no interaction reordered. Native timing/loading may differ; captions describe scripted actions, contact sheets aid review.
- M3 paired generic inline and empty-label stills with filesystem:read granted and absent filenames. Both show generic unavailable without pairing claim. Minor roughly1px raster/layout differences visible in supplied diff; not claimed pixel-identical B/A. Disconnected and fullscreen generic not separately executed.
- M4 paired direct HTTP playback recordings: changing fixture timecode proves playback. Baseline pause/resume visibly confirmed. Replacement taps during loading do not prove pause/resume. Host asset readiness confirmed after grant, but host playback not separately recorded. Local draft, retained URI loss and successful resource-link fullscreen unverified.
- M5 source assertions only: PR inline generic shares M3 placeholder; modal shares M2. Workspace null URI is loading (caller does not pass unavailable), so no false generic-unavailable claim. No file/PR shell navigation proof. See source-assertions.md.
- iOS I1/I2 UNVERIFIED: iOS simulator not available on Linux VMs. Android does not verify native iOS alert/dismissal behavior.
- Long-press attempt on denied expanded player did not open actions; not claimed verified. Top Media actions button exists, disabled save/share verified. No unrelated fixes attempted.

## Reproduction and handoff

Device remains running and paired with denied grant, with Host file access thread intended foreground. Metro PID1137187/session79887 remains available; backend and fixture HTTP preserved. adb /tmp/ev-21088/sdk/platform-tools/adb -s emulator-5572. From thread, Back70,210 → list. Host file access250,676; Video resource link250,1110; link240,1565; modal Close1005,200. Wait for actual content (cold launch may take1min); a pair of identical blank frames is insufficient. App launch t3code-dev://expo-development-client/?url=http%3A%2F%2F127.0.0.1%3A8089. Do not publish private pairing JSON/logs. No further capture-agent device actions after handoff.

## FRICTION

- infra: Metro returned cached replacement bundle after baseline swap; rejected early baseline scratch, restarted with --clear and visually verified generic baseline before accepted captures.
- infra: hot reload with modal/sheet led to RNScreens detached-context exception. Rejected crash scratch; cold stop/launch and retook accepted baseline. No native code fix.
- tool: interrupting adb shell screenrecord did not finalize first recording. Replaced with time-limited recordings, ffprobe and decoded contact-sheet validation.
- infra: cold bundle loads and native rendering are slow under emulator memory pressure. Captures inspected after stabilization; blank settled scratch rejected.
- brief: no production modifications except explicitly allowed four-file swap/restore. Current git status clean at handoff.
- runbook: explicit user adb authorization overrides skill Device-panel-only default. No browser automation used.

## Artifacts

![m1-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ce844843e21e6d29/m1-before.png)
![m1-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f0d149c51588618f/m1-after.png)
![m1-before-stability.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d854a2bf29fabe33/m1-before-stability.png)
![m1-after-stability.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/954f34dc598f585f/m1-after-stability.png)
![m1-before-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/327e2a31e8d28330/m1-before-after.png)
![m1-diff-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f05b2a1552266d44/m1-diff-amplified.png)
![m1-diff-threshold20.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d9202894ea3d5ae0/m1-diff-threshold20.png)
![m2-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/49b9172b43849d32/m2-before.png)
![m2-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/634c14bb14c60e22/m2-after.png)
![m2-before-stability.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/43ca4dfbe0f3b1b8/m2-before-stability.png)
![m2-after-stability.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/97bfdb1ab05feaf3/m2-after-stability.png)
![m2-before-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/367cfb8a28fb0b2a/m2-before-after.png)
![m2-diff-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b8ebaaf624d94ec7/m2-diff-amplified.png)
![m2-diff-threshold20.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e277b3fa2c7b1eb4/m2-diff-threshold20.png)
![m3-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/454f99de047cea2b/m3-before.png)
![m3-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/eb4a3d688fc4feed/m3-after.png)
![m3-before-stability.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d32c1ceedb1a9bed/m3-before-stability.png)
![m3-after-stability.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fb4d19a222d7438a/m3-after-stability.png)
![m3-before-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/07bb130de08bd9d0/m3-before-after.png)
![m3-diff-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b2462bdb15a055fd/m3-diff-amplified.png)
![m3-diff-threshold20.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/92ec4ccb28d6f687/m3-diff-threshold20.png)
[m2-before-flow.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5c729abbd4180767/m2-before-flow.mp4)
[m2-after-flow.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7d058ef50fb12cca/m2-after-flow.mp4)
[m4-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/13a1360191dbf286/m4-before.mp4)
[m4-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a17ff4c6403a0170/m4-after.mp4)
![m2-before-flow-contact.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/185139e24db004af/m2-before-flow-contact.png)
![m2-after-flow-contact.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f1df14131260122c/m2-after-flow-contact.png)
![m4-before-contact.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/550d8451dad540f8/m4-before-contact.png)
![m4-after-contact.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1e767977532d7556/m4-after-contact.png)
![m4-after-contact-late.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c73a87d5ba920269/m4-after-contact-late.png)
[m1-before.xml](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a8d8655683e3a997/m1-before.xml)
[m1-after.xml](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/badeaaff11879bdf/m1-after.xml)
[m1-after-final.xml](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8803c72a43da34a2/m1-after-final.xml)
[m2-before.xml](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8a88629557c83851/m2-before.xml)
[m2-after.xml](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/27989e3a4358bd1f/m2-after.xml)
[before-provenance.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9aa7630dd660a659/before-provenance.json)
[after-provenance.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a7ffa88d8cfa7b66/after-provenance.json)
[native-apk-sha256.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b651d279c360fd64/native-apk-sha256.txt)
[accessibility-summary.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e5a0ffa26f8e57fd/accessibility-summary.json)
[accessibility-readable.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/206bcc9e24f1d28c/accessibility-readable.txt)
[diff-report.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/94acdd1c38eccc0d/diff-report.json)
[source-assertions.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fa8ab37de490951a/source-assertions.md)
[capture.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f2a8c7831c1e50b0/capture.py)
[swap-mobile.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8d6ca369661e13b8/swap-mobile.py)
[provenance.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5bba8fef0cfd9c14/provenance.py)
[record-m2.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/55a3ddac9aaf6210/record-m2.py)
[record-reachable.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0bb0ad73b0e58813/record-reachable.py)
[caption.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/eb191e2fb8cac1f4/caption.py)
[caption-reachable.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9ce0279f7c6f9b7a/caption-reachable.py)
[diff.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/621edcd99c961272/diff.py)
[accessibility.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c11fce35ab2f7844/accessibility.py)
