Changelog said AGENTS.md. The session never recorded it.
Two developers pull the same commit. Same AGENTS.md. Same canary instruction buried in the file. One laptop answers with the canary word. The CI runner – or the other laptop with telemetry off – answers as if the file were never there.
Nobody gets a warning. The session looks healthy. The model just never saw the project instructions.
That is not a philosophy problem. It is a record problem.
What happened in Claude Code
In late September 2026, Claude Code 2.1.277 added a fallback: if a project has no CLAUDE.md, read AGENTS.md instead. The changelog said so. Coverage noted the practical win for teams that keep one instruction file across Codex, Cursor, and Claude (DevOps.com).
Then measurements showed a quieter path. The loader sat behind a remote feature flag. With telemetry or nonessential traffic disabled, the local file was skipped – no toast, no stderr line, no “skipped because…” (blog.szypowi.cz). On Hacker News, Anthropic’s mpoteat called it a rollout artifact tied to a remote kill-switch and said it was fixed in 2.1.281 (HN discussion).
Treat the version numbers as yesterday’s incident. Keep the class of failure.
The class is: announced support is not the same thing as a recorded load.
Claim versus record
“Supports AGENTS.md” is a product claim. It lives in a changelog and in docs. It is useful. It is not a session fact.
A session fact would answer questions like:
- Which instruction set was in effect for this run?
- Was it
CLAUDE.md,AGENTS.md, both, managed-only, or neither? - Did a feature flag resolve to on, off, or unavailable?
- If the file existed on disk and was not loaded, what was the deny or skip reason?
Without those fields, two honest engineers can disagree about “what the agent was told” while looking at the same repo tree. One machine resolved the flag. One did not. One environment was Bedrock or Vertex or a gateway that never gets the flag. One was a fresh CI image on its first session after install. Docs already list several of these edge cases. The file on disk is identical. The effective prompt is not.
Debugging then drifts into the wrong layer. People rewrite prompts. They blame the model. They argue about whether the instructions are clear. The missing step is earlier: was the instruction set ever attached to this run?
Silence is the expensive part. A loud failure (“AGENTS.md present, loader unavailable”) costs seconds. A silent skip costs hours of prompt archaeology.
What a harness should record
You do not need a courtroom. You need a short, boring record for each agent run – something a human can compare across two machines without opening a binary.
At minimum, that record wants:
- Instruction-set identity – a hash (or equivalent) of the files actually loaded into project instructions, not of every markdown file that happened to sit in the tree.
- Mode – how the harness chose among
claude-md,agents-md, both, import-via-@, managed-only, or none. - Flag resolve – for anything gated remotely: on / off / unavailable / not applicable, plus which gate mattered.
- Deny or skip reason – when a candidate file exists and is not loaded: preference order, local override (
CLAUDE.local.md), telemetry or traffic policy, cloud provider gap, first-session flag fetch, explicit user setting.
None of that “proves” the model obeyed the instructions. Models still drift. Tools still fail. The point of the record is narrower: two runs can be compared on the inputs they claimed to use.
If laptop A’s record shows agents-md + hash H, and CI’s record shows none + skip reason flag_unavailable, you stop arguing about tone and start fixing the harness path. That comparison is a debugging primitive. It is not a marketing slide.
Divergence as the unit of interest
Teams already compare green runs that are not the same run. Different tools. Different retries. Different ambient context. Instruction-file loading is just another axis where sameness on disk hides difference in the session.
Make divergence inspectable:
- Same commit, same task brief, different instruction-set hash → stop and explain.
- Same hash, different mode or skip reason → stop and explain.
- Same everything in the record, different outcome → then look for a difference in other run inputs, the model, or tool calls.
The AGENTS.md incident is a clean teaching case because the mismatch is so concrete. One file. One canary word. Two answers. The fix for that week landed in a point release. The need for a load record does not ship away with it. The next fallback, the next mod, the next “reads X when Y is absent” will hit the same shape: policy and rollout gates sitting in front of a local read, with no session-visible skip.
Why the accountability angle shows up
Regulators and buyers keep asking how agentic systems are steered in practice. EU AI Act language around transparency and logging is one reason the industry talks about accountability at all. It is not a compliance checklist for this bug. It is context for why “what instructions did this run actually load?” is no longer a niche CLI complaint.
For builders, the takeaway is simpler than any statute. If your harness can announce a file format and then omit that file without a line in the run record, two copies of the same repo are not the same agent. Treat instruction loading like configuration you already review in CI: owned, hashed when applied, and explicit when skipped.
Same repo. Different effective prompt. Write it down.