Which instruction file does each coding agent actually load? Measured with canaries

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.

Per harness

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.

HarnessVersionAGENTS.md + CLAUDE.mdFiles loaded (of 17)Measured
Claude Code2.1.319only CLAUDE.md22026-11-07
Codex CLI0.167.0only AGENTS.md12026-11-06
Gemini CLI0.67.0neither12026-11-05
Qwen Code0.26.9only AGENTS.md22026-11-07
opencode1.19.5only AGENTS.md12026-10-28
Kilo CLI7.8.27only AGENTS.md22026-11-05
Crush0.100.0both82026-11-06
goose1.57.0only AGENTS.md22026-10-29
aider0.86.2neither02026-10-04
pi1.5.0only AGENTS.md22026-11-02

Check your own setup (about a minute)

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

Sources and adding a row

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.