Codex desktop (Windows): follow-up messages in existing threads never send
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.4k
- PR merge metrics
- PR metrics pending
Description
What version of the Codex App are you using (From “About Codex” dialog)?
26.908.40834
What subscription do you have?
Pro
What platform is your computer?
Windows 11 Home, build 26200 (x64); the machine is behind a TLS-inspecting proxy, but the proxy is not involved
What issue are you seeing?
Symptoms
- A new chat's first message sends normally. Every later message in that thread, and any message in an existing thread, spins forever. The text stays in the composer.
- No request reaches the app-server. The desktop logs show no
turn/start,turn/steerorthread/queue/add, and no error. - Sending to the same thread from the ChatGPT mobile app (remote control) works.
- Sending through the in-app
send_message_to_threadtool also works. - None of these helped: restarting the app, re-login, clearing the Electron
Cache,Code CacheandGPUCache, switchingfollowUpQueueModebetween queue and steer, changing the model or permission mode, or using a different project folder.
Root cause analysis (runtime evidence)
The app was launched inside its package with --remote-debugging-port bound to 127.0.0.1. Non-pausing logpoints were set in webview/assets/app-primary-17b54400f32a.js and app-initial-d9bed9d614d8.js. The minified names below are from this build.
-
The composer submit gate parks the message. At the start of
Evr's submit handler the state was{submitDisabled:false, submitting:false, submitBlockReason:"loading-local-config"}.yvr.queueSubmitthen queued it withisLocalConfigPending:true. None of the later steps ran (cvr, the turn coordinator,turn/start). -
Why
isLocalConfigPendingis true.Ygr()ends withcomposerMode==='local' && (localWorkspaceMaterialization==='loading' || …). The submit block context was:agentMode: guardian-approvals, isAgentModeLoading: false, isAgentModePending: false, windowsSandboxRequirement: null, isWindowsSandboxRequirementPending: false, localWorkspaceMaterialization: "loading", composerMode: "local", roots: ["D:\\Claude\\Kova"]Every other input was ready. The
config/read, host and cwd data used bypvr()were all cached. -
Why materialization is
loading. TheD8query options (managed-worktree-state) readTC = ["vscode","codex-home",{hostId}]. BecauseTChas no data and no error,D8returns a disabled query keyedcodex-home-loading.aQothen maps "no data" to"loading"indefinitely. Live query cache:["vscode","codex-home","{\"hostId\":\"local\"}"] status=pending fetchStatus=fetching fetchFailureCount=0 error=null ["vscode","codex-home"] status=pending fetchStatus=fetching fetchFailureCount=0 error=null ["git","local","managed-worktree-state","codex-home-loading","D:\\Claude\\Kova"] status=pending fetchStatus=idle -
The startup
codex-homerequest is never answered.- The renderer fetch client (
sS.getInstance(), thevscode://codex/*bridge) still held 11 unresolved entries inpendingRequestsabout 30 minutes after launch. - The main process logged
[electron-fetch-handler] codex-home requestonly during startup (six lines between +1.1 s and +14 s). - A fresh
post('vscode://codex/codex-home', {"hostId":"local"})from the same renderer returned in 2 ms with{"codexHome":"C:\\Users\\User\\.codex","worktreesSegment":"C:\\Users\\User\\.codex\\worktrees"}. The main handler (readCodexHomePaths) itself works; only the startup requests are lost.
- The renderer fetch client (
-
Why it never recovers. TanStack Query's
Query.fetchreuses the in-flight retryer whenstate.data === undefined, even withcancelRefetch: true. Invalidation and refetch therefore keep waiting on the lost promise. There is no timeout on the bridge request. -
Confirmation. Running
queryClient.cancelQueries({predicate: codex-home})and thenrefetchQueries(...)turned both queries tosuccess.D8switched to["git","local","managed-worktree-state","available",...], and the next desktop submit in an existing thread sentturn/startsuccessfully (2026-09-12T15:48:34Z, conversation01a0959a-…). This was the first one since 2026-09-11 16:18.
Startup timing correlation (not proven causal)
Times are milliseconds after Launching app:
| Launch | Result | First codex-home requests |
First query-cache-invalidate broadcast |
|---|---|---|---|
| 2026-09-09 | works | +3537, +3542 | none in the first 40 s |
| 2026-09-11 14:01 (d61b04e1) | works | +8872, +8905 | +23185 (after avatar overlay loaded) |
| 2026-09-11 16:35 (bbafcf82) | fails | +5219, +5237 | +8568 |
| 2026-09-12 21:15 (430813af) | fails | +2565, +2573 | +2893 |
| 2026-09-12 23:13 (4c766004) | fails | +2395, +2407 | +3389 |
In every failing launch, an IPC query-cache-invalidate broadcast arrives about 1 s after the main window's first codex-home requests. It shows up in the main log as [IpcClient] Received broadcast but no handler is configured method=query-cache-invalidate. In the working launches it arrives much later or not at all during startup. This may be how responses get lost or mis-routed, but it has not been proven.
Ruled out
- App-server: healthy. One
codex.exe, fast responses, no queued items, SQLitequick_checkok. - Stream ownership and resume: the thread was
resumedand this window was theowner. - Other submit gates: the goals feature (no goals), Windows sandbox readiness, and agent-mode or model-settings loading were all ready.
- Remote-workspace gate: it would show a dialog, not a spinner.
- Thread
cwd: the\\?\prefix and the specific project folder make no difference. - Machine environment: WSL (healthy), proxy or TLS, stale helper processes, OS updates.
What steps can reproduce the bug?
Feedback ID: 01a0959a-8824-7282-9ac2-59173f451f2d
What is the expected behavior?
Able to submit prompt to the previous session.
Additional information
Suggested fixes
- Add a timeout and retry to
vscode://codex/*bridge requests, or reject pending requests on any window or IPC reset. Unanswered bridge requests should never hang forever. - For
codex-home, handle a stuck initial fetch with no data: cancel it, then refetch, instead of relying oncancelRefetch. - Do not block the composer indefinitely when
localWorkspaceMaterializationisloading. Fail open or show an actionable error after a timeout. - Log bridge requests that stay pending longer than N seconds, with their URL, so this is visible in the desktop logs.
Workaround in use
Launch Codex with --remote-debugging-port=<port> via Invoke-CommandInDesktopPackage, then cancel and refetch the stuck codex-home queries through DevTools. This lasts only for that app session.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by inspecting webview/assets/app-primary-17b54400f32a.js and app-initial-d9bed9d614d8.js around the composer submit gate, codex-home bridge requests, and managed-worktree-state query. Reproduce the stuck pending request on Windows, then verify that an existing thread can submit a follow-up after the request recovers or fails visibly instead of spinning indefinitely.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- electron, javascript
- Domain
- desktop
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100