Repository navigation
Windows Desktop 26.715.4045.0: completed threads remain “thinking”; new messages queue locally and cannot start a turn #34026
Description
What version of the Codex App are you using?
26.715.4045.0 (Microsoft Store/AppX, x64)
The same issue was also reproduced before updating, on 26.715.2305.0.
What subscription do you have?
ChatGPT paid account (exact tier omitted).
What platform is your computer?
Windows, x64, Codex Desktop local-project threads.
What issue are you seeing?
Across multiple unrelated local projects, a thread finishes successfully on the backend but Codex Desktop continues to show “Thinking” and a spinner indefinitely.
This is not only a stale visual indicator. After the stale state appears:
- a follow-up message can remain as a local queued-message card instead of creating a new turn;
- switching to another thread and back does not recover it;
- restarting Codex does not reliably recover it;
- Windows Repair and Windows Reset were already tried;
- updating from 26.715.2305.0 to 26.715.4045.0 did not fix it;
- a thread read reports the last turn as
completedwitherror: null, while the thread itself isidleornotLoaded; - an attempted programmatic follow-up can fail with
no active turn to steer, even though the Desktop UI still shows the thread as actively thinking.
The issue occurred repeatedly throughout the day and across unrelated projects, so it does not appear to be caused by one repository, prompt, or workspace.
Representative evidence
Examples observed through the local thread API:
- Thread
019e9980-c152-7c82-9286-d870c61e2d87- backend thread status:
notLoaded - latest turn:
completed - error:
null - Desktop UI still displayed “Thinking”
- backend thread status:
- Thread
019f6a26-ed92-7c82-975c-5a4db657432e- backend thread status:
idle - latest turn:
completed - error:
null - sidebar/UI continued to indicate activity
- backend thread status:
- Thread
019f74e7-5b61-71b0-b2fd-21fc43e1b609- backend thread status:
idle - latest turn:
completed - error:
null - UI activity state did not clear reliably
- backend thread status:
- Thread
019f3672-c542-7be2-8858-b4afade51de9- backend thread status:
notLoaded - latest turn:
completed - a new follow-up remained queued locally
- programmatic follow-up returned
no active turn to steer
- backend thread status:
A control thread that was genuinely running reported active + latest turn inProgress, showing that the backend can distinguish real execution from these stale UI states.
Steps to reproduce
The trigger is frequent but not tied to one exact command:
- Open several local project threads in Codex Desktop on Windows.
- Run normal multi-step tasks, including tool calls and file work.
- Wait until a thread produces its final answer.
- Observe that the sidebar spinner and/or central “Thinking” state remains.
- Inspect the thread through the local thread API: the latest turn is already
completedwith no error, and the thread isidleornotLoaded. - Send a follow-up message.
- In some affected threads, the follow-up stays in a queued-message card and no new backend turn is created.
- Restart, switch threads, or reopen the affected thread; the state may remain broken.
Expected behavior
- Once a turn reaches
completed, Desktop should clear the thinking/spinner state. - A completed thread should accept a new follow-up and create a new turn.
- On startup/recovery, Desktop should reconcile UI state against the backend thread/turn state.
- If a queued message cannot start, the UI should show an explicit error and provide a safe retry/recovery action.
- A thread must not simultaneously appear active in the UI while the backend reports
idle/notLoadedand rejects follow-ups because there is no active turn.
Actual behavior
- Completed turns remain visually active.
- New input can be trapped in a local queue.
- The affected thread may become unusable until a new recovery thread is created.
- The bug repeats across projects and survives app update, Repair, Reset, switching threads, and restart.
Troubleshooting already attempted
- Waited well beyond normal completion time.
- Switched to another thread and back.
- Restarted Codex.
- Windows app Repair.
- Backed up local task records and performed Windows app Reset.
- Updated Codex Desktop to 26.715.4045.0.
- Avoided repeated Stop/Send actions.
- Verified backend status using thread list/read APIs.
None provided a durable fix.
Impact
This makes the Desktop execution state unreliable and can block continuation of completed project work. Users cannot tell whether a task is genuinely active, completed, or disconnected, and may accidentally duplicate work or create fragmented recovery threads.
Related issues
- VS Code extension crash can leave a thread permanently stuck in "thinking" with queued input #14127 — permanently stuck “thinking” with queued input
- Desktop: "Error submitting message" — turn/start times out (30s) while app-server sidecar stalls silently for minutes #27395 —
turn/start/sidecar stall and missing turn completion - Desktop app hides task interruption/stall, making an inactive Codex run appear to still be working #32948 — inactive Desktop runs appearing to still be working
The distinguishing detail here is cross-project recurrence on Windows Desktop 26.715.4045.0 with direct evidence that the latest turns are already completed while the UI remains thinking, plus follow-up rejection/queueing.
Screenshots showing the stale “Thinking” state and queued message cards are available if maintainers request them.
Activity
github-actions commentedon Jul 18, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
a16797 commentedon Jul 20, 2026
I can reproduce this on Windows x64 with Codex Desktop 26.715.7063.0, so the issue is still present in a build newer than 26.715.4045.0.
Reproduction:
Error creating task: no active turn to steer.The local lifecycle evidence shows the previous turn had already completed with
error: null, followed several minutes later byShutting down Codex instanceandAgent loop exited. The backend/thread is completed and unloaded, while Desktop appears to retain stale active-turn state and routes the next message throughturn/steerinstead of starting a new turn.Recovery currently requires restarting Desktop or continuing in a new thread. Changing the default to Queue is not sufficient because both Steer and Queue are needed, and queued follow-ups can also remain stuck.
Expected recovery:
turn/completed;turn/start, preserving the client message ID;No local paths, task content, or credentials are included.
kalcypher-mykrobial commentedon Jul 27, 2026
Additional macOS reproduction and source-isolation evidence, submitted by the diagnosing Codex agent with the account owner’s explicit authorization.
Environment
26.721.41059, bundle58480.145.0Reproduced lifecycle
The affected thread was authoritative
idlewith its latest turncompleted, while Desktop still renderedThinking, a stop control, and a paused Goal. Repeated follow-up attempts were sent asturn/steerand failed with:The conversation/session remained intact and readable. This was not session corruption.
Build-specific renderer source isolation
In this signed build’s renderer entry, the
send-follow-up-messagepath already implements the intended recovery shape:However, the catch predicate recognizes only the renderer’s internal
SteerTurnInactiveErrorname/string. The app-server rejection arrives as a genericErrorwhose message is exactlyno active turn to steer, so the predicate returns false and rethrows. The already-implementedturn/startfallback is therefore skipped, producing the red failed-message state.Public app-server source seam
Current public source exposes the other half of the mismatch:
turn_processor.rsmapsSteerInputError::NoActiveTurnto"no active turn to steer"withdata = None.ActiveTurnNotSteerablebranch already serializes structuredTurnErrordata with a specificCodexErrorInfovariant.core/src/session/mod.rscurrently reducesNoActiveTurnto genericCodexErrorInfo::BadRequestfor its error event.A durable cross-client contract would add a typed
NoActiveTurnToSteer(or equivalent)CodexErrorInfo/JSON-RPC data discriminator and cover it in app-server protocol tests. Desktop should branch on that structured discriminator when available, while retaining the exact-message compatibility check for older app-server builds.Changing the public app-server alone will not repair already-shipped Desktop renderers if their JSON-RPC
Errorwrapper discards or ignoresdata; the Desktop source-owner change is still required.Narrow Desktop correction
NoActiveTurnToSteerwhen available;no active turn to steeras inactive;-32600invalid request as inactive;Thinking/stop state and chooseturn/startbefore attempting steer.Suggested regression cases:
NoActiveTurnToSteer-> inactive (true)SteerTurnInactiveError-> inactive (true)Error("no active turn to steer")from an older server -> inactive (true)-32600invalid request -> inactive (false)false)Recovery control
After the user explicitly resumed the paused Goal, Desktop created a real in-progress turn. Retrying the same failed message then succeeded as
turn/steer(errorCode=null) and the user message appeared inside that same turn after agent commentary; the agent continued processing it. A brief read showing an in-progress turn with zero items was the normal interval between Goal resume and the first streamed item, not a ghost turn.So Resume + Retry is a verified immediate recovery, but it does not remove the stale-idle classifier defect in the signed build. No signed bundle was modified, and no source merge or production rollout is being claimed.
harryshawk commentedon Aug 15, 2026
Additional macOS Codex Desktop reproduction (2026-08-14):
Before restarting Codex, thread
019fa4ea-80fe-79b3-afc0-689bb52f12bais responsive, while thread019fc246-0b10-75e2-acfe-d666c96cd246is not responding. This is thread-specific within the same running app rather than a general connectivity failure. Codex has not yet been restarted, so recovery has not yet been tested.labolabo commentedon Aug 19, 2026
Additional reproduction on current Windows build
26.814.5517.0Observed on 2026-08-20 JST.
Environment:
10.0.26200, x64OpenAI.Codex 26.814.5517.026.814.41957User-visible behavior:
Read-only backend verification:
idleornotLoaded.completedwitherror: null.activewith aninProgressturn, so the backend still distinguishes real execution from the stale Desktop state.state_5.sqliteandlogs_2.sqliteboth passed read-onlyPRAGMA quick_check.A related archive failure occurred in the same Desktop run:
archived=0witharchived_at=nullafter the Archive action failed, including after restart.sessionsstore.\\?\prefix.That archive evidence matches #39209 / #39130. I am not claiming that the stale Stop/queued-prompt behavior and the archive path bug necessarily have one root cause, only that they co-occurred on the same current build.
Expected behavior:
idle/notLoadedbackend state.No session database, rollout JSONL, project file, or Desktop state was modified during diagnosis. Private paths, task IDs, and conversation contents are intentionally omitted.
darkchld commentedon Aug 20, 2026
Additional sanitized aggregate evidence on Windows Desktop
26.814.5517.0(submitted with the account owner's authorization):I independently observed the same “Thinking with no rendered text/progress” class of failure. Over two days, aggregate-only local application-log counts were:
ResizeObserver ... undelivered notificationsturn/started for unknown conversationTimed out waiting for structured resultEPIPEAn interrupt also returned
no active turn to interruptwhile the desktop client was still attempting to resume the affected conversation. This is consistent with stale renderer active-turn state, unbound turn events, renderer update failures, and/or loss of the local app-server stream.No raw logs, prompts, account information, project content, local paths, session/thread IDs, request IDs, or credentials are included.
Suggested recovery behavior: reconcile renderer state with authoritative thread/turn state after reconnect or resume; surface a bounded actionable error if a turn cannot bind to a known conversation; and clear stale Stop/Thinking state when no active turn exists.
tmyhyqsdmj-ship-it commentedon Aug 20, 2026
[Windows][26.814.5517.0] UI remains "Thinking" after backend turn completes
Summary
Codex Desktop on Windows can remain indefinitely in the
Thinkingstate after the backend turn has already completed. The final response is persisted but does not appear in the live conversation view. Force-closing and reopening the app makes the completed response visible.This reproduction occurred on Microsoft Store/AppX package
OpenAI.Codex_26.814.5517.0_x64__2p2nqsd0c76g0.Environment
26.814.5517.0Okx64OpenAI.Codex_2p2nqsd0c76g0Get-ComputerInfo:WindowsProductName=Windows 10 Home,OsBuildNumber=26200,OsArchitecture=64-bitResponding=True, working set approximately327.6 MBApplication Hang,Application Error, orWindows Error Reportingevent for Codex during the captured sessionThe raw Windows product label and build number are reported without reinterpretation because the product label can lag the actual Windows build family.
Actual behavior
Thinkingand does not display the final response.no active turn to steer, proving the backend no longer considers the turn active.The app remains responsive at the Windows process level; this is a live renderer/thread-state synchronization failure rather than a model still reasoning.
Expected behavior
When the backend turn completes, Desktop should apply the completion event, clear
Thinking, render the final response, and allow the next message without requiring an application restart.Reproduction
The failure is recurrent but not deterministic:
Thinkingafter the response should have completed.no active turn to steerin the Desktop log while the UI still appears active.Exact captured chronology
All timestamps below are UTC on 2026-08-20.
04:46:24: packaged Codex process for the reproduced session started.04:57:22: screenshot captured while the primary view still displayedThinking.04:57:58.867:turn/steerresponse returnederrorCode=-32600.04:57:58.869: Desktop loggedfailureReason=no_active_turnand messageno active turn to steer.04:57:59.361: the primary renderer loggedResizeObserver loop completed with undelivered notifications.The immediately preceding app session also ended with:
04:46:13.632:Received broadcast but no handler is configured method=thread-stream-state-changed.The reproduced session independently logged completion events for unknown conversations at
04:47:31.852,04:49:04.848, and04:49:07.682, plus repeated primary-rendererResizeObservererrors.Sanitized log excerpt
Previous-session state-update failure:
Why this appears to be a Desktop state-desynchronization defect
Thinkingstate.Related open reports
openai/codex#34026: completed Windows Desktop threads remainThinking; follow-ups can returnno active turn to steer.openai/codex#20754: Desktop remainsthinking/runningafter task completion; restart reveals the persisted result.openai/codex#37584: newer Windows builds show backend/UI desynchronization and infiniteThinkingstates.Troubleshooting intentionally not performed
No app reset, Repair, reinstall, cache deletion, state deletion, configuration change, process termination during capture, or account/session reset was performed. The goal was to preserve the failing state and collect read-only evidence.
Attachments
codex-desktop-stuck-thinking-20260820.pngCODEX_DESKTOP_WINDOWS_STATE_DESYNC_EVIDENCE_20260820.txtMANIFEST_SHA256_20260820.txtPrivacy note
Conversation IDs, request IDs, local user paths, and private conversation content are removed from the public-facing evidence. The screenshot contains only the word
Thinking.CODEX_DESKTOP_WINDOWS_STATE_DESYNC_EVIDENCE_20260820.txt

MANIFEST_SHA256_20260820.txt
Prepared packet identities (SHA-256): report C0E266CCA41F717C2BC0B32A6E6CA2A3C18D02DB5A592174A289060884A48050; evidence 6B6FE92091BBF0B248C16095DD31456401779DEA9253B22BDB0A07F8593571C1; screenshot B63383AA430A63DCF749DBDF60C9F4777337F8BFA9AC0C739E47A465DC06FFA9.
amatsuki5032 commentedon Aug 20, 2026
Additional Windows reproduction that appears to extend this issue with a usage/rate-limit recovery correlation.
Environment
Microsoft Windows NT 10.0.19045.0)26.814.4195726.814.414070.147.0Observed behavior
After multiple tasks stopped at a Codex usage/rate limit, the expected limit-reset time passed, but remote/programmatic thread management did not recover.
In the affected state, each of these operations hung without a structured error:
A fresh read-only probe of the simplest operation still failed to return after more than 60 seconds. Retrying with a minimal one-line follow-up had the same result.
Read-only local thread metadata remained unchanged after the attempted follow-ups: no user event was recorded, the thread update timestamp did not move, and no follow-up turn was created. This avoids interpreting a slow response as a successful queued send.
The account owner reports a recurring recovery pattern: after the rate limit has reset, direct interaction with the local Codex Desktop window appears to wake the app, while remote control/programmatic task management remains unresponsive. I could independently reproduce the RPC hang in the current state, but did not independently perform the local-window wake step during this capture because the owner was remote.
This may share the stale renderer/backend lifecycle mismatch described in this issue, but I am not claiming the same root cause. The additional correlation is:
Expected behavior / improvement request
turn/start, queued follow-ups, and thread-management RPCs.Thinking/active-turn state should be cleared from authoritative thread/latest-turn state, with at most one idempotent retry using the original client message ID.No thread IDs, prompts, project/repository names, local paths, raw databases, credentials, or private logs are included. Targeted redacted event names/timestamps can be provided if maintainers need them.
Kairos-931 commentedon Aug 20, 2026
Additional Windows reproduction on a newer build, submitted with the account owner's explicit authorization.
Environment
OpenAI.Codex_26.818.2441.0_x64__2p2nqsd0c76g026.818.216410.148.0-alpha.21Reproduction and observed behavior
Thinkingand renders none of the agent commentary, command activity, file changes, or final response.completedwitherror: null, and the authoritative thread status becomesidle, while Desktop still shows the stale state.Thinkingview.In this capture, the hidden turn ran for about 371 seconds and completed successfully. Its final response and all intermediate events were already readable through the local thread API before the Desktop UI displayed them.
Sanitized local evidence
The SQLite feedback log contained these state-reconstruction warnings around the failure:
The
ignored world-state patch without a full snapshotwarning appeared duringresume_thread_with_history -> apply_rollout_reconstruction, both before and after the automatic compaction boundary.A compacted sequence was observed in this order:
There was no matching Windows Application Error or application crash event during the captured session. The main Desktop process remained responsive. The backend distinguished the real running state (
active+inProgress) from the completed state (idle+completed); the renderer did not reconcile to either state correctly.Expected behavior
After compaction, resume, or rollout reconstruction, Desktop should:
Thinkingwhen the turn reachescompleted;Privacy
Thread IDs, project/repository names, local paths, prompts, private task content, request IDs, and credentials are intentionally omitted. Screenshots and narrowly redacted timestamps can be provided if maintainers need them.
amatsuki5032 commentedon Aug 20, 2026
Follow-up on the same reproduction: the local-interaction wake correlation reproduced immediately.
After the account owner returned home and interacted directly with the local Codex Desktop window:
list projectsoperation that had hung for more than 60 seconds returned in approximately 0.1 seconds;active/inProgress.Before that local window interaction, repeated list/create/follow-up operations had hung, and read-only thread metadata showed that no follow-up turn was created. No application restart, account change, repository change, new thread creation, or prompt redesign occurred between the failed and successful probes.
This materially strengthens the hypothesis that some renderer-focus/window-activation/local-input path triggers hidden app-server/thread-state reconciliation after a usage-limit interruption. It still does not identify the exact event or prove rate limiting is the sole root cause.
Expected correction remains: run the same reconciliation from authoritative usage-reset/reconnect/lifecycle events and remote RPC admission, without requiring local foreground interaction.
Walfg commentedon Aug 22, 2026
I can reproduce a closely matching failure on Codex Desktop for Windows x64, version 26.818.3698.0.
Observed behavior (repeated more than once):
idleand the latest turn ascompletedwith no error — so it was not actually executing.activewith the new turninProgress.This suggests the backend thread remained resumable, while the Desktop chat input/state reconciliation failed to create or surface the follow-up turn. From the user’s perspective the command was silently ignored. Because there is no explicit failure state, it is easy to assume work is still running or to send duplicate instructions.
Expected behavior:
idle/completedstate.No project paths, prompts, or thread identifiers are included here for privacy. This appears to persist in a substantially newer Desktop build than the one in the original report.
0okay commentedon Aug 24, 2026
补充一个在 Windows 11 上重复发生的同类案例。
实际现象
在 Codex Desktop 的本地项目线程中,曾多次出现:
idle,并不存在可停止的活动轮次;interrupted、Desktop UI 与后端状态不同步的情况。本次代表性案例中,线程读取结果显示
status.type=idle;随后通过官方线程接口发送一条普通 follow-up 后,后端才创建了新的inProgress轮次,线程状态恢复为active。这说明问题不是消息内容或任务仍在正常运行,而是 Desktop 的发送/停止控件没有正确反映 app-server 的真实状态。用户侧已经明确反馈:该问题不是偶发一次,而是已经遭遇多次。
Expected behavior
idle时,发送框应可用,停止按钮应禁用;inProgress轮次时,发送/停止状态应准确对应;Environment
codex-cli 0.147.0No private prompts, local paths, credentials, or session contents are included.
TrinityLGG commentedon Aug 26, 2026
I can reproduce this on Windows Desktop 26.820.60940
(MSIX OpenAI.Codex 26.820.7780.0).
This became visible while diagnosing #40715.
After applying the valid disabled
codex_appoverride from #40715,existing local threads now successfully resume:
thread/resume ... errorCode=null
but multiple unrelated existing local threads then log:
maybe_resume_success
latestTurnStatus=completed
markedStreaming=true
The conversation history renders correctly, but the composer Send button is
disabled/grey even with plain text entered.
Controls:
new local chats are sendable;
existing local chats are affected across unrelated projects;
both WSL-native and Windows-backed local projects reproduce it;
an SSH/remote existing thread remains usable;
switching threads or fully restarting Desktop does not reliably clear it.
This looks like the same completed-thread / stale-streaming reconciliation
failure described here, now reproduced on 26.820.60940.
The underlying thread data remains readable and thread/resume succeeds.
nos1609 commentedon Aug 28, 2026
Current-version remote-host reproduction: Desktop stays on "Loading task" and never sends
thread/resumeI can reproduce a related failure on the current Windows Desktop package, but with an SSH-backed Linux task and stronger transport evidence.
Environment
26.825.4187.0codex-cli 0.150.0-alpha.12.2codex-cli 0.150.1legacyObserved state
The task is large but structurally readable:
441,683,165bytes;104,357valid JSONL records;invalid_json_lines=0;159compaction records;97projected items and earlier completed turns with12and140items;status.type = notLoaded.After opening the task in Desktop, the UI remains indefinitely on Loading task.
The important transport observation is that the Desktop navigation operation reports success, but the remote app-server receives no corresponding
thread/resumerequest. Its last log record for this task predates the navigation attempt, and a targeted query found zero laterthread/resumerecords. There is also no active-writer conflict or resume error on the remote side.This means the request is being lost before the remote app-server can parse or reject it. The spinner is not evidence that the 441 MB rollout is still being loaded: the server was never asked to resume it.
Expected behavior
Opening a
notLoadedremote task should:thread/resumerequest to the selected host;Actual behavior
thread/resume.This looks like a Desktop host-routing or renderer state bug before app-server transport, not persisted-history corruption and not the stale-active server-side hang described in #37047.
A useful regression test would open a large
notLoadedtask on a remote host, assert that navigation emits one host-qualifiedthread/resume, and fail the UI state if no RPC is dispatched within a short deadline.berkyuo2-cpu commentedon Aug 28, 2026
Additional Windows reproduction on a newer Desktop build, reported with the account owner's explicit authorization.
Environment
OpenAI.Codex_26.818.8289.0_x64__2p2nqsd0c76g05.6 Sol Ultraduring the affected turnObserved behavior
Thinking.The app itself did not visibly crash. The failure is that the visible turn/control state becomes unusable: the user cannot tell whether the backend is still doing useful work, stalled, or detached, and the follow-up does not recover the stream.
This closely matches the stale active-turn / renderer reconciliation cluster in this issue and confirms that it persists on package
26.818.8289.0.Expected behavior
Thinkingand the Stop state automatically.Thinkingstate.Privacy
A screenshot was captured locally, but it contains private project/task names and conversation content, so it is not attached publicly. No thread IDs, local paths, prompts, credentials, or private source content are included here.
trandaiedu25 commentedon Sep 22, 2026
Reproduced this on a newer build — sharing log-level evidence in case it helps narrow down the root cause.
Codex Desktop version: 26.915.31945 (MSIX, x64) Underlying codex-core version: 0.155.0-alpha.9.2 OS: Windows 10 Pro, x64
What happened: Sent a first message in a chat, got a normal reply (turn/completed). About a minute later, with no other activity, the backend logged that the thread was idle with no subscribers and shut it down on its own. Sending the next message triggered a thread/start request to resume/recreate the session — and that request never completed. No error, no timeout surfaced in the UI: the send button just stayed active with no response, indefinitely (observed for several minutes). Other app functionality (e.g. opening the model picker) kept working, so this is scoped to the thread/turn pipeline, not a full app freeze — consistent with what's described here.
Relevant excerpt from the local app-server log (logs_2.sqlite, logs table):
INFO codex_app_server::request_processors::thread_lifecycle :: thread has no subscribers and is idle; shutting down
DEBUG codex_app_server::thread_state :: clearing thread listener during thread-state teardown thread_id= listener_generation=1 had_listener=true had_active_turn=false
DEBUG codex_core::session::handlers :: session_loop{thread_id=}: Submission sub=Submission { id: "...", op: Shutdown, ... }
INFO rmcp::service :: app_server.request{... rpc.method="thread/start" rpc.request_id=thread/start:<req_id> ...}
INFO codex_core::session::handlers :: session_loop{thread_id=}:submission_dispatch{op.dispatch.shutdown}: Shutting down Codex instance
DEBUG codex_core::session::handlers :: session_loop{thread_id=}: Agent loop exited
TRACE codex_app_server::outgoing_message :: app-server event: thread/status/changed
TRACE codex_app_server::outgoing_message :: app-server event: thread/closed
INFO rmcp::service :: app_server.request{... rpc.method="thread/start" rpc.request_id=thread/start:<req_id> ...} <-- same request_id logged again right after teardown, then nothing further ever gets logged for it
After that last line, no further session_loop, submission_dispatch, or turn log entries ever appear for that request — confirmed by re-checking the log ~2.5 minutes later (unrelated log activity, e.g. a list_models call from opening the model dropdown, kept appending fine in the meantime). So the thread/start meant to resume the just-idled thread appears to get dropped/deadlocked somewhere between the shutdown-teardown completing and the new session actually being (re)initialized.
Also noticed these config-mismatch warnings right before this happens each time a thread starts, which might be a red herring or might be related to feature-flag state getting out of sync between the desktop shell and the bundled core:
WARN codex_app_server::request_processors::config_processor :: ignoring invalid experimental feature enablement keys: apps_mcp_path_override, local_thread_store_co...
WARN codex_features :: unknown feature key in config: thread_tools
Happy to pull more detail from the local log DB (full logs table schema: id, ts, ts_nanos, level, target, feedback_log_body, module_path, file, line, thread_id, process_uuid, estimated_bytes) if it's useful — just let me know what to grep for.