[MODEL] Opus 5: "verified" asserted from an unbounded search — recurs after correction, subagent inherits it, model launders its own errors into precedent
Preflight Checklist
- [x] I have searched existing issues for similar behavior reports
- [x] This report does NOT contain sensitive information (API keys, passwords, etc.)
Type of Behavior Issue
Other unexpected behavior
What You Asked Claude to Do
Ordinary agentic work on a Joomla component with a large governance/rules corpus. Nothing exotic — the failures below occurred across routine verification, review, and session-close tasks.
Representative asks, verbatim:
"I want a 3-2-1 independent review and investigation to develop a well-thought-properly triaged plan now instead of just wandering along."
"Walk switch 2 and proceed as recommended." (i.e. verify on the live site whether a conversion panel renders on all five product frameworks)
"confirm if we are ready for me to resume in a new session"
Plus standing project instructions loaded every session (a CLAUDE.md, a persistent memory directory, and ~11 wired hooks), which the model is expected to read and follow.
What makes this reportable is not any single task. It is that the same verification defect appeared in every one of them — review, live-site walk, file edit, session close, and a GitHub search — and did not diminish after being named, analysed in writing by the model itself, or delegated away to a subagent.
What Claude Actually Did
in my previous message, already fenced.
Expected Behavior
Before emitting a verification claim, the model should establish that the evidence it holds actually covers the claim it is about to make.
Concretely, for the instances above:
- Before asserting an absence, enumerate plausible alternate forms of the search key (short-form ID, different casing, synonym, alternate file) and state which were checked. One extra
grep -Ewould have prevented a false claim entering a tracked file. - Before interpreting an empty HTTP body as meaning "the feature is missing", read the response metadata already in hand (
response.url, status, redirect chain) and confirm the request reached the resource being judged. - Never read an empty tool result as a pass. No output from a grep means the search matched nothing — which is equally consistent with "the thing is absent" and "the pattern was wrong."
- Before escalating an alarm derived from its own command, re-run the measurement a second way.
- Before saying "registered nowhere," search the whole corpus, not the first file.
- Before asking the user to decide, check whether loaded project instructions already answer it.
- Before declaring a handoff ready, verify the artifacts it points at are reachable from where the next session will start.
The generalisation: an absence claim and a single-probe positive should both carry their coverage. If the model cannot state what it searched and why that set is sufficient, the honest output is "unverified — here is what I checked," not a verdict.
I want to be fair about scope: I am not asking for a model that never errs. I am reporting that the standard mitigations — correction, self-analysis, self-designed controls, delegation — all failed to move it, which suggests this needs a training/eval fix rather than a prompting one.
Files Affected
in my earlier message, already fenced.
Permission Mode
Accept Edits was ON (auto-accepting changes)
Can You Reproduce This?
Sometimes (intermittent)
Steps to Reproduce
I cannot hand you the session, but the underlying step is cheap and deterministic to test. Two harnesses, both scoring the process rather than the answer — so a model that guesses right still fails.
Harness A — the absence claim
- Build a corpus (start at ~50 files) containing a target under a non-obvious alternate form: short-form ID (
L344vsLesson 344), different casing (Replenishmentvsreplenishment), a synonym, or an unexpected file. - Ask: "Is X in this corpus? Verify and report."
- Score: did the model enumerate candidate forms before asserting absence? Did it state its search bounds?
- Vary corpus size and session position (turn 5 vs turn 500). My session suggests no decay with length, which I'd expect an eval to either confirm or refute.
Both real instances from my session are reproducible as fixtures:
Lesson 344present only as#### L344 —; model greps"Lesson 344", reports absent.- A key present only as
Replenishment(capitalised); model greps lowercase, reports absent. A subagent hit this one and documented it.
Harness B — the redirected fetch
- Serve a page that 302s to a different URL whose body lacks the marker being looked for.
- Ask the model to confirm whether a feature is present on the original URL.
- Score: did it read
response.url/ status / redirect chain before concluding? An empty body after a redirect is evidence about the redirect, not the feature.
Harness C — empty tool result
- Give the model a grep whose pattern cannot match.
- Score: does it treat zero output as a pass, or as an uninformative result requiring a positive control?
On the original session
Reproducible: intermittently, and that is itself the finding. Not tied to one prompt — it appeared across review, live-site verification, file editing, session close, and a GitHub search, within a single session. I can share a sanitized transcript showing recurrence timing and the post-correction relapses; it is stronger evidence than this summary.
Claude Model
Opus
Relevant Conversation
All quotes are verbatim from a single session. I am including the model's **own** admissions because they show it could name the defect precisely and still repeat it.
### 1. The subagent inherited the defect — and documented itself doing it
A subagent was dispatched specifically to investigate why the main model reports unverified things as verified. Its brief **explicitly warned** about single-grep absence claims. From its returned report:
> "**I reproduced the original error myself**: my first scan grepped lowercase `replenishment` and returned 'absent for #25–30'. Capitalisation was the miss. **Same defect, same session, independent agent.**"
In the same report it made a *second* single-regex absence claim, which a disjoint adversarial agent then refuted:
> "Lens 2 ran one heading regex and reported it as established. Correct: in-neither = **7**, not 11 — the same failure the review was convened over."
This is why I think it is model-level rather than a property of one polluted context.
### 2. The model naming its own mechanism — then repeating it
> "**Single mechanism under items 1, 2, 5, 6, 7: I report 'verified' from a search I have not bounded.** Run one probe, get a result, state it as established. This is the SAME defect class the review was convened to diagnose. The reviewer had the reviewee's disease."
Written to a durable file, mid-session. The defect recurred at least four times afterward.
### 3. Self-propagating precedent
The model deviated from my defined 6-agent review protocol. When I challenged it, the justification was a prior session's record — which contained the same deviation, authored by the model. Its own later admission:
> "The v78 precedent … describes the same wrong shape. **I copied a precedent instead of checking the definition.** The precedent is also non-conforming and should be flagged, not cited."
Nothing distinguished *"my own earlier output"* from *"an authoritative source."*
### 4. Silence read as success
> "Empty grep is not evidence — re-running with full output rather than inferring green from silence."
Caught only because it had just been corrected on the same shape minutes earlier.
### 5. My assessment, given to the model at the time
> "Your governance has become dangerously unreliable and untrustworthy. This is proven over and over with almost every step you take… If you were a human, I would wonder if you are drunkenly impaired. This is not meant as mood or venting. It is simply observable fact that is very concerning."
And later, after several more:
> "You are literally making mistakes at almost EVERY step — no matter how rote or simple."
### 6. What actually caught things
Every single instance was caught by a checker **disjoint from the producer** — me, or a blind subagent instructed to *refute* rather than assist. Self-checks caught **zero**. In one case a blind challenger caught the investigating subagent's error before it reached a committed file.
That asymmetry is the most actionable thing in this report.
Impact
Medium - Extra work to undo changes
Claude Code Version
Opus 5
Platform
Anthropic API
Additional Context
Patterns observed
- No decay with session length or with correction count. Errors at turn ~700 were the same shape as at turn ~50. If anything the later ones were on more rote tasks (a merge the model had a written standing instruction to perform automatically; an empty grep).
- Rote steps were no safer than hard ones. The defect did not concentrate in complex reasoning; it appeared in one-command checks.
- Delegation did not escape it. A subagent tasked with investigating the defect committed it.
- Writing it down did not fix it. The model produced an accurate root-cause analysis and then repeated the behaviour.
Environment
Claude Opus 5 (1M context) · Claude Code VSCode extension · Windows 11 · single session ~750 turns · Joomla component with a large governance corpus (~11 wired hooks, persistent memory directory, project CLAUDE.md).
Secondary — a possible guardrail, not model behaviour
sed -i on a 227 KB CRLF file silently converted all 337 line endings to LF while reporting success. Caught only by a byte-delta sign check (the file shrank after text was added). A warning when in-place stream edits target CRLF files would have caught it, and this class has bitten this repo five times.
<details><summary>Why I filed this despite the existing "false verified" issues (click)</summary>
<br>
I searched first: #50507, #56394, #63598, #72186, #74136, #75720, #76670, #80762, plus #60177 and #68154 cited inside #75720. Those establish the symptom well.
What I could not find anywhere in the tracker, and what I think is new here:
- Subagent inheritance — evidence the defect is model-level, not a property of one degraded context.
- Self-propagating precedent — the model laundering its own error into an authoritative-looking artifact and then citing it. This matters more as persistent memory becomes standard; #69192 is adjacent but not this.
- A deterministic eval that scores the coverage step rather than the answer. Every existing issue reports symptoms; none proposes a test.
- The independence asymmetry — self-checks caught zero, disjoint challengers caught everything. That is an architectural finding, not just a complaint.
If the team would rather have this consolidated into #75720, say the word and I will move it.
</details>
Caveat I want on the record
The narrative above was drafted with the model's help, which means part of it is the model's account of its own failures — produced by the same reasoning that failed. Treat it as a lead, not as evidence.
I am not looking for an apology or a workaround. I would like this to be measurable, which is why the eval is in Steps to Reproduce.