Blocked goal does not transition back to active when user resumes and agent continues work
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:
- #28144: wait/wake support for goals without spending tokens
- #28177:
Goal blockedafter auto compact fail - #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.
3 Comments
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.
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.
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
active.05:46 UTC, the agent encountered a legitimate external authentication blocker and calledupdate_goal({ status: "blocked" }).``
text
``status: blocked
tokensUsed: 509771
timeUsedSeconds: 13890
updatedAt: 2026-08-26 05:46:42 UTC
05:56 UTC, the user resolved the blocker and replieddonein direct response to the agent's request.get_goal()continued to return the original Goal asblocked, with the sametokensUsed,timeUsedSeconds, andupdatedAtvalues shown above.create_goalcorrectly rejected it because the thread still had an unfinished Goal:``
text
``cannot create a new goal because this thread has an unfinished goal;
complete the existing goal first
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.