Skip to content

bug: iOS bridgeless dev menu auto-opens + JS thread detaches on interaction, blocking remount-without-reload workflows #335

Description

@Lykhoyda

Description

On iOS bridgeless (RN 0.83 New Arch, Expo 55, iOS 26.2 simulator), the expo-dev-client dev menu auto-opens as a bottom sheet on every app boot / cdp_reload (Home renders behind it). Interacting with it (swipe-to-dismiss or button taps) frequently pauses the JS thread / detaches the Hermes targetcdp_status then reports APP_DETACHED (0 targets) and Runtime.evaluate times out ("JS thread paused"). Dev-menu refs also go stale between device_snapshot and device_press (the sheet animates / re-renders).

Net impact: live-verification flows that need a remount without a reload — e.g. the // @refresh reset HMR trick to reset a component ref while preserving an injected RTK Query cache — become impractical, because the only reliable recovery is terminate+relaunch, which wipes the in-memory JS store and re-triggers the dev menu.

Environment

Field Value
Plugin version 0.55.3
CDP Bridge 0.45.7
Tool count 77
OS Darwin 25.5.0
Node.js v26.3.0
npm 11.16.0
Metro running on 8081
iOS Simulators 1 booted
Android Emulators 0 connected
agent-device 0.17.5
maestro-runner 1.1.16
App arch React Native Bridgeless (New Arch), Hermes

Recent Tool Activity

Telemetry: stale (last event 16 days ago — capture not active in this plugin version, removed with the Experience Engine, GH #200).

Steps to Reproduce

  1. On a dev-client staging build (iOS bridgeless), call cdp_reload (or cold-launch the app).
  2. The dev menu appears as a bottom sheet; Home renders behind it.
  3. Swipe the sheet down to dismiss (or tap a dev-menu button).
  4. cdp_statusAPP_DETACHED, 0 Hermes targets; Runtime.evaluate('1+1') times out ("JS thread paused").

Workaround

xcrun simctl terminate <udid> <bundle> && xcrun simctl launch … recovers the connection, but wipes the in-memory JS store and re-opens the dev menu — so it cannot be used mid-injection (e.g. when an RTK Query cache has been patched and must survive a component remount).

Suggested Fix

  • A tool to reliably dismiss the iOS dev menu (parallel to cdp_dismiss_dev_client_picker, which is Android-only today).
  • And/or a remount-without-reload primitive that preserves the JS store, so injected RTK/Redux state survives a forced component remount.

Related Issues


Submitted via /rn-dev-agent:send-feedback — data sanitized automatically

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingeffort:mEffort: ~1-3 dayskano:must-beKano: basic expectation — absence causes strong dissatisfactionpriority:nextUp next after current 'now' items

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions