Skip to content

Codex Desktop automatically marks Goal blocked after transient gpt-5.6-sol capacity errors without an update_goal call #41808

Open

Description

@huangh-git

Codex App version

Codex Framework 151.0.7922.174; Codex runtime 0.151.0-alpha.7.1

Subscription

Pro

Platform

Darwin 25.5.0 arm64 arm

Summary

A long-running Codex Desktop Goal was automatically changed to blocked after transient model-capacity errors:

Selected model is at capacity. Please try a different model.

The user did not pause the Goal, and the agent did not call update_goal(status="blocked").

Observed state transition

A redacted local timeline from 2026-08-31:

2026-08-31 07:50:55Z | WebSocket disconnect | retrying sampling request (1/5 in 200ms)
2026-08-31 07:51:40Z | gpt-5.6-sol | medium | Selected model is at capacity
2026-08-31 07:51:40Z | Goal database status changed to blocked
2026-08-31 07:51:50Z | gpt-5.6-sol | medium | Selected model is at capacity
2026-08-31 07:53:14Z | gpt-5.6-sol | medium | Selected model is at capacity

A strict search found zero actual tool_name="update_goal" calls in the relevant window. The only loose text match came from tool/context documentation, not a tool invocation.

The task had already completed tools and made progress. Later continuation turns still executed after the persisted Goal status became blocked, leaving the scheduler, persisted Goal state, and UI inconsistent.

The same logs report:

  • full_context_window_limit_reached=false
  • token_limit_reached=false

This was therefore not a context-window or Goal token-budget stop.

Reproduction

  1. Start a long-running Goal in Codex Desktop.
  2. Use gpt-5.6-sol with medium reasoning.
  3. Let the Goal continue across multiple turns and execute tools.
  4. Encounter repeated transient Selected model is at capacity responses.
  5. Observe that ordinary WebSocket disconnects use the existing bounded retry path, while capacity errors terminate the turn without that retry path.
  6. After repeated capacity errors, inspect or resume the Goal.
  7. Observe that the Goal is persisted or displayed as blocked even though:
    • the user did not pause it,
    • the agent did not call update_goal(blocked),
    • later continuation turns can still execute.

The capacity response is backend-dependent and cannot be triggered deterministically.

Expected behavior

A transient model-capacity error should be classified as retryable and should not automatically convert an active Goal to blocked.

  • Retry with bounded exponential backoff.
  • Preserve completed tool results and accepted input.
  • If the retry budget is exhausted, enter a retained-state waiting or paused state with explicit retry controls.
  • Transition back to active when continuation resumes.
  • Reserve blocked for a genuine task impasse or an explicit supported state transition.

Related issues

This report adds a current Codex Desktop observation where the Goal database timestamp matches the capacity failure and no actual update_goal(blocked) call occurred.

Raw logs are intentionally not attached because they contain task content, thread IDs, local paths, tool arguments, and routing or authentication metadata. The timeline above is the redacted minimal evidence.

Activity

  1. added
    bugSomething isn't working
    appIssues related to the Codex desktop app
    connectivityIssues involving networking or endpoint connectivity problems (disconnections)
    sessionIssues involving session (thread) management, resuming, forking, naming, archiving
    on Aug 31, 2026
  2. github-actions commented on Aug 31, 2026

    @github-actions
    Contributor

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

    Powered by Codex Action

  3. 84dnnvbdvp-debug commented on Aug 31, 2026

    @84dnnvbdvp-debug

    Source-level discriminator on current public main (d60560f14e6271da8ac8f680fcdfb9245d5b9413): GoalExtension::on_turn_error maps every CodexErrorInfo except UsageLimitExceeded to ActiveGoalStopReason::TurnError, and GoalRuntimeHandle::stop_active_goal_for_turn maps TurnError to ThreadGoalStatus::Blocked. Separately, CodexErrorDetails::ServerOverloaded is the exact Selected model is at capacity. Please try a different model. error, and CodexErr::is_retryable() currently returns false for ServerOverloaded.

    So current public source contains a direct path that can persist blocked without any update_goal tool call, consistent with this report. This does not prove the reported Desktop binary was built from that exact commit.

    A focused regression could start with an active Goal, surface ServerOverloaded, and assert that a transient service-capacity failure does not become a semantic Goal impasse. Retry exhaustion / waiting UI can be tested separately. The smallest repair looks like decoupling service/transport recoverability from Goal blocked, rather than using generic TurnError -> Blocked for this case.

  4. dllu commented on Sep 1, 2026

    @dllu

    my multi-day /goal run in codex cli was also paused due to transient capacity issues. Image

  5. metjm commented on Sep 1, 2026

    @metjm

    +1 same thing keeps happening to me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    appIssues related to the Codex desktop appbugSomething isn't workingconnectivityIssues involving networking or endpoint connectivity problems (disconnections)sessionIssues involving session (thread) management, resuming, forking, naming, archiving

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions