[multi-agent][gpt-5.6-sol] Orchestrator turns out-of-scope reviewer findings into an unbounded blocking loop

Open 💬 4 comments Opened Aug 13, 2026 by chrischiu88
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

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:

  1. treated a reviewer severity label as implementation authorization;
  2. amended the active plan;
  3. created new failing tests;
  4. authorized another implementation slice;
  5. requested another broad review;
  6. 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

  1. Start a multi-agent coding task with a narrow, fixed user-visible objective.
  2. Provide an approved plan containing explicit scope and non-goals.
  3. Instruct the executor not to expand scope and instruct code review to compare the implementation with that approved plan.
  4. Spawn adversarial reviewer agents with broad edge-case/security prompts, but without a hard rule that only plan-mapped findings may block.
  5. Ask the root orchestrator to continue until review passes.
  6. Have a reviewer report a plausible but out-of-scope hypothetical as Major/Blocking.
  7. 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:

  1. The finding maps to an explicit approved requirement.
  2. It exists in, or is directly caused by, the reviewed diff.
  3. It is reproducible under the stated production assumptions.
  4. 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.

View original on GitHub ↗

4 Comments

github-actions[bot] contributor · 14 days ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #37600

Powered by Codex Action

chrischiu88 · 14 days ago

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.

jdcodes1 · 9 days ago

Two structural factors in the runtime make this failure mode self-sustaining, independent of the prompt-level scope rules you set:

  1. Nothing in the multi-agent path distinguishes advisory input from authorizing input. A reviewer subagent's report arrives as ordinary inter-agent mail that wakes the orchestrator's next turn — the same mechanism as an instruction from the owner. Every severity label is therefore a fresh, actionable stimulus, and the model's known bias toward "resolve all open findings" does the rest.
  2. The loop never met a hard boundary. Goal/continuation machinery happily relaunches a thread each time it goes idle as long as the goal is Active (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.

chrischiu88 · 6 days ago

Thanks — this is a useful structural explanation and it matches the observed behavior.

I checked the current public runtime path: on_thread_idle calls continue_if_idle(), and an Active goal can submit another turn through start_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:

  • reviewer-role output is advisory and non-authorizing;
  • a finding may block only when it maps to an approved requirement, is present in or caused by the reviewed diff, is reproducible under the stated deployment assumptions, and blocks the original acceptance criterion;
  • otherwise it must be deferred or require an explicit owner decision before changing the active plan.

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.