Skip to content

Track Expo precompiled modules with React Native source fallback #575

Description

@janicduplessis

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.

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 49ae2fc; 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions