[macOS] ChatGPT 26.818.41705 still enters unbounded SkyComputerUseService spawn storm, freezes Mac, and crashes
What version of the Codex App are you using (From “About Codex” dialog)?
[macOS] ChatGPT 26.818.41705
What subscription do you have?
ChatGPT Pro
What platform is your computer?
macOS 26.5.2 (Build 25F84), Apple Silicon arm64 — Darwin 25.5.0
What issue are you seeing?
a/.hermes/workspaces/operator/chatgpt-codex-spawn-storm-report.md → b/.hermes/workspaces/operator/chatgpt-codex-spawn-storm-report.md
@@ -0,0 +1,125 @@
+# [macOS] ChatGPT 26.818.41705 still enters unbounded SkyComputerUseService spawn storm, freezes Mac, and crashes
+
+## Summary
+
+The unified ChatGPT/Codex desktop app on macOS repeatedly creates SkyComputerUseService helpers without an apparent bound. The helper population rapidly consumes several gigabytes of RAM, drives system load extremely high, makes the Mac unresponsive, and ends with a ChatGPT crash.
+
+This reproduces while the app is idle; Computer Use does not need to be invoked manually.
+
+The behavior appears to match open reports such as #38760, #38841, and #39151, but it still reproduces on the newer desktop build 26.818.41705 (build 6971).
+
+## Environment
+
+- ChatGPT desktop app: 26.818.41705 (build 6971)
+- Crashing predecessor observed immediately beforehand: 26.818.41509 (build 6962)
+- Bundle identifier: com.openai.codex
+- macOS: 26.5.2 (25F84)
+- Architecture: Apple Silicon / ARM64
+- Hardware model: Mac16,10
+- Memory: 16 GiB
+- Codex Framework: 151.0.7922.170
+
+## Steps to reproduce
+
+1. Fully terminate ChatGPT and all existing Computer Use helper processes.
+2. Launch /Applications/ChatGPT.app normally.
+3. Do not invoke Computer Use; leave the app open.
+4. Observe the process population and resource use.
+5. SkyComputerUseService instances begin accumulating within seconds.
+6. The UI becomes increasingly unresponsive and ChatGPT eventually crashes.
+
+## Observed results
+
+### First live observation
+
+- SkyComputerUseService: 81 processes
+- Combined helper RSS: approximately 4.5 GiB
+- System load average: approximately { 24.08 26.03 29.96 }
+- Multiple additional Codex renderer, security, Node, and Crashpad processes were present.
+
+### Clean restart verification
+
+After fully terminating the ChatGPT/Computer Use process tree and reopening the app:
+
+- Within approximately 8 seconds: 13 SkyComputerUseService processes
+- Combined helper RSS: approximately 1.0 GiB
+- Combined helper CPU: approximately 146%
+- Main ChatGPT RSS: approximately 800 MiB
+- The process population continued increasing, so the app was terminated to protect the host.
+
+### Subsequent reproduction
+
+On another launch:
+
+- SkyComputerUseService: 110 processes
+- Combined helper RSS: approximately 7.5 GiB
+- Codex renderers: approximately 2.2 GiB combined RSS
+- Main ChatGPT process: approximately 880 MiB RSS
+- Load snapshot: { 49.82 94.13 69.94 }
+- Peak recent load observed during cleanup: { 95.70 101.35 72.89 }
+- The system had begun swapping heavily and the entire Mac was becoming unresponsive.
+
+Force-terminating the ChatGPT/Computer Use process tree immediately released substantial memory.
+
+## Crash evidence
+
+Two macOS diagnostic reports were generated within minutes:
+
+- ChatGPT-2026-08-22-171729.ips
+- ChatGPT-2026-08-22-171923.ips
+
+Common or relevant fields:
+
+- App version: 26.818.41509
+- Build: 6962
+- bug_type: 309
+- Faulting/triggered thread name: computer-use
+- Work queue limit recorded: Dispatch Thread Soft Limit: 64
+
… omitted 47 diff line(s) across 1 additional file(s)/section(s)
What steps can reproduce the bug?
- Fully quit ChatGPT and terminate any existing SkyComputerUseService helper processes.
- Launch /Applications/ChatGPT.app normally.
- Leave the app open without invoking Computer Use or starting a Computer Use task.
- Open Activity Monitor and search for SkyComputerUseService.
- Observe that new SkyComputerUseService processes appear continuously within seconds.
- Continue observing as the helper count, memory consumption, and system load rise rapidly.
- The ChatGPT UI becomes unresponsive and eventually crashes.
On my Mac, a clean restart produced 13 SkyComputerUseService processes using about 1 GiB within approximately eight seconds. A subsequent occurrence reached 110 helpers using about 7.5 GiB, with system load reaching approximately 95–101.
What is the expected behavior?
ChatGPT should maintain a single bounded Computer Use service lifecycle and remain stable while idle.
If the Computer Use helper cannot initialize or complete its bootstrap handshake, the app should use a retry limit, exponential backoff, process cap, and circuit breaker. Failed helpers should be terminated and reaped.
Leaving ChatGPT idle must not continuously create helper processes or worker threads, exhaust memory and process limits, freeze the UI or operating system, or crash the application.
Additional information
_No response_
7 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I can confirm the same issue on another Mac, including the same crash signature.
Environment:
ChatGPT: 26.818.41705 (6971)
macOS: 27.0 (26A5416b)
Apple Silicon / ARM64
The issue reproduces simply by launching ChatGPT and leaving it idle. I do not need to invoke Computer Use.
Activity Monitor shows ChatGPT Computer Use processes being created continuously. I confirmed that the actual executable is:
~/.codex/computer-use/Codex Computer Use.app/Contents/MacOS/SkyComputerUseService
All instances have the main ChatGPT process as their direct parent. In one observation, the process count increased as follows:
01:08:30 — 26
01:08:32 — 34
01:08:34 — 40
01:08:36 — 48
I also moved ~/.codex/computer-use aside and relaunched ChatGPT to rule out stale/corrupted local Computer Use state. The issue reproduced again immediately.
The macOS crash report shows:
Triggered by Thread: 320 computer-use
Exception Type: EXC_CRASH (SIGABRT)
Dispatch Thread Soft Limit Reached: 64 (too many dispatch threads blocked in synchronous operations)
Application Specific Information: abort() called
I also observed multiple threads blocked in synchronous Apple Event operations involving AESendMessage, NSAppleEventDescriptor sendEventWithOptions:timeout:error:, and RemoteHostedPIPContentService.
This looks like the same unbounded SkyComputerUseService spawn/retry loop described in this issue.
One additional data point: this reproduces on macOS 27.0, whereas the original report is on macOS 26.5.2, so the issue does not appear to be limited to a single macOS major version.
I have the full .ips crash report and an Activity Monitor screenshot showing the process spawn storm if those would be useful.
I can confirm that the same unbounded
SkyComputerUseServicespawn issue still occurs in the newer26.818.61809build (7019).I also found an environment condition that reliably triggers the issue, along with a working workaround.
Environment
26.818.61809(build7019)26.803.6160126.4.1 (25E253)Mac16,8com.openai.codexMy Codex home directory is a symbolic link:
Trigger condition
When
CODEX_HOMEis not already present in the GUI user's launchd environment and 26.818 is launched normally from Finder, the Computer Use PiP bootstrap repeatedly fails.The macOS unified log repeatedly reports the following error for the
SkCu/PiPBAppleEvent:Instead of stopping or applying retry backoff, the application continuously creates new Computer Use helpers and workers.
One crash report shows:
EXC_BREAKPOINT/SIGTRAP(Breakpoint) brk 0computer-usecomputer-useRemoteHostedPIPContentService, V8/Node memory allocation, and garbage collectionThis appears consistent with the helper/process spawn storm and Computer Use thread crashes described in this issue.
Differential test
| Startup condition | Connected to CUAService |
paramErr (-50)| Helper behavior || --- | ---: | ---: | --- |
| Normal startup using the symlinked path | 0 | 24–28 within approximately 12 seconds | Continuously created |
|
CODEX_HOMEset to the physical path | 1 | 0 | At most one new helper |With the physical path, the log reports a successful connection:
Version
26.803.61601also connects successfully on the same machine with the same symbolic link, helper location, account, and macOS permissions.Fully quitting the older version and confirming that
SkyComputerUseServicehad exited did not change the behavior of 26.818. This rules out a helper process left behind by the older version.Setting the physical path only in
config.tomlwas not sufficient. The environment variable must be present before the application starts, suggesting that the PiP/helper bootstrap occurs before this configuration is loaded.Workaround
Set
CODEX_HOMEto the physical target of the symbolic link before launching ChatGPT:Then fully quit and restart ChatGPT 26.818.
If
$HOME/.codexis a symbolic link, the following can also be added to$HOME/.zprofile:Note that
.zprofileis only evaluated when a zsh login shell starts. After logging out or restarting macOS, Terminal must be opened once before launching ChatGPT.Possible root cause
At least in my environment, this appears to be a path-canonicalization regression introduced after 26.803. During the Computer Use PiP bootstrap, 26.818 seems to mix the logical
$HOME/.codexpath with the physical target of the symbolic link.The application should canonicalize
CODEX_HOME, the Computer Use helper path, and related bootstrap parameters before performing thePiPBhandshake.The bootstrap failure path should also enforce a retry limit, exponential backoff, and a helper process cap so that a single
paramErrcannot escalate into unbounded process and thread creation.Confirmed on a newer build with a matching failure signature and additional IPC/path evidence.
Environment
26.818.61809(build7019)26.818.21641(build6849)26.823.100085424G90), Darwin 24.6.0, Apple Silicon arm64com.openai.codexReproduction and crash evidence
Seven matching macOS crash reports were generated between 10:15 and 10:37 CST on August 25, 2026. The failure survived an app update from
26.818.21641to26.818.61809.At failure, the ChatGPT process consistently had:
computer-useEXC_CRASH / SIGABRTwithnode::OOMErrorHandler(...) -> abort(), orEXC_BREAKPOINT / SIGTRAPon the same Node/V8 worker/isolate pathThe unified macOS log showed the bootstrap/IPC loop immediately before the process storm:
The failing code identity path was:
During one approximately 80-second observation window, the log contained 439 unique
SkyComputerUseServicePIDs. At least 266 instances reached normal termination while ChatGPT continued launching replacements. This strongly indicates an unbounded bootstrap retry/reuse loop rather than a single helper crash.This was not system-wide memory pressure: there were no memory-pressure, jetsam, or system OOM events in the failure windows. The machine still had substantial available memory during inspection. The helper also passed strict code-signature and Gatekeeper validation.
Isolation result
I moved
~/.codex/computer-useto a reversible backup location and allowed the app to recreate it. The recreated helper had the same version and identical SHA-256 hashes, ruling out binary corruption.After recreation:
~/.codex/computer-use/...rather than the volatile RAM volume.SkyComputerUseServiceprocess remained active.The path-dependent behavior suggests that the service bootstrap/reuse logic should be inspected for stale Mach/AppleEvent endpoints or LaunchServices registration associated with
CodexVolatileRAM. A failed bootstrap needs deduplication, bounded retries with backoff, a process cap, and cleanup of the correspondingcomputer-useworker/V8 isolate.Raw
.ipsreports and sanitized unified-log excerpts are available if maintainers need a specific sample.@rick147's differential test matches a six-condition matrix I posted in #38769, and I think I can supply the piece nobody in either thread has stated yet: why the symlinked spelling makes the handshake fail, at the code level. Cross-linking so the two threads don't diverge.
Where the mismatch is created
From
app.asar: whenSKY_CUA_SERVICE_PATHis set, it is returned verbatim and un-normalized, and then used asexpectedExecutablePathinwhich the CUA manager consumes as
isExpectedServiceProcess. The expected path is assembled asserviceAppPath/Contents/MacOS/SkyComputerUseService.The AppleEvent itself is sent from
Contents/Resources/native/sky.node, which imports bothposix_spawnandproc_pidpath— consistent with "spawn the helper, read the PID's executable path, compare it to the expected path".proc_pidpathreturns the resolved path (/Volumes/...), whileexpectedExecutablePathretains the symlink spelling ($HOME/.codex/...). Those two strings can never be equal, so the identity/readiness check fails on every attempt, the PID is discarded, and another helper is spawned — with no readiness wait, no backoff, no single-flight, and no cap.This is why
paramErr (-50)here andprocNotFound (-600)in my case are both downstream symptoms rather than the cause: the app is asking about a PID it has already decided isn't its service.It is also why this is not a TCC or LaunchServices problem — the AppleEvent targets a PID directly instead of resolving a bundle URL, and
tccdlogged zero denials forcom.openai.sky.CUAServiceacross 20 minutes of continuous storming on my machine.There is a second un-normalized use worth checking too: the "canonical refresh" step
dittos the source service into${CODEX_HOME}/computer-use/Codex Computer Use.appwithout canonicalizing first.Reconciling the three independent reports
| Source | Symlinked | Canonicalized |
|---|---|---|
| @rick147 (this thread) | 0 connections, 24–28
paramErrin ~12 s, helpers created continuously | 1 connection, 0 errors, at most one helper || #38769 (mine, 6 configs × 6 min) | crash in 126–158 s, 385–434 helpers | exactly 1 helper, stable |
| @iuxxoo (#38769) | — | 1 helper, stable through real Computer Use calls |
One apparent discrepancy is worth stating precisely, because it affects the workaround instructions people are copying:
config.tomlwas not sufficient, and concluded the bootstrap runs before config load.config.tomlstill carried symlinked paths, avoided the crash but still leaked a finite number of helpers at startup (61) before going flat.Both results are consistent with: the env var must be present before launch and is what prevents the storm, while the remaining config paths account for a bounded startup leak. So the safe instruction is to do both, env var first, then relaunch — not either one alone.
Regression boundary
@rick147's observation that
26.803.61601connects successfully on the same machine, same symlink, same helper location, same permissions is the most useful single data point in this thread for whoever picks it up: the symlink did not change, the app's handling of it did. Consistent with that, my first crash occurred about two minutes after an auto-update landed26.810.52044, on a symlink layout that had been in place and working for weeks beforehand.The part that isn't about symlinks
@brian-wijaya reported in #38769 that their helpers were dying with their own
SIGABRTin__assert_rtn/ IOSurface initialization, on a setup where paths were not the issue. A helper that dies during startup for any reason fails the same readiness check and enters the same retry loop — so path identity is one reliable entry point, not the only one.Their other observation is the sharpest structural evidence available: killing all 343 helpers produced exactly 343 replacements. A one-for-one replacement means the desktop process is retaining one restart controller per failed helper, which is precisely the missing single-flight guard, and it explains why killing children never recovers the app.
For whoever picks this up
The two fixes are separable, and the second one is the one that bounds the blast radius regardless of trigger:
With (2) alone — even leaving the path comparison exactly as it is — every report in this thread would degrade from "app consumes several GB, freezes the Mac, and aborts in 90–158 s" into a logged, recoverable handshake failure.
Worth noting that neither
[plugins."computer-use@openai-bundled"] enabled = falsenor[mcp_servers.computer-use] enabled = falsestops the managed service, and the app rewrites the Computer Usenotifyhook back intoconfig.tomlon every launch, so affected users currently have no supported way to opt out while waiting for a fix.Related: #38769, #38697.
Additional data point: the reversible ~/.codex/computer-use reset did not resolve the issue on my machine.
Further testing caused the entire Mac to become unresponsive and reboot at approximately 10:19 JST on Aug 27. I stopped testing to avoid repeated host-level failures.
After reboot, the installed app is 26.803.41515 (build 6321). Its desktop log repeatedly records Browser Use runtime initialization followed by:
heartbeat_automation_resume_failed
invalid thread/session id: "thread"
At the current observation there is only one SkyComputerUseService process, so recreating the helper can change the process count but does not reliably eliminate the underlying failure path.
No kernel-panic report was retained in the standard DiagnosticReports directory, so I cannot confirm whether the reboot was a kernel panic, watchdog event, or an extreme-load reset.
Still reproduces on app
26.820.60940(build 7119) with Computer Use helper26.819.1000816(@oai/sky0.6.21) — newer than the builds in this thread. It took the whole machine down via a kernel panic tonight.Two things I can add that I haven't seen pinned down yet: a different helper crash signature from #38697's
SIGSEGV, and the specific system resource that runs out and turns a helper crash-loop into a full OS reboot.Environment
26.820.60940(build 7119), bundle IDcom.openai.codexcom.openai.sky.CUAService26.819.100081665EBE98C-5C65-4C5C-89DE-44BC66E4EA6FdisplayState: OFF). Computer Use was not invoked manually.Helper crash signature —
SIGABRT, notSIGSEGVEach helper lives ~15s (
procLaunch 23:14:10→ crash23:14:25) and aborts on an assertion while building its firstNSWindow:parentProc: ChatGPT,coalitionName: com.openai.codex. This is a failed IOSurface connection, distinct from the_XXMIGPostNotificationsegfault in #38697. Since it happened with the display asleep, anNSWindowcreated while no display is awake looks like a plausible trigger — the helper asserts instead of handling the failure.Respawn rate: the PID space wraps
Unified log, consecutive helper launches:
~208 processes/second. Between 22:55 and 23:14 the machine burned through the entire PID space and wrapped at least once. There is no backoff at all.
The actual kill mechanism:
launchservicesddispatch-pool exhaustionThis is the part I think is missing from the existing reports. From the watchdog stackshot:
SkyComputerUseServiceprocesses, 7,745 threads, 29.88 GB resident (coalition total 31.47 GB of 48 GB; system-wide RSS 49.98 GB, ~300 MB free)launchservicesd(pid 145) carries flagexceededWQTotalLimitwith 513 threads, 512 of them parked on"queue thread to be allocated"— it hit the libdispatch worker-thread ceiling and deadlockedSkyComputerUseServiceWindowServerthen blocks during startup:turnstile blocked on task pid 145, hops: 3 (com.apple.coreservices.launchservicesd)Every helper launch registers with LaunchServices, so 200 spawns/sec saturates that daemon. Once it deadlocks, WindowServer cannot complete initialization, and the userspace watchdog escalates:
So the reboot is not memory pressure and not a WindowServer bug — it is PID/LaunchServices exhaustion starving a watchdog-monitored service. That also explains why reports here describe a hard reboot rather than an OOM kill.
Corroborating, once the system was saturated the helpers could no longer even take power assertions:
Note each spawn also created and immediately released a
PreventUserIdleDisplaySleep/UserIsActiveassertion named"Codex Computer Use interaction", ~200×/second.The loop survives a reboot
After the panic and restart, the storm resumed immediately — 343 more spawns at 23:19–23:20 — because the app relaunched on login. That makes this hard to escape without uninstalling; the machine re-enters the loop before you can quit the app.
Suggested fixes
IOSurfaceClientGetPropertyMaximumfailing with the display asleep should be a handled error, not__assert_rtn.NSWindowat helper startup when there is no work and no awake display.