[Windows] Codex 26.715 enters a periodic ~15 s AppHang / ~10 s responsive cycle
What version of the Codex App are you using (From “About Codex” dialog)?
OpenAI.Codex_26.715.2305.0_x64__2p2nqsd0c76g0 (ChatGPT.exe file version 150.0.7871.124)
What subscription do you have?
Pro
What platform is your computer?
Windows 11 Pro 10.0.26200 x64; Intel Core i5-13600K; 95.75 GiB RAM; Intel UHD Graphics 770, driver 32.0.101.7085 (2026-03-02)
What issue are you seeing?
After the Microsoft Store updated Codex from the 26.707 line to the 26.715 line, the main Codex window began entering a stable periodic freeze cycle. The window becomes completely non-responsive for about 15 seconds, recovers for about 10 seconds, and freezes again.
The rest of Windows remains responsive. Task Manager shows the ChatGPT-named Codex window process as "Não respondendo" (Not responding), but does not show high CPU, RAM, disk, network, or GPU use.
Windows Error Reporting recorded 38 AppHangTransient events for ChatGPT.exe file version 150.0.7871.124 in a seven-day window. A live 40.801-second WM_NULL probe observed three unresponsive episodes (3.636 s, 15.079 s, and another episode active when the capture ended), with 10.125 seconds of responsiveness between episodes. Healthy message latency averaged 0.261 ms.
During the 15.079-second episode, Wait Chain Traversal reported the native UI thread as Blocked, with no deadlock cycle and no advancing user/kernel CPU counters. This indicates a sleeping/blocked main UI thread rather than a CPU-bound loop.
What steps can reproduce the bug?
- Start Codex Desktop on Windows.
- Open or continue a normal thread.
- Leave the main window open; no special action is required.
- Observe the window repeatedly enter "Not Responding."
- Wait approximately 15 seconds; it recovers.
- After approximately 10 seconds, it becomes non-responsive again.
The problem survives restarting both Codex and Windows.
What is the expected behavior?
The Codex window should remain responsive and continue processing Windows messages while background work, rendering, or network operations are in progress.
Additional information
Regression timing:
- No Codex AppHangTransient events were present in the preceding days.
- 26.715.2236.0 deployment began at 2026-07-16 22:26:51 -03:00.
- The first AppHangTransient occurred at 2026-07-16 22:56:04 -03:00.
- 26.715.2305.0 deployment began at 2026-07-16 23:21:46 -03:00, and the issue continues on that build.
No matching display-driver resets, WHEA errors, disk errors, or resource-exhaustion events were found since boot.
Possible related reports: #23981, #20214, #16374, and #20867.
I am attaching a sanitized diagnostics bundle containing package/OS/driver inventory, WER timestamps, Store deployment timeline, process counters, response-probe timings, hang summaries, UI-thread/WCT snapshots, whitelisted app-log signal names, the Task Manager screenshot, and the reusable collector script. It contains no conversation text, raw Codex logs, source code, command lines, window titles, cookies, tokens, credentials, crash dumps, or process memory.
20 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I captured an ETW/WPR trace during the periodic freeze and correlated it with the JavaScript/native sources shipped inside
app.asar. The root cause appears to be synchronous HID enumeration for the Codex Micro / Work Louder integration on Electron's main thread.Captured hang
OpenAI.Codex_26.715.2305.0_x64__2p2nqsd0c76g0ChatGPT.exe(PID 5020)CrBrowserMain(TID 38484)Idle (0), consistent with synchronous device-I/O completion/timeout rather than CPU saturation.Resolved portion of the blocking stack:
Correlation with shipped code
The package includes:
@worklouder/device-kit-oai0.1.10@worklouder/wl-device-kit0.1.18node-hid3.3.0In
.vite/build/codex-micro-service-C0OetNTY.js:1e4(10,000 ms);connect()callsthis.discovery.findWLDevices([DeviceType.Project2077]);scheduleReconnect()repeats the operation after that 10-second delay.In
wl-device-kit/dist/index.js,findWLDevices()calls synchronousnodeHID.devices()and only filters the returned list afterward. Thus it enumerates unrelated HID interfaces too.In the shipped
node-hidsource,devices()invokeshid_enumerate()synchronously. During enumeration, the Windows HIDAPI implementation callsHidD_GetManufacturerString(), which is exactly where the trace shows the 5-second USB descriptor wait. The same shippednode-hidversion already exposesdevicesAsync().This explains both symptoms: a roughly 10-second recurrence interval and a nonresponsive window with near-zero CPU while a USB HID interface times out. The problematic peripheral does not have to be a Codex Micro, because all HID devices are enumerated before filtering.
Suggested fix
nodeHID.devices()on Electron's main thread; useawait nodeHID.devicesAsync()or a worker/utility process.Source-map note
The ASAR has 6,818 entries and 3,561 JavaScript files with
sourceMappingURLreferences, but contains zero.mapfiles; all 3,561 map references are missing. The distributed bundles and native-module sources were nevertheless sufficient to identify this path.ASAR SHA-256:
d909924d6ae7a160ac78b88f01f9b16f079e6abbe3f677427b752a411c6a3449I kept the raw ETL local because it contains process/module/thread/path metadata, but I can provide a reduced export or additional targeted evidence if maintainers need it.
Temporary local workaround (validated, but unsupported)
I found a reversible workaround that stops the freezes without disconnecting or disabling any USB device. It disables only Codex Micro discovery for the launched Codex process, preventing the synchronous HID enumeration described above.
Tested with
OpenAI.Codex_26.715.2305.0_x64:| Launch | Probe duration | Samples | Window timeouts | Longest estimated hang |
| --- | ---: | ---: | ---: | ---: |
| Normal | 30.18 s | 110 | 70 | 13.3 s |
| With workaround | 30.21 s | 116 | 0 | 0 s |
The hook was also instrumented locally, and the real Electron main process confirmed that
WLDeviceDiscovery.findWLDevices()had been patched before the second measurement.Important caveats
NODE_OPTIONS=--requireexecutes JavaScript inside the application process. Only use a hook whose contents you have inspected. The complete hook is shown below.1. Save this as
disable-codex-micro-hook.cjs2. Save this beside it as
Start-Codex-Without-Micro.ps13. Launch it
First quit Codex completely, including its system-tray process. Then run:
The launcher sets both variables only in its own process environment; the started Codex process inherits them, while the caller's environment is restored immediately afterward.
Resolution update — 2026-07-20, package
OpenAI.Codex_26.715.7063.0_x64On the same Windows 11 machine, with the same USB/HID devices connected, I repeated the test using a normal Explorer launch with no No-Micro workaround:
ChatGPT.exeAppHang eventThe new Windows build still ships the nested Work Louder
node-hid/build/Release/HID.node, but it was not loaded into the normal-launch main process during this test. Instead, the process loadedresources/native/hid-topology-watcher.node, and the Windowscodex-micro-servicepath now callsfindCodexMicroInterfaces(). The previous broadnode-hid.devices()path was not used.This is consistent with an app-side fix for the blocking HID-enumeration path. I can confirm the issue is resolved on this machine in
26.715.7063.0; cross-machine confirmation is still appropriate before the issue itself is closed.---
Historical A/B evidence from package
26.715.3651.0I repeated a controlled local A/B test on the same machine and thread. The sampler ran every 100 ms and recorded only window-hung state, process counters, microphone capability start/stop timestamps, and foreground mouse-click timestamps. It did not record audio, transcription text, prompts, or window titles.
A — normal launch (5 minutes)
B — same build with a local unsupported No-Micro startup hook (5 minutes)
The hook only stubs
@worklouder/device-kit-oaias “no device found.”The issue author has already captured an ETW/WPR blocking stack through
HID.node -> hid.dll!HidD_GetManufacturerString -> DeviceIoControl -> HIDCLASS.SYS/hidusb.sys, so the native blocking path is documented in this issue. I have not collected a second ETW trace on my machine and therefore cannot independently prove that my machine entered the identical native stack. However, the same-build A/B result is consistent with that documented root cause and independently shows that disabling only Work Louder/Codex Micro discovery removes the hangs while voice input remains functional.That package shipped both the Work Louder
node-hid\build\Release\HID.nodecomponent and the serialportbindings.nodecomponent. The existing ETW evidence implicated the HID enumeration path; I did not attribute that hang to serialport.Version 26.715.31925 still has the issue.
Version 26.715.4045.0 has the issue also.
May help someone: I have been having the same problem after hours of pulling my hair out it turned out to be my K55 corsair keyboard causing the issues. I unplugged it an plugged in a wireless keyboard and no hang or crash in 2 hours (this only started happening after the latest update for me)
I can confirm that switching the keyboard from a USB 3.0 port to a USB 2.0 port helped; I have a standard Chinese USB keyboard.
It was connected via a USB 3.0 hub. I plugged it directly into the PC (USB 2.0), and the problem went away completely.
Confirming this on Windows 10 (issue reports Win 11) with a different
26.715 build, and adding a thread-level detail that may narrow the cause.
Environment
OpenAI.Codex_26.715.3651.0_x64__2p2nqsd0c76g0Same regression window: zero freezes across 15 logged sessions
2026-07-05 → 2026-07-16; freezes began 2026-07-17, immediately after
26.715.21425 installed on 2026-07-16 20:42 local. Matches your
"first AppHangTransient 2026-07-16 22:56:04".
Same cycle, longer period. Mine is ~65–70s frozen / few seconds responsive,
vs your 15s/10s — so the period varies by machine but the pattern is identical.
Sampled every 10s on one launch (PID 25624):
The detail I think matters: it isn't just "blocked/sleeping" — the UI thread
is specifically suspended, and it's the only one. Enumerating all 56
threads of the hung
ChatGPT.exewhile frozen:ThreadState=Wait,WaitReason=SuspendedUserRequest/EventPairLowwaitsnot deadlocked, not busy
A lock/deadlock shows as a blocking wait, not a suspend. Windows PLM/lifecycle
freeze would suspend every thread and show "Suspended" in Task Manager, not
"Not Responding". One surgically-suspended UI thread suggests something
in-process calling
SuspendThreadon it — possibly a hang-watcher, profiler,or telemetry sampler. Native modules loaded in the process:
windows-updater.node,windows-account.node,HID.node(@worklouder/device-kit-oai), plus Sentry.
Also ruled out on my machine: memory pressure (5+ GB free), third-party AV
(Defender only), WerFault (idle, no crash dumps, no Crashpad reports, no Event
Viewer entries for the app), GPU, port conflicts. Reinstall, app-data clear,
and the Background-apps permission toggle made no difference.
Backend is unaffected — the Rust
codex.exeapp-server keeps servingJSON-RPC and logging normally the entire time the UI is parked. The Electron UI
log stops mid-stream; when suspension hits early enough in startup the UI log
is 0 bytes.
Happy to capture a minidump mid-freeze if that would help identify the
suspending caller.
Table dropped from my comment above — here's the sampled cycle:
time responding mainThread mainCPU procCPU
16:06:23 False Suspended 7.20 11.61
16:06:33 False Suspended 7.20 11.61 <- 0 CPU in 10s
16:06:43 True Running 7.64 13.09
16:06:53 False Suspended 11.09 17.44
16:07:58 False Suspended 11.09 17.70 <- ~65s parked, 0 CPU
16:08:08 True Running 14.97 22.20
16:08:21 True Running 20.08 30.19 <- near-pegged once released
mainCPU frozen at a constant value across each parked stretch is the key part —
the thread isn't slow, it's stopped.
tried to use claude code to fix, this is what it gave me.
Root-caused this on my machine (26.715.4045.0, Win11 26200), it's synchronous HID device I/O on the browser-process UI thread.
Minidump of the window-owning thread during a hang:
ntdll!ZwDeviceIoControlFile
KernelBase!DeviceIoControl
hid.dll!HidD_SetFeature / HidD_GetProductString / HidD_GetSerialNumberString
HID.node (node-hid, bundled via app.asar.unpacked\node_modules\@worklouder\device-kit-oai\...\wl-device-kit\...\node-hid)
chrome.dll ...
user32!CallWindowProcW
The device-kit probes every HID interface with blocking HidD_* calls inside window-message dispatch, with no timeout. Any HID device that answers control-pipe requests slowly (or not at all) blocks the UI thread for the duration — CPU stays flat, WCT shows no deadlock cycle, and the hang repeats on every device-change event or probe cycle, which produces the periodic hang/responsive pattern reported here.
In my case the trigger was a USB keyboard (Corsair K63) whose HID interfaces had stopped servicing control requests entirely (typing still worked, so nothing looked wrong). Timing HidD_GetProductString per HID interface found it instantly: every interface of that device blocked >10s while all others answered in ~10-40ms. Unplugging/replugging the device cleared the hangs completely.
Suggested fix: run HID enumeration/probing off the UI thread and/or add timeouts. Same code ships in the ChatGPT desktop app.
I can confirm that unplugging the keyboard while Codex is unresponsive and reconnecting it to a different USB port only solves the issue temporarily; the responsiveness-unresponsiveness cycle quickly starts again.
Same here, replugging only bought minutes. That's the pinpoint: a replug fires a device-arrival event, and the device-kit re-enumerates HID on every such event, on the UI thread, with blocking HidD_* calls. Reconnecting the keyboard immediately re-runs the probe cycle that stalls the device, so the hang cycle resumes.
The loop: device-change event, then @worklouder/device-kit-oai (bundled node-hid) enumerates synchronously on the UI thread, then a DeviceIoControl blocks on the slow HID interface and the window freezes until it completes. The fix has to be in code: probe off the UI thread, with timeouts.
Culprit device identified and workaround confirmed: JBL Pebbles USB speakers (VID_05FC PID_0231) — consumer-control HID interface times out at exactly ~5 s on the manufacturer-string request
Same regression on OpenAI.Codex_XX, Windows 11. Symptoms matched this thread: a guaranteed freeze at every startup plus a periodic hang cycle even when fully idle. During each hang, dragging the Codex window halted while the composer caret kept blinking (main/browser process stalled, renderer alive), and input was affected system-wide (cursor moved, clicks dead everywhere).
Ruled out first: clean reinstall + full .codex deletion, IME (same with ENG-US layout), GPU/VRAM contention, non-ASCII profile path. Unplugging a Stream Deck made no difference.
Then I probed every HID interface on the system directly with timed HidD_GetManufacturerString / HidD_GetProductString / HidD_GetSerialNumberString calls. Every interface answered in 0–110 ms except one:
HID\VID_05FC&PID_0231&MI_04 (JBL Pebbles USB speakers — consumer-control interface for the volume dial)
Manufacturer string: 5014 ms Product: 12 ms Serial: 10 ms
The device simply never answers the manufacturer-string request and the call runs into the ~5-second USB control-transfer timeout — matching the ~5 s hang episodes measured earlier in this thread. The speakers otherwise work perfectly and have for years; the firmware just doesn't implement that one request.
Workaround (confirmed): disabling only that HID interface —
powershellGet-PnpDevice | ? { $_.InstanceId -like "VID_05FC&PID_0231&MI_04" } | Disable-PnpDevice -Confirm:$false
— eliminates all freezes completely, including the startup hang and the system-wide input lockups. Audio is unaffected (only the hardware volume dial loses its Windows integration).
This is a concrete reproduction of the diagnosis above: one slow/non-answering HID device × synchronous HidD_* string requests on the UI thread × no timeout = a 5-second UI freeze on every enumeration pass. Probing off the UI thread with per-call timeouts would make this entire class of device harmless. Happy to run an instrumented build against this device if useful.
Adding to this, hoping to get a fix completed sooner.
I am experiencing the same regression after upgrading to the newest Windows app.
Symptoms:
Troubleshooting attempted:
None resolved the issue.
Codex CLI 0.144.6 works normally, so the failure appears isolated to the Windows desktop UI.
I hit the same hang cycle on 26.715 (Windows 11 26200, Codex 26.715.4045.0) and managed to root-cause it on my machine. TL;DR: the main Electron thread synchronously enumerates HID devices via node-hid, and a single misbehaving HID device turns each string-descriptor query into a ~5 s driver-timeout wait — producing exactly the 15–30 s "Not Responding" cycles described above.
Evidence
I captured a full minidump of the main
ChatGPT.exeprocess (non-invasivecdb -pvattach) during the hang cycle. Thread 0 — the native UI thread that WCT reports as Blocked — was here:So the app is running node-hid enumeration (which reads manufacturer/product/serial string descriptors per HID collection) on the UI thread, and
HidD_Get*Stringhas no timeout — it blocks until the device's driver gives up.The offending device (on my system)
A FIFINE K670 USB microphone (
USB\VID_3142&PID_0001) had gotten into a wedged state (its audio interface reported Code 10 "device cannot start"). Its HID interface exposes 2 collections, and every string query against either collection blocked for 5,009 ms before failing, while the other 22 HID interfaces on the system answered in under 40 ms. Two collections × three string queries × 5 s per enumeration pass matches the observed freeze length; the app re-enumerates periodically, which produces the freeze/recover cycle.After unplugging that device: zero
AppHangTransientevents since, app fully responsive. Replugging (power-cycling the device) also clears the wedged state.Script to find your offending device
For anyone else hitting this: the PowerShell script below probes every HID interface with the same string queries node-hid makes and times them. Healthy devices answer in milliseconds; the culprit blocks for seconds. It prints each device path before touching it, so even a device that hangs forever is identified by the last printed line. Read-only (opens devices with access mask 0), no elevation needed.
<details>
<summary><code>Find-SlowHidDevice.ps1</code></summary>
</details>
Suggested app-side fix
The device was the trigger, but the regression is in the app: 26.707 didn't freeze with the same device attached. HID enumeration (and especially the per-device string-descriptor reads) should run off the main thread — or skip string queries entirely during enumerate — since any flaky/wedged HID device on the user's system otherwise stalls the whole UI with no timeout.
Hope this helps narrow it down — happy to provide the full dump analysis output if useful.
Additional confirmed reproduction on a newer Windows Store package.
Environment:
OpenAI.Codex_26.715.4045.0_x64__2p2nqsd0c76g0150.0.7871.12426.715.31925Observed on 2026-07-20 JST:
Responding=Falseon an approximately 15-second cadence.Important A/B result:
Responding=False.Troubleshooting with no improvement:
logs_2.sqlitediagnostic DB.conversationDetailModefromSTEPS_COMMANDStoSTEPS_PROSEfor an A/B test, then restored it.This confirms that the issue is still present in package
26.715.4045.0, not only26.715.2305.0. I can provide a sanitized response-transition timeline or run a targeted collector if maintainers need another data point.Root cause confirmed on my machine: the offending HID device is a HyperX SoloCast microphone (
VID_03F0&PID_0B8B).Read-only per-interface timing before disconnect:
MI_02 / COL01: manufacturer 4,994–5,005 ms; product 5,000–5,016 msMI_02 / COL02: manufacturer 5,009–5,011 ms; product 5,015–5,017 msThe SoloCast audio interface is
MI_00; the slow paths are the separate control HID interfaceMI_02, which exposes consumer-control and vendor-defined collections.After physically disconnecting the HyperX SoloCast:
Responding=Falsetransitions, whereas the connected-device baseline reliably alternated approximately every 15 seconds.This confirms the app regression is synchronous HID string-descriptor probing on the Electron main thread. A normally functioning USB audio device with slow/unsupported HID descriptor responses can freeze the entire Codex UI periodically. I will also test whether a physical unplug/replug resets the SoloCast HID behavior or whether disabling only
MI_02is required.Follow-up with a confirmed recovery condition on Windows Codex 26.715.4045.0:
VID_03F0&PID_0B8B,MI_02,COL01/COL02) took about 5 seconds for each Manufacturer/Product string query.Responding=False: 0).So a physical USB power-cycle cleared the wedged device state in this instance. The app-side regression/risk remains: synchronous enumeration/string reads of unrelated HID devices can still block the Windows UI for many seconds if a device or driver stalls. A timeout, async enumeration, or filtering to known Codex Micro VID/PID devices would prevent recurrence.
Confirming that I am no longer experiencing this issue in Version 26.715.52143
Confirmed fixed in internal version 26.715.52143
I inspected the updated Windows package and repeated the responsiveness test without the temporary
NODE_OPTIONSworkaround. The fix is present, so I am closing this issue as resolved.Exact version mapping
OpenAI.Codex_26.715.7063.0_x64app.asar/package.json:26.715.52143Implementation change
The old Windows discovery path ran in the Electron main process:
If no Codex Micro was found, it repeated that synchronous scan every 10 seconds.
In internal version
26.715.52143, the Windows path no longer callsfindWLDevices()/nodeHID.devices()for discovery.CodexMicroServicenow awaits a dedicated native operation:The new
hid-topology-watcher.nodeaddon:napi_create_async_workandnapi_queue_async_work;CM_Register_Notificationfor event-driven topology changes;CM_Get_Device_Interface_ListW;HidD_GetManufacturerString,HidD_GetProductString, orHidD_GetSerialNumberString, which were the calls observed blocking for approximately five seconds.The fixed ten-second blind discovery loop is gone. Normal discovery is topology-event driven. A 30-second fallback scan exists only if watcher creation fails, and topology settle retries after an actual change are bounded to 250 ms, 1 s, and 3 s.
For Linux, the new implementation uses
nodeHID.devicesAsync(VID, PID).Runtime verification
Passive probe of the normally launched, unmodified app:
| Internal version | Duration | Samples | Window timeouts | Longest estimated hang |
| --- | ---: | ---: | ---: | ---: |
| 26.715.2305 | 30.18 s | 110 | 70 | 13.3 s |
| 26.715.52143 | 30.20 s | 115 | 0 | 0 s |
This agrees with the independent user confirmation above. The temporary workaround is no longer required on this version.