Codex Desktop accepts prompt but UI stays stuck in Thinking; Stop fails and turn can become invisible after restart

Open 💬 16 comments Opened May 24, 2026 by winnal
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

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 /goal cases 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 Thinking with 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:

  1. I had already started the goal via a prompt in the original window.
  2. The goal was working normally.
  3. The original session UI was showing the prompt/goal progress traces normally.
  4. The prompt box was correctly showing the Stop button, indicating an active turn was running.
  5. Only after that, I tried opening the same session in a new Codex window.
  6. In the new window, the session failed to load or did not finish loading the active session state.
  7. At that point, the already-visible goal/prompt progress traces disappeared in both the new window and the original window.
  8. 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.
  9. 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
  1. Use Codex Desktop on macOS during a long-running local workspace thread.
  2. Keep the app open. In some cases this may happen after a relogin/auth flow.
  3. Send a prompt.
  4. The UI remains stuck on Thinking after the prompt.
  5. Try pressing Stop. It does not stop the turn.
  6. Manually quit/restart Codex Desktop.
  7. Reopen the thread.
  8. The prompt/trace may be missing or partially recovered, even though later state shows the agent had been executing the prompt.
  9. 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
  1. Start a /goal turn via prompt.
  2. Let it run normally in the original window.
  3. Confirm traces/progress are visible and the prompt box shows Stop.
  4. Open the same session in a new Codex Desktop window.
  5. The new window fails to load or does not finish loading the active session state.
  6. Already-visible traces disappear in both windows.
  7. The goal bar still shows actively pursuing, but chat/trace state disappears and the prompt box may show Send instead of Stop.
  8. After waiting, traces may spontaneously reappear and the prompt box may return to Stop.
Multi-window active-session monitoring path
  1. Have multiple long-running active sessions.
  2. Open each session in its own Desktop window to monitor progress.
  3. One or more windows fail to load/rehydrate active session state completely.
  4. Visible progress traces across sessions/windows stop updating or appear frozen/detached.
  5. 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: 2
  • method=turn/steer: 1
  • Item not found in turn state: 2
  • app_state_snapshot: 26
  • App-state snapshots repeatedly included active/streaming mismatch indicators:
  • thread_count_active: 4
  • thread_count_streaming_owner: 3
  • thread_count_streaming_without_role: 1
  • thread_count_streaming_without_active_runtime: 2-3
  • thread_count_with_inflight_turn: 1-2
  • inflight_turn_count: 1-2
  • browser_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 Thinking or 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.

View original on GitHub ↗

16 Comments

github-actions[bot] contributor · 1 month ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #24263
  • #24217
  • #23292

Powered by Codex Action

winnal · 1 month ago

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:

  1. Stuck Thinking with no traces shown

Sometimes after I send a prompt, the UI gets stuck on Thinking and none of the traces/steps/progress are shown, even though the backend appears to be working.

  1. 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.

  1. 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 Thinking and nothing afterward for a long time. If I wait an extended time, the UI can randomly resume showing traces again before the turn finishes.

  1. 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 · 1 month ago

This is essentially the same thing I'm seeing in my issue https://github.com/openai/codex/issues/24263

jshaofa-ui · 1 month ago

---
title: "Codex Desktop accepts prompt but UI stays stuck in Thinking; Stop fails and turn can become invisible after restart"
issue: https://github.com/openai/codex/issues/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:

  1. Prompt accepted but UI loses ownership: The backend accepts and executes the prompt, but the UI's turn subscription fails to receive or render the prompt bubble, assistant progress, and tool traces
  2. Stop fails: The Stop button can't cancel because the UI doesn't have a valid reference to the active turn
  3. State invisible after restart: The thread's prompt/trace state is not durably associated with the originating thread, so restart shows misleading or missing history

Key evidence from Sentry breadcrumbs:

  • thread_count_active: 4 but thread_count_streaming_owner: 3 — one active thread has no streaming owner
  • thread_count_streaming_without_role: 1 — a streaming thread has no role assigned
  • thread_count_streaming_without_active_runtime: 2-3 — streaming threads with no active runtime
  • Item not found in turn state: 2 — turn state lookup failures

Fix — Three-Layer Approach

Layer 1 — Turn ownership reconciliation (primary fix):

// In app-server's turn management (Rust)
// When a prompt is accepted, ensure the turn is durably linked to its thread
// BEFORE any streaming begins

fn handle_prompt(thread_id: &str, prompt: Prompt) -> Result<TurnId> {
    // 1. Create turn record in the thread's durable store FIRST
    let turn = Turn::new(thread_id, prompt);
    self.store.save_turn(&turn)?;  // Durable write before streaming
    
    // 2. THEN start the backend execution
    let turn_id = turn.id.clone();
    self.backend.execute(turn_id.clone(), prompt);
    
    // 3. Subscribe the UI to the turn stream
    self.ui.subscribe(thread_id, turn_id.clone());
    
    Ok(turn_id)
}

Layer 2 — Stop/cancel reliability:

// In the Desktop UI's Stop handler
async handleStop() {
    // Get the current turn_id from the durable store, not just in-memory state
    const turnId = await this.store.getActiveTurnId(this.threadId);
    if (!turnId) {
        // Show recovery UI instead of silently failing
        this.showRecoveryState("No active turn found. Checking backend state...");
        const backendTurn = await this.appServer.findActiveTurn(this.threadId);
        if (backendTurn) {
            // Re-attach UI to the backend turn
            await this.reattachToTurn(backendTurn);
        }
        return;
    }
    await this.appServer.cancelTurn(turnId);
}

Layer 3 — Recovery/reattach state:

// When the UI detects it has lost ownership of an active turn
async detectAndRecover() {
    const localActive = await this.store.getActiveTurns(this.threadId);
    const backendActive = await this.appServer.getActiveTurns(this.threadId);
    
    // Find turns that exist in backend but not in UI
    const orphanedTurns = backendActive.filter(
        bt => !localActive.some(lt => lt.id === bt.id)
    );
    
    for (const orphaned of orphanedTurns) {
        // Show a recovery banner
        this.showRecoveryBanner({
            type: 'orphaned_turn',
            turnId: orphaned.id,
            message: 'An active turn was found that is not visible in the UI. Click to re-attach.',
            action: () => this.reattachToTurn(orphaned)
        });
    }
}

Testing Strategy

  • Unit test: verify turn is durably stored before streaming begins
  • Integration test: simulate UI crash during active turn, verify recovery on restart
  • Edge case: verify Stop works even when UI has lost turn ownership
  • Regression test: verify normal turn flow (prompt → stream → response) is unaffected

Files to Change

  1. codex-rs/app-server-daemon/src/turn_manager.rs — add durable turn storage before streaming
  2. app/src/turn-state-manager.ts — add recovery/reattach logic
  3. app/src/stop-handler.ts — use durable turn reference instead of in-memory

Impact

  • Prompts are durably associated with their originating thread
  • Stop button reliably cancels the backend turn or shows recovery state
  • Orphaned turns are detected and recoverable after restart
  • No duplicate prompts from invisible accepted prompts
winnal · 1 month ago

Additional detail: this also appears associated with the /goal feature, and the order of events matters.

Corrected repro order:

  1. I had already started the goal via a prompt in the original window.
  2. The goal was working normally.
  3. The original session UI was showing the prompt/goal progress traces normally.
  4. The prompt box was correctly showing the Stop button, indicating an active turn was running.
  5. Only after that, I tried opening the same session in a new Codex window.
  6. In the new window, the session failed to load or did not finish loading the active session state.
  7. At that point, the already-visible goal/prompt progress traces disappeared in both the new window and the original window.
  8. 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.
  9. 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.

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 · 1 month ago

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:

  • 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;
  • I could no longer reliably see further progress traces in the UI;
  • 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.

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 · 1 month ago

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:

  • the session/turn appears active;
  • the UI can be stuck on Thinking;
  • the prompt bar may show an active turn with the Stop button;
  • but no new progress traces appear;
  • the UI does not reliably respond or reflect what the backend is actually doing.

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 · 1 month ago

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:

  • active agent work may continue while the UI appears frozen or stale;
  • the user cannot reliably observe what Codex is doing;
  • the user cannot reliably determine whether a turn is active, stopped, or detached;
  • the Stop control may be unavailable, misleading, or unresponsive;
  • users may resend prompts or open/fork sessions because the UI makes the active state unclear;
  • long-running repo workflows can be duplicated, conflicted, or left running invisibly.

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 · 1 month ago

Additional confirmation: 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.

This is the core reliability problem: active work can continue invisibly while the app UI is stuck and provides no usable observability.

grizzithal · 1 month ago

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, and Stop either 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:

  • Codex accepts a prompt in an existing long-running thread.
  • The UI stays on Thinking with no new trace/progress updates.
  • The prompt box may still show Stop, but pressing it does not reliably cancel the work.
  • Restarting the app may show missing or partial turn history.
  • In some cases, usage continues decreasing while the UI shows no visible activity, which suggests backend execution is still active.
  • Sending a follow-up prompt or waiting can sometimes cause the trace stream to reattach.

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?

Kai-Watson · 1 month ago

same here

peterw · 1 month ago

same issue

martinmclee · 1 month ago

Follow-up for this issue
I can still reproduce this with:

Codex App version: 26.608.12217
Codex CLI version: 0.139.0
This still matches the same failure pattern:

UI stays in Thinking during an active turn
progress/trace output is not updating reliably
Stop may not appear to stop execution
behavior looks stale or detached from actual backend activity

martinmclee · 1 month ago

Extra context on the same stuck thread: the session was already in Plan mode before restart by Codex Desktop update. After restarting to 26.608.12217, UI now shows Plan mode as off, but the thread remains stuck in the Plan execution path and Plan mode cannot be turned off. Workaround that unblocks me: switching reasoning level and continuing there; that allowed the thread to proceed. This seems like a session/state desync, not an actual mode toggle mismatch.

franksong2702 · 12 days ago

Tracking this from a downstream app-server client / Codex Mobile integration because it matches the same user-visible failure mode: a submitted message can leave the client showing an active/Thinking state while the durable thread state does not reliably show the new turn.

Sanitized local signal from a recent occurrence:

  • The client submit endpoint received the message and returned a new turnId from turn/start.
  • A follow-up durable read still showed the previous latest completed turn, with no matching newly submitted turn visible.
  • The local session JSONL/rollout did not contain the returned turnId or the client submission id after the submit response.
  • A local fallback cache then projected the returned turnId as active, which made the Mobile UI look like the session was still thinking even though persistent state had not advanced.

That makes this feel like the same class of session/turn ownership and durable-state desync described here: the user-facing client cannot safely distinguish "accepted and running" from "accepted-looking but not materialized". We have added a downstream guard that verifies the submitted turn is visible via bounded thread state before showing it as active; subscribing here for the upstream fix.

michaliskon · 3 hours ago

I reproduced this on Windows across the VS Code extension and Codex Desktop using the same local thread.
A /goal was actively running in VS Code. After opening another chat/window and returning, both VS Code and Desktop showed stale conversation state ending several messages earlier. The goal bar still showed the goal as pursuing, but the visible turn appeared stopped.
The local rollout JSONL retained the full history and continued growing, confirming that backend reasoning and tool activity were still running. At the same time, the exposed thread state reported notLoaded and the latest turn as interrupted.
This suggests the rehydration/state-synchronization problem also affects cross-surface VS Code ↔ Desktop usage, not only multiple Desktop windows.