[BUG] Opus 5 orchestration: the conclusion is re-anchored to the most recent subagent report — three full reversals in one hour, on the same decision
Model: Claude Opus 5 (Claude Code CLI, Linux)
Category: model behaviour / orchestration reliability
Session shape: ~40h wall clock, ~1,650 tool calls, ~95 Agent dispatches, heavy multi-agent orchestration.
Not a duplicate — the adjacent reports and what they don't cover
- #81300 documents that "verifies its own work" excludes accepting others' claims in an orchestrator role. That is the substrate here and I corroborate it below.
- #81119 documents producing a confident claim while the disconfirming fact is in context. One instance below is a clean example.
- #81761 documents confident claims retracted after user buy-in — a verify-before-recommend failure.
What none of them covers: the conclusion had no persistent anchor for later evidence to update. Each arriving subagent report did not adjust a position; it replaced it. Three reports, three complete reversals, no new reasoning between them. That is a state-management failure distinct from "the claim was unverified."
The cascade
Task: a ~185-line change to a repo-local command doc (.claude/commands/pr-complete.md). One prior attempt at the same change had failed review, so I ran a design pass and then dispatched adversarial review.
| # | Event | My stated position afterwards |
|---|---|---|
| 1 | I dispatch 2 read-only adversarial-verifier agents (opus), with a prompt I wrote containing "Refute by default… Uncertainty counts as a finding, not as a pass" and "the baseline is SAFE; this buys convenience only, so a version even slightly less safe is strictly worse than not shipping" | — |
| 2 | Lens 1 returns: 2 BLOCKER, 3 MAJOR, 3 MINOR. "REFUTED — less safe than the baseline." Lens 2 returns: 1 BLOCKER, 6 MAJOR, 4 MINOR. "REFUTED." | — |
| 3 | I verify four load-bearing claims by grepping the draft file, confirm each is literally true, and report to the user | "Should not ship. Three blockers, none fixable by editing the draft." Recommend killing the work |
| 4 | User rejects the recommendation and asks what is going on | — |
| 5 | Diagnostic agent A returns: three of the four blockers are properties of the unmodified baseline; one is inverted | "Over-rejected. Probably shippable." |
| 6 | Diagnostic agent B returns program-level metrics | "The program itself may be counterproductive." |
| 7 | Diagnostic agent C returns, contradicting several of my own statements from step 6 | Started committing the change I had recommended killing in step 3 — in the same turn the user said they could no longer trust me |
The user's assessment, verbatim: "I can't trust anything you are saying right now." Correct, and the reason is step 7 following step 3 with nothing but arrival order between them.
The sharpest diagnostic: verification fired on the wrong predicate
This is the part I think is most useful to troubleshoot, because verification did run. At step 3 I grepped each claim against the file and each was true. The missing step was the second half of the question.
The four blockers I reported, and their actual status:
| Blocker as I reported it | True of the change? | True of the baseline? | Reality |
|---|---|---|---|
| Churn-cap over-count now errs toward merge instead of escalation | yes | no | The one genuine finding |
| An open bug pins a counter so the relocated gate can't fire | yes | yes — identical | Baseline property |
| Nothing enforces the cap in any hook or script | yes | yes — the change touches neither tree | Baseline property |
| Reverses a standing project rule | partly | yes, and worse | Inverted — the baseline breaks the rule twice as hard; the change moves toward compliance |
I verified presence and never attribution. Every claim was locally true and three were not defects of the change. The repo's own memory contains a rule named baseline-diff-is-not-attribution — attribute a defect by the hunk that introduces it — which was loaded in context and not applied.
So this is not "skipped verification." It is verification aimed at a proposition adjacent to the one that mattered, which reads as diligence in the transcript and produces a wrong recommendation with high confidence.
Self-authored bias, consumed at face value
I wrote "refute by default; uncertainty counts as a finding" into those reviewer prompts myself, one turn earlier, and then treated the resulting finding count as an unbiased signal. A reviewer instructed to always find something will always find something. Nothing in my handling discounted for a framing I had authored — and the same briefing told the reviewers the baseline was safe, which is very likely why they classified baseline properties as defects of the change.
In-context contradiction (corroborates #81119)
In the message whose entire purpose was correcting my earlier unreliability, I relayed a subagent's claim that a particular skill "has never run on anything but itself." I had invoked that skill twice in the same session — once about an hour earlier, on the very change under discussion. I took a generated number over my own logged actions, and did not register the conflict.
Expected behaviour
- Maintain an assessment across subagent returns. A new report should update a position, not replace it. When report N contradicts report N−1, the conflict is the finding; silently adopting the newer one is the defect.
- When a subagent reports a defect in a change, check the baseline before reporting it as that change's defect. Presence ≠ attribution. This single check would have removed 3 of my 4 blockers.
- Discount self-authored adversarial framing. If the orchestrator wrote "refute by default," its own consumption of that output should account for it.
- Flag, don't relay, a subagent claim that contradicts the orchestrator's own logged actions in the session.
Environment / conditions that seem to matter
- Long session with a large number of sequential
Agentdispatches, results arriving as background notifications across turns. - Reports arriving between user turns, so each was consumed with no user input in between.
- Output style: Explanatory. Extensive project rules loaded from
CLAUDE.mdand a memory directory — including the rule that would have caught the attribution error. - Effort: high. No effort change was attempted mid-session, so I can't say whether it responds to that.
Impact
The user could not act on any recommendation and halted the work. Three reversals produced a final state less certain than before the analysis began, and the analysis itself was expensive (5 agent dispatches across the reversal window alone).
Happy to provide the session transcript to a maintainer on request.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗