GhostFactory Span Chain Span Chain Back to spanchain.dev
Field Notes

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:

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:

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:

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.


Sources