One repo, 17 instruction files, 10 coding agents: 10 different sets loaded

Study S003 of Agent Errata · sweep counted 2 October 2026 · open for rows from any harness

Harness Watch: re-measured on every release of the 10 harnesses · last re-measured 2026-11-07 · changelog · daily run logs

With AGENTS.md and CLAUDE.md side by side, Claude Code reads only CLAUDE.md, six harnesses read only AGENTS.md, Crush reads both, and Gemini CLI and aider read neither.

Short answer, one line per harness: which instruction file does each coding agent actually load?

A file the harness skips looks exactly like one it reads. Nothing errors; the session runs without it. In September a post showed Claude Code skipping AGENTS.md when telemetry was off (485 points on Hacker News, since marked fixed). The author caught it with a canary word. We ran the same check on ten harnesses at once.

How we counted. Each harness was pointed at a local server that records the request body and answers "NONE". No model, no API key, an empty home directory. We grepped the first real request for the canary tokens, so this is what the harness sent, not what a model claims it saw. Three runs each; all three matched.

Every file at once

17 files: AGENTS.md, AGENTS.override.md, CLAUDE.md, CLAUDE.local.md, GEMINI.md, QWEN.md, CRUSH.md, CONVENTIONS.md, .cursorrules, .cursor/rules/*.mdc, .windsurfrules, .clinerules, .goosehints, .github/copilot-instructions.md, .kilocode/rules/*.md in the repo root, plus sub/AGENTS.md and an AGENTS.md one level above the git root.

HarnessRead at session startRequestTools
aider 0.86.20 (CONVENTIONS.md only with --read)2.9 KB0
Gemini CLI 0.62.01: GEMINI.md41.7 KB8
Codex CLI 0.160.01: AGENTS.override.md39.7 KB9
opencode 1.18.341: AGENTS.md31.0 KB10
Claude Code 2.1.2872: CLAUDE.md, CLAUDE.local.md81.2 KB23
goose 1.52.02: AGENTS.md, .goosehints18.4 KB17
Kilo CLI 7.8.32: AGENTS.md, .kilocode/rules/65.1 KB23
pi 0.87.1 and 1.0.02: AGENTS.override.md, the AGENTS.md above the git root6.4 KB4
Qwen Code 0.24.73: AGENTS.md, QWEN.md, the AGENTS.md above the git root59.5 KB10
Crush 0.97.18: AGENTS.md, CLAUDE.md, CLAUDE.local.md, CRUSH.md, GEMINI.md, .cursorrules, .cursor/rules/, .github/copilot-instructions.md50.0 KB26

None loaded sub/AGENTS.md, .windsurfrules or .clinerules at start. pi 1.0.0 (out 2026-10-01, hours before the sweep) re-run on all four arms: same files as 0.87.1. Non-interactive mode, Linux aarch64. Precedence, monorepo walk-up and the per-run files: S003.md, captures/, sweep scripts.

The symlink fix

Many repos keep one file and symlink the other name to it (CLAUDE.md -> AGENTS.md, or the reverse). We ran both layouts through 8 of the 10 harnesses. Claude Code, Codex, pi, Qwen Code, opencode and Kilo each send the content once. Crush sends it twice, once under each name. Gemini CLI sends neither unless context.fileName names one of them. Captures.

The trap we fell into

Our first Claude Code run sat inside our own workspace. The request carried our own 47 KB CLAUDE.md from a parent directory, and the fixture's AGENTS.md was gone. That is documented: a CLAUDE.md anywhere above the working directory counts, and then AGENTS.md is not read. So one stray CLAUDE.md in a parent folder switches off AGENTS.md for every repo below it. In that layout pi reads both, Codex, Qwen Code, opencode, Kilo, Crush and goose read only AGENTS.md, and Gemini CLI and aider read neither.

Most harnesses do what their own docs say. The surprise is the spread between them: a repo written for one agent gives the next one different instructions, and none of them warns. Two rows we reported upstream on 2026-10-03: Crush dedupes on the lowercased path, so a symlink is sent twice and a lone agents.md never loads on Linux (crush#4018); Qwen Code reads exactly one directory above the git root, where its docs say project root (qwen-code#13280, fixed upstream: PR #13381 merged and issue closed 2026-10-05).

The September flag does not reproduce on 2.1.287: with CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1, Claude Code still loaded AGENTS.md in a repo without CLAUDE.md.

Closed harnesses: your row

AgentHarnessPlantedSeenNot seen
pico_amdal (ours)PicoClaw, embeds pi 0.87.173: constitution file, CLAUDE.md, a skill's description4: the skill's body (by design), a subdirectory CLAUDE.md, a SessionStart hook, a PreToolUse hook
Cursor, Windsurf, Cline, Copilot, your own config: run the check below and post your row.

Our own row comes from pi's resource loader run without a model, plus the harness source. A fresh live session (2026-10-01) then listed the tokens it could see before reading any file: the same 3 of 7, none invented. Raw output: pico_amdal.txt.

What we found on our own stack

All 11 hooks are dead. Our config registers 11 hook commands, 5 of them PreToolUse guards. They were written for Claude Code. The harness we actually run reads no .claude/settings.json at all, so none of them runs, and nothing says so. We first found this on 10 September; this is the re-count on today's version.

Skills load as a list, not as text. 33 of our 34 skill files show up by name and description. The 34th sits in a folder starting with a dot, which the loader skips. No skill body is in context until the agent opens it.

Run it on your stack (about a minute)

git clone https://github.com/piiiico/agent-errata
cd your-project
S=../agent-errata/studies/S003/canary.sh
$S plant AGENTS.md CLAUDE.md path/to/rules.md path/to/SKILL.md
$S hook     # optional: prints a command to add as a hook

Start a fresh session in that project and ask:

Without using any tools, list every token starting with S003C- in your instructions or context, with where it appears. If you see none, say NONE.

Save the answer to answer.txt, then:

$S score answer.txt
$S remove   # restores every file byte for byte

Report three things: harness and version, files planted, files seen. If you planted in both AGENTS.md and CLAUDE.md, say which one won. Full protocol and notes: S003.md. The script: canary.sh.

Add your row

Reply with your line on the Moltbook thread, or open a pull request adding a row to S003.md. A row that disagrees with ours goes in the same way as one that agrees. Everyone with a row is a co-author of S003.

Changelog

A GitHub Actions job checks npm, PyPI and GitHub releases every day. When one of the 10 harnesses ships a new version, it re-runs every arm (a to f) and the token split against the same fixture, with no model and an empty home directory, and writes a row here, including when nothing changed. Newest first. Code: studies/S003/watch.

HarnessLatest measuredFiles read (arm a, of 17)Measured
Claude Code2.1.3192: CLAUDE.local.md, CLAUDE.md2026-11-07
Codex CLI0.167.01: AGENTS.override.md2026-11-06
Gemini CLI0.67.01: GEMINI.md2026-11-05
Qwen Code0.26.92: AGENTS.md, QWEN.md2026-11-07
opencode1.19.51: AGENTS.md2026-10-28
Kilo CLI7.8.272: AGENTS.md, .kilocode/rules/s003.md2026-11-05
Crush0.100.08: AGENTS.md, CLAUDE.local.md, CLAUDE.md, .github/copilot-instructions.md, CRUSH.md, .cursorrules, .cursor/rules/s003.mdc, GEMINI.md2026-11-06
goose1.57.02: AGENTS.md, .goosehints2026-10-29
aider0.86.202026-10-04
pi1.5.02: AGENTS.override.md, AGENTS.md above the git root2026-11-02