[macOS 14.3] CUA service launch crash triggers PiP zombie-process loop
Summary
On macOS 14.3, Codex Desktop starts SkyComputerUseService even though the helper declares LSMinimumSystemVersion 14.4. The helper crashes during process initialization. The Desktop PiP bridge then retries about every 1.67 seconds without backoff, and each exited direct child remains a zombie under the main Desktop process.
This can exhaust the per-user process limit during an otherwise idle Desktop session.
Environment
- Codex Desktop bundle ID: com.openai.codex
- Desktop version: 26.730.61639, build 6234
- Computer Use helper: com.openai.sky.CUAService 26.803.1000621, build 1000621
- macOS: 14.3, build 23D56
- Apple Silicon
The installed Computer Use helper is byte-identical to the copy bundled with the app. This does not appear to be a corrupted local helper copy.
Reproduction
- Use Codex Desktop on macOS 14.3.
- Launch the app and leave the Desktop session running.
- Observe the Desktop logs and process table.
The loop begins without a user initiated Computer Use action in this session.
Actual behavior
Each cycle follows this sequence:
- Desktop logs Refreshing managed Computer Use service for PiP and receives a new process identifier.
- The new SkyComputerUseService crashes about 124 ms after launch.
- RemoteHostedPIPContent logs CUAService bootstrap failed with NSOSStatusErrorDomain Code -600, procNotFound.
- It requests another reconnect and starts another helper about 1.67 seconds later.
- The exited helper remains a zombie whose direct parent is the main Desktop process.
Sanitized crash signature:
- EXC_BAD_ACCESS
- SIGBUS
- KERN_PROTECTION_FAILURE
- faulting initialization frames include map_images_nolock, map_images, dyld4 RuntimeState setObjCNotifiers, and _objc_init
The service has not yet reached its own request handling when it crashes. procNotFound is therefore a consequence of the service being gone, not the initiating error.
Impact
The observed cadence is approximately 0.60 zombies per second, one per retry. The condition eventually blocks creation of new user processes.
Expected behavior
- Gate Computer Use and PiP on the helper supported OS range, with a clear unsupported version message on macOS 14.3.
- Reap every failed helper launch.
- Use bounded exponential backoff and a retry budget for PiP CUA bootstrap failures.
Suggested fixes
- Do not launch CUA version 26.803.1000621 below its declared macOS 14.4 minimum, or ship a compatible helper.
- Ensure the Electron or native spawn path observes and reaps every helper exit.
- Add retry backoff and a circuit breaker to the PiP CUA bootstrap path.
- Add a regression test that asserts helper count and zombie count remain stable when bootstrap repeatedly fails.
Workaround
Upgrading macOS to 14.4 or later is the first environment correction to test. Fully quitting Codex clears existing zombies, but reopening it on macOS 14.3 restarts the loop.
3 Comments
Additional confirmed reproduction: macOS 13.7.5, with Computer Use disabled and uninstalled
I can confirm the same failure mode on an older supported Desktop OS. This adds evidence that the native PiP host starts independently of the Computer Use MCP/plugin installation state.
Environment
26.730.61639, build6234com.openai.sky.CUAService26.803.100062113.7.5LSMinimumSystemVersion = 14.4LC_BUILD_VERSION minos 14.4The Desktop application itself launches on this OS, but the bundled helper requires macOS 14.4.
Computer Use was disabled/uninstalled before the controlled reproduction
The following were all confirmed before the cold launch:
computer-useMCP entry was disabled.computer-use-bundled-plugin-auto-install-disabledwastrue.<HOME>/.codex/computer-usedirectory was absent.The only remaining helper was the copy embedded in the Desktop application bundle.
Cold-start timeline
A fresh Desktop main process started at
09:57:54.The reconnect cycle then repeated approximately every 1.65 seconds.
At
09:58:07, Desktop regenerated the disabled[mcp_servers.computer-use]stanza inconfig.toml. This shows that removing the MCP registration is not a durable workaround. More importantly, the nativesky.node / RemoteHostedPIPContenthost had already started before that configuration was regenerated.Zombie-process evidence
A ten-second sample after the cold start showed:
All zombies had the current Desktop main PID as their direct PPID. Newly created zombie PIDs matched the process identifiers reported by the reconnect log.
PiP gate appears independent of Computer Use availability
Local bundle inspection shows the Remote Hosted PiP host is gated by both:
cuaPIPfeature flag; andcomputerUseAlwaysHidePictureInPicturesetting not beingtrue.The Computer Use settings UI exposes this as Always hide picture in picture, but disabling or uninstalling Computer Use does not automatically set it. Consequently, the PiP host can continue bootstrapping CUA even when the MCP/plugin is unavailable.
Expected behavior
In addition to the fixes already proposed in this issue:
This reproduction contains no user-initiated Computer Use action; launching Desktop and leaving it idle is sufficient.
Additional independent reproduction and verified workaround
I encountered the same issue, investigated its root cause, and independently reproduced it. I also submitted my findings through the official Codex feedback flow.
Feedback thread ID:
019fd78c-c037-7750-b56f-dbf7048ae528Additional measurements
During the affected session, I observed 2,360 managed Computer Use PiP service refreshes over 3,896.967 seconds, giving an average interval of approximately 1.652 seconds.
The
processIdentifiervalues reported by the PiP refresh logs matched the resulting zombie PIDs one-for-one. All affected zombie processes had the main ChatGPT process as their direct parent.Verified workaround
Enabling Always hide picture in picture in the Computer Use settings and fully restarting ChatGPT stopped the leak.
Before applying the workaround, zombies increased at approximately 0.60–0.64 per second. After applying it, the zombie count remained unchanged at
1 → 1during a subsequent 30-second measurement.Environment:
Thank you for reporting this!
This issue should be resolved in the latest Codex update