Repository navigation
[Windows Desktop] Existing Local Work chats have Send disabled while new Work chats can send #46763
Description
Summary
Existing Local Work chats in the ChatGPT Windows desktop app can no longer submit messages.
Text can be entered into the composer, but the Send button remains disabled.
A newly created Local Work chat can send messages normally.
This appears to affect restoration/initialization of existing Local Work chats rather than Local Work globally.
Environment
- ChatGPT Windows desktop app: 26.915.4065.0
- Windows 10 Pro 22H2
- OS Build: 19045.4651
- Agent environment: Windows native
- Integrated terminal shell: PowerShell
- WSL: Not currently available (
wslcommand is not recognized)
Reproduction / A-B test
Existing Local Work chats
- Open an existing Local Work chat.
- Enter text in the composer.
- Send remains disabled.
- Three-dot menu continuously shows "Loading scheduled tasks..."
Ctrl + backtickdoes not open the integrated terminal.- Opening/interacting with the affected Work chat does not create or modify a transcript under
.codex\sessions.
Result: Cannot submit any message.
Brand-new Local Work chat
- Create a new Local Work chat.
- Enter and send a message.
Result: Sending works normally.
However:
- "Loading scheduled tasks..." still loops indefinitely.
Ctrl + backtickstill does not open the integrated terminal.
Because scheduled tasks also remain stuck in the new Work chat while Send works, the scheduled-task loading loop does not appear to be sufficient by itself to cause the disabled Send button.
Diagnostics already performed
-
Fully quit and restarted the desktop app
-
Confirmed app is up to date
-
Signed out and back in
-
Windows app Repair
-
Windows app Reset
-
Checked for approval prompts: none
-
Renamed/recreated
.codex\thread-writer-locks: no change -
Tested Windows sandbox with:
sandbox = "elevated"sandbox = "unelevated"
Same behavior in both modes.
-
Codex itself works normally in the same desktop app.
-
Regular ChatGPT web works normally.
-
Windows PowerShell can execute commands such as
git statusandpwdnormally.
Logs / session behavior
When reproducing the issue in an affected existing Work chat:
- No new session transcript is created or modified under:
%USERPROFILE%\.codex\sessions - No current sandbox log is generated/updated under:
%USERPROFILE%\.codex\.sandbox
The latest available sandbox log predates the current failure.
Diagnostic ID
Feedback was submitted through the working Codex interface because the affected Work composer cannot submit / feedback.
Diagnostic/session ID:
no-active-thread-01a0bcc0-39ac-70f3-a356-9881514543b7
Expected behavior
Existing Local Work chats should initialize normally and allow messages to be submitted, just like newly created Local Work chats.
Ideally, there should also be a supported recovery path for an existing Local Work chat if its thread/session state cannot be restored.
Additional note
I have preserved the existing affected Work chats and .codex data and have not deleted the session history.
Activity
github-actions commentedon Sep 20, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
HovikChan commentedon Sep 20, 2026
Update: I can now reproduce the exact pattern described in #45719. A brand-new Local Work thread can send its first turn successfully, but subsequent turns from the same thread cannot be submitted from Desktop. The same thread remains resumable and writable through Codex CLI.
TR2293814813 commentedon Sep 20, 2026
Windows Desktop 26.915.4065.0 (bundled CLI 0.155.0-alpha.9.2): sending a message creates a thread and holds its writer lock, but no rollout is written and the turn never dispatches
Environment
Observed behaviour
%USERPROFILE%\.codex\thread-writer-locks\<thread-id>.lock.%USERPROFILE%\.codex\sessions\for that turn.Control: same binary, same CODEX_HOME, same config.toml, same endpoint
codex.exe exec --skip-git-repo-check(andexec resume <thread-id>) succeeds every single time, and the configured endpoint receives the request.codex.exe exec resume <thread-id>fails only while the Desktop app holds that thread, with:thread-store conflict: thread <id> already has an active writer (code -32600)Lock semantics verified directly
<thread-id>.lockis held, any writer attempt fails:failed to open thread writer lock ... (os error 32).Also observed (may be unrelated, but correlated on this build)
error [AppServerConnection] Codex CLI process exited classifiedAsExpected=false code=4294967295 signal=null transport=stdiofollowed byfatal_error_broadcasted, after which the renderer stays in a failed/reconnecting state even though the app-server is respawned.codex_sandbox_offline_block_loopback_tcp, LocalUser=CodexSandboxOffline), while%USERPROFILE%\.codex\.sandbox\setup_marker.jsonhas"proxy_ports": [], socodex_sandbox_offline_allow_loopback_proxyis never created.Expected
Related: #37403, #37450, #46763, #44449, #38150
jesusangelurieta-cell commentedon Sep 20, 2026
I am experiencing the same issue on the ChatGPT Windows Desktop app with Local Work.
A new Work conversation can run the first turn successfully, but follow-up messages in the same conversation often cannot be submitted. Creating a new Work conversation allows me to continue temporarily.
My local Codex logs repeatedly show:
Received turn/started for unknown conversation
Received turn/completed for unknown conversation
OpenAI Support reviewed my description and advised me to report this in the Codex GitHub repository. I have preserved the original .codex session data.
I have a sanitized diagnostic file containing only timestamps and these unknown conversation messages, with conversation IDs and other private content removed.
Codex-error-unknown-conversation.txt
TR2293814813 commentedon Sep 20, 2026
Thanks for the sanitized log — it matches what I captured locally on the same build, and it points at the actual defect.
Your 21 lines are all
Received turn/started/completed for unknown conversation. I have the same signature in my own desktop log, with the conversation id intact:That line is the crux: the app-server broadcasts turn lifecycle events for a conversation the renderer does not have registered. Because the two sides disagree on conversation identity, the turn is never adopted by the writer path, so:
%USERPROFILE%\.codex\sessions\for that turn;%USERPROFILE%\.codex\thread-writer-locks\<thread-id>.lockstays held for the lifetime of the app process;Two control experiments that isolate this from networking or configuration, on the same machine, same
CODEX_HOME, sameconfig.toml:codex.exe exec --skip-git-repo-check(andexec resume <thread-id>) succeeds every time, and the endpoint does receive the request.thread-store conflict: thread <id> already has an active writer (code -32600). The lock is held by the app's own app-server: an exclusive open of<thread-id>.lockfails while it runs, and succeeds the moment the app is fully quit.Two details that may help maintainers narrow it down further:
codex app-serverchild is not a fix: the parent respawns it and the new child re-acquires the same writer lock. Only a full app quit releases it.codex_sandbox_offline_block_loopback_tcpforLocalUser=CodexSandboxOffline(RemoteAddress 127.0.0.0/8) while%USERPROFILE%\.codex\.sandbox\setup_marker.jsonhas"proxy_ports": [], so the documented "(Except Proxy)" exceptioncodex_sandbox_offline_allow_loopback_proxyis never created.Requested improvements, on top of a fix for the identity mismatch: include owner/lease information in the
-32600conflict (surface, pid, acquisition time), and expose an explicit release/handoff (thread/release,thread/unload) instead of relying on a full app quit.Related: #37403, #37450, #44449, #38150.