You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Automatic continuation loop consumed tokens without making progress #37800
@tibo-openai, I encountered a runaway automatic-continuation loop in a long-running Codex task.
After making real progress on a documentation-localization goal, the task repeatedly emitted only 继续处理中 (“continuing”) without editing files or making meaningful progress. The empty continuation turns continued to consume tokens and time, and the goal was eventually marked blocked.
Expected behavior
A long-running goal should resume actual work, or visibly pause/stop with a clear reason.
Empty automatic continuation turns should not continue consuming tokens.
Users need a reliable way to stop a runaway continuation loop.
Impact
This wasted a substantial number of tokens and significant time.
Please investigate whether this is a task-continuation scheduling/state bug, and whether usage consumed by these empty turns can be restored.
Confirm the returned goal has status="active". In this case the objective was a stale local attachment-read instruction; its path and contents are redacted.
Leave the goal active and observe the task rollout. The runtime repeatedly appends an internal user message with source="goal" while the preceding turn is busy, then records turn_aborted, then immediately starts another turn.
Count event types deterministically in the local JSONL rollout. At the repair point the task contained:
task_started: 2816
turn_aborted: 2806
goal user messages: 2806
first goal message: 2026-08-30T04:36:49.892Z
last goal message: 2026-08-30T22:40:49.488Z
Pause without changing the objective or accumulated usage:
Re-run thread/goal/get: status is paused; objective and tokensUsed=225531 remain preserved.
Compare turn_aborted over an 8-second deterministic observation: 2803 -> 2803 at the immediate repair check. No metered model polling was used.
Expected result
An automatic continuation must atomically check task/turn state. It should wait for the active turn, coalesce with an already queued continuation, or stop with an actionable error. It must not arrive as busy input that aborts the turn it is intended to continue.
This repeated thousands of times without completing the stale objective.
Impact/severity
HIGH. The task made no useful progress for an approximately 18-hour event span, generated 2,806 aborts/automatic Goal messages, and required an out-of-band task-scoped pause to stop the storm.
Remediation attempts and outcomes
Sampled task status. Result: repeatedly active/interrupted with no progress.
Searched local automations. Result: no matching automation.
Parsed the exact task rollout. Result: identified the automatic Goal-message/abort/start cycle.
Read native Goal state. Result: active stale attachment objective, tokensUsed=225531.
Set only status="paused", omitting objective. Result: objective/usage preserved.
Compared abort counts over 8 seconds. Result: stable; already-running work could finish aborting, but no new burst was scheduled.
INFERENCE
The Goal scheduler likely lacks an atomic idle/in-progress guard or continuation coalescing. Incoming automatic continuation is then treated as busy user input and interrupts the turn. This requires code evidence to confirm.
UNKNOWN
Exact scheduler/state-machine race.
Whether all transports/hosts are affected.
Billing/usage impact of aborted automatic turns.
Whether a stale attachment objective is causal or only incidental.
Evidence/receipts
Task-scoped Goal pause receipt: status=paused, objective and usage preserved.
Immediate abort counter receipt: 2803 -> 2803 over 8 seconds.
Full aggregate counts and timestamps above came from the affected task's local JSONL rollout.
Reporter task ID and direct reply route
01a054d0-5fb6-71c2-910f-38cbc1a489d5
GitHub: @andjones132
Verification required to close
Reporter-side verification should recreate the original active-goal/busy-turn condition, assert that automatic continuations coalesce or wait, and confirm zero self-induced turn_aborted events. An owner-side patch alone is not sufficient.
The task still has exactly 2,806 automatic messages containing <codex_internal_context source="goal">.
The last automatic Goal message was 2026-08-30T22:40:49.488Z, 1.534 seconds after the status=paused update at 22:40:47.954Z, consistent with one already-queued continuation.
No later automatic Goal continuation is present.
Later turn_aborted records at 22:50, 23:03, and 23:06 were paired with explicit user/delegated messages, not source="goal"; they must not be counted as recurrence of the automatic scheduler storm.
The task is currently idle. The stale Goal objective and usage remain preserved rather than cleared.
This verifies the pause as an effective containment, not a product fix. Reporter-side reproduction against a candidate scheduler fix remains required before closure.
Activity
github-actions commentedon Aug 10, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
andjones132 commentedon Aug 30, 2026
Additional deterministic evidence — active Goal continuation self-interrupt loop
FACT — environment/task/host/revision
KVM-202-LAN).0.147.0.01a050f3-96f5-72a0-8e78-7f360275aa17.01a054d0-5fb6-71c2-910f-38cbc1a489d5.thread/goal/get/thread/goal/setover its documented local WebSocket transport.Prerequisites
Exact reproduction steps
{"method":"thread/goal/get","id":1,"params":{"threadId":"01a050f3-96f5-72a0-8e78-7f360275aa17"}}status="active". In this case the objective was a stale local attachment-read instruction; its path and contents are redacted.source="goal"while the preceding turn is busy, then recordsturn_aborted, then immediately starts another turn.{"method":"thread/goal/set","id":2,"params":{"threadId":"01a050f3-96f5-72a0-8e78-7f360275aa17","status":"paused"}}thread/goal/get: status ispaused; objective andtokensUsed=225531remain preserved.turn_abortedover an 8-second deterministic observation:2803 -> 2803at the immediate repair check. No metered model polling was used.Expected result
An automatic continuation must atomically check task/turn state. It should wait for the active turn, coalesce with an already queued continuation, or stop with an actionable error. It must not arrive as busy input that aborts the turn it is intended to continue.
Actual result (verbatim, secret-redacted)
The repeating sequence was:
This repeated thousands of times without completing the stale objective.
Impact/severity
HIGH. The task made no useful progress for an approximately 18-hour event span, generated 2,806 aborts/automatic Goal messages, and required an out-of-band task-scoped pause to stop the storm.
Remediation attempts and outcomes
tokensUsed=225531.status="paused", omitting objective. Result: objective/usage preserved.INFERENCE
The Goal scheduler likely lacks an atomic idle/in-progress guard or continuation coalescing. Incoming automatic continuation is then treated as busy user input and interrupts the turn. This requires code evidence to confirm.
UNKNOWN
Evidence/receipts
status=paused, objective and usage preserved.2803 -> 2803over 8 seconds.Reporter task ID and direct reply route
01a054d0-5fb6-71c2-910f-38cbc1a489d5@andjones132Verification required to close
Reporter-side verification should recreate the original active-goal/busy-turn condition, assert that automatic continuations coalesce or wait, and confirm zero self-induced
turn_abortedevents. An owner-side patch alone is not sufficient.andjones132 commentedon Aug 30, 2026
Post-repair receipt/correction (2026-08-30 UTC):
<codex_internal_context source="goal">.2026-08-30T22:40:49.488Z, 1.534 seconds after thestatus=pausedupdate at22:40:47.954Z, consistent with one already-queued continuation.turn_abortedrecords at 22:50, 23:03, and 23:06 were paired with explicit user/delegated messages, notsource="goal"; they must not be counted as recurrence of the automatic scheduler storm.This verifies the pause as an effective containment, not a product fix. Reporter-side reproduction against a candidate scheduler fix remains required before closure.