# Issue 24901 native evidence capture

Captured 2026-10-26 UTC in the provided checkout. No repository edits, forge writes, push, merge, watch, builds, or tests. Evidence and scripts are only under `/tmp/issue24901-evidence`.

## Revisions and client

Before: [bfc7177f](https://git.cafe/pingdotgg/t3code/commit/bfc7177f9f54b0a4b9d3571d30723a51cd4b31bd), the requested merge base. After: [d3de380d](https://git.cafe/pingdotgg/t3code/commit/d3de380d7a5f39986844467f53b2da9165e834ee), branch `fix/issue-24901`. The clean checkout was temporarily detached at base and then restored. Metro was stopped and restarted with `--clear` at head. Native development client `com.t3tools.t3code.dev`, development JS bundle, React Compiler enabled; this is not a release-build claim. Android cached native fingerprint `0328f4ec326e7e4bf1bf87625118f3ff2f7a18d7` on both revisions. iOS cached fingerprint `b9823eb63e2fa1319dd1d160569093b8dab903b7` installed, but runtime verification blocked.

The captured Android bundle excerpt independently shows the base cache guard checking threads/workingShelfEnabled and head additionally checking inboxVersion. No source changes were applied to create the before evidence.

## Fixtures and environment

Explicit isolated backend home `/tmp/t3-issue-24901-home`, started with `vp run dev:server --home-dir /tmp/t3-issue-24901-home --no-seed --host 0.0.0.0`, actual port 13773. Metro port 8081, reachable via the supplied tailnet host. Existing isolated data was reused; live userdata was never opened for writes. Backend watch restarted at the branch change; no unrelated source changes were made.

Environment fs-18; project `45e7e744-cdc6-42cb-9592-43ab96de0535` (server). Target `thread:project:45e7e744-cdc6-42cb-9592-43ab96de0535:7f5547a5-3c7e-4cd9-8999-be9c10919a3a` (New thread). Older idle control `e3442bd3-3b67-400e-8a87-e31c88cdb6ac` (Run Shell Sleep Command). Same target reused with fresh real turns; no projection fixtures fabricated completion.

Actual prompt each time: `Run sleep 30 in shell then reply Done. Do not edit files.` Codex gpt-6-astra, Medium. Target ordinary, unpinned, unsnoozed, unarchived, no attention request/error. Search empty and matching project/environment; preferences loaded and Working enabled. Target observed working before completion.

## Matrix results

| Row | Actual native target / viewport / theme | Result |
|---|---|---|
| B1 | Pixel 9 Android phone, portrait, 1080×2424 captured pixels, light | Reproduced: Done remains under expanded Working. Raw recording captures running→Done. Later still at 07:37:31 UTC shows it stuck 31 s after persisted completion; Android raw video stops encoding at last changed frame (see limitation). |
| A1 | Same Pixel 9 / resolution / theme, head Home | Pass: working→Done/grace→one returned target above idle control; Working header disappears, older control stays below. Home uninterrupted across the decisive interval; no taps/navigation/search/refresh. Stable after return. |
| A2 | Pixel Tablet Android, landscape, 2560×1600 captured pixels, light, actual split thread sidebar | Pass: collapsed Working count with selected target retained; automatic return above control and removal of zero-count header. Conversation remains selected and visible. Only after >grace stable interval, control selected then target reselected. Final raw frame catches target route loading; subsequent accessibility snapshot confirms New thread selected and its same three sleep/Done turns present. |
| A3 | Requested iPad Pro 13-inch (M5), initial pool screenshot 1032×1376 logical pixels, light | Blocked/unverified: cached client installed after worker-disconnect retries. Launch, orientation, snapshot, screenshot and pairing operations timed out; no iOS sidebar transition claim. |

Server requested/completed UTC:

- B1 ordinal 1: 07:36:20.790 → 07:36:59.533, completed.
- A1 ordinal 2: 07:42:09.681 → 07:42:56.512, completed. Return visible before the 07:43 minute rollover, so that rollover does not explain the move.
- A2 ordinal 3: 07:44:37.920 → 07:45:16.776, completed. Initial connection settled before send; no reconnection during decisive completion/grace interval seen in reviewed contact sheet.

## Evidence review and limitations

I inspected phone stills, the before/after/difference composite, Android tablet split view, contact sheets across both head recordings, and detailed phone completion/return frames. This is native app evidence, not a web viewport. Head target returns once, with fresh ordering and no Working header. A2 uses the real sidebar beside the conversation, not a phone drawer.

Narrated derivatives retain the original visual timeline, scale to 720px phone/1280px tablet width, add a black revision/title strip and synthetic spoken explanation. No fabricated UI frames or inserted hold frames. Raw originals remain linked. Narration timestamps are rounded; transcripts below carry exact milliseconds.

B1 raw screenrecord reports 50.3 s encoded timeline for 59.3 s wall recording: Android encodes only changing frames. Thus continuous encoded motion does not itself cover the entire static post-grace interval. The later unmodified still and server transcript substantiate the prolonged stuck state. Do not describe this as a full continuously encoded post-grace base video. No minute-tick masking repaired base; it remained stuck after the minute changed.

Before/after pixel diff is comparable same device, viewport, theme, target and control. Besides revision, the target has one additional real turn at head, wall time/clock differs, and Metro/client were restarted. The target/control order and Working header change are intended; clock differences also appear in the absolute diff. No style changes are claimed.

## Unverified / source-only conditions

A3 iOS native sidebar remains unverified unless an addendum below records an actual successful run. No iOS phone, foldable, alternate orientation/theme, release build, hidden nonselected collapsed-card run, Working off/on, preference-loading, search/ranking/scoping, pinned/settled/snoozed/removal, approval/input/error/resume, other-provider, relay/tunnel, web/Electron or agent/MCP runtime sweep was performed. The supplied matrix identifies those as unchanged/source-only controls or unnecessary expansion; they are not runtime passes here. The compiler regression test was not rerun, and no repo-wide checks competed with capture.

## FRICTION

- Phone lease waited roughly two minutes; unsupported pool `devices` and global `session list` probes were not usable.
- Initial Android snapshot helper instrumentation failed during client installation; subsequent snapshots worked.
- Head Metro restart briefly produced connection refused, then a blank load; reloading/relaunching after Metro was ready recovered. No run began on the blank screen.
- One phone Navigate up action returned malformed daemon JSON even though navigation succeeded; the uninterrupted recording confirms Home during the run.
- Android tablet initial Send selector did not match during reconnection; a fresh snapshot/ref worked. One settle snapshot stalled, but the action succeeded. Initial reconnect precedes the recorded run transition.
- iOS worker disconnected during the first two cached installs. A fresh lease installed in 223 s. Orientation/open then hit daemon read timeouts; no native build attempted.
- Pool rejects appearance read without an explicit state; visible captures establish light appearance.
- Android static screen encoding truncates B1 as described above. No frame duplication was used to conceal this.

## Hosted artifacts

[B1-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e010a4dc1a1f27b8/B1-narrated.mp4)
[A1-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9091b5f23014c4af/A1-narrated.mp4)
[A2-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/396d656985f05fb9/A2-narrated.mp4)
![phone-before-after-diff.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/411c4ee2bea5fa51/phone-before-after-diff.png)
[B1-base-phone-raw.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5191ae8a211a58f8/B1-base-phone-raw.mp4)
[A1-head-phone-raw.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fcee738e9b884461/A1-head-phone-raw.mp4)
[A2-head-android-tablet-raw.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6db05628f71f1c40/A2-head-android-tablet-raw.mp4)
![B1-stable-late.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1116a8ef6bf32435/B1-stable-late.png)
[B1-runs.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/76d5db431b3fc94d/B1-runs.json)
[A1-runs.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5af61a8925b5dc8e/A1-runs.json)
[A2-runs.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fcb3cc2f8dc6772e/A2-runs.json)
[narrate.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2864a6446979e1d8/narrate.py)
[android-compiled-observe.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/88c60470a71e6e39/android-compiled-observe.txt)
![A1-contact.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5edf0d541dfdb4e8/A1-contact.png)
![A2-contact.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b086ffc0f5b85582/A2-contact.png)
![A1-after-grace.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2b467dcddd019cc0/A1-after-grace.png)
![A2-after-grace.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7ed10f65d4129226/A2-after-grace.png)
[capture-recipe.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/00ba704d000eb8ea/capture-recipe.sh)
[completion-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f661fba5afd2ac33/completion-transcript.txt)

## Teardown

All three task-owned pool sessions returned `Closed`: issue24901-phone, issue24901-android-tablet, issue24901-ios-tablet. Closing returns/wipes the disposable device connection. Owned Metro/backend listeners stopped; final ports 8081 and 13773 have no listeners. Requested branch restored at d3de380d7a5f39986844467f53b2da9165e834ee, worktree clean. No unrelated server was stopped.

Model/harness: gpt-6.1-sol through Codex in T3 Code.

[A2-selection-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9d182a2314f36421/A2-selection-transcript.txt)
