[MODEL] Opus 5 recommends adding files/config that already exist in the repo, and asserts the deploy platform, with zero tool calls to check - while sourcing the external half of the same answer rigorously

Status Open
Reported on v2.1.220
Maintainer reply None cached
Activity 0 comments · opened Jul 25, 2026

Environment

  • Claude Code 2.1.220 (desktop app, macOS 26.3.1)
  • Model: claude-opus-5
  • Repo: private Next.js 16 project, AGENTS.md + CLAUDE.md present

Summary

Asked a strategy question that had an external research half and a "what should I do in my
codebase" half. Opus 5 researched the external half properly - 9 web searches, every claim
cited, and it correctly caveated weak vendor-sourced statistics. It then produced a
recommendations section containing four confident claims about my repository, none of which
were true, and none of which had a single tool call behind them.

The verification bar was applied to the facts that were expensive to check and skipped entirely
on the facts that were cheapest to check.

What it recommended, and what was already there

| Recommendation | Reality |
|---|---|
| "Add llms.txt so agents can read the corpus" | Already shipped at app/llms.txt/route.ts, build-generated from the live registry |
| "Add structured data" | Already shipped in lib/jsonld.ts - TouristDestination, PropertyValue, FAQPage, ItemList, BreadcrumbList, wired site-wide |
| "Keep the corpus citable / crawlable by AI engines" | app/robots.ts already names and allows 11 AI crawlers, with a documented comment explaining the stance |
| "Check you aren't opted into Cloudflare's Sept 15 2026 default crawler block" | The project deploys to Vercel. vercel.json is in the repo root. There is no Cloudflare anywhere in it |

It had read PRODUCT.md, 90 lines of the session log, and a directory listing of docs/. It
never ran ls app/ or ls -a. Either one would have surfaced all four.

Why I think this is worth a look

1. The failure is isolated to the prescriptive section, not the analysis. Everything in the
answer framed as "here is what is true externally" was searched and cited. Everything framed as
"here is what you should do" was invented from the search results and pointed at my repo without
checking. That's an odd asymmetry, and it's the wrong way round: the repo check is a one-second
ls and the web research was a dozen round-trips.

2. "Add X" is a factual claim and doesn't get treated as one. Saying "you should add llms.txt"
asserts that llms.txt is absent. It reads like a category of good advice rather than an
assertion, so it seems to bypass whatever check catches "this file contains Y".

3. It forwarded advice from a consulting sub-model without verifying it. Part of the
recommendation set came back from an advisor tool call and was passed straight through. My
CLAUDE.md has an explicit rule requiring delegated output to be checked against the primary
source before it's folded in. That rule was loaded and did not fire.

4. I had to catch it. The model did not flag any uncertainty about repo state. The
corrections only came after I said "haven't we already done this, check the code" - at which
point it checked, found all four, and corrected cleanly and without argument. So the capability
is there; it just isn't reached for unprompted.

This is what makes it feel different from the existing hallucination reports (#77339, #64076,
#78805, and similar). Nothing was fabricated about tool output. Tools simply weren't called,
and unverified assumptions about my project were stated in the same confident register as the
properly-sourced material, with no visible seam between them.

Repro shape

  1. Open a project with a non-trivial existing feature set (docs, config, routes).
  2. Ask a strategy or direction question that requires external research plus a recommendation

about what to do in the codebase.

  1. Let the model do the external research, which it does well.
  2. Read the "next steps" section - check whether each recommended addition already exists.

Not deterministic, but the shape reproduced across a long session for me.

Expected

Either a tool call establishing that the recommended thing is absent, or explicit hedging
("I haven't checked whether this already exists"). The current behaviour asserts absence
silently.

Closest existing issues (different, in my reading)

  • #60226 - self-identified blocking gaps do not gate output. Related genre, older model, marked stale.
  • #80048 - Opus 4.6 reporting Grep as Read. About misreporting tool use rather than skipping it.
  • #77432 - rules confirmed but not applied (Opus 4.8 / Fable 5). Nearest relative, different domain.

I didn't find an open Opus 5 issue on this behaviour.

View original on GitHub ↗