Repository navigation
Blocked goal does not transition back to active when user resumes and agent continues work #29370
Description
Summary
A Codex Desktop goal that has been marked blocked can remain visually and programmatically blocked after the user resolves the blocker and explicitly asks the agent to resume. The agent can continue executing work, but the UI footer still shows Goal blocked ... and the Resume goal control while the turn is already running.
This makes it look like the agent is not able to resume goals by itself, and there does not appear to be an agent-visible status transition from blocked back to active/in-progress.
Observed behavior
In a Codex Desktop thread, the user resolved a blocker and sent:
done just quit. proceed. resume goal
The agent then resumed work and performed the expected actions:
- removed the waiting marker from the thread title
- re-checked external state
- ran the guarded recovery command
- continued toward verification
However the goal footer still displayed:
Goal blocked Diagnose and fix why John's 100-hour Slay the Spire 2...
and the UI still showed the Resume goal button/tooltip while the agent was actively working. A screenshot taken during the active turn showed Working for 43s, active assistant status text, command execution rows, and the bottom goal strip still saying Goal blocked with Resume goal visible.
During the resumed turn, the agent also observed via the goal tool that the goal record still had status: blocked before continuing. There was no obvious tool/API path for the agent to mark the goal as active/resumed; the exposed transitions appeared to support terminal statuses such as complete/blocked, but not unblocking.
Expected behavior
When a blocked goal is resumed by the user, either:
- the goal should automatically transition from
blockedto an active/running state as soon as the resumed turn starts, or - the agent should have a supported tool/API transition to mark the goal unblocked/resumed before continuing.
The UI footer should no longer show Goal blocked or a Resume goal button while an active resumed turn is already running for that same goal.
Actual behavior
The resumed turn runs, but the goal remains displayed as blocked. The UI simultaneously shows active work and a blocked goal state.
Impact
- Users cannot tell whether the goal is actually resumed or still blocked.
- The agent appears unable to recover goal state by itself after the user resolves the blocker.
- This can cause repeated manual resume attempts and confusing side conversations while the original turn is actually progressing.
- It weakens the blocked/resume contract for long-running goal workflows.
Reproduction outline
- Start a Codex Desktop goal.
- Have the agent mark the goal blocked due to a real external blocker.
- Resolve the external blocker.
- Send a user message such as
done, proceed, resume goal. - Observe that the agent starts working again.
- Observe that the bottom goal strip can still show
Goal blocked ...andResume goalduring the active resumed turn.
Nearby issues checked
I searched for obvious duplicates and found nearby but not exact issues:
- Add wait/wake support for goals without spending tokens #28144: wait/wake support for goals without spending tokens
- "Goal blocked" after auto compact fail for ~1 hour run goal session. #28177:
Goal blockedafter auto compact fail - Codex Desktop renderer crashes when opening a thread with blocked goal status #26784: renderer crash when opening a blocked-goal thread
This report is specifically about a user-resolved blocked goal continuing to display/remain blocked while the agent is already executing the resumed turn.
Environment
- Product: Codex Desktop
- Platform: macOS
- Date observed: 2026-06-21
- Screenshot evidence: local screenshot captured from the Codex UI showing active work plus the still-blocked goal footer/
Resume goalcontrol.
Activity
ChenTingToDo commentedon Jul 13, 2026
I can reproduce the blocked-goal resume issue described here in Codex Desktop on Windows, with an additional timing/lifecycle problem.
Observed flow:
In addition to the stale blocked status, the goal's displayed end time/duration stops at the moment the Skill requested user input. The resumed portion of the lifecycle is not included:
Expected behavior:
Environment:
This looks closely related to the missing blocked-to-active transition reported here, but it also affects the accuracy of goal lifecycle timestamps and duration.
BlakeMasters commentedon Jul 27, 2026
I can independently reproduce this on Codex Desktop for Windows (observed 2026-07-27), and I would frame the requested remedy primarily as a missing goal-lifecycle feature/API transition rather than only a UI bug.
Observed sequence:
blockedunder its goal-management instructions.get_goalstill returnedstatus: blocked.update_goalcontract exposed onlycompleteandblocked; it offered no supportedactive,resume, orunblocktransition. Creating a replacement goal would also be inappropriate while the original goal remains unfinished.Suggested feature shape / acceptance criteria:
resume_goalaction or supportupdate_goal({status: "active"})fromblocked.get_goal, automatic-continuation behavior, and the Desktop status strip atomically.completeterminal unless reopening completed goals is designed separately.No private repository, command, path, or goal-objective details are included here.
neverdie88 commentedon Aug 27, 2026
Confirmed independently with a long-running Codex Desktop Goal. This appears to be persisted lifecycle state drift, not only stale UI rendering.
Environment
0.145.0-alpha.18Observed sequence
A Goal was created and ran normally as
active.At approximately
05:46 UTC, the agent encountered a legitimate external authentication blocker and calledupdate_goal({ status: "blocked" }).The resulting persisted state was:
At approximately
05:56 UTC, the user resolved the blocker and replieddonein direct response to the agent's request.Codex confirmed that authentication was restored and resumed work toward the same Goal. It performed additional diagnostics, monitored the running workload, modified implementation files, and continued through later stages of the original objective.
Despite that work,
get_goal()continued to return the original Goal asblocked, with the sametokensUsed,timeUsedSeconds, andupdatedAtvalues shown above.The agent later attempted to recreate the Goal with the same objective, but
create_goalcorrectly rejected it because the thread still had an unfinished Goal:The session continued doing Goal-related work for many hours, while the persisted Goal record remained frozen in the blocked state.
I am not posting the raw rollout because it is very large and contains workspace-specific operational context, but I can provide additional sanitized event extracts if useful.
Source-level diagnosis
The current behavior appears internally consistent once the Goal reaches
blocked, but there is no supported agent-side transition back toactive:codex-rs/ext/goal/src/spec.rsexposesupdate_goal.statuswith onlycompleteandblocked.codex-rs/ext/goal/src/tool.rsrejectsactiveand says pause/resume transitions are user- or system-controlled.codex-rs/ext/goal/src/extension.rsattaches turn accounting only when the persisted status isactiveorbudget_limited.codex-rs/ext/goal/src/runtime.rsschedules automatic continuation only for anactiveGoal.codex-rs/state/src/runtime/goals.rsallowscreate_goalto replace an existing Goal only when its status iscomplete, so recreation cannot recover a blocked Goal.thread/goal/setpath can set the existing Goal toactive, but a normal user message that explicitly resolves the blocker does not invoke that transition, and the model-facing Goal tools cannot invoke it either.Consequently, after the user explicitly resolves a blocker, the agent can resume ordinary turn execution while all Goal-specific state remains stopped:
Expected behavior
An explicit user resume should atomically transition the same persisted Goal from
blockedtoactivebefore Goal work continues. The transition should:blocked -> activeand updateupdatedAt.thread/goal/updatedevent so every client clears its blocked presentation.Suggested implementation direction
Either of these would close the lifecycle gap:
Option A: explicit agent-side resume tool
Add a narrowly scoped
resume_goaltool that:blocked;activewithout replacing it;get_goal.This keeps terminal
update_goalsemantics unchanged and makes the resume action explicit in the transcript.Option B: explicit resume intent on turn submission
Add a typed resume signal to the user/client turn-submission path. Desktop, TUI, mobile, and noninteractive clients would send that signal when the user chooses Resume or explicitly submits a resume action. The Goal extension would consume it before turn accounting begins and transition the existing Goal to
active.This avoids relying on free-text matching in the runtime, but every client surface must support the signal.
I would avoid automatically resuming every blocked Goal on any user message, because an unrelated question or status request should not silently restart autonomous continuation.
Regression coverage
A regression test should cover the complete lifecycle:
thread/goal/updatednotifications contain the resumed active state.This occurrence matches the core behavior described in this issue: the agent resumed real work after the user removed the blocker, but the Goal state and accounting remained one-way blocked.
perdurabo93 commentedon Oct 10, 2026
Additional occurrence on Windows, observed October 10, 2026, reported at the user's request.
After the user explicitly said
resume now, the same Codex desktop chat resumed meaningful work, including tool calls and delegated work. The goal card continued to show Goal stalled. During resumed work,get_goalstill returned:{ "status": "blocked", "updatedAt": 1791624649 }That timestamp is 2026-10-10 09:30:49 UTC. A screenshot confirms the stalled card; the screenshot and full transcript are not attached because they contain private project context.
Observed sequence:
Expected: when an explicit resume request is acted upon and work toward the goal resumes, reconcile the persisted goal state and UI to active/running. A blocked/stalled state should remain only while the blocking condition persists; an explicit user pause or exhausted budget should still be respected.
Impact: the status misleadingly suggests work has stopped, making unattended execution and progress monitoring unreliable. This observation does not establish the underlying cause or whether automatic goal continuation was restored.
Environment: Windows x64; read-only OS query returned
Microsoft Windows NT 10.0.26200.0. Exact desktop build was not captured. No repository content, credentials, local paths, or private task identifiers are included.Follow-up observation (October 10, 2026): the user then explicitly said
resume goal if you have not already. Aget_goalcall immediately afterward still returnedstatus: "blocked"with the unchangedupdatedAt: 1791624649, while deployment and schema-validation work toward the goal continued. This reproduces the mismatch after a second request that explicitly names the goal.