Paused Goal still receives automatic continuation turns until marked blocked
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.5k
- PR merge metrics
- PR metrics pending
Description
What version of Codex are you using?
Codex Desktop/current connected runtime; the exact app build was not discoverable from this session.
Platform
macOS 26.5.2 (25F84), Apple Silicon arm64.
What issue are you seeing?
A Goal whose persisted status was confirmed as paused continued to receive automatic internal Goal-continuation turns.
This is not the case where a user merely says "pause" in chat while the persisted Goal remains active. The Goal service returned status: "paused" before the unwanted continuations began.
Observed sequence:
- The user paused the active Goal to discuss progress.
get_goal()returned the same thread Goal withstatus: "paused".- The runtime nevertheless injected:
<codex_internal_context source="goal">Continue working toward the active thread goal...</codex_internal_context> - The agent declined to work and stated that it was honoring the explicit pause.
- The runtime injected the same Goal continuation again.
- After three consecutive unwanted continuations, the agent had to call
update_goal(status: "blocked")merely to stop the loop.
No user request resumed the Goal between the paused-state observation and these continuation turns.
Expected behavior
- A persisted
pausedGoal must not schedule or inject any automatic continuation turn. - It should resume only through an explicit supported user resume action.
- A user should not have to mark a healthy paused Goal
blockedto suppress automatic continuation. - The scheduler should re-check persisted Goal status immediately before enqueueing and immediately before injecting a continuation.
- If an already-enqueued continuation races with a pause, it should be cancelled or discarded when it observes
paused.
Impact
- Consumes tokens while the user is intentionally discussing or waiting.
- Can cause unintended work after the user paused execution.
- Corrupts lifecycle semantics because
blockedmust be used as a workaround forpaused. - Makes long-running Goal work difficult to review safely.
Suggested acceptance criteria
- Start an active Goal.
- Pause it and verify its persisted status is
paused. - Leave the thread idle across multiple continuation scheduling intervals.
- Confirm no internal Goal-continuation turn is injected.
- Resume explicitly and confirm continuation restarts normally.
- Add a race test where pause occurs after continuation scheduling but before injection; the queued continuation must be dropped.
- Keep
pausedandblockedsemantically distinct.
Related issues
- #33827 reports the same "paused then continuation injected" signature on Windows, but combines it with browser restoration and a Desktop crash.
- #24531 concerns chat-level stop instructions while the persisted Goal remains active, which is distinct from this persisted-paused case.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the Goal lifecycle entry points named in the report, get_goal and update_goal, then trace continuation scheduling and injection. Add coverage for the pause-before-injection race and verify that paused Goals produce no automatic turns, while explicit resume restarts continuation and paused remains distinct from blocked.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100