Repository navigation
Codex Desktop accepts prompt but UI stays stuck in Thinking; Stop fails and turn can become invisible after restart #24287
Description
What version of the Codex App are you using (From “About Codex” dialog)?
Codex Desktop 26.519.41501 (CFBundleVersion 3044)
What subscription do you have?
ChatGPT Pro
What platform is your computer?
macOS 15.6.1 build 24G90
arm64
Apple M1 Max
64 GB RAM
Local app/runtime details observed from the installed app and local Sentry scope:
Bundle id: com.openai.codex
Electron: 42.1.0
Chrome runtime: 148.0.7778.97
Sentry release: codex@26.519.41501
What issue are you seeing?
Codex Desktop intermittently accepts prompts and continues executing backend work, but the Desktop UI loses reliable active-turn/session state. The visible chat can get stuck in Thinking, stop showing progress traces, show stale or missing turn state, or disagree with other UI surfaces about whether work is active.
I would consider this a major/critical issue, not a cosmetic UI bug, because the Desktop UI is the primary observability and control surface for active Codex execution. If trace visibility, active-turn state, and Stop/cancel state desynchronize, the user loses reliable control over active background work.
Important clarification: I have not observed an app crash, renderer crash, or automatic reload before this happens. The app can remain open. The issue appears to be that the renderer-visible session/turn/trace state becomes detached, stale, frozen, missing, or incompletely rehydrated while backend work may still be running.
The core bug:
- the session/turn appears active or was already visibly active;
- the UI can be stuck on
Thinking; - the prompt bar may show an active turn with the Stop button, or in some
/goalcases may incorrectly show Send while the goal bar still says the goal is actively pursuing; - no new progress traces appear, even while usage may continue decreasing;
- Stop may be unavailable, misleading, or unresponsive;
- the UI does not reliably reflect what the backend is actually doing.
This has happened intermittently for roughly a month. It appears random, but it may be more likely with long-running sessions/threads, trace-heavy turns, subagents/tools, compaction, multi-window use, /goal, or after a relogin/auth flow while the app remains open.
Observed failure modes
1. Prompt accepted, UI stuck in Thinking, Stop fails
Basic pattern:
- I send a prompt.
- The UI stays stuck on
Thinking. - Pressing Stop does not stop the turn.
- I am forced to quit/restart Codex Desktop manually.
- After restart, the thread can look like my prompt was never sent, or it can show later assistant progress without showing the prompt and/or traces that happened while the UI was stuck.
- Because the UI makes it look like the prompt was not accepted, I may resend the prompt.
- Later recovered state proves the original prompt was accepted and the backend/agent had been working the whole time.
- In previous occurrences, trying to recover by resending the prompt or forking the chat has produced errors along the lines of
cannot find session/ missing session.
2. Live trace/progress stream disappears
When this bug happens, it is not only the final assistant message or prompt bubble that can be affected. The live trace/progress stream itself can disappear.
Observed variants:
- stuck
Thinkingwith no traces shown, even though backend work appears to continue; - restart can remove traces that were previously visible;
- for long tasks, the trace stream can randomly reattach later without restart;
- sending a follow-up prompt has sometimes appeared to unstick/reconnect the trace stream.
3. /goal state split and multi-window rehydration failure
This also appears associated with the /goal feature, and the order of events matters.
Corrected repro order from one occurrence:
- I had already started the goal via a prompt in the original window.
- The goal was working normally.
- The original session UI was showing the prompt/goal progress traces normally.
- The prompt box was correctly showing the Stop button, indicating an active turn was running.
- Only after that, I tried opening the same session in a new Codex window.
- In the new window, the session failed to load or did not finish loading the active session state.
- At that point, the already-visible goal/prompt progress traces disappeared in both the new window and the original window.
- Both windows then looked as if the active turn/progress had been lost in the chat/trace area, and the prompt box showed Send instead of Stop. However, the goal bar above the prompt box still showed the goal as actively pursuing, not paused or stopped.
- After waiting some time, all of the traces that had previously been visible spontaneously appeared again, and the prompt box changed back to Stop.
This is different from the UI simply failing to show traces from the beginning. The traces and active Stop state were visible and working first. Opening the same session in a second window appears to have caused the Desktop UI to lose or detach the already-visible active turn/session state across all windows.
The especially strange part is that different parts of the same UI disagreed about whether work was active: the goal bar still showed an active pursuing-goal state, while the chat/trace area lost the active progress and the prompt box reverted to Send. That suggests a session/turn state split between the goal-level active state and the visible turn/trace/input state.
4. Multi-window active-session monitoring can freeze/detach visible progress across sessions
This is especially concerning when trying to monitor multiple active Codex sessions at once. My goal was to open each active session in its own Desktop window so I could watch each one progress, instead of manually switching between sessions inside a single window.
Observed behavior:
- one existing window/session had been showing the active turn's persisted traces/progress correctly;
- after trying to open active sessions in new windows, one of the windows hit the session loading/rehydration issue;
- after that, visible progress across the sessions/windows appeared to become frozen or detached;
- all of the sessions I had opened in new windows stopped showing new traces;
- the backend presumably continued working in the background, but the Desktop UI stopped showing new trace/progress updates;
- this makes the UI unreliable as a monitor for active work, because it can show no progress even while work may still be running.
This may be connected to very long sessions/threads. These sessions are long-running and trace-heavy, and it is starting to look possible that the app is failing to consistently load or rehydrate long session state unless I completely quit and restart the app.
5. Confirmed active backend usage while UI is frozen
This now appears confirmed as active backend execution with a frozen/detached Desktop UI.
Across multiple active sessions:
- the UI shows the sessions as
Thinking; - the prompt box shows the Stop button, indicating an active turn;
- no new progress traces or activity are visible in the app;
- the visible state appears frozen;
- however, my usage dashboard is actively decreasing while this is happening.
That strongly indicates Codex is still executing and using model resources in the background, but the Desktop app is not showing any of the activity, traces, or progress. The issue is not simply that the model stopped or that the turn is idle. The backend appears active while the UI is detached from the running turn state.
Concrete evidence from one occurrence
After restart/recovery, the visible history showed that the original stuck turn had actually continued doing work. It showed status/progress like:
Steered conversation
The previous commit-boundary reviewer handle is not available in this resumed tool session, so there’s no valid approval artifact to consume. A new prompt delta just arrived too; I’m checking it against the already registered EK-DOCS-SYNC delta before I touch any gate state.
Explored 1 file, ran 2 commands
The repeated EK-DOCS-SYNC directive is already represented in the repo-local prompt-delta artifact and successor proof: full docs-state backfill, coverage matrix, canonical docs, and explicit forbidden actions are all present. I’m going to have the commit-boundary reviewer independently verify that duplicate/newest prompt is covered before approving the commit boundary.
Spawned 1 agent
Ran 3 commands
The reviewer is running while I keep my side read-only. One local inspection hit a harmless parsing assumption in VALIDATION.json; I’m not treating that as a repo failure, just as a cue to use the file’s actual schema when refreshing validation later.
The independent commit-boundary gate is approved with no findings, including the repeated EK-DOCS-SYNC directive check. I’m closing that reviewer and recording the gate outcome into repo-local artifacts/state before moving to commit approval.
From the user perspective before the manual restart, the app was simply stuck in Thinking, Stop did not work, and I could not see that work. I resent the prompt because the UI made it appear as if the prompt had not been sent.
Impact
- Active agent work may continue while the UI appears frozen, stale, or detached. Usage can continue decreasing while no traces/progress are visible.
- The user cannot reliably observe what Codex is doing.
- The user cannot reliably determine whether a turn is active, stopped, detached, or invisible.
- Stop/cancel may be unavailable, misleading, or unresponsive.
- The visible chat history can be misleading after restart.
- Duplicate prompts can be created because the original prompt is hidden or appears unsent.
- Resend/fork recovery paths can hit missing-session style errors.
- Long-running workflows with subagents/tooling can be duplicated, conflicted, or left running invisibly.
- Multi-window monitoring of active sessions becomes unreliable because opening/loading one session can appear to freeze or detach visible progress across windows.
For an agentic desktop app that can run tools, spawn agents, and work on repositories, reliable active-turn state, trace visibility, and cancellation are core safety/control surfaces. If those desynchronize, the app becomes unsafe/unreliable for serious long-running work.
What steps can reproduce the bug?
I do not have a deterministic repro yet. Observed patterns:
Basic stuck Thinking / invisible turn path
- Use Codex Desktop on macOS during a long-running local workspace thread.
- Keep the app open. In some cases this may happen after a relogin/auth flow.
- Send a prompt.
- The UI remains stuck on
Thinkingafter the prompt. - Try pressing Stop. It does not stop the turn.
- Manually quit/restart Codex Desktop.
- Reopen the thread.
- The prompt/trace may be missing or partially recovered, even though later state shows the agent had been executing the prompt.
- If the prompt is resent because it looks unsent, it may later appear as a steered/duplicate continuation, or recovery actions like forking can hit missing-session errors.
/goal / second-window rehydration path
- Start a
/goalturn via prompt. - Let it run normally in the original window.
- Confirm traces/progress are visible and the prompt box shows Stop.
- Open the same session in a new Codex Desktop window.
- The new window fails to load or does not finish loading the active session state.
- Already-visible traces disappear in both windows.
- The goal bar still shows actively pursuing, but chat/trace state disappears and the prompt box may show Send instead of Stop.
- After waiting, traces may spontaneously reappear and the prompt box may return to Stop.
Multi-window active-session monitoring path
- Have multiple long-running active sessions.
- Open each session in its own Desktop window to monitor progress.
- One or more windows fail to load/rehydrate active session state completely.
- Visible progress traces across sessions/windows stop updating or appear frozen/detached.
- Backend work may still be running, but the UI no longer reliably shows progression.
Local state observations
Sanitized local state observations from the same app session:
- Local Sentry scope had active app-state snapshots during the session.
- Breadcrumb counts included:
method=turn/start: 2method=turn/steer: 1Item not found in turn state: 2app_state_snapshot: 26
- App-state snapshots repeatedly included active/streaming mismatch indicators:
thread_count_active: 4thread_count_streaming_owner: 3thread_count_streaming_without_role: 1thread_count_streaming_without_active_runtime: 2-3thread_count_with_inflight_turn: 1-2inflight_turn_count: 1-2browser_use_active_turn_route_count: 1-2
I am not claiming this is the same as reports involving a confirmed crash/reload, placeholder rebinding, or thousands of Item not found in turn state errors. The observed user-facing bug here is: prompt accepted and executed, UI stuck in Thinking or active-turn state becomes detached/frozen, Stop/Send state becomes misleading, and visible prompt/trace/session state is missing or misleading until restart or later rehydration.
What is the expected behavior?
If Codex Desktop accepts a prompt or continues a goal, it should durably and visibly associate that backend turn with the originating thread/session across windows.
Expected behavior:
- The user prompt should remain visible after submission.
- Assistant progress, tool calls, subagent activity, and traces should stream reliably while work is active.
- Active turn state should be consistent between the goal bar, chat/trace area, and prompt box.
- Opening the same session in another window should not detach or clear traces in the original window.
- Opening multiple active sessions in separate windows should not freeze visible progress streams across sessions.
- Stop should reliably cancel the backend turn or show why it cannot.
- If the renderer/thread UI loses ownership of an active backend turn, the app should show a recovery/reattach state instead of generic stuck
Thinkingor misleading Send/Stop state. - Resending or forking should not produce missing-session errors or duplicate/steered turns because of hidden accepted prompts.
- Long sessions should either load/rehydrate reliably or show an explicit loading/recovery state that does not erase visible active traces.
Additional information
This seems like a session/turn state ownership or trace-stream subscription problem between the Desktop UI and the backend/app-server. The backend appears to accept and execute prompts, but the UI can fail to show the submitted prompt, active stream, tool traces, goal/turn alignment, and cancellation state.
The main issue is not one exact repro path. It shows up through /goal, multi-window session opening, long-running turns, restarts, and sometimes follow-up prompts. The common failure is that the Desktop UI does not reliably and consistently show the real active state, progress, and trace stream for running sessions, especially long sessions.
Activity
github-actions commentedon May 24, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
winnal commentedon May 24, 2026
Additional detail about the visible trace/progress stream:
When this bug happens, it is not only the final assistant message or prompt bubble that can be affected. The live trace/progress stream itself can disappear.
Observed variants:
Stuck
Thinkingwith no traces shownSometimes after I send a prompt, the UI gets stuck on
Thinkingand none of the traces/steps/progress are shown, even though the backend appears to be working.Restart can remove traces that were previously visible
After manually quitting/restarting the app, the reopened thread can be missing parts of the thread that were previously present. In particular, if I send a prompt during an active turn and the app bugs out, then after restart the entire previous turn's traces can be gone from the visible UI.
Trace stream can randomly reattach later without restart
For long tasks, Codex normally shows progress/traces continuously during the turn. When the bug happens, it may show only
Thinkingand nothing afterward for a long time. If I wait an extended time, the UI can randomly resume showing traces again before the turn finishes.Follow-up prompt can sometimes unstick the trace stream
In at least one occurrence, I sent another follow-up prompt while it was stuck, and that appeared to unstick the UI: the thinking/progress traces started showing again.
This makes the bug feel like a live turn trace/session subscription or ownership desync. The backend work can continue, but the renderer-visible thread can stop receiving or rendering the active turn's trace events. Later, the UI may reattach spontaneously or after another prompt, but restart can also cause previously visible traces to disappear from the reconstructed thread view.
MisterRound commentedon May 24, 2026
This is essentially the same thing I'm seeing in my issue #24263
jshaofa-ui commentedon May 24, 2026
title: "Codex Desktop accepts prompt but UI stays stuck in Thinking; Stop fails and turn can become invisible after restart"
issue: #24287
repo: openai/codex
type: bug-fix
area: app, session, app-server
competition: low (3 comments, but no solution proposed)
quote: $1,500-$2,500
Complete Solution
Root Cause Analysis
This is a session/turn state ownership desync between the Codex Desktop UI (Electron renderer) and the backend/app-server. The core issue:
Key evidence from Sentry breadcrumbs:
thread_count_active: 4butthread_count_streaming_owner: 3— one active thread has no streaming ownerthread_count_streaming_without_role: 1— a streaming thread has no role assignedthread_count_streaming_without_active_runtime: 2-3— streaming threads with no active runtimeItem not found in turn state: 2— turn state lookup failuresFix — Three-Layer Approach
Layer 1 — Turn ownership reconciliation (primary fix):
Layer 2 — Stop/cancel reliability:
Layer 3 — Recovery/reattach state:
Testing Strategy
Files to Change
codex-rs/app-server-daemon/src/turn_manager.rs— add durable turn storage before streamingapp/src/turn-state-manager.ts— add recovery/reattach logicapp/src/stop-handler.ts— use durable turn reference instead of in-memoryImpact
winnal commentedon May 24, 2026
Additional detail: this also appears associated with the
/goalfeature, and the order of events matters.Corrected repro order:
This is different from the UI simply failing to show traces from the beginning. The traces and active Stop state were visible and working first. Opening the same session in a second window appears to have caused the desktop UI to lose or detach the already-visible active turn/session state across all windows.
The especially strange part is that different parts of the same UI disagreed about whether work was active: the goal bar still showed an active pursuing-goal state, while the chat/trace area lost the active progress and the prompt box reverted to Send. That suggests a session/turn state split between the goal-level active state and the visible turn/trace/input state.
That makes the session state shown in the UI feel temporary or incompletely rehydrated: the persisted/streaming state seems to disappear from the renderer until whatever session/turn binding or trace stream loading finishes again. When it reattaches, the missing traces reappear as if they had been there the whole time.
This still does not look like an app crash. The app remains open. The visible session state becomes inconsistent across windows, then later rehydrates.
winnal commentedon May 24, 2026
Additional impact / multi-window observation:
This is especially concerning when trying to monitor multiple active Codex sessions at once. My goal was to open each active session in its own Desktop window so I could watch each one progress, instead of manually switching between sessions inside a single window.
What I observed:
This may be connected to very long sessions/threads. These sessions are long-running and trace-heavy, and it is starting to look possible that the app is failing to consistently load or rehydrate long session state unless I completely quit and restart the app.
The concerning failure mode is: opening the same or other active sessions in additional windows can appear to detach or freeze the visible active-turn state across windows, leaving the user unable to tell what is currently running or whether Stop would work.
winnal commentedon May 24, 2026
Core failure mode clarification:
As of now, all of the sessions I opened in new windows are no longer showing any new traces. This is the main problem behind the different variants I have described.
The core bug is:
Thinking;So the issue is broader than one exact repro path. It shows up through
/goal, multi-window session opening, long-running turns, restarts, and sometimes follow-up prompts, but the common failure is that the Desktop UI does not reliably and consistently show the real active state, progress, and trace stream for running sessions, especially long sessions.In other words: the app can have an active backend turn, but the renderer-visible session state/trace stream becomes detached, frozen, missing, or stale. That makes the app UI unreliable for monitoring active Codex work and for knowing whether Stop will actually work.
winnal commentedon May 24, 2026
Severity note:
I would consider this a major/critical issue, not a cosmetic UI bug.
Reason: the Desktop UI is the user's primary control and observability surface for active Codex execution. When it stops showing real progress traces, shows inconsistent active state, or leaves the user unsure whether Stop will work, the user loses reliable control over active background work.
Impact:
For an agentic desktop app that can run tools, spawn agents, and work on repositories, reliable active-turn state, trace visibility, and cancellation are core safety/control surfaces. If those desynchronize, the app becomes unsafe/unreliable for serious long-running work.
winnal commentedon May 24, 2026
Additional confirmation: this now appears confirmed as active backend execution with a frozen/detached Desktop UI.
Across multiple active sessions:
Thinking;That strongly indicates Codex is still executing and using model resources in the background, but the Desktop app is not showing any of the activity, traces, or progress. The issue is not simply that the model stopped or that the turn is idle. The backend appears active while the UI is detached from the running turn state.
This is the core reliability problem: active work can continue invisibly while the app UI is stuck and provides no usable observability.
grizzithal commentedon May 25, 2026
I’m seeing the same failure mode on Codex Desktop as well.
In my case, the important part is that the UI appears detached from an active backend turn rather than the turn simply being idle. The thread can remain stuck on
Thinking, progress traces stop updating, andStopeither does not work or does not appear to reflect the actual backend state. I have also seen cases where the prompt/turn appears missing after restart even though later state suggests the backend accepted and continued executing it.My observed pattern:
Thinkingwith no new trace/progress updates.Stop, but pressing it does not reliably cancel the work.This is especially risky because the UI makes it unclear whether a turn is actually running, stopped, detached, or invisible. From a user-control perspective, the problematic behavior is not just stale rendering; it is loss of reliable observability and cancellation for active agent work.
I can provide app version/platform details and local diagnostics if helpful. Are there specific logs, Sentry scope values, or local state files that would be most useful to capture the next time this happens?
8 remaining items
kumag36 commentedon Jul 31, 2026
Additional Windows/Desktop data point (2026-08-01 JST):
26.721.11231.0on Windows.24,303,264 ms. The PC had not slept, the same app-server process was still alive, and the stopped model transport count observed at that point was zero. Delivery completed immediately after Desktop/thread resume. The initial connection-loss trigger remains unverified.Expected behavior: a terminal callback/event should be delivered independently of whether the target thread is currently visible or focused, or the client should automatically resume/reconcile the thread without requiring UI interaction.
Temporary recovery observed locally: do not resend the instruction; foreground the exact target thread once. Fully restarting Desktop is a secondary recovery, but it risks losing visible trace continuity. I can provide sanitized timestamps/log excerpts privately if useful; no repository or conversation content is included here.
Roland0511 commentedon Aug 10, 2026
Additional sanitized diagnostic data point from a case where this affected not only the renderer, but also the thread-reading projection and subsequent model-visible context.
Environment
26.803.41515(build6321)codex-cli 0.147.026.5.2(build25F84), arm64019fa27e-f0ea-7f71-9c78-de349bfd3365Sanitized timeline (UTC)
10:39:38.241— ordinary turn A started, turn ID019feb41-aee3-7923-a41a-1249815e9d33.10:39:38.361— the user message for turn A was persisted in the rollout.10:40:12.460— context compaction occurred while turn A was active.10:40:20.843— the assistant's final answer for turn A was persisted.10:40:21.211—task_completewas persisted for turn A.10:43:57.609— ordinary follow-up turn B started, turn ID019feb45-a3e9-76e3-aa84-a0cba38f7546.10:43:58.704— the user message for turn B was persisted.10:44:04.141— an assistant commentary message for turn B was persisted.10:44:22.062—turn_abortedwas persisted for turn B.After turn B was aborted:
read_threadcall also omitted both turn IDs and jumped from an earlier completed turn to later turns.task_completefor A, andturn_abortedfor B.thread_rolled_backevent around this sequence.Conversation text, repository names, and local paths are intentionally omitted.
This appears more severe than a trace-only rendering issue: an abort of the current turn seems able to make a previously completed turn disappear from the canonical thread projection used by all three consumers:
The durable rollout remains intact, so the likely failure boundary is replay/indexing/canonical-turn reconstruction, possibly involving the combination of compaction inside turn A followed by aborting turn B.
Expected invariant: aborting turn B must not remove completed turn A, and UI, thread APIs, and model-visible context should converge on the durable rollout history.
tonyzhu163 commentedon Aug 10, 2026
This seriously hurts usability of running long-horizon tasks. I'm not sure how this has been in place for several months now?
ByteYue commentedon Aug 11, 2026
Adding a sanitized data point involving Codex Desktop, subagent-heavy work, and a remote Linux app-server.
Environment
26.803.415150.147.0I observed two related state-reconciliation failure modes.
Case A: app-server restart while subagent work existed
The app-server service was terminated by systemd-oomd and automatically restarted.
After the restart:
The worktree and file modifications remained intact, but the live execution handle did not survive the service restart. The problematic part was not the loss of the OS process itself; that is expected after the whole service cgroup is killed. The problematic part was that the client did not reliably reconcile the stale running state into an explicit interrupted, failed, or recoverable state.
Case B: stale running UI without an app-server restart
A later occurrence happened after the restart, while the app-server remained continuously healthy.
The Desktop UI showed a long-running command as active. At the time of inspection:
model_needs_follow_up=falsehas_pending_input=falseneeds_follow_up=falseprocess/killrequest, but there was no matching OS process to terminateA few minutes later:
turn/completedThis suggests that the backend/thread remained usable while the Desktop view temporarily retained stale active-turn/process state.
Possible contributing pressure
During the same general interval, another Desktop connection generated a burst of Git
process/spawnandprocess/exitedevents, similar to the behavior reported in #26812. I did not capture an explicit slow-connection disconnect warning for this exact occurrence, so I am not claiming that outbound backpressure is the proven trigger. It may simply be an event-load or client-state-rehydration amplifier.Expected recovery behavior
After a disconnect, app-server restart, missing terminal event, or unknown process handle, the client should ideally:
turn/completedwas not observed on the original connection.I am not claiming that this is necessarily the same internal trigger as every reproduction in this issue. The user-facing state split, however, is very similar: backend state and Desktop-visible active/Stop/queue state can disagree for an extended period.
I can provide a redacted event timeline and systemd journal summary if that would help triage.
harryshawk commentedon Aug 14, 2026
Additional macOS Codex Desktop evidence matching this issue:
Affected task/thread IDs:
019fc246-0b10-75e2-acfe-d666c96cd246019fa4ea-80fe-79b3-afc0-689bb52f12baObserved behavior:
The UI therefore presents an active-turn state while neither End/Stop nor queued-message delivery works. This is not resolved by restarting the machine or application. Screenshots captured on 2026-08-14 show the queued
Steercard and the unresponsive End/Stop control.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.AdiedX commentedon Aug 16, 2026
I'm seeing what appears to be a closely related issue in the current ChatGPT/Codex desktop app on macOS.
Environment:
Thread session IDs:
01a00856-d54e-7221-8669-c91b61e33172
01a00348-8da0-7593-924d-02b0fdf60f6c
The most obvious repro for me is starting work in a new desktop window/session:
This is happening frequently enough that I now expect to have to submit the initial request twice.
I've completely deleted the ChatGPT app, downloaded a fresh copy, and reinstalled it. The behavior persists.
I'm also seeing a related failure after context compaction: the agent stops instead of continuing the active task and requires another user message to resume.
This did not occur regularly for me previously and seems to have become significantly worse following the recent desktop update.
ChatGPT desktop build number Version 26.810.52044
prashantbhamu commentedon Aug 19, 2026
I reproduced this on Windows, and the failure is especially clear because I could compare the frozen Desktop renderer with the same task's persisted/backend state from another task.
Environment
26.814.5167.0(x64)10.0.26200.0x64Sequence
Thinkingwith a spinner/Stop button and did not show further progress.completed, while the affected window still looked active.Failed to stop chat. Archiving also failed.Thinkingdisappeared and the previously missing final response became visible.Thinking, with no progress messages.inProgressturn and exposed multiple assistant commentary updates plus completed/in-progress tool executions. None of those updates appeared in the affected window.idle, while the affected renderer had not provided reliable visibility/control.Important distinction
This produced both variants:
The second variant reproduced with keyboard-only input after restarting the app. Voice was only involved in the original creation of the task, suggesting that a voice-originated task may retain a broken renderer/stream subscription across later text turns.
Expected
The task window should reattach to the persisted/live turn stream, show commentary and tool progress, clear
Thinkingon completion, and keep Stop/archive availability consistent with backend state.prashantbhamu commentedon Aug 19, 2026
Additional evidence after a full Windows PC restart:
I then checked the obvious local targets. The session JSONL file exists, the
~/.codex/archived_sessionsdirectory exists, and the task working directory exists. This suggests a stale or mismatched internal path/reference in the thread store rather than the main session file actually being absent.A full application restart and a full PC restart both failed to repair the archive operation. This extends the impact beyond renderer/stream desynchronization: the affected voice-originated task appears to retain corrupted or inconsistent thread-store metadata that prevents lifecycle operations such as archive.
zmc1997 commentedon Sep 2, 2026
I am seeing this issue repeatedly on a newer macOS desktop build.
Environment
26.820.71523(build7226)0.150.0-alpha.8Repeated behavior
In one recent occurrence, the turn had to be manually stopped after 9m42s. The task did not reliably continue after retrying in the same conversation.
Expected behavior
No thread IDs, raw logs, local paths, repository names, account details, screenshots, or project content are included in this comment.
mdotk commentedon Sep 17, 2026
Additional macOS reproduction with archive/unarchive and active-writer evidence (2026-09-18 NZST).
Environment:
Observed sequence from the desktop log and read-only thread APIs:
Selected model is at capacity. Please try a different model.thread/resume; app-server correctly rejected it because the session was archived. The desktop loggedheartbeat_automation_resume_failedwithfailureReason=thread_archived.thread/unarchive, resumed the task, and accepted a newturn/start.Thinking; Send was unavailable and no usable Stop control was exposed.inProgress, with no terminal error or completion.turn/interruptrequest for this task. The user's attempted Stop action therefore never reached app-server.thread/resumereturnedthread-store conflict: thread ... already has an active writer; a subsequent narrowly targetedturn/interruptreturnedthread not foundbecause the new client did not own the running thread. The active writer is the desktop's long-lived app-server process.This appears to be an active-turn ownership/control desynchronization rather than only a model-capacity incident. Archiving is not a cancellation mechanism, and the heartbeat/resume path can immediately recreate the running state after unarchive. Restarting the renderer does not clear the persisted active writer/turn state.
Expected behavior:
turn/interruptresult: cancelled, already terminal, failed, or unknown.Private task content, repository paths, thread/turn IDs, raw logs, and account identifiers are intentionally omitted.
mdotk commentedon Sep 17, 2026
Follow-up with a deterministic terminal-turn/streaming-state contradiction from the same macOS reproduction.
After the orphaned turn was successfully interrupted, read-only task APIs consistently reported:
idleinterruptedcompletedAtHowever, reopening the task caused Desktop hydration to log this contradictory state:
The composer consequently continued showing a spinner and disabled Send even though the backend was idle.
A simple navigation away/back did not clear it. A deeper remount also reproduced it:
resumeState=needs_resumeand a newthread/resume.thread/resumesucceeds, butmaybe_resume_successagain logslatestTurnStatus=interrupted markedStreaming=true.This rules out an active model request and ordinary renderer-route caching. The poisoned streaming marker is persisted or reconstructed during resume despite the authoritative terminal turn state.
Required invariant: if the latest turn is
completed,failed, orinterrupted, resume must not return or derivemarkedStreaming=true. Hydration should reconcile terminal turn status before disabling the composer. A supported per-thread state-repair action is also needed; restarting the shared app-server would disrupt unrelated active tasks.mdotk commentedon Sep 17, 2026
Further reproduction: the invalid streaming state propagates through
thread/forkand can become worse in the child.Sanitized sequence:
status=interruptedcompletedAtstatus=interruptedcompletedAt=nulldurationMs=nullidle, but initial hydration logs:Thinking, disables Send, and leaves the draft greyed out. No model request or tool call is active.The fork call itself succeeded; the problem is the lifecycle state copied into the child. Forking again repeats the failure because the child inherits an interrupted turn without a completed timestamp and then reconstructs it as streaming.
Required invariants:
thread/forkmust only copy completed history, as documented by the product behavior, and must normalize interrupted turns to a terminal record withcompletedAt.markedStreaming=trueunless it owns a genuinely active turn.status=interruptedwith no completion timestamp, resume should repair it rather than treating it as streaming.Private task content, paths, thread/turn IDs, and raw logs are omitted.
RohinJ444 commentedon Sep 19, 2026
I saw a similar failure on macOS 26.6.2 (25G83), Apple Silicon, in the desktop app:
The main problem was not just the elapsed-time display: I could neither stop nor redirect the task through the UI, and could not tell whether it was actually still executing.
The roughly one-hour wait and “Worked for 16m” are observations, not measurements of the underlying shell process. I have not established whether steering reached the backend or whether this shares the same root cause as the original report. I do not have a deterministic reproduction yet.
Potentially separate: the side chat was no longer visible after restarting. Linking #40262 for that symptom rather than assuming it is caused by the same failure.
kalexander-alt commentedon Oct 21, 2026
Additional macOS reproduction — 21 October 2026
Codex desktop
26.1016.51333, build21161, bundlecom.openai.codex; macOS26.6.2, Apple Silicon. This adds measured execution evidence and specific active-turn mismatch observations to the existing issue.User-visible problem: the user reported hours without new chat updates, indefinite “Thinking”, and inability to send messages in a long-running local chat. Backend metadata and independently verified document saves show that work continued, with real interruptions as well. Reopening the chat restored a visible update, confirmed by the user. Ongoing reliable message sending has not been independently verified.
Bounded audit: 21 October 2026, 14:00:00–18:18:02 Europe/Zurich (UTC+02:00) / 12:00:00–16:18:02 UTC.
Native request evidence:
turn/steerrejected withactive_turn_mismatch; expected active-turn ID differed from actual. Successful same-method routing followed 113 ms later.turn/interruptrejected withactive_turn_mismatch; successful same-method routing followed 15 ms later.The actual turn identifiers are omitted. Successful request routing does not prove a user message was delivered, applied or displayed. A brief app-global executor restart and window-level pubsub reconnects were observed separately; neither is scoped sufficiently to count as this chat's downtime or explain the stale display.
The precise display-freeze onset, duration and root cause remain unknown. The chat was active after recovery, and its larger task remains unfinished. Please investigate reconciliation of renderer-visible active-turn state, progress subscriptions and steering targets against the backend. No deterministic repro or fix is claimed.
No project names, local paths, account details, source files or raw transcripts are included.
Report reference:
macos-desktop-20261021-stale-ui-audit-v1.