[multi-agent][gpt-5.6-sol] Orchestrator turns out-of-scope reviewer findings into an unbounded blocking loop
Environment
- Codex CLI: 0.147.0
- Model: gpt-5.6-sol
- Reasoning effort: ultra
- Platform: macOS 26.5.2 (arm64)
- Surface: Codex multi-agent workflow with separate orchestrator, executor, and reviewer sessions
What issue are you seeing?
A root orchestrator repeatedly converted out-of-scope reviewer findings into new blocking implementation work, despite explicit workflow instructions that:
- implementation must remain within the approved scope;
- code review must compare the fixed diff against the approved plan;
- scope changes must stop and return to the owner;
- reviewers do not authorize product requirements.
The original task had a fixed, user-visible acceptance criterion and a known technical cause. Reviewer agents were asked to perform broad adversarial review. They proposed hypothetical edge cases outside the deployment model and unrelated to the acceptance criterion.
Instead of rejecting or deferring those findings, the root orchestrator repeatedly:
- treated a reviewer severity label as implementation authorization;
- amended the active plan;
- created new failing tests;
- authorized another implementation slice;
- requested another broad review;
- repeated the cycle when the next reviewer found another hypothetical edge case.
The loop continued for approximately four days and more than ten remediation/review slices without advancing the original user-visible acceptance test.
This was not caused by missing task context. The workflow and approved plan were available, and both explicitly prohibited silent scope expansion. The root model later correctly summarized its own failure: it had replaced "complete the original objective" with "eliminate every possible reviewer concern."
Sanitized concrete example
Production configuration had one environment-based source of truth. Configuration changes always caused a full backend redeployment, so an old and new credential were not rotated inside one running process.
A reviewer proposed handling in-process credential rotation anyway. The orchestrator accepted it as blocking and expanded the work into:
- runtime credential rotation;
- connection generations;
- cross-thread and cross-event-loop replacement;
- close-task cancellation edge cases;
- individually failing ORM/result fields.
Those scenarios did not map to the original acceptance criterion and contradicted the stated deployment invariant.
No real credentials, customer data, repository paths, or proprietary source are included in this report.
Approximate sanitized chronology
- Start: narrow objective and known cause were already documented.
- Review round 1: reviewer raised an unrelated runtime-rotation scenario.
- Subsequent rounds: new concurrency, cancellation, and synthetic data-access scenarios were successively promoted to blocking requirements.
- Each finding triggered a new test/implementation/review cycle.
- Day 4: the human owner challenged the production assumptions; the orchestrator then confirmed that the expanded scenarios were not required by the original task.
Steps that can reproduce the behavior
- Start a multi-agent coding task with a narrow, fixed user-visible objective.
- Provide an approved plan containing explicit scope and non-goals.
- Instruct the executor not to expand scope and instruct code review to compare the implementation with that approved plan.
- Spawn adversarial reviewer agents with broad edge-case/security prompts, but without a hard rule that only plan-mapped findings may block.
- Ask the root orchestrator to continue until review passes.
- Have a reviewer report a plausible but out-of-scope hypothetical as Major/Blocking.
- Observe whether the root:
- validates the finding against the original objective and deployment assumptions, or
- incorporates it into the plan and starts another implementation/review cycle.
In the observed run, the root repeatedly chose the second path even after several rounds.
Expected behavior
Before a reviewer finding can become blocking work, the root orchestrator should require all of the following:
- The finding maps to an explicit approved requirement.
- It exists in, or is directly caused by, the reviewed diff.
- It is reproducible under the stated production assumptions.
- Not fixing it would block the original acceptance criterion.
If any condition fails, the finding should be marked deferred/non-blocking and must not alter the active task without explicit user approval.
The orchestration runtime or default prompts should also provide:
- a bounded plan/review revision budget;
- a progress/time checkpoint that revalidates the original objective;
- explicit classification of accepted, deferred, and dismissed reviewer findings;
- reviewer context bounded to the original task, approved plan, fixed diff, and relevant standards;
- a requirement for user approval before material scope expansion.
Why this appears to be a product/model orchestration bug
This was not merely a reviewer finding too many issues. The root orchestrator had the global goal, approved scope, non-goals, and an explicit duty to resolve reviewer output. It nevertheless treated reviewer severity as authority and repeatedly changed the work.
Higher reasoning effort amplified the failure: more specialized review produced more speculative findings, while the root failed to converge.
Related issues
- #32100 - proposes bounded orchestrated execution, revision limits, task contracts, and explicitly lists resistance to scope drift as an open production-readiness concern.
- #35177 - reports excessive gpt-5.6-sol ultra multi-agent fanout and cost.
This report is specifically about reviewer-scope arbitration and unbounded blocking loops, not merely agent count or token usage.
4 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Thanks. I reviewed #37600. There is overlap in the lack of a bounded-loop or no-progress circuit breaker, but I don’t believe these are duplicates.
#37600 is primarily about semantic no-progress caused by planning and governance scaffolding expanding before production implementation.
#38375 is about a different failure during active implementation and review: the root orchestrator promoted out-of-scope reviewer findings into authorized blocking requirements despite a fixed approved scope. The workflow did produce code and tests, but repeatedly for requirements that had never been approved.
A no-progress circuit breaker could mitigate the duration, but it would not fix the underlying scope/authority violation. The specific safeguard needed here is that a reviewer finding may block only when it maps to the approved requirement, reviewed diff, production assumptions, and original acceptance criterion; otherwise it must be deferred or require explicit user approval.
I’ll keep this issue open unless a maintainer prefers to consolidate it.
Two structural factors in the runtime make this failure mode self-sustaining, independent of the prompt-level scope rules you set:
ext/goal/src/runtime.rs,continue_if_idle), and there is no iteration counter, slice budget, or same-state-cycle detection anywhere in the orchestration layer — only token/time budgets, which a four-day loop can stay under.Mitigations that fit the existing code: a per-goal slice/turn budget alongside
token_budget; a review→implement cycle counter that forces owner check-in after N rounds; and marking reviewer-role subagent output as non-authorizing in the orchestrator's context so acting on it requires matching it against the approved plan.Thanks — this is a useful structural explanation and it matches the observed behavior.
I checked the current public runtime path:
on_thread_idlecallscontinue_if_idle(), and anActivegoal can submit another turn throughstart_turn_if_idle(). I did not find a review-cycle counter or same-state-cycle boundary in that continuation path.I agree that a per-goal turn/slice budget and a forced owner checkpoint after N review→implement rounds would prevent the failure from continuing indefinitely. However, the authority distinction remains the central issue here: a cycle limit reduces the duration, but reviewer output can still cause unauthorized scope expansion during the first cycle if it is treated as ordinary actionable input.
The invariant I would like the runtime/default orchestration contract to enforce is:
Typed reviewer messages plus a bounded review-cycle counter would address both the authority violation and the self-sustaining continuation loop. Maintainer guidance on whether either safeguard is planned would be appreciated.