ChatGPT desktop 26.810.41047 repeatedly spawns Computer Use workers and crashes with V8 OOM on macOS
Open 💬 38 comments Opened Aug 13, 2026 by flannick
💡 Likely answer: A maintainer (github-actions[bot], contributor)
responded on this thread — see the highlighted reply below.
- macOS 15.7.7, Apple Silicon, 32 GB RAM
- App version 26.810.41047, build 6570
- Previous version 26.730.61639 worked
- Reproduces while idle, 98 seconds after launch
- SIGABRT through node::OOMErrorHandler
- 316 threads at crash; 187 named computer-use
- Telemetry showed 78 unexplained child processes consuming about 4.96 GB after 29 seconds
- Browser and Computer Use flags were explicitly disabled
- App restored the SkyComputerUseClient notifier at startup
- Crash incident ID: 096C41F9-EE0C-4136-BEDF-9035077248B7
- CLI remains healthy; all databases pass integrity/parity checks
38 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I can reproduce a related macOS desktop failure, but without the Computer Use worker pattern described above.
Environment:
On 2026-08-13 I recorded five Apple crash incidents: 5FC1B088-AD38-45A8-B80A-5FC8F9E89B7C, 3B49E19E-C8C9-484C-852B-7D84FF7133CA, 83F8B3B6-5455-4E49-8DC0-6A8A3CE026E5, 05F2AEF5-2C4A-4BAB-AEC4-391953648B08, and 8160CEFB-07DB-4D77-858E-922C9254DC11.
All show EXC_BREAKPOINT / SIGTRAP in V8/Chromium; observed V8 frames include v8::Extension and v8::ExternalMemoryAccounter::Decrease. Earlier desktop logs also contained V8 heap/OOM markers.
The crashes correlate with rehydrating or switching very large Codex task histories. Archiving three completed unpinned transcripts reduced active session storage by 1.18 GiB (to 4.96 GiB), but did not eliminate the same V8 crash signature. A fresh app process was only about 422 MiB RSS, so this does not appear to be system-wide RAM exhaustion.
Please also investigate task-history rehydration and V8 external-memory handling on macOS. I can provide the Apple .ips reports privately if useful; I am intentionally not attaching raw diagnostics here.
Additional local evidence after mitigation:
This now points to two linked product-side defects rather than local app corruption: orphan-helper cleanup after renderer/app crashes, and unbounded renderer/app-server growth during task catalog/session-history rehydration. Archiving reduces the trigger surface but does not fix the live-process leak.
This is a serious problem!
I can reproduce what appears to be the same issue on the exact same app build.
Environment:
The app crashes consistently around 1–2 minutes after launch, even while idle.
I sampled the ChatGPT process every ~10 seconds and observed the number of
computer-usethreads continuously increasing:14:16:17 5
14:16:30 28
14:16:45 54
14:17:00 79
14:17:13 91
14:17:25 121
14:17:38 149
14:17:51 177
→ crash
The Apple crash report is also extremely similar:
computer-useMost of the
computer-usethreads in my crash report are blocked around:AESendMessage
→ objc-js
→ sky.node
I also completely removed and reinstalled the app and deleted ~/.codex, but the issue reproduces.
After each crash,
bare-modifier-monitoris left orphaned with PPID 1, althoughSkyComputerUseServiceitself exits with the main app.This looks like the same Computer Use thread/resource leak described in this issue.
I can reproduce the same issue on ChatGPT Desktop 26.810.41047 (Build 6570), macOS 26.6.1, Apple Silicon.
The app continuously spawns dozens of ChatGPT Computer Use processes, even when Full Access and Computer Control permissions are disabled.
My crash report also shows EXC_CRASH / SIGABRT, node::OOMErrorHandler, and sky.node. Reinstalling the app and clearing Codex caches did not resolve it
Corroborating this exact failure on the same desktop build.
Environment:
26.810.41047(build6570)0.148.0-alpha.91.0.1000717Darwin 25.6.0 arm64 armClean reproduction and measurements:
SIGABRTthroughnode::OOMErrorHandler, with the failing V8 worker identified ascomputer-use.[features] computer_use = falseand restarting left the app stable for more than 8 minutes with a single helper, roughly 530 MB RSS, low CPU, and no new crash report.Uploaded diagnostic thread:
019fff85-84db-7621-8f00-941ea44f2e01This strongly matches the Computer Use worker/resource leak reported here, rather than general system memory pressure or database corruption.
Another exact reproduction from an affected user (sanitized and posted on their behalf).
Environment
26.810.41047(Build6570)26.6.1(25G76)Mac17,9, 24 GB RAMReproduction / mitigations already tried
Latest macOS hang report
Incident ID:
6B809A63-113A-4D68-9893-4C6E47346048Event: hang148ChatGPT threads.Dispatch Thread Soft Limit Reached: 75(too many dispatch threads blocked in synchronous operations).502.61 MB, so the thread/process leak appears to precede the later OOM crash.SkyComputerUseServiceprocess entries/PIDs from a single ChatGPT launch.Parent: ChatGPTandResponsible: ChatGPT./Users/<redacted>/Codex Computer Use.app/Contents/MacOS/SkyComputerUseService26.812.1000717 (1000717), while the host app is26.810.41047 (6570).computer-useNode worker threads are still present even after the plugin was disabled and uninstalled, with calls throughsky.node/node.napi.armv8.nodeintoAESendMessage.Earlier crash report
Incident ID:
1C13B090-A2DB-4BF9-80F0-B1EF69E7208DEXC_CRASH (SIGABRT)/Abort trap: 6Dispatch Thread Soft Limit Reached: 75node::OOMErrorHandler(...) → abort().This looks like a host-side retry/spawn loop in the bundled Computer Use runtime, rather than a user plugin configuration problem: the desktop app continues to initialize and repeatedly spawn the Computer Use helper after the visible plugin has been disabled and removed.
Please consider shipping an urgent hotfix and, if possible, a true startup kill switch that prevents the bundled Computer Use runtime/helper from loading. Full
.ips/ stackshot reports are available privately if an OpenAI maintainer needs them.Same build here (
26.810.41047, build 6570) on macOS 26.5.2 (25F84), Apple M4, 24 GB. I filed #38589 separately before finding this thread and am closing it as a duplicate — moving the evidence here, since I have two things this thread does not yet have: a stack showing the spawns are synchronous, and a clean before/after comparison across the update.My machine does not reach the V8 OOM crash — it freezes instead. The UI stops responding and, critically, system-wide mouse and keyboard input goes with it. That difference is explained by the stack below.
1. The spawns are
spawnSyncon the Electron main threadsampleof the main process (pid 80696, 12 s, 8814 samples/thread) resolves the spawn path to Node's synchronous process runner:SyncProcessRunnerischild_process.spawnSync. At ~5 spawns/sec on the main thread, the event loop is blocked essentially continuously — which is why the freeze extends past the app to the whole desktop, rather than just producing a slow UI.Supporting hotspots in the same sample: heavy
v8::ArrayBuffer::Newchurn plusnode::IsolateData::CreateIsolateDataandnode::worker::MessagePort::New, consistent with each spawn rebuilding worker state. That churn is likely the same pressure that ends in OOM on the 32 GB machine in the original report.2. Measured churn — 75 unique children in 14 seconds
Sampling every ChatGPT-family process every 2 s starting right after launch:
| t after launch | live
Contents/Resources/codexchildren ||---|---|
| +14 s | 19 |
| +16 s | 27 |
| +18 s | 21 |
| +20 s | 13 |
| +22 s | 2 |
| +24 s | 11 |
| +26 s | 16 |
| +28 s | 20 |
The PIDs are entirely different at each snapshot — these are not long-lived workers:
80731→81455(724 PIDs consumed)This lines up with the "78 unexplained child processes after 29 seconds" in the original report, and with the zombie accumulation in #37311 — I think all three are the same respawn loop observed at different points.
Menu-bar CPU hit 99.9% about 15 s after launch, and
launchditself showed 42.5% — a process whose only job here is spawning and reaping, which is a fairly direct fingerprint of the loop.3. Before/after the update, same machine, same day
~/Library/Logs/com.openai.codex/:| session | version | uptime |
[IpcRouter] I am the router| log files written ||---|---|---|---|---|
| pid 93935 | pre-update | 10 h 56 min | 0 | 2 |
| pid 83373 | 26.810.41047 | 2 min | 158 | 65 |
| pid 89094 | 26.810.41047 | 2 min | 171 | 73 |
| pid 58173 | 26.810.41047 | 4 min 30 s | 296 | 127 |
The three short sessions are short only because I force-quit them.
[IpcRouter] I am the routerdoes not appear once in the 2,320-line pre-update log spanning nearly 11 hours; it appears 158–296 times per 2–4 minutes afterwards. The app also opens a new log file per spawn — 2 files per session before, 65–127 after, nearly all zero-byte.Broadcast storms accompany it, up to 45 log lines in a single second:
Sessions end with:
4. Possible trigger — stale plugin app-server copy (hypothesis)
The update did not refresh the installed plugin app-server. The installed copies are still the ones written by the previous version:
| file | size | sha256 (first 16) | mtime |
|---|---|---|---|
|
/Applications/ChatGPT.app/Contents/Resources/codex| 219,666,000 |7a26b07855ef9119| 2026-08-14 17:04 ||
~/.codex/plugins/.plugin-appserver/codex| 218,437,552 |04ddea2f332bd524| 2026-08-11 17:58 ||
…/Resources/codex-code-mode-host| 51,495,456 |206000a48fbe9d2f| 2026-08-14 17:04 ||
~/.codex/plugins/.plugin-appserver/codex-code-mode-host| 49,992,576 |75575bbeae891d4e| 2026-08-11 17:58 |Both are hash-mismatched against the bundle, so the file-equivalence check in
chrome-plugin-app-server-runtime(theXKsha256 helper identified for Windows in #38547) can never succeed. A reconcile that re-checks and relaunches on every failure would produce exactly this unbounded loop.Stated as a hypothesis, not a conclusion: on macOS
bundled_plugins_reconcile_startedonly appears 2–3 times per session in my logs, so I have not shown the reconcile path is the caller of thespawnSyncloop. The measured facts are the spawn rate, the synchronous stack, and the router storm.Suggested fix direction
Whatever drives this loop, the app-server launch and any file-equivalence check should be asynchronous so they can never block the Electron main thread, and a failing equivalence check should back off and surface an error instead of retrying without bound. The synchronous call is what turns a background bug into a desktop-wide input freeze.
Happy to attach the raw
sampleoutput (10.7 MB) and the per-PID churn log if that is useful.Correction and follow-up to my comment above — I re-examined the same
sampleoutput and one of my claims was overstated. I also now have the caller path, and it points at Computer Use, which supports the original report rather than my plugin-app-server guess.1. Correction: the main thread is not blocked continuously
I wrote that "the event loop is blocked essentially continuously." That is not what the data shows, and I should not have written it.
Measured on the main thread (
Thread_28350855,DispatchQueue_1: com.apple.main-thread), out of 8,814 samples over 12 s:| frame | samples | share of main-thread samples |
|---|---:|---:|
|
node::SyncProcessRunner::Spawn| 139 | 1.6 % || …of which reach
posix_spawn| 19 | 0.2 % |So
spawnSyncon the main thread is real and is a genuine defect, but it accounts for roughly 1.6 % of main-thread time in that window — not continuous blocking. My "which is why the freeze extends past the app to the whole desktop" was wrong as stated.What I think actually causes the desktop-wide stall: system-level CPU saturation from the child processes themselves, not main-thread blocking. During the freeze, menu-bar CPU read 99.9 %, and
launchd— whose work here is spawning and reaping — was itself at 42.5 % of a core, alongside 11–27 livecodexchildren at any instant, each 40–120 MB RSS. The spawn rate is the problem; the synchronous call is an aggravating factor on top of it.For completeness, the async spawns are on the libuv workers, which is expected:
posix_spawnappears there at 2, 7, 12 and 12 samples across fourlibuv-workerthreads. Only the main-thread path goes throughSyncProcessRunner.2. The caller path — Computer Use worker messages
The full main-thread stack into the spawn is:
MessagePort::OnMessageon the main thread accounts for 55 samples and is the parent of the spawn frames.The relevant detail: 14 of the Node Worker threads in the main process are named
computer-use. Each runs its ownnode::worker::Worker::Run→SpinEventLoopInternal→uv_runloop and posts back over MessagePort. That matches the original report here (187computer-usethreads at crash time on a 32 GB machine — mine froze before reaching that count).So the shape is: Computer Use workers post messages → the main-thread handler spawns a child synchronously per message → ~5 spawns/sec of the 219 MB
codexbinary → 75 unique child PIDs in 14 s, 724 PIDs of churn.Corroborating log lines from the same sessions:
-600isprocNotFound— the Apple Event target is gone. A retry loop around a target that never comes back would produce exactly this message-per-spawn pattern.Worth noting: Browser and Computer Use were reported as explicitly disabled in the original report, and the app still restored
SkyComputerUseClientat startup. On my machineSkyComputerUseClientandResources/cua_node/bin/node_replwere both running.3. Retracting my plugin-app-server hypothesis as the likely cause
In my previous comment I floated the stale
~/.codex/plugins/.plugin-appserver/hash mismatch as a possible trigger. The stale-copy observation stands as a fact — those files are still from the previous version and hash-mismatched — but it is not the caller of this loop, and I no longer think it is the cause.bundled_plugins_reconcile_startedappears only 2–3 times per session in my logs, while the spawn loop runs continuously. The Computer Use path above is a much better fit. Treat the stale copy as a separate, lower-priority observation.Credit where due: the Computer Use attribution in the original report was right, and my alternative was not.
Additional configuration detail that may help reconcile the reported workaround using
[features] computer_use = false:Before relaunch,
codex doctor --jsonconfirmed that thecomputer_usefeature override wasfalse; the browser-related feature overrides and the Computer Use MCP entry were also disabled. The desktop app nevertheless crashed with the same ~98-second worker-growth/OOM pattern.At app startup (19:21:05 local time), the app rewrote
~/.codex/config.toml—the file mtime matched startup—and restored this active hook:The startup log recorded an
experimentalFeature/enablement/setevent at the same time. Socomputer_use = falsemay stabilize the app when it remains fully effective, while in my case the desktop app's configuration reconciliation restored the Computer Use client hook. That difference may explain why the workaround succeeds for some users but did not prevent my crash.好,我根据实际排查到的所有证据给你整理一份可直接提交给官方的 Bug 报告。
---
🐛 Bug 报告(中文版)
标题:ChatGPT macOS 桌面版在启动后 1-2 分钟内因"控制电脑"(Computer Use) 组件无限繁殖进程导致内存耗尽(OOM)闪退
环境
26.810.41047(build 6570)151.0.7922.137问题描述
启动 ChatGPT 后,"控制电脑"(computer use / CUA) 组件
SkyComputerUseService会无限制地繁殖进程,且不会终止:node::OOMErrorHandler调用abort(),异常为SIGABRT(Abort trap: 6)进程来源与行为
/Applications/ChatGPT.app/Contents/Resources/cua_node/lib/node_modules/@oai/sky/.../Codex Computer Use.app/Contents/MacOS/SkyComputerUseService~/.codex/computer-use/Codex Computer Use.app/Contents/MacOS/SkyComputerUseService次要影响
~/.codex)持续大量读写,触发 Spotlight(mds/mds_stores)疯狂索引,CPU 占用一度达 200%+,系统整体卡顿崩溃日志位置
~/Library/Logs/DiagnosticReports/ChatGPT-*.ips(终止原因均为Abort trap: 6,故障线程含node::OOMErrorHandler)已确认的规避方法(供官方复现参考)
将
SkyComputerUseService二进制替换为立即退出的空程序后,进程不再繁殖、应用稳定运行,但"控制电脑"功能不可用。由此可确认问题出在 Computer Use 组件被重复启动的逻辑(疑似启动/重试失控)。---
🐛 Bug Report(English, for OpenAI support)
Title: ChatGPT macOS desktop (26.810.41047) crashes with OOM ~1–2 min after launch due to runaway "Computer Use" component spawning
26.810.41047(build 6570); Codex Framework151.0.7922.137; macOS arm64 (Apple M4), 16GB RAMBehavior: On every launch, the computer-use service
SkyComputerUseServicespawns endlessly without termination:node::OOMErrorHandler→abort()), crash typeSIGABRT/ "Abort trap: 6"Component: re-copied from bundle each launch from
Contents/Resources/cua_node/lib/node_modules/@oai/sky/.../Codex Computer Use.app/Contents/MacOS/SkyComputerUseService, executed from~/.codex/computer-use/.... Each instance connects to OpenAI backend and holds ~207 FDs.Crash logs:
~/Library/Logs/DiagnosticReports/ChatGPT-*.ips(allAbort trap: 6; faulting thread showsnode::OOMErrorHandler).Workaround confirmed: replacing the
SkyComputerUseServicebinary with a no-op stops the spawn loop and the app runs stably, but Computer Use becomes unavailable — so the bug is in the repeated-start/retry logic of the Computer Use (CUA) component.---
ChatGPT/Codex Mac 26.810.41047 creates excessive
computer-usethreads, crashes repeatedly, and freezes macOSDescription
After updating the ChatGPT/Codex macOS app to 26.810.41047 (6570), the application has become extremely unstable.
ChatGPT repeatedly crashes and, more seriously, causes the entire Mac to become extremely slow or completely unresponsive.
The problem appears to be related to the
computer-usefunctionality. A very large number ofcomputer-usethreads are created and become blocked. Eventually, the application crashes and macOS may become effectively unusable.This is currently blocking my development work completely.
Environment
com.openai.codexSymptoms
computer-usethreads.Crash Report
The crash report shows:
There are also a very large number of threads named:
Many of them appear to be blocked around:
For example:
This looks like
computer-useworkers are accumulating while blocked on synchronous operations until the dispatch-thread soft limit is reached.Reinstallation Did Not Fix It
I have already:
The problem still occurs after reinstalling.
Therefore, this does not appear to be caused by a corrupted application installation.
Expected Behavior
computer-useoperations should complete or time out cleanly, and their associated workers/threads should be released.The application should not continuously accumulate blocked
computer-usethreads or consume enough system resources to freeze macOS.Actual Behavior
computer-usethreads appear to accumulate until ChatGPT becomes unstable.The crash report eventually reports:
The crash is also explicitly reported as being triggered by a
computer-usethread.Severity
Critical / Work Blocking
This is not just an isolated application crash. It can degrade the performance of the entire operating system and eventually make the Mac unusable.
I rely heavily on Codex for development work, and this issue has currently brought my normal workflow to a standstill.
Independent reproduction with an additional user-facing input failure and a reversible containment result.
Environment
26.810.41047(build6570)151.0.7922.13726.812.1000717(build1000717)15.7.7(24G720), Apple SiliconObserved behavior
The issue begins without invoking Computer Use.
SkyComputerUseServiceprocesses are continuously spawned as children of the ChatGPT process and do not exit.Measured snapshots from one launch:
After a crash/relaunch, the behavior immediately returned: at approximately 2 minutes of app uptime there were already 340 helpers using ~14.4 GB aggregate RSS.
A sampled helper held more than 200 file descriptors, including shared Chromium GPU/WebGPU caches and GCM/LevelDB logs under the Codex application data directory. This explains the accompanying disk churn and secondary indexing activity.
The external connections were owned by the ChatGPT network service / local proxy rather than directly by each helper, but connection churn increased while the spawn loop was active.
Crash evidence
The Apple crash report matches the issue exactly:
EXC_CRASH (SIGABRT)/ Abort trap 6computer-useDispatch Thread Soft Limit Reached: 64 (too many dispatch threads blocked in synchronous operations)RemoteHostedPIPContentService sendBootstrapToServiceWithProcessIdentifier→
NSAppleEventDescriptor sendEventWithOptions→
AESendMessage→
_dispatch_group_wait_slownode::OOMErrorHandler(...) → abort()Additional UI impact
Before the crash, the message composer stopped accepting normal keyboard input. The user had to type in another application and paste text into the composer. This persisted while the helper/process leak was active and made the app effectively unusable even before the eventual abort.
Containment result
As a reversible workaround, the managed runtime directory was moved out of its active location (retained as a backup), then only processes whose command exactly matched the old
SkyComputerUseServicepath were terminated. The Computer Use plugin, feature flag, and stale turn-ended notification hook were also disabled with a configuration backup retained.Result:
This strongly suggests an unbounded host-side bootstrap/retry loop, likely aggravated by the host/runtime version mismatch (
26.810...host vs.26.812...CUA runtime). Please add bounded retries/backoff, ensure failed helpers are reaped, validate host/runtime compatibility before launch, and provide a true startup kill switch for Computer Use.No usernames, personal filesystem paths, session contents, device UUIDs, or full logs/crash reports are included.
I can independently corroborate this issue with substantially more process-level evidence, and I can also confirm that the problem still affects the newer macOS ChatGPT Desktop release
26.810.50856, released after26.810.41047.System: M1 Max 64GB macOS 26.6.1
My original incident began immediately after ChatGPT Desktop self-updated from:
26.803.81509— build6415— normal26.810.41047— build6570— affectedI have since updated to:
26.810.50856— still affectedThe bundled Computer Use runtime is still:
26.812.100071710007171.0.1000717So the newer Desktop release did not update the Computer Use runtime.
Impact
This is a complete blocker for using the Desktop app safely on my machine.
The affected Desktop builds can rapidly create hundreds of processes and thousands of threads, producing severe CPU/memory pressure and making the system progressively difficult to control.
The standalone Codex CLI remains usable and does not reproduce this Desktop process storm.
I am therefore keeping ChatGPT Desktop closed except for bounded diagnostic reproductions.
Confirmed behavior on
26.810.41047I collected four affected Desktop runs on
26.810.41047.The first three produced:
A fourth post-reinstall run produced:
Normal pre-update runs produced only 2 fragments each.
Critically, these are not primary app-server restart loops.
Each affected run shows:
AppServerConnectionrestart;The uncontrolled process creation happens below/alongside that healthy primary connection.
The Desktop wrapper is not the cause
I reproduced the same failure through two independent CLI routes:
codex-cli 0.147.0;reporting:
Removing the wrapper therefore does not remove the failure.
Historical process counts
Saved process captures from affected runs contain as many as:
SkyComputerUseServiceprocessesThe repeated app-server command is exactly:
These are actual OS process rows, not inferred counts from log files.
Bounded PPID probe: exact process topology
I subsequently ran a bounded diagnostic capture specifically to resolve process ancestry.
The capture preserved:
over 30 complete process snapshots.
This definitively resolved the immediate topology.
The observed process tree is:
Representative independent PPID chains included:
and:
Across all 30 snapshots there were:
So this is not a recursively self-spawning app-server chain.
The immediate fan-out boundary is:
Growth during the bounded reproduction
The bounded capture shows rapid population growth:
So within roughly one minute the app had created dozens of independent Computer Use service instances and dozens of downstream stdio app servers.
Approximate summed per-process RSS during the same capture reached:
These sums are not unique/private-memory measurements, but they demonstrate the scale of the resource pressure.
trustd: only its CPU spike correlates with the incidentThe bounded capture also monitored the system's existing
trustdprocesses to determine whether macOS trust evaluation was involved in the fan-out.There were six
trustdprocesses throughout the capture. Their existence and process count are not anomalous and are not attributed to ChatGPT:trustdPIDs were already running in the pre-launch baseline;SkyComputerUseService, or any Codex app server;The relevant observation is specifically their CPU behavior during the incident.
One pre-existing
trustdprocess reached approximately 97.9% sampled CPU while the Computer Use/app-server fan-out was occurring.So the distinction is:
The ancestry evidence therefore rules out
trustdas the initiator, parent, or source of the process fan-out.A plausible secondary explanation is that the extremely high rate of newly launched signed Computer Use and Codex helper processes causes additional macOS trust/code-signing evaluation work, producing the observed
trustdCPU spike.My capture establishes the temporal association and excludes
trustdfrom the fan-out ancestry, but it does not establish that causal mechanism.Bundle corruption was also ruled out
I created three full logical snapshots of
/Applications/ChatGPT.app:All three were the same release/build:
The snapshots had:
Info.plist;app.asar;codex;Reinstalling only reconciled Homebrew/install metadata.
It did not replace a different/corrupt application payload, and the process storm reproduced afterward.
So a damaged app bundle is strongly contradicted.
Apps/MCP/plugin/runtime activity
During affected runs I also observed unusually slow Desktop operations including:
and:
The affected post-reinstall run also overlapped with:
These make Apps/MCP/plugin/runtime reconciliation a plausible upstream trigger.
However, I do not want to overstate this: the process capture proves the immediate lifecycle topology, but it does not yet prove which Desktop request/source-level function instructs ChatGPT to repeatedly create new
SkyComputerUseServiceinstances.That remains the important missing root-cause step.
What the evidence currently rules out
The evidence now strongly contradicts or rules out:
trustdbeing the parent or initiating source of the fan-out — only its abnormal CPU spike correlates with the incident;app-server.Current working diagnosis
The strongest diagnosis supported by the captures is:
The remaining root-cause question is:
That may be in Computer Use lifecycle/reconciliation itself or may be triggered by higher-level Apps/MCP/plugin/runtime orchestration.
Persistence on
26.810.50856I have now upgraded the macOS ChatGPT app to:
The issue is still present.
The Computer Use runtime remains unchanged:
This is the same Computer Use runtime version present in my fully captured affected
26.810.41047environment.I have not yet repeated the complete 30-snapshot PPID capture on
26.810.50856, so I am deliberately not claiming that the exact topology has been independently re-proven on the new Desktop build yet.What I can confirm is:
1.0.1000717is still installed;If a short cross-version PPID confirmation on
26.810.50856would be useful, I can collect one, but I would prefer not to repeatedly reproduce an issue that can create hundreds of processes unless there is a specific diagnostic that maintainers need.Why I think this belongs in this issue
The symptoms line up closely with the existing reports here:
My process captures add direct OS-level ancestry showing that the service fan-out is:
rather than a recursive app-server chain.
Request to maintainers
Could someone from the team please confirm whether this is being actively investigated?
In particular, I think the useful instrumentation/fix area is the Desktop lifecycle that creates and reconciles
SkyComputerUseServiceinstances:SkyComputerUseService;I have a substantially more detailed local investigation report, process ancestry data, bundle comparisons, main Desktop logs, and the original bounded snapshots.
The complete raw capture is large and contains local paths/private metadata, so I would prefer to provide narrowly requested sanitized evidence rather than publishing the entire archive.
If there is a specific trace, process sample, log interval, or source-level diagnostic the Desktop/Computer Use team needs, please tell me exactly what would be most useful and I can capture it in a bounded reproduction.
At the moment, the Desktop app is effectively unusable for me since Thursday's release, while the standalone Codex CLI remains my only practical workaround, but far from the same productivity level.
cc @tibo-openai
Additional bounded reproduction on 26.810.50856 (build 6644)
I reproduced the same Computer Use service/process runaway on the newer macOS desktop build and narrowed two independent trigger boundaries.
Environment
26.810.50856(build6644)0.148.0-alpha.91.0.100071726.6.1, Apple Silicon, 16 GB RAMNormal desktop launch
With both the Computer Use plugin and the explicit
computer-useMCP server disabled, a normal LaunchServices launch with no arguments still grows without bound:The same behavior reproduced after isolating the two damaged Chromium LevelDB directories and after forcing regeneration of the Computer Use component. This makes profile database corruption and a stale helper bundle unlikely as the primary cause.
Explicit user-data-dir control
Launching the same binary with an explicit profile argument remained stable:
Controls performed:
The same profile directory used by an ordinary no-argument launch ran away, while passing that directory explicitly remained stable. This suggests a desktop startup/lifecycle regression associated with the no-argument LaunchServices path rather than profile contents.
Isolated Computer Use boundary tests
Each test used a separate profile and a guard that terminated the instance before system-wide memory pressure.
This shows that starting the Computer Use service boundary is sufficient to reproduce the runaway; it is not necessary for the visible plugin UI to be enabled.
Independent plugin controls
event_stream_statusreturned successfully without starting a recording.These controls suggest the unbounded growth is specific to the Computer Use service lifecycle rather than all browser-related plugins.
Current workaround
--user-data-dirargument.Request
Please instrument and bound the lifecycle that creates/reconciles
SkyComputerUseServiceinstances, including:--user-data-dirstartup.Raw crash reports and local logs are preserved but intentionally not attached publicly because they contain local paths and metadata. Sanitized excerpts can be provided if maintainers request a specific trace.
Independent reproduction with socket-level evidence for the same failure.
Environment
26.810.41047(build6570)26.6.1, Apple Silicon M4Reproduction
The app crashes while idle after roughly 90 seconds. Instrumented launches showed:
The Apple crash reports contain 319 to 325 total threads, with 184 to 188 named
computer-use. The termination path isSIGABRTorSIGTRAPthroughnode::OOMErrorHandler.A clean
--user-data-dirand a temporary emptyCODEX_HOMEboth reproduced the growth. This rules out the normal Chromium profile and the user's Codex/plugin config as required causes.Socket and process evidence
During the runaway, ChatGPT repeatedly launched
SkyComputerUseServiceprocesses. One instance owned:The other service instances repeatedly logged:
The same interval also contained repeated
Bad file descriptorandNSPOSIXErrorDomain Code=9errors. Newcomputer-useworkers continued to appear while those service launches failed to acquire the socket lock.The immediate failure chain appears to be:
Disabling the visible Computer Use feature doesn't stop this shared service lifecycle on the affected build.
This evidence points to missing deduplication or backoff around service startup. A single lifecycle owner, plus a bounded retry when
computeruse.sockis already owned, should prevent the process and worker storm. I preserved the crash reports and can provide narrow sanitized log excerpts if maintainers need them.Independent reproduction on ChatGPT Desktop 26.810.52044 (build 6662), macOS:
Dispatch Thread Soft Limit Reached.ps aux | grep -Ei 'ChatGPT|Codex' | grep -v grep | wc -lreturned 319 ChatGPT/Codex-related processes.syspolicydwas not under pressure at the time: approximately 2.5% CPU, 0.1% memory, and 36 open files./Applications/ChatGPT.app(merged desktop app), with Codex Framework151.0.7922.137.browser_crashpad_handlerandbare-modifier-monitorprocesses from multiple launch times.Bundle version:
This appears consistent with the same unbounded Computer Use worker/helper lifecycle and orphan-helper cleanup problem described here. I do not yet have a sanitized
.ipsreport, so I am limiting this comment to directly observed evidence.Reproduced on two Macs. Rather than add another repro, here are four things I haven't seen posted yet — two of them actionable for anyone who has already worked around this.
⚠️ 1. Downgrading does not stick: the app re-arms its own update
This is the one I'd flag hardest, because several people here have downgraded and may be silently exposed.
After rolling back and setting:
I re-checked two days later. Both keys had been reset to
1,SULastCheckTimeshowed a fresh check, and26.810.52044was fully downloaded (1.9 GB) and staged in:armed to install on next quit. The only reason it hadn't landed is that the app happened to have 39 hours of uptime. The app rewrites its own preferences domain, the same way it rewrites
~/.codex/config.tomlon launch.If you have downgraded, check both:
Given the kernel panics in #38760 / #38697, silently getting re-updated is not a small problem.
2. Reaping the helpers keeps the app alive indefinitely
A stopgap for anyone who can't downgrade. Killing the accumulated helpers does release the app's worker threads, so the app never reaches the ceiling:
Verified over 10.5 minutes under a launchd agent: helper count capped at 25–37, app thread count plateaued ~105 and then declined to ~90, no crash. Without it the same machine died in ~4 minutes, every time. Costs ~20–50% of one core in permanent churn — a bridge, not a home, but it makes the app usable.
This also says something about the leak: the worker threads are not orphaned from their child processes, so a fix that simply bounded/cleaned up the spawn loop would reclaim them.
3. The two point releases did not touch the bug (binary comparison)
Comparing
26.810.41047against26.810.52044locally:| | 41047 | 52044 |
|---|---|---|
|
Contents/Resources/native/sky.node| 1210752 bytes,1e468ee72cc1e402…| 1210752 bytes,b6248745c81c7013…|| embedded
codex-cli|0.148.0-alpha.9|0.148.0-alpha.9|| Computer Use runtime |
26.812.1000717|26.812.1000717|So the native module was rebuilt (identical size, different hash) but the embedded CLI and the Computer Use runtime are unchanged — consistent with everyone's reports that 50856 and 52044 are still affected. A Desktop version bump is not a signal here; the Computer Use runtime version moving off
26.812.1000717is.4. Ruled out locally — including a clean-room test
Each applied, then re-tested with a clean relaunch and process monitoring. None changed the spawn rate:
tccutil reset Accessibilityfor the app and helper bundle IDs, then granting the Accessibility prompt when it appeared, and re-adding "Codex Computer Use" to Screen Recording. (Permissions are unrelated to the crash.)[features] computer_use = false— accepted to the point that the app strips its own[mcp_servers.computer-use]and[plugins."computer-use@openai-bundled"]entries on next launch, and spawns anyway.[desktop] computerUseAlwaysHidePictureInPicture = true(the workaround that helped the 26.730 PiP variant).~/.codex/computer-use/— re-provisioned within seconds of launch.Environment / measurements
26.810.41047.EXC_BREAKPOINT (SIGTRAP)(twiceSIGABRT) on a thread namedcomputer-use, bottom framesnode::worker::Worker::Run() → node::NewIsolate() → v8::Isolate::Initialize()— i.e. the fatal abort lands on isolate creation, a slightly different presentation from thenode::OOMErrorHandlerpath reported above, but the same resource-exhaustion family.Rolled back to
26.727.51351, which has been completely clean (39h uptime, 1 helper, 0 crashes). Note that some rollback recommendations here point at26.803.x, which has its own crash-on-launch report in #38037 — worth going further back.Corroborating this exact Computer Use worker/thread-exhaustion failure on the newer desktop build.
Environment
26.810.52044(build6662)151.0.7922.13726.6.1 (25G76)Mac15,7, ARM64Reproduction
Crash evidence
Dispatch Thread Soft Limit Reached: 64computer-useAESendMessage → NSAppleEventDescriptor sendEventWithOptions → RemoteHostedPIPContentService sendBootstrapToServiceWithProcessIdentifier321, namedcomputer-useEXC_BREAKPOINT (SIGTRAP), rather than theSIGABRT/node::OOMErrorHandlertermination in the original reportreading_mode...parse_distilled_html/v8::CppHeapframesThis looks like the same unbounded Computer Use worker/bootstrap retry, but it demonstrates that build 6662 can reach a dispatch-thread/SIGTRAP terminal failure without first surfacing as the conventional V8 OOM signature.
Sanitized full crash report (Crash Reporter Key redacted):
chatgpt-macos-crash-26.810.52044-sanitized.txt
Corroborating this failure with a controlled rollback test on the newer build train.
Environment
26.810.52044(build6662)151.0.7922.13726.4.1 (25E253)arm64Crash evidence on build 6662
The app repeatedly entered a startup crash loop. The latest two inspected macOS crash reports had:
EXC_CRASH / SIGABRTnode::OOMErrorHandler → abort()computer-useSeven ChatGPT/Codex diagnostic reports are currently present on this machine. Raw reports are not attached because they contain local process and path information.
Controlled rollback still reproduces
I downloaded the official arm64 ZIP for
26.810.50856(build6644), verified its deep code signature and Apple notarization, then launched it against the original user profile.The startup storm reproduced immediately:
| Relative sample time | Main-process threads | RSS (KiB) | Per-thread log files |
[IpcRouter] I am the router||---:|---:|---:|---:|---:|
| 0 s | 161 | 949376 | 68 | 136 |
| 10 s | 190 | 902880 | 97 | 194 |
| 21 s | 217 | 807120 | 125 | 248 |
| 31 s | 241 | 467536 | 147 | 293 |
The process was force-quit at 241 threads to avoid another OOM, so this rollback run intentionally produced no new crash report. Build 6662 was then restored and left stopped.
This is also consistent with the per-thread log and router-election storm reported in #38589.
Recovery attempts that did not provide a usable path
node_replserver in config did not stop the startup storm; the desktop app still initialized its internal Browser/Computer Use runtime. The original config was restored after the test.--disable-gpudid not help.Conclusion
This machine reproduces the same Computer Use worker/thread-exhaustion failure on both build
6662and the immediately preceding build6644. Therefore26.810.50856is not a safe rollback target for this failure. The CLI remains the practical workaround while the desktop app stays stopped.I can provide sanitized log excerpts or crash reports if maintainers specify the exact fields needed.
Confirmed failure on 26.810.52044 (build 6662) after real interaction
I tested the current production build on the same affected Mac. A three-minute idle control initially appeared stable, but real interaction immediately reproduced the original failure twice.
Fresh crash evidence
Both crashes were generated by the installed production app:
26.810.52044(build6662)EXC_CRASH / SIGABRT, 320 total threads, 186 namedcomputer-use; faulting thread 319 wascomputer-useEXC_CRASH / SIGABRT, 318 total threads, 187 namedcomputer-use; faulting thread wasV8WorkerRemoteHostedPIPContentService → AESendMessagewaits andnode::OOMErrorHandlerin the Computer Use worker pathThis is the same resource-exhaustion signature as the earlier affected builds. The idle-only test was therefore a false negative; actual use is required for a meaningful regression test.
Control still holds
The same build launched with an explicit
--user-data-dirremains stable with roughly 65 threads, 9 direct children, and a singleSkyComputerUseServiceinstance.Conclusion
Build 6662 has not fixed this issue on this machine. Please include an interaction-driven regression test in addition to idle startup coverage, and keep the Computer Use service/worker population bounded across both normal LaunchServices startup and explicit-profile startup.
The two raw macOS reports are preserved locally but are not attached publicly because they contain local metadata. Sanitized excerpts can be provided if a maintainer requests specific fields.
Independent reproduction with state-reset A/B evidence
Environment:
26.810.52044(build6662)26.810.41047(build6570)26.4 (25E246), Apple Silicon, 24 GB RAMObserved:
computer-use.V8Worker; the report recordsEXC_CRASH / SIGABRTandnode::OOMErrorHandlerleading toabort.Controlled state-reset test:
[IpcRouter] I am the routerentries: 199 at t+24s, 281 at t+34s, 357 at t+44s, and 423 at t+54s, then crashed at about t+59s.The same failure also reproduced with a fresh Electron
--user-data-dir. Disabling the browser and Computer Use plugins and testing with default configuration did not stop it.This evidence appears to rule out thread-history volume, corrupt local thread state, plugin enablement, Electron profile state, and host memory pressure. It is consistent with an unbounded Computer Use worker/router lifecycle while the app is idle.
I have not attached raw diagnostic reports because they contain local paths and metadata. I can provide targeted, sanitized excerpts if maintainers request specific fields.
Update: working containment
Adding the following to the active Codex configuration stopped the worker proliferation:
Two controlled launches remained stable:
computer-use-named threads.computer-use-named threads, and no new crash report.For comparison, uncontained launches consistently crashed within 59–95 seconds and the latest had 186
computer-usethreads. This workaround disables Computer Use, but leaves the rest of the desktop app usable in this reproduction.Update — controlled re-enable test on macOS desktop 26.814.41407 (build 6720)
I re-enabled Computer Use after updating the desktop app, and the same runaway behavior reproduced almost immediately. Within a short period, the network monitor showed:
This was not a normal sustained Computer Use workload. The ChatGPT process began spawning large numbers of SkyComputerUseService helpers again, with the same resource-exhaustion pattern reported above. The test was aborted as soon as the runaway behavior was clear.
Please treat this as evidence that the 26.814.41407 update does not provide a safe mitigation for this issue, or at minimum that the fix status is unclear. Please confirm:
No usernames, personal paths, session contents, device UUIDs, or complete local logs are included.
Update: still reproducible on
26.814.41407/ build6720with updated Codex and updated Computer Use runtimeI have now reproduced the same process-fan-out failure on the newer macOS ChatGPT Desktop release:
26.814.41407— build67200.148.0-alpha.1526.817.1000761— build100076126.6.2(25G83), Apple SiliconThis is an important new boundary because, unlike the previous 26.810.x updates, the Desktop app, embedded Codex CLI, and Computer Use runtime have all changed, yet the failure persists.
I captured another bounded 30-sample PID/PPID series. The immediate topology is unchanged:
Across the complete capture:
2306sampledSkyComputerUseServiceobservations were direct children of ChatGPT;947sampled bundled stdio app-server observations were direct children of aSkyComputerUseService;134SkyComputerUseServiceprocesses;95bundled stdio app servers;This reproduces the same topology previously captured on builds
6570and6662, but at a larger observed population.The Desktop-managed primary app server is still not crash-looping: the saved Desktop logs record one primary stdio spawn, successful initialization, normal persistence through the capture, and one teardown stop. The runaway processes are subordinate Computer Use services and their stdio app-server children.
After ChatGPT itself and its direct Code Mode host had exited, the saved post-quit snapshot still contained:
codex app-server --listen stdio://processes1SkyComputerUseService, reparented to PID 1The unified-log capture independently recorded 139 distinct
SkyComputerUseServicePIDs performing process-managerCHECKINevents during the reproduction window, consistent with the process snapshots showing continuous creation of new Computer Use services.At this point the affected build boundary I have directly captured is:
And importantly:
This rules out the previously shipped embedded Codex build and Computer Use runtime version as sufficient causes on their own.
The strongest remaining defect boundary is the ChatGPT Desktop-managed Computer Use lifecycle: service creation, readiness/reuse, reconciliation, and cleanup.
The unresolved question is no longer process ancestry—we now have the same PPID topology across multiple releases. The unresolved question is:
Still broken on ChatGPT App
26.814.41957 Released Aug 18, 2026Feedback ID:
no-active-thread-01a01a29-526c-7080-8192-bbb379e4c1ecStill reproducible on 26.814.41407 (build 6720) — plus two data points I haven't seen in this thread: the storm is gated on being signed in, and it reproduces on macOS 14 (Sonoma), not just 26.x.
Environment
26.814.41407(build 6720), bundle idcom.openai.codex151.0.7922.13726.817.100076114.6.1(23G93), Apple Silicon — so the affected OS range is wider than the 26.x reports aboveSignature (matches OP)
~20 crashes since the app auto-updated on Aug 18. Every launch:
SkyComputerUseServicechildren spawn at ~4/sec from t=0, each pinning a thread namedcomputer-usein the main process; SIGABRT vianode::OOMErrorHandlerat ~185–450 threads, 2.5–5.5 minutes after launch. No user-initiated computer-use task; this is startup behavior.Signed-in vs signed-out A/B (controlled, one variable)
CODEX_HOME(noauth.json, everything else app-default): clean and stable — ~60 threads, 2–3 services, flat.auth.json: full spawn storm and OOM crash.Before finding that, I falsified every local-state candidate one at a time (each: quit, remove/restore one item, relaunch, sample thread + child-process counts every 20–30s): app profile (
~/Library/Application Support/Codex),process_manager/chat_processes.json(192 stale entries), session rollouts (503 files — also tested trimmed to 2 days),state_5.sqlitethreads table (1,089 rows — also tested at 25 rows),goals_1.sqlite(one blocked goal),config.toml(removed entirely), plugin cache, and the Computer Use runtime bundle (app reinstalls it byte-identical on launch). All storm. Only the signed-out run is clean.Conclusion: the spawn loop is armed by authenticated account state, not local machine state. Possibly related: my
.codex-global-state.jsoncarrieselectron-remote-hosted-pip-task-visibility-statewith two remote hosted task IDs (matches theRemoteHostedPIPContentServicebootstrap in #38744's trace).Containment from #38744 does NOT hold on 26.814
Applied the full combo from #38744's closing comment (remove the
notifyturn-ended hook,[features] computer_use = false, move the Computer Use runtime dir aside):notifyhook toconfig.tomland reinstalls the runtime dir on every launch,computer_use = falsenotwithstanding.So on this build the flag only slows the storm; it does not stop it.
Happy to attach
.ipscrash reports or run diagnostics against a candidate build.The spawn storm is on the same box as the desktop app, so when Computer Use workers run away they take the Mac (and any overnight job) with them. A
computer_use = falseflag the desktop ignores is consistent with the workers being launched from the app process, not from a separate host.Split that actually survives: keep ChatGPT/Codex as the UI, run the long job on a fenced VPS that does not sleep and does not share the desktop process. Approve money / customer / production in the browser so a dead laptop is not the gate.
If you just need that overnight split: hosted Hermes, $10/mo, 14-day trial — https://thumbgate.app
Controlled build 6744 retest with fresh Computer Use helper
I reproduced the same startup spawn storm on the current production macOS release and ran a recoverable helper-reset A/B test.
Environment:
26.814.41957(build6744)arm64)First launch with the pre-existing helper:
45liveSkyComputerUseServiceprocesses by about 23 seconds after launch114threadsFresh-helper reset:
26.817.1000761(build1000761).Result after the reset:
123liveSkyComputerUseServiceprocesses by about 27 seconds after launch169threadsControl:
26.803.41515(build6321)1Computer Use service,61ChatGPT threads, and no new crash reportThis rules out a stale Computer Use helper as the explanation on this machine. Build 6744 reproduces the unbounded Desktop-managed service/bootstrap lifecycle even after installing its own fresh helper 1000761.
Privacy note: this report intentionally excludes usernames, account details, local paths, session/task identifiers, machine identifiers, crash UUIDs, raw logs, and attachments. Targeted sanitized excerpts can be provided if a maintainer requests specific fields.
I have isolated a strong filesystem trigger for the Computer Use process explosion.
On ChatGPT Desktop
26.818.21641/ build6849, with my existing~/.codeximplemented as a symlink into my version-controlled dotfiles hierarchy, the previously reported runawaySkyComputerUseService+ bundledcodex app-serverspawning still reproduces and drove the total machine thread count above 13,000.I first allowed all Desktop-managed plugin/Computer Use runtime updates to finish, quit cleanly, committed those changes, and reproduced again with no further runtime/plugin filesystem mutations. This rules out plugin/runtime reconciliation itself as the continuing trigger.
I then changed only the filesystem topology: removed the top-level
~/.codexsymlink and copied the same Codex home contents into a physical~/.codexdirectory. Some files/subdirectories inside remain symlinked. With that layout, the same Desktop build has remained stable for 40+ minutes and successfully ran a new Codex thread, with no runaway Computer Use/app-server spawning.The standalone Codex CLI/TUI continues to operate with the original symlinked layout.
This strongly narrows the initiating trigger to Desktop handling of a symlinked
~/.codex/CODEX_HOMEroot, likely a lexical-vs-canonical path mismatch in Desktop/Computer Use runtime initialization or service recognition. The already-observed unbounded Computer Use restart/reconciliation behavior then amplifies that initial failure into resource exhaustion.Independent corroboration: #39420 reports the same Computer Use process explosion with a symlinked
~/.codex, and says removing the symlink avoids it. #39732 independently isolates the same symlink-vs-real-path trigger on26.818.21641/ build6849, including an alternating A/B test where the exact sameCODEX_HOMEdata crashes through the symlink path and remains stable through its resolved real path. #38841 reports the same unbounded Computer Use failure mechanism and also notes that~/.codexis symlinked to an external volume.On my machine, the regression boundary is
26.810.41047/ build6570: the same symlinked~/.codexlayout worked normally on the preceding Desktop releases and has reproduced the failure from build6570onward. I've used this symlink-based layout since I started using Codex, long before that release, without this behavior.A quick scan of other open issues also shows multiple App and CLI regressions involving symlink and canonical-path handling. I wouldn't treat these as acceptable regressions in a developer-focused tool.
Symbolic links are a longstanding and fundamental filesystem primitive, and using them to manage configuration is a normal and well-established practice in developer and engineering environments.
A symlinked
~/.codex/CODEX_HOMEshould therefore work transparently, as it did in previous Codex/Desktop releases and continues to do in the standalone Codex CLI/TUI and other agent harnesses.Regressing normal filesystem semantics in a developer-focused product is itself a serious compatibility problem. Turning that path-resolution regression into an unbounded
SkyComputerUseService/codex app-serverprocess and thread explosion is substantially worse.Given that this behavior crossed several consecutive Desktop releases and multiple independent users have now isolated the same symlink-related trigger, this also raises a serious regression-test and release-QA concern. A basic test matrix covering physical paths, symlinked
CODEX_HOME, symlinked subdirectories, canonical/real paths, and mixed lexical/canonical representations should have caught this class of failure before release.It is also concerning that this regression has been publicly reproducible for roughly a week across multiple Desktop releases and independent reports without any visible human acknowledgment from OpenAI.
Resolved on my machines — and a correction to my earlier comment
First, retracting something I said above. I claimed the Computer Use runtime version moving
off
26.812.1000717would be the signal that this was fixed. That was wrong. The runtime movedto
26.817.1000761and builds still stormed, as several people here reported. The defect isn'tin the helper runtime — apologies to anyone who used that as a gating heuristic.
What actually fixed it for me: the codex home was reached through a symlink.
Full credit to @TahitianBlue in #39732 for finding this. I can independently replicate it, with
a known-bad control:
|
~/.codex| Result on26.810.41047, idle, same machine, same script ||---|---|
| symlink →
~/.config/codex| 3 → 73 helpers in 27 seconds, app threads 71 → 138 || real directory | 1 helper, flat for 903 seconds, threads declining 67 → 60 |
Same binary, one variable, 33× the time-to-storm. Before the change that machine crashed 7 out
of 7 launches at ~600–680 helpers.
This also explains the multi-machine reports that made some of us suspect account-level or
server-side state. Both of my Macs stormed on one account — but they also share dotfiles, and
both had the identical
~/.codex -> ~/.config/codexlayout. Two machines, one *dotfilelayout*, not one account. Worth checking before reaching for an account theory.
The condition is visible in config without running anything: on my machine the same
hooks.jsonwas registered twice, once under each spelling, andstate_5.sqliteheld4,865 thread rows under
/Users/mg/.codex/...against 4 under/Users/mg/.config/codex/....Path strings are compared rather than inodes, so the two spellings never match.
The fix
Make the path the app derives the real one (same-volume rename, instant):
Then canonicalize only the operative path fields —
config.toml(project entries,marketplace
source, the Computer Usenotifypath),.codex-global-state.json, andstate_5.sqlite'sthreads.rollout_pathandthreads.cwd. Do not blanket-rewrite: mostoccurrences live in
threads.title,first_user_message,preview,logs_2.sqliteandarchived_sessions/*.jsonl, which are records of what actually happened. And if your hooks areregistered under both spellings, a naive
sedwill collapse them into duplicate TOML table keysand break your config — merge them instead.
Result
Both machines migrated. The main one now runs 26.818.22352 with Computer History enabled
(runtime
26.819.1000816): 1 helper, ~65 threads, flat, zero crashes. No downgrade, no pinning,no reaper script.
Still an app bug
To be clear, the symlink is a trigger, not the cause. Per #39732's decompilation,
requestComputerUseWorkerawaitst.requestFromHost(e)with no timeout and no cap, and itsdisposal
finallyonly runs once that settles — so anything that makes the handshake hang leaksa worker and a V8 isolate permanently. A bounded retry with a circuit breaker would make this
class of trigger harmless. Worth noting one measurable detail for whoever fixes it: killing the
accumulated helpers does release the app's worker threads, so they aren't orphaned — a fix
that merely bounds the loop should reclaim them.
Detail if useful: field report with full measurements
· retrospective, including every wrong turn
Confirming the symlink finding on my machine — and retracting my account-state attribution.
My
~/.codexhad been a symlink into a version-controlled dotfiles directory since mid-May. Converting it to a real directory (same contents; only individual files likeconfig.tomlsymlinked inward to the dotfiles copies) fully resolved the crash loop on macOS14.6.1/ ChatGPT Desktop26.814.41407(build 6720):SkyComputerUseServicechildren by 30 seconds after launch, OOM SIGABRT at 2.5–5.5 minutes, ~20/20 launches.computer_use = false).Two notes for the thread:
config.toml,hooks.json, and hooks directory are symlinks into the dotfiles repo from inside the real~/.codex, the app writes through them fine, and the launch-time config rewrites did not detach them. Only the top-level symlinked home triggers the storm.Confirming the top-level Codex-home symlink trigger and unbounded Computer Use bootstrap failure on a newer build.
Environment:
26.818.31338(build6892)26.6.2(25G83), Apple SiliconCODEX_HOMEis unset in both the shell and per-userlaunchdenvironment~/.codex -> .config/codexThe
CODEX_HOME=~/.codexvalue present in localconfig.tomlis scoped only to[mcp_servers.node_repl.env]; it does not configure the desktop app or its managed-service bootstrap.This machine has six retained ChatGPT crashes across builds 6570, 6662, 6720, and 6892. The latest build was installed at 07:41, launched at 07:43:42, and aborted at 07:45:43.
The latest crash contains 333 threads, including 184 named
computer-usethreads and all 80 slots at the recorded Dispatch Thread Soft Limit. At least 132computer-usethreads are blocked around synchronousAESendMessage; the common path includesRemoteHostedPIPContentService sendBootstrapToServiceWithProcessIdentifier:rendezvousPort:attempt:. The triggeredV8Workeraborts throughnode::OOMErrorHandler.The lexical/resolved path split is directly visible in local state:
The config and global-state files also contain both spellings. Unified logs show 57 distinct
SkyComputerUseServicePIDs in the incident window, and the app created 267 zero-byte per-thread desktop logs within seconds.This confirms the bug persists in build 6892. The symlink is a trigger, but the product failure is the missing timeout/single-flight/circuit breaker: a path-recognition or service-handshake mismatch must not retain hundreds of worker isolates and synchronous AppleEvent calls until V8 aborts.
I can provide redacted
.ipsexcerpts privately if useful.Build 6933 retest with a physical top-level Codex home
Following the recent reports about a top-level Codex-home symlink, I ran a controlled retest on the newest production build available to this machine.
Environment:
26.818.32112(build6933)arm64)~/.codexwas a physical directory, not a top-level symlinkResult approximately 53 seconds after launch:
237liveSkyComputerUseServicehelpers218ChatGPT threads255matching ChatGPT/Computer Use workers1.0 GBChatGPT RSSThe safety monitor terminated the app before resource exhaustion produced a crash, so the crash-report delta remained zero. The worker storm began during startup and it was not safe to attempt a representative Computer Use UI action.
Rollback control:
26.803.41515(build6321)1Sky helper throughout67to6220550 MBConclusion: making
~/.codexa physical top-level directory was not sufficient to prevent the regression on this machine with build 6933. A top-level symlink may be one trigger, but it is not the only condition capable of reaching the unbounded Computer Use bootstrap/worker failure. This test did retain individual symlinks inside the physical directory, so that distinction may matter for further isolation.Privacy note: this report excludes usernames, account details, local paths, session/task identifiers, machine identifiers, crash UUIDs, raw logs, and attachments. Targeted sanitized excerpts can be provided if a maintainer requests specific fields.
Another path mismatch worth testing: home-directory capitalisation
One more data point that may be related to the symlink findings.
My
.codexdirectory is not symlinked, but my home directory had a case mismatch:Both paths point to the same inode on the same APFS volume. The mismatch came from the macOS account record, not from anything I configured in ChatGPT.
My Codex configuration also mixed the two spellings. The Computer Use notifier used
/Users/Example, whileCODEX_HOME,SKY_CUA_SERVICE_PATHandNODE_REPL_TRUSTED_CODE_PATHSused/Users/example.What I observed:
6415with runtime26.804.1000633was stable with the mixed paths.6720with runtime26.817.1000761created 459SkyComputerUseServiceprocesses in under five minutes.CODEX_HOME.6962with runtime26.819.1000816, the app remained stable. Every check showed one helper, the same helper PID was still running nearly eight hours later and a real Computer Use task completed successfully.The important caveat is that this was not a clean same-build A/B test. I did not rerun build 6720 after changing the paths because the previous test created hundreds of processes. The desktop build and Computer Use runtime also changed, so I cannot say whether the path change, the newer build or both produced the stable result.
I’m not claiming that capitalisation was definitely the cause. It does, however, create the same kind of lexical-versus-resolved path mismatch as a symlink. Case-only path differences on case-insensitive filesystems seem worth adding to the regression test matrix.
Whatever initiates the failure, the Computer Use worker lifecycle still needs a timeout, bounded concurrency, backoff and a circuit breaker.
I found a reliable workaround for this issue on macOS.
The crash appears to be triggered when
~/.codexis a symbolic link and Codex uses the symlink path instead of the resolved physical path.For example:
Both paths point to exactly the same directory, but the Codex app currently appears to treat:
and:
as different paths in some parts of the app.
This can eventually trigger the runaway
computer-useworker/thread leak and crash.This matches the investigation in #39732, where using the symlink path reproduced the crash consistently, while using the real path for the exact same directory made the app stable.
Workaround
You do not need to remove the
~/.codexsymlink.Instead, explicitly set
CODEX_HOMEto the resolved physical path.1. Check whether
~/.codexis a symlinkFor example:
2. Get the real physical path
Example:
Do not use:
as
CODEX_HOME, because that is still the symlink path.---
Option 1: Set it permanently in
~/.zshrcThis works on my macOS setup:
Replace
/Volumes/Data/.codexwith the output of:Verify:
It should print the real path, for example:
You can also configure it automatically from the existing symlink:
---
Option 2: Set it for the macOS GUI session
If the app is launched from Finder/Dock and does not inherit the shell environment, use:
Verify:
Then completely quit ChatGPT/Codex and reopen it.
For example:
This is also the workaround demonstrated in #39732:
With the symlink path, the issue reproduced consistently; with the resolved real path, the app remained stable.
---
Recommended setup
My current setup is therefore:
The symlink is kept for compatibility, but Codex itself is explicitly given:
instead of:
In other words:
You can verify both values with:
If necessary:
Then completely quit and restart the app.
Why this works
The important part is not moving or changing the
.codexdata.The same directory can behave differently depending only on the path string used to access it:
The investigation in #39732 reproduced this with the same directory, same inode, and same data. Only the
CODEX_HOMEpath string changed.The likely permanent fix in Codex itself is to canonicalize
CODEX_HOMEwithrealpath()before storing or comparing paths.Until that is fixed, explicitly setting
CODEX_HOMEto the physical path is a reliable workaround and allows the existing~/.codexsymlink to remain in place.Build 7119 same-build retest with explicit GUI
CODEX_HOMEI tested the workaround from the latest comment on the same Apple Silicon machine and app bundle used for an unset-
CODEX_HOMEcontrol.Environment:
26.820.60940(build7119)~/.codexis already a physical top-level directorycd ~/.codex && pwd -Plaunchctl setenv CODEX_HOME <physical-path>and verified withlaunchctl getenv CODEX_HOMEbefore a complete app restartSame-build results at the fourth five-second sample:
| Build 7119 condition | Elapsed | Helpers | Matching workers | App threads |
|---|---:|---:|---:|---:|
|
CODEX_HOMEunset | ~16 s | 27 | 54 | 73 || GUI
CODEX_HOMEset to physical path | ~16 s | 26 | 43 | 69 |The bounded monitor stopped both trials before resource exhaustion. Neither produced a new crash report. After the second trial, signed/notarized build
6321was restored and remained healthy with one helper; app threads declined from 67 to 61. The temporary launchd value was removed, and I did not persist it in.zshrc.Conclusion: explicitly setting GUI
CODEX_HOMEto the physical top-level path was not sufficient on this topology. The workaround may still be effective when the top-level Codex home itself is a symlink, but this same-build A/B suggests an additional trigger remains when the top-level directory is physical and managed entries inside it are symlinked. The missing timeout/single-flight/circuit-breaker behavior remains the product-level failure mode.Privacy note: this report excludes usernames, local paths, account details, session identifiers, raw logs, and attachments.