Windows Codex Desktop spawns powershell.exe every second for full process polling, causing high CPU usage
What version of the Codex App are you using (From “About Codex” dialog)?
26.527.31326
What subscription do you have?
Pro
What platform is your computer?
Microsoft Windows NT 10.0.26200.0 x64
What issue are you seeing?
Codex Desktop repeatedly spawns short-lived powershell.exe children under the Codex.exe GUI process to run full-machine CIM/WMI scans over Win32_Process and Win32_PerfFormattedData_PerfProc_Process.
In a fresh 30.05s measurement, I observed 23 PowerShell/pwsh processes, approximately 0.77/sec, consuming about 48.95 CPU-seconds total. Roughly 1.6 logical cores of sustained load from this recent change to how Codex monitors apps.
Confirmed child command examples:
powershell.exe -NoProfile -NonInteractive -Command "... Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId | ConvertTo-Json -Depth 2"
powershell.exe -NoProfile -NonInteractive -Command "... Get-CimInstance Win32_PerfFormattedData_PerfProc_Process ... Get-CimInstance Win32_Process ... CommandLine,WorkingSetSize,..."
What steps can reproduce the bug?
019e7fe2-7262-7c50-bbbc-0a374d0db752
- Run Codex Desktop on Windows.
- Watch child processes under Codex.exe using Task Manager, System Informer, or Get-CimInstance Win32_Process.
- When active, Codex.exe repeatedly spawns powershell.exe children running Get-CimInstance Win32_Process / Win32_PerfFormattedData_PerfProc_Process.
I do not yet have a deterministic trigger; the loop appears intermittent or state-dependent but happens while conversations are ongoing.
What is the expected behavior?
Codex Desktop should not spawn PowerShell repeatedly for full-machine process polling. Process tracking should be throttled, non-overlapping, scoped to Codex-owned process trees, or implemented through a persistent/native helper.
Additional information
This appears to be Codex Desktop app behavior, not the standalone Codex CLI. The parent process is the packaged Windows app Codex.exe, and the likely source is Desktop process-manager code in app.asar.
This did not happen before the updates at the end of last week (~28th/29th).
12 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I used Codex to help try investigate, and it found an anomaly:
~\.codex\process_manager\chat_processes.jsonhad 15 stale entries for conversations that happened the day prior.After clearing the stale entries and restarting Codex, the expensive checks still happen but at a slower interval than before.
Each launch of the powershell still is doing these commands that take ~1 or 2 seconds of ~2 CPU cores to complete.
``
powershell.exe -NoProfile -NonInteractive -Command "$ErrorActionPreference = 'Stop'; Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId | ConvertTo-Json -Depth 2"````
powershell.exe -NoProfile -NonInteractive -Command "$ErrorActionPreference = 'Stop'; $cpuByPid = @{}; Get-CimInstance Win32_PerfFormattedData_PerfProc_Process | ForEach-Object { $cpuByPid[[int]$_.IDProcess] = [double]$_.PercentProcessorTime }; Get-CimInstance Win32_Process -Filter \"ProcessId = 4392 OR ProcessId = 6368 OR ProcessId = 7132 OR ProcessId = 7160 OR ProcessId = 9384 OR ProcessId = 9528 OR ProcessId = 10408 OR ProcessId = 10868 OR ProcessId = 10876 OR ProcessId = 12048 OR ProcessId = 13772 OR ProcessId = 13872 OR ProcessId = 14400 OR ProcessId = 14828 OR ProcessId = 15604 OR ProcessId = 15652 OR ProcessId = 15932 OR ProcessId = 16024 OR ProcessId = 17308 OR ProcessId = 18164 OR ProcessId = 19972 OR ProcessId = 20632 OR ProcessId = 24368 OR ProcessId = 25228 OR ProcessId = 25320 OR ProcessId = 25328 OR ProcessId = 25404 OR ProcessId = 25916 OR ProcessId = 27828 OR ProcessId = 27832 OR ProcessId = 28396 OR ProcessId = 28788 OR ProcessId = 29300 OR ProcessId = 30292 OR ProcessId = 31736 OR ProcessId = 32152 OR ProcessId = 33536 OR ProcessId = 33948 OR ProcessId = 33988 OR ProcessId = 34356 OR ProcessId = 34544 OR ProcessId = 35192 OR ProcessId = 35244 OR ProcessId = 35364 OR ProcessId = 35852 OR ProcessId = 36868 OR ProcessId = 37092 OR ProcessId = 37712 OR ProcessId = 38156 OR ProcessId = 38520 OR ProcessId = 38608 OR ProcessId = 38724 OR ProcessId = 39336 OR ProcessId = 40392 OR ProcessId = 40492 OR ProcessId = 40580 OR ProcessId = 40840 OR ProcessId = 41416 OR ProcessId = 42652 OR ProcessId = 43232\" | Select-Object ProcessId,ParentProcessId,CommandLine,WorkingSetSize,@{Name='CpuPercent';Expression={$cpuByPid[[int]$_.ProcessId]}},@{Name='AgeSeconds';Expression={[int]((Get-Date) - $_.CreationDate).TotalSeconds}} | ConvertTo-Json -Depth 2"````
powershell.exe -NoProfile -NonInteractive -Command "$ErrorActionPreference = 'Stop'; $cpuByPid = @{}; Get-CimInstance Win32_PerfFormattedData_PerfProc_Process | ForEach-Object { $cpuByPid[[int]$_.IDProcess] = [double]$_.PercentProcessorTime }; Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,CommandLine,WorkingSetSize,@{Name='CpuPercent';Expression={$cpuByPid[[int]$_.ProcessId]}},@{Name='AgeSeconds';Expression={[int]((Get-Date) - $_.CreationDate).TotalSeconds}} | ConvertTo-Json -Depth 2"``I added a small helper for packaging this kind of evidence without posting raw full-machine process dumps:
trace-to-skill@0.1.73now hasprocess-audit.Scope note: it does not inspect live processes or mutate Codex state. It parses process notes/snippets that a user already captured from Task Manager, System Informer,
Get-CimInstance,ps,top, etc. It currently flags:Get-CimInstance Win32_Process/Win32_PerfFormattedData_PerfProc_Processprocess_manager/chat_processes.jsonmentionsThe output includes a checklist for sample duration, child process count, approximate spawn rate, CPU-seconds, parent Codex.exe PID, and redacted command lines. Release/proof: https://github.com/grnbtqdbyx-create/trace-to-skill/releases/tag/v0.1.73
I added a small local report helper for this kind of evidence in
trace-to-skill@0.1.73:Scope note: it does not inspect live processes or modify Codex state. It only turns pasted/saved process evidence into a smaller public report, so users do not need to attach raw full-machine process dumps.
It detects:
powershell.exe/pwshCIM polling commands such asGet-CimInstance Win32_ProcessandWin32_PerfFormattedData_PerfProc_Processprocess_manager/chat_processes.jsonmentionsRelease/proof: https://github.com/grnbtqdbyx-create/trace-to-skill/releases/tag/v0.1.73
Additional confirmation on the latest Windows Desktop build.
Environment
10.0.19045, x64C:\Program Files\WindowsApps\OpenAI.Codex_26.623.9142.0_x64__2p2nqsd0c76g0\app\Codex.exeapp.asar:26.623.70822codexBuildNumber:455942.1.0C:\Program Files\WindowsApps\OpenAI.Codex_26.623.9142.0_x64__2p2nqsd0c76g0\app\resources\codex.exe app-server --analytics-default-enabledObserved behavior
Process Explorer showed repeated short-lived
powershell.exechildren spawned directly by the ElectronCodex.exeprocess. The command line matches the background process telemetry/polling command:A short live sample saw fresh
process-metadataPowerShell processes underCodex.exeevery ~0.5-1s while a Codex turn/tool flow was active. Example sample rows:This was not caused by a user hook or script. The only configured hook command on this machine was a startup-only
SessionStartcleanup hook withpowershell -NoProfile -ExecutionPolicy Bypass -File ...; the repeated processes were insteadpowershell.exe -NoProfile -NonInteractive -Command ... Get-CimInstance ...and were parented byCodex.exe.Installed bundle evidence
Extracting the installed
app.asarshows this is coming from the Electron process sampler path.main-Btzug9bx.jscreates a worker namedchild-process-snapshot:The same bundled file labels this area
electron-sampler, andaddChildProcessFieldscalls the worker on Windows:The bundled sampler manager has:
and uses
setInterval(() => this.requestAppStateSnapshot('heartbeat'), OZ), so the background heartbeat appears intended to be 30s, with non-heartbeat snapshot triggers gated at 5s. The observed rate can be much higher while the app is active, likely due to additional snapshot triggers and/or overlapping slow WMI/CIM probes.child-process-snapshot-worker.jslaunches two Windows PowerShell probes for each snapshot:and then:
The worker receives only a root PID via
workerData, builds the descendant process set, and then asks PowerShell/WMI for details. The second query still enumeratesWin32_PerfFormattedData_PerfProc_Processglobally to build$cpuByPid.Why this remains a problem
Even if the telemetry is intentional, spawning full Windows PowerShell repeatedly for process telemetry is expensive and highly visible in diagnostic tools. On Windows 10 in particular, the combination of
powershell.exestartup +Get-CimInstance+ globalWin32_PerfFormattedData_PerfProc_Processpolling is a poor background implementation.Expected behavior:
This issue is still present on
OpenAI.Codex_26.623.9142.0/ bundle4559.EDIT: do you test this code in prod only? Tragic.
Seeing the same pattern on Windows 11 with Codex Desktop.
Local PowerShell event logs show short-lived
powershell.exeConsoleHost sessions around2026-07-06 17:30:00-17:30:02and2026-07-06 22:20:04-22:20:12, running:Get-CimInstance Win32_ProcessandWin32_PerfFormattedData_PerfProc_Process, thenConvertTo-Json.A live sample showed the
powershell.exeprocess parented byCodex.exe. User-visible impact includes black console flashes and intermittent mouse/keyboard stutter. This also matches #26613.Confirmed on a newer Windows Desktop build with the same global WMI sampling command.
Environment
26.707.3748.00.144.126200, x64Captured process
A live process-tree snapshot found a short-lived
powershell.exedirectly parented by the packaged DesktopChatGPT.exe. Its command line contained the same sequence described in this issue:The filter listed a large set of Desktop, app-server, MCP, Node, renderer, and command-runner PIDs, while
Win32_PerfFormattedData_PerfProc_Processwas still enumerated globally to build the CPU map.I also captured the separate Git-process churn on this machine. GPU utilization remained only 1-3%, so repeated Windows process creation and global WMI queries are a much better fit for the observed fan activity than GPU saturation.
An unprivileged
Win32_ProcessStartTracesubscription was denied by WMI on this machine, so I am not claiming an exact PowerShell spawn rate from this run. The captured parent PID and command line do confirm that the expensive sampler path is still present in26.707.3748.0.Suggested fix
Use a persistent/native process sampler, scope expensive metrics to the already-discovered descendant PIDs, make snapshots single-flight, and coalesce active-turn triggers so they cannot overlap the heartbeat sampler.
---
This issue or PR was generated by LazyCodex.
Tag: lazycodex-generated
Additional confirmation from a newer Windows Desktop build, with ETW/WMI attribution and user-visible impact.
Environment
26.707.12708.0Evidence
The machine exhibits sustained total CPU usage in the roughly 30-60% range during the affected state, with about eight logical-processor graphs remaining continuously busy and severe system-wide input/UI stutter.
An ETW trace of
Microsoft-Windows-WMI-Activitycorrelated the activity with short-lived PowerShell clients spawned by the packaged Codex Desktop process (ChatGPT.exe). The queries were handled by two WMI Provider Host instances:WmiPerfInstservicingWin32_PerfFormattedData_PerfProc_ProcessCIMWin32servicingWin32_ProcessThis matches the commands and Electron sampler path already documented in this issue. The installed
26.707.12708.0bundle still contains the sameGet-CimInstance Win32_ProcessandGet-CimInstance Win32_PerfFormattedData_PerfProc_Processpolling implementation.The symptom is particularly misleading in Task Manager/Resource Monitor: individual
WmiPrvSE.exerows can show low sampled averages while total CPU usage is much higher, but the high total CPU state consistently coincides with the polling activity and real machine stutter.Impact
This is not merely a cosmetic telemetry issue. Repeated full-machine process polling:
Please prioritize a fix or provide an immediate supported kill switch. At minimum, the sampler should be single-flight, aggressively rate-limited/coalesced, idle-aware, and restricted to the Codex-owned process tree. A persistent/native Windows process sampler would avoid repeatedly launching PowerShell and globally enumerating WMI performance classes.
This comment was prepared and submitted by OpenAI Codex using the affected user's GitHub account with the user's explicit permission.
Confirmed this still reproduces on the current Microsoft Store build 26.715.4045.0 on Windows 11 (20 logical processors), including while the Codex desktop app is visibly idle.
A/B confirmation
WmiPrvSE.exeremains active.Live measurements
Using Windows Process performance counters, the busy
WmiPrvSE.exeinstance averaged 8.42% of total machine CPU over 10 seconds and peaked at 10.10%. A second sample averaged 6.62% and peaked at 21.69% of total machine CPU.Provider troubleshooting counters identified
CIMWin32in that host as the active provider:A six-second
Msft_WmiProvider_ExecQueryAsyncEvent_Precapture observed 120 queries. The dominant query occurred 86 times (about 14.3/sec):There were also repeated per-PID
ExecutablePath/CommandLinequeries and largeProcessId = ... OR ProcessId = ...filters.Since boot, the WMI Operational log contained 893 Event 5858 client failures:
The reported client PIDs belonged to short-lived processes and had exited by inspection time.
Installed bundle correlation
The current packaged
app.asarstill contains Windows process snapshot code that launches hiddenpowershell.exeand runs both:It also constructs the same
Get-CimInstance Win32_Process -Filter "ProcessId = ... OR ProcessId = ..."query shape recorded by WMI. The renderer contains achild-processesquery configured withintervalMs: 5000, but the measured rate is much higher than one snapshot every five seconds, suggesting duplicated/overlapping callers or another unbounded refresh path.No WMI service crashes,
WmiPrvSEquota events, or signature anomalies were found. This appears to be application-driven polling rather than WMI corruption.Current workaround: fully exit Codex Desktop when it is not actively needed. Restarting or rebuilding WMI is not an appropriate workaround.
Potential duplicates/related reports: #29499 and #33875.
Independent confirmation on the current Microsoft Store build, with a live process count and installed-package correlation.
Environment
OpenAI.Codex_26.715.4045.0_x64Live impact and attribution
During the affected state:
WmiPrvSE.exereached 36.24% of total-machine CPU while total CPU was 83.97%.Win32_Processquery and failed in the same millisecond with RPC error0x800706BE.Get-CimInstancecommands embedded in the installed Codex package, and the processes were direct children of the packaged DesktopChatGPT.exe.Installed-package confirmation
Read-only inspection of the installed
app.asarshows:delta_burst,thread_started,turn_started, andturn_completed;Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessIdGet-CimInstance Win32_PerfFormattedData_PerfProc_ProcessGet-CimInstance Win32_Processdetail queries;This matches the observed burst of simultaneous clients and explains why a nominal 5/30-second schedule can become a WMI storm.
Requested fix
Please provide an immediate supported kill switch for Windows host/process sampling, then make collection single-flight, coalesced, timeout-bounded, and protected by exponential backoff/circuit breaking. A persistent native collector scoped to the Codex process tree would avoid repeatedly launching PowerShell and globally enumerating WMI classes.
No prompts, conversation contents, usernames, local paths, or raw private logs are included. This comment was prepared and submitted by Codex using the affected user's GitHub account with the user's explicit permission.
Additional reproducible evidence for this issue follows. This narrows the failure to overlapping WMI snapshot paths and a fixed 5-second timeout, including retriggering on window focus.
Exit code: 0
Wall time: 20.7 seconds
Output:
[Windows Desktop] Repeated PowerShell/WMI process snapshots hit a fixed 5-second timeout on startup and window focus
Summary
Codex Desktop for Windows launches overlapping PowerShell/WMI process-enumeration commands from at least two internal paths. Both enumerate system-wide process data, and one path uses a fixed 5-second timeout.
On a Windows system where these valid WMI queries take roughly 4.3–4.7 seconds when warm and more than 5 seconds when cold, the commands repeatedly time out or fail. The same work is triggered again when the Codex window receives focus. This causes repeated WMI provider activity and noticeable CPU usage.
This appears to be an application bug rather than a damaged WMI repository or a permanent permissions problem: the exact queries succeed under the same user account when allowed to finish.
Environment
OpenAI.Codex_26.715.3651.0_x64__2p2nqsd0c76g0C:\Program Files\WindowsApps\OpenAI.Codex_26.715.3651.0_x64__2p2nqsd0c76g0\app\ChatGPT.exeActual behavior
Two independent call paths launch PowerShell and query WMI/CIM:
ChatGPT.exe->electron-sampler->child-process-snapshot-worker.js->powershell.exe->Get-CimInstanceChatGPT.exe->BundledPluginsMarketplaceplugin reconciliation /stop_chrome_native_host->powershell.exe->Get-CimInstanceThe queried classes include:
Win32_ProcessWin32_PerfFormattedData_PerfProc_ProcessInspection of the installed application package shows the sampler creates
child-process-snapshot-worker.js, invokespowershell.exe -NoProfile -NonInteractive, and applies a fixedtimeout = 5e3(5,000 ms). The process is hidden and the output buffer is set to 8 MiB.The application log shows the sampler and plugin reconciliation failing close together. The pattern repeats after window focus:
electron-samplerfailure while queryingWin32_ProcessBundledPluginsMarketplacefailure while queryingWin32_PerfFormattedData_PerfProc_ProcessandWin32_Processbundled_plugins_reconcile_started reason=focusWMI Activity logs at the same timestamps show provider activity for
CIMWin32,WmiPerfClass, andWmiPerfInst. SubsequentWMIBinaryMofResourceactivity underSYSTEMappears to be downstream provider initialization, not a separate direct Codex query.Timing evidence
The queries were measured outside the Codex sandbox, under the same Windows user account.
Individual queries, three runs each:
| Query | Run 1 | Run 2 | Run 3 |
|---|---:|---:|---:|
|
Win32_Process| 1,899 ms | 1,713 ms | 2,642 ms ||
Win32_PerfFormattedData_PerfProc_Process| 4,675 ms | 2,689 ms | 2,602 ms |The combined Codex-equivalent command completed successfully in:
This leaves only 330 ms of margin against the fixed 5,000 ms timeout in the slowest warm run. In an earlier cold run, the performance-class query took 5,931 ms, and the combined command took approximately 6.3 seconds.
Therefore, normal timing variation is sufficient to cross the application's timeout. Starting two overlapping full-system WMI enumerations can make the condition more likely and increases CPU load even when both eventually succeed.
Steps to reproduce
Microsoft-Windows-WMI-Activity/Operational.powershell.exechildren runningGet-CimInstanceforWin32_Processand/orWin32_PerfFormattedData_PerfProc_Process.bundled_plugins_reconcile_started reason=focus, followed by another set of WMI calls and, on affected machines, timeout/failure warnings.The issue is easier to reproduce during cold WMI provider startup or other system load.
Expected behavior
Suggested fixes
electron-samplerand bundled-plugin reconciliation instead of launching duplicate WMI work.Configuration note
Changing the Codex workspace sandbox setting is not expected to fix this issue. The WMI calls originate from the desktop host application and also reproduce as normal same-user commands outside the sandbox. No supported setting was found for changing the sampler timeout or disabling these WMI snapshots.
Available diagnostics
Before uploading any full log or session transcript, it should be reviewed for local paths, prompts, repository names, environment variables, tokens, and other sensitive information.
Local evidence references (not public paths)
%LOCALAPPDATA%\Packages\OpenAI.Codex_2p2nqsd0c76g0\LocalCache\Local\Codex\Logs\2026\07\19\...logcodex_diagnostics\current-wmi-latency-20260719.csvConfirming and extending this report with ~3h of diagnostic data collected tonight.
Environment: Codex Desktop 26.715.4045.0 (current), Windows 11 Pro build 26200, 12 logical cores. The bug is still fully present in this version.
1. Spawn cadence and query shapes. The spawner is the app's main process (
ChatGPT.exewith no--type=flag). It launchespowershell.exe -NoProfile -NonInteractiveroughly every 1–2 s — I captured 11 spawns in a 20 s window. Three rotating query shapes:Get-CimInstance Win32_PerfFormattedData_PerfProc_Processscan, then aWin32_Processquery whose filter is a machine-generated list of ~120 literalProcessId = N OR …clauses (the watched-PID list changes every round);Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId | ConvertTo-Json;CommandLine,WorkingSetSize,AgeSeconds.The watched PIDs are the app's own processes,
codex.exe, thecua_noderuntime, MCP servers, and terminals of running agent tasks (e.g. annpm run package:smokethe agent had started).2. Where the cost lands (why Task Manager never blames Codex). Measured attribution on a fully loaded machine: Codex-named processes ≈ 3% of total CPU; induced load ≈ 48% —
WmiPrvSE.exeup to ~2.5 cores servicing the full-machine scans,MsMpEng.exe(Defender) scanning every short-lived spawn,svchost(Winmgmt) and DWM handling conhost churn. Total ≈ 51% of a 12-core machine attributable to this loop. Quitting the app instantly dropped total CPU from ~100% to ~30%.3. External mitigation is a losing arms race. A watchdog killing the spawned pollers at birth (250 ms cadence) made the app retry faster — spawn rate roughly doubled to ~2/s (>2,300 spawns in ~20 min). Suspending the main process does stop the loop but hangs system-wide UI (window-message broadcasts block on the frozen queue — same symptom family as #31236), so that's not viable either.
4. Partial relief that worked: a Defender process exclusion for
powershell.executMsMpEngfrom ~0.6 to ~0.15 cores. Also, session accumulation matters: after ~12 h the app had 9 × ChatGPT.exe, 6 × codex.exe and 53 orphaned conhost.exe alive.Suggested fix direction: replace the spawn-a-fresh-PowerShell-per-tick design with one persistent native/helper worker doing incremental, scoped polling of Codex-owned process trees (as the OP suggested). That would eliminate essentially all of the WMI + Defender + process-churn cost described above.