Track Expo precompiled modules with React Native source fallback
- Dominant language
- TypeScript
- Stars
- 41
- Forks
- 1
- Avg merge
- 1h 25m
- Merged PRs (30d)
- 397
Description
## Problem
The default Expo iOS release-QA fixture builds and installs, then aborts because its precompiled ExpoModulesWorklets framework requires React.framework, while React Native was installed from source. Stim correctly reports a fatal native launch; the app cannot complete the loop with these installed Pods.
```text
Native crash: EXC_CRASH / SIGABRT / DYLD / Library missing
Library not loaded: @rpath/React.framework/React
Referenced from: app.app/Frameworks/ExpoModulesWorklets.framework/ExpoModulesWorklets
```
## Evidence
- Stim candidate based on 49ae2fce16fbc49b69c710063ded7b685f3c7fea; Expo57.0.21, React Native0.86.3, ExpoModulesCore57.0.17; Xcode26.6 / iOS simulator26.5.
- Native loop built successfully, then the app aborted. The retained artifact has ExpoModulesWorklets.framework but no React.framework or ReactNativeDependencies.framework; `otool -L` confirms both are linked requirements of ExpoModulesWorklets.
- Repeating the Expo iOS lifecycle with `EXPO_USE_PRECOMPILED_MODULES=0` passed cold launch, second-worktree artifact reuse and cleanup. Expo iOS cache suite passed with that setting too.
- Running the installed upstream Ruby decision code with only the React Native artifact-availability probe stubbed to return false yields `reactNativeBuildsFromSource: true` and `expoPrecompiledModulesEnabled: true` when both prebuilt environment flags are1. No Stim code participates in that decision probe.
- Private release evidence: `release-qa-1.0.0.3deGkF/loop-expo-ios.log`, `source-modules-loop-expo-ios.log`, `source-modules-caches-expo-ios.json`; original disposable source fixture retained under `tmp/stim-native-expo-ios-iAIaTB/app`.
## Cause
The installed React Native `scripts/cocoapods/rncore.rb` lines79–87 falls back to source when its artifact probe fails, but leaves `RCT_USE_PREBUILT_RNCORE=1`. Expo's `scripts/ios/precompiled_modules.rb` lines984–985 decides whether prebuilt React is active solely from that environment value. This decision gap is reproduced. A transient artifact probe failure is consistent with the original fixture's dependency graph, but the original probe response was not captured, so its precise cause is still unconfirmed. The artifact URL returns HTTP200 now.
## Fix idea
Prefer an upstream Expo check of React Native's resolved source/prebuilt decision rather than only the requested flag. For release QA, record the source-module setting explicitly; also retest the default path once artifacts are available. Do not silently change every user's build configuration or mark the original failure as passed. Determine whether a doctor diagnostic is useful only after the upstream behavior and default-path rerun are settled.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.