フォーマット論争は AGENTS.md で決着がつきました。Codex CLI、GitHub Copilot、Cursor、Windsurf、Amp、Devin はいまや同じファイルを読みます。Claude Code は CLAUDE.md、Gemini CLI は GEMINI.md のままですが、この例外リストは短くなる一方です。
ただ、高くついていたのはフォーマットではありませんでした。
今朝、普段使っているノート PC を 1 台スキャンしました。特別な環境ではありません。開発者 1 人、数年ぶんのプロジェクト、ごく普通のエージェント構成です。
| ファイル | ディスク上のコピー数 | 中身の種類数 |
|---|---|---|
AGENTS.md | 111 | 19 |
CLAUDE.md | 38 | 19 |
GEMINI.md | 2 | 2 |
SKILL.md(エージェントスキル) | 3,073 | 887 |
計測方法は find ~ -maxdepth 7 -type f -name <X> で、node_modules・.venv*・site-packages・Library/Caches は除外しました。「中身の種類数」は md5 ハッシュのユニーク数です。ベンダーが同梱したスキルバンドルも SKILL.md の行に入れてあります。除外しないのが趣旨です。マシン上に置かれていて、エージェントが読める。それだけで対象になります。
ファイル 111 個に対して、書かれている内容は 19 通り。
入れ子のファイル自体は仕様どおりの使い方です。モノレポならパッケージごとに指示を分けるべきで、仕様にもそう書かれています。しかし 111 個のコピーに対して中身が 19 種類というのは、スコープ分割ではありません。コピーして、片方だけ直して、忘れた結果です。
1. 手で貼る。 うまく書けた指針を、次のリポジトリにも貼り付けます。半年後、そのうちの 1 つで誤字を直します。残りのコピーはその瞬間に古くなりますが、それを知らせるものはどこにもありません。
2. マシンの境界。 グローバル設定はどのリポジトリにも属しません。~/.claude/CLAUDE.md、~/.gemini/GEMINI.md、~/.config/opencode/AGENTS.md。ノート PC が 2 台あればバージョンも 2 つになり、その差は 3 週間後に「自分の環境では挙動が違う」という形で表に出ます。
3. 生成スクリプト。 よくある対処は、正となるファイルを 1 つ決めて残りを生成する方法です。AGENTS.md → CLAUDE.md → .cursor/rules/*.mdc → .github/copilot-instructions.md。実行した日はきれいに揃います。ただし、生成されたファイルを誰かが直接編集した時点で崩れます。ディスク上のファイルには「生成物である」という印がなく、確認する仕組みもないからです。
この失敗パターンは別記事にまとめました。1つのファイルから生成しても、ズレは止まらなかった
一覧にしておく価値があります。間違えやすいのはパスだからです。
| ツール | 読むファイル |
|---|---|
| Claude Code | CLAUDE.md(プロジェクトルート、サブディレクトリ、~/.claude/)、.claude/skills/*/SKILL.md、.claude/agents/*.md |
| Codex CLI | AGENTS.md(ルートと入れ子。最も近いものが優先) |
| GitHub Copilot | .github/copilot-instructions.md、スコープ指定は .github/instructions/*.instructions.md |
| Cursor | .cursor/rules/*.mdc(旧 .cursorrules) |
| Windsurf | .windsurf/rules/*.md(旧 .windsurfrules) |
| Gemini CLI | GEMINI.md(~/.gemini/、ワークスペースルート、サブディレクトリ) |
| opencode | AGENTS.md、なければ CLAUDE.md、グローバルは ~/.config/opencode/AGENTS.md |
agent-drift は単一ファイルの Python スクリプトです。MIT ライセンス、依存なし。ツリーを走査して、上記のエージェントが読む指示ファイルを集め、内容のハッシュでまとめ、食い違っているものを出力します。
curl -O https://raw.githubusercontent.com/untactit/agent-drift/main/agent_drift.py
python3 agent_drift.py ~
リポジトリ: https://github.com/untactit/agent-drift
直す機能はありません。どれだけひどいかを数字で出すだけです。多くのチームに足りていないのはその数字のほうで、数字がないままプロセスの変更を通すことはできません。
私は untactit を作っています。エージェントが動くために読むスキル・指針・メモリを 1 か所に置き、変更のレビューは一度だけ。そのあとは誰もファイルを開かないまま、対象へ反映される、という形です。
区別しておきたいのはここです。判断は人が、伝播は無接触。 何を承認するかは人が決めますが、そこから先に手作業は入りません。ドリフトを後から直すのではなく、生まれる側が止まります。コピーを編集する人がいなくなるからです。触らないから、ばらつかない。
まだ公開前です。上のスキャナは untactit がなくても動きます。そこは意図してそうしてあります。詳しい話はプロダクトページにまとめてあります。
自分のマシンでスキャンしたら、その数字を見せてほしいです。3 人以上のチームなら、AGENTS.md の行は私の環境より悪いはず、と踏んでいます。