[Windows desktop] Chrome native host retry loop consumes a CPU core and causes input lag
Codex App version
- Windows MSIX package:
OpenAI.Codex 26.810.4967.0 - Previous package before the update:
26.803.10989.0
Platform
- Windows 11 Enterprise 25H2, build
26200.9168, x64
Issue
After updating the Codex desktop app, the Windows desktop developed severe keyboard and mouse input stutter while Codex was running. Closing Codex removed the stutter, and rebooting or relaunching temporarily restored normal responsiveness before the symptom returned.
The Codex main process sustained approximately 100-140% of one logical CPU core during affected periods. System-wide CPU utilization, DPC activity, interrupt activity, memory pressure, and device status were otherwise normal.
The desktop log repeatedly emitted this warning every approximately 0.3-0.5 seconds:
[chrome-native-host-cache-watcher] chrome_native_host_cache_reconcile_failed
errorMessage="Missing bundled Electron runtime required to sync Chrome native host resources for com.openai.codexextension: codex
(resourcesPath: <WindowsApps package>\app\resources)."
marketplaceName=openai-bundled
pluginName=chrome
One session accumulated 1,288 copies of the same warning and grew to about 5.1 MB. No raw logs are attached because they contain local paths and conversation metadata.
The retry loop eventually stopped spontaneously before the Chrome plugin was manually disabled. After setting:
[plugins."chrome@openai-bundled"]
enabled = false
no additional copies of this warning were observed during a 10-second verification window. A full restart after disabling is still needed to confirm the workaround across a fresh process.
Steps to reproduce
- Install or update to Windows MSIX package
26.810.4967.0. - Leave the bundled
chrome@openai-bundledplugin enabled. - Launch Codex and use it normally.
- Wait until
chrome_native_host_cache_reconcile_failedbegins repeating in the desktop log. - Observe sustained main-process CPU usage and keyboard/mouse input stutter outside Codex.
- Close Codex; system responsiveness returns.
The onset is not fully deterministic, but the log loop and CPU increase are directly measurable when the problem is active.
Expected behavior
- The Windows package should include or correctly locate the runtime required by the bundled Chrome plugin.
- A missing runtime should produce one actionable diagnostic and use bounded exponential backoff, rather than retrying several times per second.
- A plugin initialization failure should not consume a CPU core or degrade system-wide input responsiveness.
- If the bundled runtime is unavailable, the plugin should fail closed or disable itself with a clear notification.
Privacy note
This report is intentionally sanitized. Usernames, account details, user-directory paths, conversation/task IDs, process IDs, IP addresses, device identifiers, and raw logs have been omitted.
15 Comments
I maintain WinBridge Recovery, an independent Windows recovery tool for Codex Desktop plugin/runtime state: https://github.com/zemeng5208/winbridge-recovery
This report is a high-confidence match for one of the local layers WinBridge is intended to diagnose: the bundled Chrome plugin / native-host reconciliation path after a Desktop update. In particular, it can check whether the locally installed official package, the
openai-bundled/chromecache/version/lateststate, Chrome Native Host manifest/registry/v2 state, and related runtime paths have drifted or were only partially staged, then rebuild the user-side state from the official package when that is possible.The important limitation here is the exact log message:
Missing bundled Electron runtime required to sync Chrome native host resources. If the current MSIX package itself genuinely does not contain (or no longer exposes) the runtime that the new Desktop code expects, that is an upstream packaging/runtime lookup bug. WinBridge does not patch or take ownership ofC:\Program Files\WindowsApps, does not redistribute official runtime files, and cannot guarantee a permanent fix for a package-level omission. What it can do is distinguish that case from stale local cache/latest/Native Host state and recover the latter without modifying WindowsApps.The repeated 0.3–0.5s reconcile loop is also an upstream behavior issue even if the local state is repairable; a bounded backoff/fail-closed path still needs to be fixed in Codex itself.
Independent ETW reproduction confirms the same retry loop on another Windows system and adds process-level evidence.
Environment
OpenAI.Codex 26.810.4967.029639, x64codex-computer-use.exewas not present during the capture.WPR / ETW evidence
A requested 75-second WPR
GeneralProfilecapture was recorded while the system-wide stutter was visible. The resulting ETW timeline, including recorder startup/stop overhead, covered approximately 87.9 seconds.During that interval, the Codex main process
ChatGPT.execreated 143 instances ofreg.exe. Every instance used the same command:Verified properties:
reg.exeinstances: the Codex mainChatGPT.exeprocess.conhost.exeprocesses.Main-process CPU
The hot main-process thread was
CrBrowserMain:chrome.dll.ChatGPT.exeprocesses accumulated 132.77 CPU seconds during the trace.The machine was not globally CPU-saturated.
Negative evidence
codex-computer-use.exeprocess was present.dwm.exeused 7.23 CPU seconds across the trace and was not the dominant CPU consumer.Conclusion
This independently confirms that the user-visible system-wide stutter coincides with a sub-second Chrome native-host registration/reconciliation loop in the Codex main process. The loop repeatedly launches
reg.exeandconhost.exeand keepsCrBrowserMainhot even when Codex is not focused.This is distinct from the earlier Computer Use helper trigger reported in #36091, although the external symptom is similar. Please investigate the native-host cache watcher lifecycle, the packaged Electron-runtime lookup, and add bounded exponential backoff or a fail-closed path.
The raw ETL is being withheld because it contains local paths, command lines, process metadata, and other private workstation information. It can be provided through a private secure upload channel if requested.
Independent reproduction on Windows confirms the same Chrome native-host/cache reconcile loop on Codex Desktop
26.810.4967.0.Environment
26.810.4967.0chrome@openai-bundled26.810.41047WPR / ETW file-I/O evidence
A 29.775-second kernel File I/O trace of the Electron main process recorded:
The dominant targets were repeated reads of matching Codex runtime binaries from:
%LOCALAPPDATA%\OpenAI\Codex\bin\<build>\%USERPROFILE%\.codex\plugins\.plugin-appserver\The paired runtime files had identical sizes and SHA-256 hashes, so this was not caused by corrupted or mismatched binaries.
During the same 29.775-second trace, the Chrome plugin cache junction:
%USERPROFILE%\.codex\plugins\cache\openai-bundled\chrome\latestwas deleted/replaced 56 times.
Observed interval:
The junction pointed to the correct installed plugin version whenever sampled. This appears to be a self-triggering reconciliation/idempotence problem rather than a genuinely missing or corrupt plugin version.
Live measurements before mitigation
A separate five-second sample of the Electron main process showed:
The system was not under general CPU, DPC, interrupt, paging, or physical-memory pressure. The backend, Docker, Defender, indexing, and GPU processes were not the dominant consumers.
Controlled mitigation and retest
Only this configuration was changed:
A full Codex Desktop restart was required for the change to take effect.
An 11.17-second post-restart sample showed:
The in-app Browser plugin remained enabled. Only the external Chrome/native-host integration was disabled.
Conclusion
The system-wide mouse/input stutter coincides with a sub-second self-triggering Chrome cache/native-host reconciliation loop. The loop repeatedly replaces the
latestjunction and rereads hundreds of megabytes of paired runtime binaries.Please investigate:
latest.This may also explain the persistent main-process read loop reported in #38518, although that issue initially appeared to be triggered by conversation navigation.
No raw ETL, account data, conversation data, credentials, or identifying local paths are included.
I isolated a deterministic root cause for this loop on the same Windows build. This is not a missing runtime or a corrupt plugin cache.
Root cause
In the packaged Desktop
app.asar, the bundled-plugin cache builder first converts the Codex home to forward slashes, then constructs the version directory withpath.posix.join. On Windows this leaves the expected version path in this form:The
latestverifier resolves the junction target with the platformpath.resolve(path.dirname(latestRoot), readlink(latestRoot)), which produces:It then compares the two strings with strict equality. They identify the same Windows path, but the comparison is false solely because one uses
/and the other uses\.In build
26.810.4967.0, the relevant minified cache-builder occurrence is unique inapp.asar(around byte offset 6,443,210). The effective logic is:Because
isCurrentnever becomes true on Windows, every reconcile pass treats the already-correctlatestjunction as stale, replaces it, triggers the watcher again, and repeats full runtime verification.Controlled A/B evidence
With the unmodified behavior, a 5-second ETW File I/O capture recorded approximately 21.6 GB of logical reads while the physical disk was idle, plus 210 create, 210 filesystem-control, and 210 delete events involving the Chrome
latestjunction. The Electron main process used about 1.66 logical CPU cores and the desktop mouse visibly hitched.I then applied a narrow process-local diagnostic shim that changes only this plugin-cache join from POSIX to Win32 semantics. It made the two paths compare equal. With the Chrome plugin still enabled after restart:
latestcompleted its one startup initialization and then retained the same creation identity for at least 109.7 seconds;No plugin cache contents, bundled binaries, Chrome registration, or WindowsApps files were changed for this A/B test.
Suggested fix
Use the platform path implementation for local filesystem paths and canonicalize both operands before comparison. For example, build the cache path with
path.join, then comparepath.resolve(resolvedTarget)withpath.resolve(versionRoot)(with the normal Windows case-insensitive treatment if required). Avoid serializing a local Windows cache path throughpath.posix.joinand later comparing it byte-for-byte with a Win32-resolved path.It would also be useful to retain bounded backoff, but path canonicalization fixes the deterministic trigger rather than merely throttling it.
Additional side-by-side regression evidence: the official Microsoft Store Beta package does not reproduce this issue on the same Windows machine.
Tested configuration
OpenAI.Codex 26.810.4967.0OpenAI.CodexBeta 26.727.4816.026.810.41047; the Chrome extension was not removed or disabled.In a simultaneous sampling window with both applications running:
I then closed Stable and exercised the Beta build through the real external Chrome extension/native host: create a temporary tab, navigate, read the DOM, follow a link, go back, reload, and close the tab. All operations completed successfully.
During a 16.6-second sample covering Chrome activity, the entire Beta process tree averaged 2.39 MiB/s logical reads with a 4.36 MiB/s peak. A later post-operation 15-second sample averaged 4.52 MiB/s, with a 19.08 MiB/s peak. The native host settled at 0% CPU / 0 MiB/s after the operation.
Across all three Beta desktop logs created during the test:
chrome_native_host_cache_reconcile_failed: 0 occurrenceschrome-native-host-cache-watcher: 0 occurrencesThe system-wide mouse/input stutter was not observed while using the Beta build.
Because
26.727.4816.0is an older Beta-channel package, this is not evidence that a newer release already contains a fix. It does provide a useful regression boundary and a side-by-side workaround that preserves external Chrome integration. The result is also consistent with the Windows path-normalization/string-comparison root cause described in the latest comment.Was able to reproduce this.
26.810.4967.026.810.41047Codex repeatedly thinks its bundled Chrome integration needs refreshing, each refresh reading hundreds of MB from disk. Disabling Chrome integration manually didn't disable the background cache-maintenance code.
The
src-BlUt09P1.jsfunction responsible for maintaining the Chrome plugin’slatestjunction constructsversionRootusing slash/posix normalisation, it callsreadlink(latestRoot)andpath.resolve(), which produce a Windows backslash path, and then compares the two strings using strict equality.So they identify the same directory but differ textually. E.g.:
C:/.../chrome/26.810.41047C:\...\chrome\26.810.41047So the comparison fails every time. Codex the deletes and recreates the unchanged
latestjunction whose target was already correct.Before reaching that comparison reconciliation recursively verifies the Chrome app-server runtime using full SHA-256 reads (
zK → GK → JK → XK), includingcodex-resources. The junction mutation then retriggers the cache watcher.Affected state:
127–165%396–529 MiB/slatestdeleted/recreated approximately every1.8scodex.exewere not dominantCausal A/B:
Deleteon thelatestjunction stopped reconciliation.00.39%mean0.03 MiB/smeanThe ACL test is diagnostic/session mitigation, not a proposed product workaround: it intentionally causes one
EPERMduring reconciliation.Suggested fix
realpath()plus Windows-aware normalisation/case handling.This appears to provide the missing concrete explanation for the path-canonicalisation hypothesis already raised here and for the hashing mechanism reported in #38547.
Additional independent reproduction with a completed pre/post mitigation A/B on Windows.
Environment
OpenAI.Codex 26.810.4967.0chrome@openai-bundled 26.810.41047User-visible impact
The entire desktop developed severe mouse and keyboard stutter while Codex remained open. Task Manager showed the main ChatGPT/Codex process at Very high power usage. Fully exiting the app immediately restored responsiveness, but relaunching without changing configuration only made the problem disappear temporarily.
Measurements while affected
A 10-second live delta on the Electron main
ChatGPT.exeprocess showed:At the same time, the junction
%USERPROFILE%\.codex\plugins\cache\openai-bundled\chrome\latestwas not merely receiving timestamp updates: its creation identity/FileId changed repeatedly while its target remained the same
26.810.41047directory. In a per-second sample, the junction was deleted and recreated every second. The target contained only 378 files / 8.62 MB, while the main process produced approximately 10.4 GB of logical reads in 10 seconds, consistent with repeated verification/hashing of the same small tree.No corresponding GPU reset/TDR, DPC/interrupt storm, or system-wide CPU saturation was present.
Controlled mitigation and restart behavior
Only this setting was changed:
The running process did not hot-reload the setting: before a full exit, it continued at approximately 1,010–1,030 MB/s and the junction kept cycling.
After a full exit and relaunch:
browser@openai-bundledremained enabled; only the external Chrome/native-host integration was disabled.This is a strong local causal A/B match for the Windows path-normalization/cache-reconciliation findings already reported here. Please prioritize a Windows-aware canonical path comparison and ensure the watcher has bounded backoff/fail-closed behavior so this loop cannot degrade system-wide input.
Raw local logs are not attached because they contain workstation paths and task metadata, but the summarized measurements above were taken live before and after the single configuration change.
Independent reproduction on a newer Windows stable package confirms that this issue is still present in 26.810.6296.0.
Environment
26200OpenAI.Codex 26.810.6296.0chrome@openai-bundled 26.810.50856Measurements while affected
A five-second live sample of the Electron main
ChatGPT.exeprocess showed:A Process Monitor trace showed the main process repeatedly reading:
The file was 281.48 MiB. During a 4.17-second capture, the process issued 2,522 reads totaling 1,260.92 MiB, with five separate reads starting at offset zero. The same trace showed the parent
ChatGPT.exerepeatedly launching:The registry command occurred roughly once per second. Physical disk throughput was much lower than the logical-read counter, consistent with repeated hashing/verification of cached runtime bytes.
This matches the path-normalization/cache-reconciliation loop already identified in this issue.
Controlled mitigation
Only the external Chrome integration was disabled:
After a full Codex Desktop exit and restart, a new five-second sample showed:
The in-app
browser@openai-bundledplugin remained enabled. No registry, junction, package, or WindowsApps files were modified.This confirms both that the regression persists in
26.810.6296.0and that disabling onlychrome@openai-bundledplus a full restart is an effective workaround on this machine.Independent confirmation on the current Windows package installed on this machine.
Environment
Live process sample
An 8-second read-only sample while the fault was active showed:
This rules out continuous log writing as the main cause. The high read rate is logical/cache-backed I/O rather than physical disk saturation.
Reconciliation-loop evidence
A read-only watch of the Chrome plugin latest junction observed 10 distinct creation timestamps in approximately six seconds. The junction target remained unchanged and correct for every sample:
%USERPROFILE%\.codex\plugins\cache\openai-bundled\chrome\26.810.50856
The compared runtime files existed on both sides with identical sizes:
The Chrome plugin was configured as enabled. No application, plugin, registry, junction, or cache files were modified during this diagnostic capture.
User impact and interpretation
While this loop is active, the mouse visibly stutters across Windows and input feels delayed. Fully exiting the ChatGPT/Codex process tree restores responsiveness.
The CPU, logical-read rate, low physical-disk rate, and repeated recreation of an unchanged junction independently match the hashing/cache-reconciliation loop described in this issue and #38547, as well as the input-lag symptoms in #38551.
The suggested chrome@openai-bundled disable-and-restart mitigation had not yet been applied at the time of capture, so the figures above are clean pre-mitigation evidence. No account identifiers, task contents, session IDs, complete user paths, logs, or transcripts are included.
Follow-up A/B result from the same machine after applying only the suggested mitigation:
Post-restart sample 1
An 8-second sample showed:
Post-restart confirmation sample
A second 8-second sample showed:
During the same confirmation window, the Chrome plugin latest junction was checked 24 times over approximately six seconds:
Before versus after
Before disabling the external Chrome integration:
After disabling it and fully restarting:
This is a clean same-machine A/B confirmation that disabling only chrome@openai-bundled stops the repeated runtime hashing/junction-reconciliation loop on OpenAI.Codex 26.810.6296.0. The in-app Browser plugin remains enabled and functional.
thank you for your reports, we believe we've addressed this in 26.810.7004.0. try that version and send a fresh feedback if it persists!
Independent same-process A/B confirmation from another affected Windows system.
Environment
26.810.4967.0User-visible symptom
After Codex had been running for approximately 60 minutes, mouse and touchpad movement became visibly discontinuous across both displays. Dragged windows followed the same stuttering motion.
Video playback and normal animations remained smooth, and the pointer was smooth on the Ctrl+Alt+Delete secure desktop. Restarting Codex temporarily cleared the symptom, but it returned after continued use.
Captured measurements
During the affected period, the same Electron main
ChatGPT.exeprocess showed:133.808%of one logical core326.851%1128.597 MB/s3169.104 MB/sWrites remained low, and
logs_2.sqlitewas not undergoing sustained high-frequency growth. The observed reads were therefore consistent with cache-backed runtime verification rather than physical disk saturation.Controlled mitigation without restarting Codex
The external Chrome integration plugin was uninstalled while Codex remained running.
The same process then dropped to:
4.653%0.506 MB/s28.020%4.163 MB/sMouse responsiveness returned immediately. There was no Codex restart between the affected and recovered measurements.
This provides an independent same-process causal A/B match for the repeated Chrome runtime hashing/cache-reconciliation loop described in this issue and #38547.
The built-in Browser remains usable and is not implicated. I rely on the external Chrome integration for authenticated Chrome sessions and would like to reinstall it once the fixed build is available.
I am currently on
26.810.4967.0. Please confirm whether upgrading to26.810.7004.0or later is sufficient before reinstallingchrome@openai-bundled. If the issue persists after upgrading and reinstalling, I can provide a fresh sanitized feedback/session ID and new post-fix measurements.No raw logs, local paths, account identifiers, conversation contents, or session transcripts are included in this report.
@chess-oai I confirm that
26.810.7004.0fixes it, thx :)@EDM115 where can I download the newest version?
@derekhe Fully quit the ChatGPT app, including from the system tray (and make sure no ChatGPT processes remain in Task Manager), wait a few seconds, then launch it again. It should download and install the update automatically. After reopening, check that the version is
26.810.7004.0or newer.