# M2 — round 2 native: Home failure preview

Additional differences outside the changed error text: the iOS filter controls have sparse antialiasing differences visible only in Diff0; Android has no additional non-status differences.

Captured from before [d1c4b52b7c](https://github.com/pingdotgg/t3code/commit/d1c4b52b7c7c7e1b7637ec47e4c959ff0c2d8d99) and after [652e9c18ce](https://github.com/pingdotgg/t3code/commit/652e9c18cee800df7e255916365967ba211097ae) for [#26086](https://git.cafe/pingdotgg/t3code/pull/26086).

**Environment — light:** iPhone 17 Pro simulator · iOS 27.2 · 402×874 logical · DPR 3 · font scale 1.0 (OS text-size large) · portrait · PNG 402×874, recording 1206×2622. Status-only mask: PNG rows **0–61**, recording rows **0–185** (inclusive).

**Environment — dark:** Pixel 9 emulator · Android 16 / API 36 · 411.428571×923.428571 logical · DPR 2.625 · font scale 1.0 (OS text-size large) · portrait · PNG/recording 1080×2424. Status-only mask: rows **0–62** (inclusive).

Real T3 native development client, JavaScript from each side’s own checkout and one Metro on port 8081 at a time. Separate fresh servers, created with `T3CODE_DEV_SEED=0`; data inserted through real app RPC, no copied database and no component harness. Claude’s real SDK runs the auth-free fixture executable, which emits a partial reply then terminates by SIGABRT or exit 7. The SDK/adapter/orchestrator create the actual persisted failures.

Both sides use identical capture-only Date instrumentation in `apps/mobile/index.ts` and a server Date preload: **2026-10-27T12:00:00.000Z**; real timers continue normally. This freezes app-relative dates without altering rendering components or injecting error payloads. No instrumentation was committed. The same cached native binary serves both sides: iOS fingerprint `e416a21c6a355b943ac5530d1cc2f8f2d446aa0e`; Android `f2adc10370e29967253ba5e4fa64d66a88ee3798`.

`--normalize-status-bar` exists, but simulator clock/battery pixels revert between commands and within recordings. Only the exact top status rows stated below are excluded from settle/diffs and blacked out in comparison recordings. No other region is masked or cropped. Stills retain their full original screen; raw recordings are linked too.

Before each submitted still, the driver takes two full screenshots with a 500 ms pause between screenshot commands and accepts them only if pixel-identical outside that status strip. The uploaded `*-settle.png` and `*-settled.json` preserve the second frame and check. All primary stills and both diffs were opened and inspected. Recordings were reviewed through frame contact sheets.

**Diff algorithm:** max absolute RGB-channel difference per pixel; Diff0 highlights every nonzero difference in saturated pink (including a one-level change). Diff16 highlights pixels with a channel difference **>16/255** in orange. Unchanged pixels are gray; excluded status rows dark gray. No registration, scaling, cropping, blur, or non-status exclusion is applied before comparison.

| Fixture | Before<br>[d1c4b52b7c](https://github.com/pingdotgg/t3code/commit/d1c4b52b7c7c7e1b7637ec47e4c959ff0c2d8d99) | After<br>[652e9c18ce](https://github.com/pingdotgg/t3code/commit/652e9c18cee800df7e255916365967ba211097ae) | Diff0<br>[d1c4b52b7c](https://github.com/pingdotgg/t3code/commit/d1c4b52b7c7c7e1b7637ec47e4c959ff0c2d8d99) → [652e9c18ce](https://github.com/pingdotgg/t3code/commit/652e9c18cee800df7e255916365967ba211097ae) | Diff16<br>[d1c4b52b7c](https://github.com/pingdotgg/t3code/commit/d1c4b52b7c7c7e1b7637ec47e4c959ff0c2d8d99) → [652e9c18ce](https://github.com/pingdotgg/t3code/commit/652e9c18cee800df7e255916365967ba211097ae) |
|---|---|---|---|---|
| M2 · iPhone 17 Pro · light · Home unselected/unsettled cards | ![M2-ios-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3f4778544d3c6f55/M2-ios-before.png) | ![M2-ios-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d9ca1ef93907f84f/M2-ios-after.png) | ![M2-ios-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/817782efcf3ffb4c/M2-ios-diff0.png) | ![M2-ios-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4dde9c1e3ab5b172/M2-ios-diff16.png) |
| M2 · Pixel 9 · dark · Home unselected/unsettled cards | ![M2-android-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/08ebaad0ca38af4c/M2-android-before.png) | ![M2-android-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/84963b4e1bce09e2/M2-android-after.png) | ![M2-android-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2567f11be4c6f027/M2-android-diff0.png) | ![M2-android-diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/75f6356bbdf41e1c/M2-android-diff16.png) |

## What else changed

- `Provider turn failed.` becomes `Claude Code process terminated by signal SIGABRT.` / `Claude Code process exited with code 7.`.
- Both Home cards replace the environment subtitle with that same one-line error. Card size, failed status, provider icon, and optional PR absence match.
- Additional differences outside the changed error text: the iOS filter controls have sparse antialiasing differences visible only in Diff0; Android has no additional non-status differences.
- Raw status clock/battery/network pixels vary; only the explicitly stated status strip is excluded. No claim that nothing else changed is made.

## Reproduction, drivers, and checks

[native-drivers-and-seeds.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f1cef19f1de3dd23/native-drivers-and-seeds.zip)

[reproduce-round2-native.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fc09bc3cda158e06/reproduce-round2-native.md)

Core scripts: [seed.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f1d2807703fa900d/seed.mjs), [rpc.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b446c9101836e3d6/rpc.mjs), [pair-native.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e1744a7ab6bf28b3/pair-native.mjs), [capture-native.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/16fb6df751bb938f/capture-native.py), [claude-exit-stub.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0588a101aba1faea/claude-exit-stub.mjs), [frozen-clock.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bbb87d170f5688c6/frozen-clock.mjs), [install-native-clock.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ca8d2f1b2829c2b5/install-native-clock.py), [clean-native-list-v2.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/91c229fbd7ce4731/clean-native-list-v2.mjs), [start-servers-reviewed.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/abce3c80437a49e5/start-servers-reviewed.py), [build-delivery.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ad77de880f459f3d/build-delivery.py).

Actual app projection / environment telemetry: [fixture-transcript.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bfa2450ccbe5085b/fixture-transcript.json), [native-environments.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ba1ca8c293cdacd9/native-environments.json).

The transcript records one failed run and one error item per fixture, the retained partial answer, unsettled metadata, exact failure message/code, and absence of the nonsecret stderr sentinel in the failure. This supplements the captures; it does not replace them.

Settle partners, individual check results, and sanitized command logs:

- ![M2-ios-before-settle.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b43b358580088693/M2-ios-before-settle.png) [M2-ios-before-settled.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d5bf4c3b708cfa7e/M2-ios-before-settled.json)
- ![M2-ios-after-settle.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7c814c80c364f3f6/M2-ios-after-settle.png) [M2-ios-after-settled.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b62933bf22159335/M2-ios-after-settled.json)
- ![M2-android-before-settle.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dfc8f658aa21ef69/M2-android-before-settle.png) [M2-android-before-settled.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/77c38fa2caf14dbe/M2-android-before-settled.json)
- ![M2-android-after-settle.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/da591d3a1403ad8a/M2-android-after-settle.png) [M2-android-after-settled.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/274152f2b2349d04/M2-android-after-settled.json)
- [M2-ios-before-steps.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/666def17d5e88d63/M2-ios-before-steps.json)
- [M2-ios-after-steps.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f1352e5a1ef9df89/M2-ios-after-steps.json)
- [M2-android-before-steps.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c11109054585f41f/M2-android-before-steps.json)
- [M2-android-after-steps.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/44f82a3f05add08f/M2-android-after-steps.json)

**Unverified assigned variants:** none. This sheet covers M2 only; it makes no claim about the other capturer’s web/desktop or delegated-child rows.
