# fix\(mobile\): disarm the first-paint valve once any frame has painted · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/commit/fd62e5edff976f1cb2e0bfc931a556f43c142a45)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

Requested revision: fd62e5edff976f1cb2e0bfc931a556f43c142a45

Requested commit: fd62e5edff976f1cb2e0bfc931a556f43c142a45

Commit: fd62e5edff976f1cb2e0bfc931a556f43c142a45

Tree: c8576f3bcb66c9390254c885ec6ec259261dc384

Author: Julius Marminge

Committer: Julius Marminge

## Message

```
fix(mobile): disarm the first-paint valve once any frame has painted

expo-updates disarms its OTA recovery tasks at RN's first-native-view
marker, which rides the first commit ANYWHERE in the root tree — providers
above the navigation seam mount native views too. If a shell frame ever
paints before Home's first commit, a Home crash afterwards is already
'after content appeared' for expo: a rethrow there would be a plain crash
with the recovery tasks removed — strictly worse than the fallback. So the
valve now also requires that the app has never completed a commit, latched
by a sentinel layout effect that flips inside that very first commit and
therefore stays false exactly when a render-phase throw discards it.

In the all-at-once launch (the pre-PR world for bad OTAs) the valve fires
and the startup-error pipeline runs; in an early-shell world it self-disarms
and the fallback wins, matching the fact that cached-update fallback was
never available in that world even on main.

```

## Parents

- [cb480a0f54748c8bf1dc0dd624c5b400b808529e](https://git.cafe/pingdotgg/t3code/commit/cb480a0f54748c8bf1dc0dd624c5b400b808529e?format=markdown)

[Source at this commit](https://git.cafe/pingdotgg/t3code/tree/fd62e5edff976f1cb2e0bfc931a556f43c142a45?format=markdown)
