[Bug] Computer Use spawn storm exhausts launchservicesd and triggers WindowServer watchdog kernel panic on macOS 26.5
Summary
The ChatGPT desktop app / Codex on macOS repeatedly spawned SkyComputerUseService at approximately 5-8 processes per second immediately after app launch. The services were not reused or cleaned up. This caused two separate failure modes:
- The desktop app accumulated roughly 340 threads and crashed from a V8/Node OOM after about 60-80 seconds.
- More than 500 GUI helper instances exhausted
launchservicesd's dispatch-thread hard limit (512). WindowServer then failed its watchdog check-ins and macOS kernel-panicked and rebooted.
This happened twice. Computer Use was not actively being invoked when the spawn storm began.
The only effective local mitigation has been to prevent the Computer Use runtime from being installed/launched. That keeps Codex stable but makes Computer Use unavailable, so it is not an acceptable long-term resolution.
Please treat this as a critical desktop stability issue because it can reboot the host Mac and cause loss of unsaved work.
Environment
- Device: Apple Silicon Mac
- macOS:
26.5 (25F71) - First affected desktop build:
26.810.41047 (6570) - Reproduced after updating to build
6644 - Current desktop build:
26.810.52044 (6662) - Computer Use runtime:
26.812.1000717 (1000717) - Computer Use bundle ID:
com.openai.sky.CUAService
The current build still enters ensureServicePidForEnabledFeatures and logs a managed-service reconciliation failure while the runtime is intentionally blocked. I have not unlocked the runtime to reproduce on build 6662 because two previous tests caused kernel panics.
Timeline and observed impact
- App launch: helper spawn storm begins within seconds.
- Spawn rate: approximately 5-8
SkyComputerUseServiceprocesses per second. - Around 60 seconds: app reaches roughly 337 threads / 6 GB RSS.
- Around 62-79 seconds: app crashes with V8 OOM.
- 518 distinct Computer Use service PIDs were present in the WindowServer spin evidence.
launchservicesdreached its dispatch-thread hard limit of 512.- WindowServer stopped checking in, was killed twice by watchdog, and could not reinitialize.
- macOS kernel-panicked and rebooted twice.
Local artifacts:
- 26 ChatGPT/Codex crash reports after the initial event and controlled reproductions.
- 2 full kernel panic reports.
- 4 WindowServer userspace watchdog spin reports.
Raw reports can be provided through a private OpenAI support channel if requested. They are not attached publicly because the spin reports contain a full local process inventory and paths.
Desktop app crash signature
All sampled app crashes shared the same pattern:
exception: EXC_CRASH / SIGABRT (some later reports were SIGTRAP)
faulting thread: computer-use or V8Worker
node::OOMErrorHandler(char const*, v8::OOMDetails const&)
185-188 computer-use threads
approximately 138 threads blocked in AESendMessage waits
Representative blocked path:
__ulock_wait
_dispatch_group_wait_slow
AESendMessage
ffi_call_SYSV
sky.node N-API callback
Managed service failure
The desktop log repeatedly reported:
Failed to reconcile managed Computer Use service
appshotsEnabled=true
computerUseEnabled=true
errorMessage="Failed to spawn managed Computer Use service"
at ensureServicePidForEnabledFeatures
In a sanitized sample, the first two helpers started only about 149 ms apart while the first instance was still performing startup work. More helpers continued at roughly the same interval.
Each helper emitted repeated macOS runtime diagnostics during startup:
This method should not be called on the main thread as it may lead to UI unresponsiveness.
The messages were emitted from security/privacy-related initialization. This suggests the desktop service manager is starting another instance before the previous instance can finish registration and report availability.
There was no matching Gatekeeper/amfid signature-denial event in the original failure window.
AppleEvent failure
Every failing helper eventually logged an AppleEvent reply failure:
returned -609 for event SkCu/PiPB to ChatGPT
Error #17 (os/kern) invalid right attempting to add send right
dead:1
The bridge uses CodexComputerUseNativeBridge-1 and synchronous AESendMessage(..., kAEWaitReply, ...).
My current working hypothesis is a lifecycle race rather than a missing libuv run loop: multiple concurrently launched service instances supersede or invalidate the pending rendezvous/reply state, so older instances attempt to reply to ports the desktop app has already discarded.
Kernel panic / system evidence
The panic string was:
userspace watchdog timeout: no successful checkins from WindowServer
WindowServer initialization not complete (post IOKitWaitQuiet)
The corresponding WindowServer spin report begins with:
Processes reached dispatch thread hard limit (512): launchservicesd
The report contained 8,978 references to SkyComputerUseService and 518 distinct service PIDs. Kernel panic memory statistics showed no swap or compressor exhaustion, so memory pressure was not the direct panic path. The direct path was LaunchServices exhaustion followed by WindowServer watchdog failure.
Reproduction
This was reproducible on the affected machine by:
- Allow the normal Computer Use runtime to exist under the Codex home directory.
- Launch the ChatGPT desktop app / Codex.
- Do not invoke Computer Use; simply observe processes after launch.
- Within approximately five seconds, multiple
SkyComputerUseServiceprocesses begin spawning. - Without a safety monitor, the app crashes in about one minute and the OS can subsequently reboot.
I do not recommend reproducing without a separate watchdog that terminates the test after more than 2-3 concurrent service instances.
Mitigations tested
Did not resolve the problem:
- Updating desktop build 6570 to 6644.
- Hiding Computer Use Picture in Picture.
- Setting the bundled Computer Use plugin to disabled; the app restored it to enabled.
- Deleting the Computer Use runtime; the app automatically reinstalled it.
- Disabling the MCP entry alone.
Effective safety mitigation:
- Block the Computer Use runtime directory so the app cannot reinstall or start the helper.
- The app then logs one reconciliation warning per session instead of entering the spawn loop.
- No further app crashes or kernel panics have occurred while the runtime remains blocked.
This mitigation disables Computer Use and therefore only protects the machine; it does not restore the feature.
Requested fixes
Please prioritize the following:
- Add a process-global single-flight/in-progress guard around managed Computer Use service startup.
- Enforce a hard maximum of one active/starting service instance.
- Add bounded retry with exponential backoff and a circuit breaker; never retry several times per second.
- Cancel and reap failed/superseded helpers and pending AppleEvent requests.
- Move slow security/privacy initialization off the helper's main thread where possible.
- Ensure the desktop app honors a supported Computer Use disabled state without automatically reinstalling or re-enabling it.
- Add a regression test that simulates slow helper startup and verifies no second instance is launched.
- Identify the first desktop/runtime build containing the fix so the blocked runtime can be restored safely.
I can validate a candidate fix with a strict process-count watchdog and provide redacted crash, panic, spin, and unified-log excerpts through a private OpenAI support channel.
Related issues
- #25744 - Computer Use / MCP helper accumulation and WindowServer/TCC stalls
- #20683 -
-609 connectionInvalidfrom Computer Use - #37420 - Computer Use/replayd reconnect loop
- #29157 -
turn-endedComputer Use helper leak
This report adds the previously unreported escalation from helper accumulation to launchservicesd's 512-thread hard limit and an actual WindowServer watchdog kernel panic.
12 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Follow-up observation from current build
26.810.52044 (6662): Computer Use is not completely unavailable while the downloaded/managed runtime remains blocked.There appear to be two distinct launch paths:
ensureServicePidForEnabledFeatures) and uses the downloaded Computer Use runtime. This is the path that entered the rapid spawn loop in the original incident. It remains blocked locally, and the desktop log emits one managed-service reconciliation warning instead of retrying continuously.cua_noderuntime. A task can import@oai/skythroughnode_repl, which launches the bundledCodex Computer Use.app/SkyComputerUseServiceindependently of the blocked downloaded runtime.During an active Computer Use task on the second path:
SkyComputerUseServiceremained running for more than 14 minutes.launchservicesdhad 10 threads and WindowServer had approximately 30, far below the previous 512-thread exhaustion condition.One separate lifecycle concern remains: 22
node_replbroker processes were present. Their count stayed constant during the short sample and each used roughly 19 MB, so this was not an immediate spawn storm, but the count is high relative to four active tasks and may indicate long-session cleanup/retention issues.So the current local mitigation should be described more precisely as blocking the desktop-managed automatic service path, not disabling every Computer Use implementation. The on-demand bundled path currently works and appears stable in this short observation. This does not prove the original lifecycle race is fixed; removing the managed-runtime block has not been retested because the prior attempts caused kernel panics.
Additional evidence clarifies why the app-bundled on-demand path behaves differently from the desktop-managed path.
The helper binaries are identical
The app-bundled helper and the backed-up downloaded helper have:
26.812.1000717 (1000717)com.openai.sky.CUAServiceThis makes a helper binary or protocol-version mismatch unlikely. The important difference is service ownership and startup coordination.
The on-demand client has connect-first and single-client behavior
The app-bundled
@oai/skypackage is version0.6.11. Its Code Mode implementation:node_replsession.ensureServiceonly after the socket is unavailable.This is consistent with the observed single stable helper during an active Code Mode Computer Use task.
By contrast, the desktop-managed startup path entered
ensureServicePidForEnabledFeaturesduring feature reconciliation and created another GUI helper approximately every 149 ms before the previous instance had become ready. The evidence still suggests this path lacks an effective process-global single-flight/readiness guard or equivalent deduplication.Quarantine differs, but is probably an amplifier rather than the root cause
The downloaded helper executable had a
com.apple.quarantineattribute; the identical app-bundled executable did not. Repeated Gatekeeper/TCC/static-code evaluation of the quarantined copy could increase startup latency and make the race easier to trigger. However, manually removing quarantine would only change timing and would not fix unbounded duplicate launches, so I do not consider it a safe resolution.The package also contains both the older MCP launcher through
$CODEX_HOME/computer-useand the newer Skill instructions that requirenode_repl + @oai/sky. This looks like a compatibility/migration overlap in the current build, although that interpretation is an inference from the installed package rather than a documented architecture statement.Additional local containment
I have now removed the
turn-endednotification hook so completed turns do not wake the Computer Use client unnecessarily. This does not explain or fix the original app-launch storm, but it removes a separate background lifecycle trigger associated with other reports.A local watchdog now observes the exact helper process count. It allows the normal single helper, but if three or more helpers persist across two consecutive samples it terminates the desktop app and helper processes and reasserts the blocked managed-runtime directory before the count can approach LaunchServices exhaustion. This is only host protection, not a product fix.
The product-side fix should make the desktop-managed path use the same connect-first/single-flight behavior, enforce one active or starting service globally, wait for readiness with bounded backoff, and provide separate supported controls for background/Appshots service management versus on-demand Computer Use.
I can confirm that I’m experiencing the same regression.
System:
Last known working version:
Affected versions I tested:
I can reproduce the issue consistently with every 26.810.x build I’ve tested.
Activity Monitor observations
With the working 26.803.81509 build:
With the affected 26.810.x builds:
The important difference is that the thread count and memory usage never stabilize on the affected builds. They keep increasing until the application crashes.
Downgrading to 26.803.81509 immediately restores the normal behavior (~65 threads / ~700 MB RAM) on the exact same machine.
This strongly suggests a thread/worker and memory leak introduced somewhere between 26.803.81509 and 26.810.41047.
The automatic updater also makes the workaround difficult: after reinstalling the working 26.803.81509 version, a newer affected version is automatically installed after restarting the application.
This issue has made the desktop app unusable for me for several days.
I can provide crash reports, logs, Activity Monitor screenshots, or additional diagnostics if that would help.
I independently reproduced this on the updated build.
Environment:
Controlled A/B test:
computer_use=falseand the managed Computer Use directory blocked/read-only: after relaunch, ChatGPT stayed at 1 process andSkyComputerUseServicestayed at 0 for 15 seconds.computer_use. On a clean launch, the helper count was:The test was aborted at 10 helpers and the processes were stopped immediately.
computer-use/ V8node::OOMErrorHandlercrashes (includingparse_distilled_htmlframes).The mitigation is restored:
computer_use=false, the managed runtime directory is read-only/quarantined, and the Desktop app relaunches stably with zero Computer Use helpers.This confirms the spawn storm still reproduces on 26.810.52044; it is not limited to an old stale helper copy.
I can confirm that this issue is caused by the SkyComputerUseService spawn storm on my machine as well, and I can also confirm that blocking the Computer Use runtime directory completely fixes the problem for me.
System
Versions tested
Last known working version:
Affected versions without the workaround:
Every 26.810.x build I tested exhibited the same behavior before applying the workaround.
Activity Monitor comparison
With the working 26.803.81509 build:
With the affected 26.810.x builds:
The thread count and memory usage never stabilize on the affected builds.
SkyComputerUseService spawn storm
I compared the running processes between the working and affected versions using:
ps aux | grep -i SkyComputerUseService | grep -v grep
On 26.803.81509, this normally shows only one SkyComputerUseService process:
~/.codex/computer-use/Codex Computer Use.app/Contents/MacOS/SkyComputerUseService
On the affected 26.810.x builds, the same command shows dozens of SkyComputerUseService instances being continuously spawned. Some of the newly spawned processes immediately consume significant CPU.
This continues until CPU, memory and thread usage become excessive and the application eventually crashes.
Important: Computer Use was never enabled
Computer Use is completely disabled/unchecked in my Codex settings.
I have never enabled or used Computer Use.
Despite this, the affected 26.810.x builds continuously spawn SkyComputerUseService processes in the background.
Workaround confirmed
With Codex completely closed, I ran:
mv ~/.codex/computer-use ~/.codex/computer-use.disabled
mkdir ~/.codex/computer-use
chmod 000 ~/.codex/computer-use
After doing this, I launched 26.810.41047 again.
The problem was completely gone:
Workaround survives the update to 26.810.52044
I then allowed Codex to update from 26.810.41047 to the latest version currently available to me, 26.810.52044.
After the update, 26.810.52044 also started normally and remains stable with the workaround in place.
The update did not undo the blocked ~/.codex/computer-use directory, and I am no longer seeing the runaway SkyComputerUseService processes, excessive CPU/RAM usage, or startup crash.
So on my machine the A/B result is very clear:
26.810.x without workaround
→ runaway SkyComputerUseService spawning
→ CPU/RAM/thread growth
→ crash
26.810.x with ~/.codex/computer-use blocked
→ normal CPU/RAM/thread usage
→ no spawn storm
→ no crash
I have now confirmed this on 26.810.52044 after updating from 26.810.41047.
Downgrading to 26.803.81509 also immediately restores normal behavior without the workaround, which suggests the regression was introduced somewhere between 26.803.81509 and 26.810.41047.
Hopefully this additional confirmation and the exact workaround help narrow down the regression.
Independent confirmation with a distinct failure signature: the failed helpers are left as real macOS zombie processes, and the helper crash is in AppKit/IOSurface startup rather than V8 OOM.
Environment
26.810.52044(build6662)0.148.0-alpha.926.812.1000717Darwin 25.6.0 arm64 arm26.6.2(25G82), Apple SiliconReproduction and process evidence
statusItemMenuState.SkyComputerUseServiceis launched and exits repeatedly.psreports 263 direct children of the ChatGPT main process inZ/<defunct>state:All 263 have the same ChatGPT parent. The ChatGPT parent cwd is
/, so this is not tied to a project or worktree. The same pattern occurred under a previous ChatGPT parent process; fully quitting removes the zombies, but relaunching creates a fresh population.The desktop app log records:
Helper crash signature
A retained
SkyComputerUseServicecrash report shows:The service therefore aborts while initializing
NSWindow/IOSurface. Subsequent AppleEvent failures includeAESendMessage failed with -600, consistent with the target process already having exited.This exposes two independently actionable failures:
SkyComputerUseServicebuild26.812.1000717can abort during AppKit/IOSurface initialization on macOS 26.6.2.One additional observation: the downloaded managed helper under
$CODEX_HOME/computer-usewas changed to mode000with theuchgflag immediately after the retry burst. That may be a downstream quarantine/circuit-breaker action rather than the primary cause, because the crash report proves the helper ran and aborted first.Raw logs and the
.ipsreport remain local because they contain machine paths and identifiers. Sanitized excerpts above are verbatim.---
This issue or PR was generated by LazyCodex.
Tag: lazycodex-generated
Adding another independent reproduction with a very similar crash signature.
Environment
Observed behavior
The crash report showed:
187 Computer Use threads
Dispatch Thread Soft Limit Reached: 64
Node/V8 out-of-memory abort
The 187 Computer Use threads count is particularly notable because it matches the count reported in this issue almost exactly.
This does not look like ordinary high memory usage. From what I can observe, SkyComputerUseService instances continue accumulating until Codex exhausts process/thread/memory resources and aborts.
I’ve reproduced the problem repeatedly on this machine and it currently makes the Codex desktop app effectively unusable.
I can reproduce the same issue on ChatGPT/Codex Desktop 26.814.41407 on macOS.
Environment
26.814.41407Reproduction
After launching the app, it quickly becomes unresponsive.
I monitored the number of
SkyComputerUseService/SkyComputerUseClientprocesses with:Observed on 26.814.41407:
This is approximately 8 new Computer Use processes per second.
Result
The process count continuously increases after startup until the application becomes unresponsive.
I also tested after resetting/removing the previous Codex configuration, but the issue still reproduces. This suggests the problem is not caused by a stale
config.tomlor configuration migration.Rollback comparison
I rolled back to 26.730.61639 on the same machine and ran the exact same process monitoring command.
Observed on 26.730.61639:
The process count remains stable at 1, and the application is usable normally.
This provides a direct A/B comparison on the same machine:
26.814.41407: runaway spawning (~8 processes/sec) → app becomes unresponsive26.730.61639: stable at 1 process → app works normallySo the
SkyComputerUseServicespawn storm is still reproducible in 26.814.41407, while rolling back to 26.730.61639 avoids the issue on the same system.If useful, I can also provide macOS crash logs / process tree information.
Still reproducible on 26.820.60940 (build 7119): full macOS UI freeze
I can confirm that this remains unfixed in the current desktop build, with a newer and more severe reproduction.
Environment
26.820.60940(build7119)26.819.1000816(build1000816)26.5.1(25F80)Mac17,7/ M5 Max, arm64Impact and forensic evidence
On 2026-08-28 the machine experienced two complete UI freezes, around 01:15 and 01:25 local time, each requiring a forced power-button reset.
The retained WindowServer userspace-watchdog spin from the first incident shows:
launchservicesd: 513 threads, with the report explicitly noting a hard limit of 512.WindowServer: no successful check-in for 40 seconds.SkyComputerUseServiceprocesses.The later
btn_rstreport records the forced reset. It should not be interpreted as the initiating kernel panic; the initiating failure was the userspace WindowServer/LaunchServices deadlock described above.Hardware checks did not identify an alternative cause: memory had no swap/pageout pressure, SSD SMART/APFS status was healthy, and there were no thermal warnings.
Trigger path in this build
The desktop log repeats:
Sampling the ChatGPT parent during the storm shows multiple workers in:
The bootstrap does not complete, the manager does not obtain/save a reusable service PID, and another status-item menu state request starts another helper. There is no effective process-global single-flight guard or retry backoff.
A bounded follow-up test also showed that setting
[features] computer_use = falsealone is insufficient for the desktop path: after the app refreshed the canonical helper bundle, a second launch produced 38 helpers before it was stopped. This agrees with the log identifyingstatusItemMenuState, rather than an active Computer Use task, as the trigger.Verified containment
The following combination survives a cold launch locally:
defaults write com.openai.codex mac-menu-bar-enabled -bool false[features] computer_use = false, keep the Computer Use MCP disabled, and remove the top-levelnotifyhook that invokesSkyComputerUseClient turn-ended.$CODEX_HOME/computer-use/.CODEX_ELECTRON_SKIP_COMPUTER_USE_CANONICAL_REFRESH=1so desktop startup does not silently restore that helper.CODEX_HOME; on this machine~/.codexis a symlink, so path canonicalization may be an additional test variable, although it is not proven to be the primary cause.A controlled cold launch with this containment ran for 20 seconds with:
SkyComputerUseService: 0launchservicesd: 5-7 threadsBrowser and in-app browser features remained enabled.
Requested product fixes
I can provide a redacted WindowServer spin and desktop log excerpts if needed. The raw spin is not attached publicly because it contains a complete local process inventory and filesystem paths.
Follow-up evidence from the same machine after applying the local safety guard:
SkyComputerUseServicehelpers and no new crash/panic report. The former 600-second app-termination path remains disabled.cua_nodechild processes (11node_repl/ server pairs) currently total about 1.0 GiB RSS. Several have been alive for roughly 5 hours and remain after their subagent work completed. All are children of the Codex app-server.cua_nodeor the desktop parent.This suggests the original self-exit is fixed locally, while long-lived
cua_nodesession cleanup may be a separate accumulation issue worth investigating upstream.Additional follow-up from the same machine after upgrading to ChatGPT/Codex Desktop 26.820.60940 (build 7119) on macOS 26.5.1:
SkyComputerUseServicecount remains 0, and no new Codex/ChatGPT/Sky diagnostic report has appeared.This is continued evidence that a bounded helper-only circuit breaker prevents whole-machine failure without requiring the desktop parent to be killed. It does not establish that the upstream helper lifecycle is fixed, because the local guard/disabled helper state remains active.