# Native verification R3 — BLOCKED for final head; no native captures

Replacement [#24583](https://github.com/pingdotgg/t3code/pull/24583), original [#19570](https://git.cafe/pingdotgg/t3code/pulls/19570). Run: 2026-10-25 00:39–01:13 UTC. Only `/home/ubuntu/wt/pr-19570`; own scratch `/tmp/ev-19570/native-r3`. No source/config changes, commits, pushes, PR comments or watches by this run. No live userdata, other machines or environment links.

## Result and current-head limit

**Final-head native verification is BLOCKED. Native device captures: zero.** No screenshots, accessibility trees, videos, paired base/head native stills, amplified zero-threshold diffs or max-channel >16 diffs were obtained. Local JavaScript compilation and source hashes are preparation records, not native evidence.

The requested starting head was [e810a33cf8](https://github.com/pingdotgg/t3code/commit/e810a33cf8114e5c4e76eeffe8ea299ef8466b71), base [3cc31ed27c](https://github.com/pingdotgg/t3code/commit/3cc31ed27c8956b36cee35a50509fb7c6869592b). At 01:10 UTC the maintainer reported a mandatory main merge. The checkout was then verified at [dbecd5d7e9](https://github.com/pingdotgg/t3code/commit/dbecd5d7e99fe2db6080efabf873c7a775b57603), with parents the requested starting head and main [453bf01d20](https://github.com/pingdotgg/t3code/commit/453bf01d2068758fac79f9aa74099b2e85bbc719). It remained that head and clean at final verification.

The merge changed `apps/mobile/app.config.ts`, `apps/mobile/metro.config.js` and `apps/mobile/src/features/threads/floating-working-control.tsx`, among other files. The completed build and prepared fixture bundles predate this merge. **They cannot certify the merged native configuration, Metro pipeline, pill implementation or final-head behavior.** No final-head build/fingerprint match is claimed. No rebuild was attempted after the merge.

## One development build, successful but pre-merge only

Five recent finished development APKs were examined; none matched the current-at-start fingerprint. The prior R2 build was canceled and had no APK. No older binary was installed as proof.

One build was started using the existing development profile and default cache behavior (no cache clearing, no source or configuration override):

```sh
npx --yes eas-cli@latest build --platform android --profile development --non-interactive --no-wait --message 'Thread sync recovery 19570 e810a33cf8 native r3' --json
```

[Build 8bacc7ea](https://expo.dev/accounts/pingdotgg/projects/t3-code/builds/8bacc7ea-12c7-4bca-a4e8-7883d8364b8f) was created at 00:41:26 UTC and finished successfully at 01:11:41 UTC. Its recorded git commit is the pre-merge starting head. Its fingerprint `236efefcbaa2b185e07a10dfcd520ec6d1027f20` matched an independent local `fingerprint:generate --platform android --build-profile development` run before the merge. The build produced an [Android development APK](https://expo.dev/artifacts/eas/VuFNMzUnRdkaGiCdO0H86OoB2hsyrDuXxUS032f-U_c.apk).

Metadata upload warned `Failed to upload metadata to EAS Build` / `Request failed: 400 (Bad Request)`, but the 215 MB source archive uploaded and compilation proceeded. Expo updates configuration passed. Gradle compiled the native dependencies and app across architectures, then uploaded the APK. No terminal build error occurred. This is supplemental pre-merge build evidence only, not device or final-head evidence.

The requested 15-minute checkpoint was sent while Gradle was pending. The 01:15 capture/upload target became unattainable for final-head proof after the merge invalidated the pending build's target.

## Fixture preparation and why it is not M1 proof

The existing R2 fixture entry was copied unchanged into own scratch. The same external read interception compiled paired head/base component bundles on owned Metro ports 18085 and 18086. Original component reads were checked against the starting head or git-show base. No repository entry, component, configuration or test source was edited. Comparison was limited to the two floating-working component/status modules, not a full base application.

The fixture explicitly displays “Static component fixture — not runtime recovery proof.” Its failed/connection/recovered chapters are local state controls. A static “recovered” chapter cannot prove a foreground or new-session retry. Neither bundle was loaded onto a native device in this run.

Before the merge, the native fingerprint's source paths did not intersect the PR's JavaScript-only changed paths. That compatibility observation was limited to the original base/head pair. It does not extend to the merged head's changed app config and Metro/native dependencies. After the merge was reported, both owned Metro processes were stopped to prevent mixed-source capture; no old-binary/new-JavaScript combination was presented as proof.

## Exact native omissions

All M1 behavioral requirements remain unverified on Android and iOS:

- Cached ready content retained during sync failure, including base cached-sync versus head failed presentation.
- Failed-sync pill without button accessibility role or press action.
- Real runtime foreground retry and successful recovery removing the pill.
- New-session retry and recovery.
- Actual connection-error button semantics and reconnect action as the interactive control.
- Creation-failure suppression, connection priority, and non-ready loading/error content precedence.

No native recording, frame inspection, before/after still comparison or pixel-diff certification exists. Existing web evidence was not relabeled as native evidence. The successful APK does not close any native capture row.

## Cleanup

Both owned Metro PIDs (2652457, 2652458) were stopped with SIGTERM after confirming their `/proc/<pid>/cwd` matched this worktree's mobile directory. Both PIDs exited, and ports 18085/18086 had no listeners at final verification. No app server was started.

No simulator session was created; no session or recording requires stopping, and no `.env.eas-simulator` was created. The prepared session command would have used “Thread sync recovery 19570” with a 20-minute maximum, but was never invoked. The sole build is terminal FINISHED, so there is no pending owned build to cancel. The bounded status monitor exited after FINISHED. All owned active work is stopped before 01:20 UTC.

Public artifacts exclude raw EAS responses/logs, development bundles/manifests, tunnel URLs, environment values, tokens and credentials. The original unchanged fixture sources are available in the [previous public fixture archive](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ec97df8d45c39a31/fixture-sources-public.tar.gz).

FRICTION: the fresh multi-architecture development build took about 30 minutes after acceptance and finished after main was merged into the checkout. The resulting APK is valid supplemental evidence for its recorded old commit, but final-head native evidence is missing. No conclusion about final-head runtime correctness can be drawn.

## Published records

[driver-public.ndjson](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4a47dcb3228f47e8/driver-public.ndjson), [build-result-public.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5b7c795475166215/build-result-public.json), [cleanup-public.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/444091af74babf59/cleanup-public.json).
