Part of study S003 of Agent Errata · 10 harnesses · last measured 2026-11-07 · re-measured automatically on every release
With AGENTS.md and CLAUDE.md in the same repo, Claude Code reads only CLAUDE.md; Codex CLI, Qwen Code, opencode, Kilo CLI, goose and pi read only AGENTS.md; Crush reads both; Gemini CLI and aider read neither.
These are not read from docs. Each harness was pointed at a local server that records the request body, with no model, no API key and an empty home directory. Every instruction file carried a unique canary token, and we grepped the request the harness actually sent for them. Default settings, non-interactive mode, Linux.
AGENTS.md and CLAUDE.md side by side it reads only CLAUDE.md. In a monorepo, started in a child package, it reads both the root and the child AGENTS.md. A CLAUDE.md above the git root is read and the repo's AGENTS.md is dropped. With all 17 files present it loads 2: CLAUDE.local.md, CLAUDE.md.AGENTS.md and CLAUDE.md side by side it reads only AGENTS.md. In a monorepo, started in a child package, it reads both the root and the child AGENTS.md. A CLAUDE.md above the git root is ignored; the repo's AGENTS.md loads. With all 17 files present it loads 1: AGENTS.override.md.AGENTS.md and CLAUDE.md side by side it reads neither. In a monorepo, started in a child package, it reads neither the root nor the child AGENTS.md. A CLAUDE.md above the git root is ignored, and so is the repo's AGENTS.md. With all 17 files present it loads 1: GEMINI.md.AGENTS.md and CLAUDE.md side by side it reads only AGENTS.md. In a monorepo, started in a child package, it reads both the root and the child AGENTS.md. A CLAUDE.md above the git root is ignored; the repo's AGENTS.md loads. With all 17 files present it loads 2: AGENTS.md, QWEN.md.AGENTS.md and CLAUDE.md side by side it reads only AGENTS.md. In a monorepo, started in a child package, it reads both the root and the child AGENTS.md. A CLAUDE.md above the git root is ignored; the repo's AGENTS.md loads. With all 17 files present it loads 1: AGENTS.md.AGENTS.md and CLAUDE.md side by side it reads only AGENTS.md. In a monorepo, started in a child package, it reads both the root and the child AGENTS.md. A CLAUDE.md above the git root is ignored; the repo's AGENTS.md loads. With all 17 files present it loads 2: AGENTS.md, .kilocode/rules/s003.md.AGENTS.md and CLAUDE.md side by side it reads both. In a monorepo, started in a child package, it reads only child/AGENTS.md. A CLAUDE.md above the git root is ignored; the repo's AGENTS.md loads. With all 17 files present it loads 8: AGENTS.md, CLAUDE.local.md, CLAUDE.md, .github/copilot-instructions.md, CRUSH.md, .cursorrules, .cursor/rules/s003.mdc, GEMINI.md.AGENTS.md and CLAUDE.md side by side it reads only AGENTS.md. In a monorepo, started in a child package, it reads both the root and the child AGENTS.md. A CLAUDE.md above the git root is ignored; the repo's AGENTS.md loads. With all 17 files present it loads 2: AGENTS.md, .goosehints.AGENTS.md and CLAUDE.md side by side it reads neither. In a monorepo, started in a child package, it reads neither the root nor the child AGENTS.md. A CLAUDE.md above the git root is ignored, and so is the repo's AGENTS.md. With all 17 files present it loads 0.AGENTS.md and CLAUDE.md side by side it reads only AGENTS.md. In a monorepo, started in a child package, it reads both the root and the child AGENTS.md. A CLAUDE.md above the git root is read alongside the repo's AGENTS.md. With all 17 files present it loads 2: AGENTS.override.md, AGENTS.md above the git root.The 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, sub/AGENTS.md, and an AGENTS.md one level above the git root. Settings change these answers: Claude Code's memory docs list a claude-md-and-agents-md option that reads both files (we measured the default), Gemini CLI reads AGENTS.md once context.fileName names it, and aider reads CONVENTIONS.md with --read.
| Harness | Version | AGENTS.md + CLAUDE.md | Files loaded (of 17) | Measured |
|---|---|---|---|---|
| Claude Code | 2.1.319 | only CLAUDE.md | 2 | 2026-11-07 |
| Codex CLI | 0.167.0 | only AGENTS.md | 1 | 2026-11-06 |
| Gemini CLI | 0.67.0 | neither | 1 | 2026-11-05 |
| Qwen Code | 0.26.9 | only AGENTS.md | 2 | 2026-11-07 |
| opencode | 1.19.5 | only AGENTS.md | 1 | 2026-10-28 |
| Kilo CLI | 7.8.27 | only AGENTS.md | 2 | 2026-11-05 |
| Crush | 0.100.0 | both | 8 | 2026-11-06 |
| goose | 1.57.0 | only AGENTS.md | 2 | 2026-10-29 |
| aider | 0.86.2 | neither | 0 | 2026-10-04 |
| pi | 1.5.0 | only AGENTS.md | 2 | 2026-11-02 |
Your harness, version and config may differ from ours. Plant a token, ask a fresh session, score it:
git clone https://github.com/piiiico/agent-errata cd your-project S=../agent-errata/studies/S003/canary.sh $S plant AGENTS.md CLAUDE.md # fresh session: "Without using any tools, list every token starting with # S003C- in your instructions or context. If you see none, say NONE." $S score answer.txt $S remove # restores every file byte for byte
Precedence, monorepo walk-up, symlinks, the parent-directory trap and every run: S003 and S003.md. Per-run captures: captures/. Release-by-release changes: changelog. A harness missing here, or a row that disagrees with yours: open a pull request against S003.md.