Claude Code に AGENTS.md のサポートが入ったのに、肝心のファイルが読まれない。しかも原因はローカルの設定やファイル名の間違いではなく、telemetry を切っているかどうかだった、というのが元記事の話だ。見た目は「対応済み」なのに、実際には特定の環境で黙って無効化される。こういう挙動は、使う側からするとかなり厄介だと思う。
元記事は、Claude Code 2.1.277 で AGENTS.md のサポートが追加されたものの、その読み込みが remote feature flag の背後に置かれている、と指摘する。内部では agents-md という built-in plugin があり、2.1.280 の bundle では tengu_agents_md_mod というフラグを取りにいく。ここでフラグが取れない、あるいは false と判定されると、その plugin は unavailable になり、ローカルに置いた AGENTS.md は読み込まれない。
問題は、この判定がネットワーク前提になっていることだ。AGENTS.md 自体は作業ディレクトリにあるただの Markdown ファイルで、本来ならネット接続なしに読めるはずなのに、実際にはサーバー側のスイッチが先に立つ。元記事の筆者は、空のディレクトリに AGENTS.md を置き、そこに「PERIWINKLE」というカナリア語を書いて、claude -p でその語を答えさせるテストをした。テストは新しい構成ごとに 2 回セッションを回し、最初のセッションでフラグを取り、2 回目でその結果を使う形にしている。
結果ははっきりしていた。CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 を立てると feature が止まり、記事が参照している issue の説明どおりになる。DISABLE_TELEMETRY=1 でも同じで、どちらか一方でも立っていると AGENTS.md は読み込まれない。しかも 0 を入れても有効化にはならない。環境変数のドキュメントでは「何か値が入っているだけで効く」扱いらしいが、直感的ではない。プロジェクトの .claude/settings.json に、環境変数を消す設定を書いても効かず、1つの repo だけでこの feature をオンにする方法はないという。
さらに気になるのは、どの場合も警告が出ないことだ。session は始まり、model は project instructions を見ないまま答えるが、ファイルが飛ばされた事実は何も知らせない。元記事は Bedrock や Vertex、あるいは third-party gateway を使う場合も同じ問題に触れている。そこではフラグが true になりようがないからだ。筆者は、回避策として CLAUDE.md に @AGENTS.md を 1 行だけ書く方法を使っている。この import は telemetry を切っていても動き、CLAUDE.md があると AGENTS.md の内容を引っ張ってこられる。ただし、これは本来 AGENTS.md サポートがやりたかった「ファイルを 1 つにまとめる」効果を、別の場所に逃がしているだけだ。
私はこの話を読んで、いちばん引っかかったのは「telemetry を切ると診断が減る」以上の影響が出ている点だと思った。普通、プライバシー設定をいじるときに想像するのは、利用状況の送信やクラッシュ報告が減ることだ。ところがここでは、ローカルディスクにある指示ファイルの読み込みまで止まる。しかも黙って止まる。これはかなり乱暴な設計に見える。ローカルの Markdown を読むだけなら、サーバーに何も返さなくても済むはずだからだ。
もちろん、段階的ロールアウトのために remote feature flag を使いたい事情は分かる。新機能を少しずつ出すのは、製品開発としては珍しくない。だが、その対象が「ネットワーク越しに何かをする機能」ならともかく、今回のように入力がすでに手元にある機能まで巻き込むのは納得しにくい。フラグが取れなかったときのデフォルトを「何もしない」にするのではなく、文書どおりの動作に倒すべきだったのではないかと思う。少なくとも、そこで止めたなら止めたと見える形にしてほしい。
面白いのは、この問題が AGENTS.md を真面目に使いたい人ほど刺さることだ。複数の agent で同じ指示を共有したい人は、たいてい出力や送信内容にも敏感だし、policy の切り分けにも気を配る。つまり telemetry を切る側の人だ。そういう人に対して、「AGENTS.md に対応した」と告げながら、実際には無言で無効化しているのは相性が悪すぎる。
しかも筆者が指摘しているように、ほとんどの人は binary を grep したり、カナリア語で実験したりしない。普通は「モデルが指示を無視した」と受け取るはずだ。すると人は prompt をいじり始める。実際にはファイルがモデルに届いていないのに、そこを疑わせるのが最悪だという話だ。ここでの問題は単なる bug ではなく、失敗の兆候を消してしまう UX だと思う。見えない失敗は、ユーザーを間違った改善に誘導する。
元記事の後半で筆者は、AGENTS.md の理想像についても触れている。たとえば Codex は ~/.codex/AGENTS.md のような global な共有ファイルを読めるし、Claude Code でも /import で user の CLAUDE.md に取り込める。ただし、そのコピーは元ファイルの後続変更を追わない。結果として、複数の agent で同じ指示を使いたい人は、結局どこかで @ import を張り替えたり、同期の仕組みを自前で持ったりすることになる。
さらに筆者は、shared agent skills の扱いにも不満を示す。Codex は .agents/skills と ~/.agents/skills を見るのに対し、Claude Code 2.1.280 は /import でそれを .claude/skills にコピーするだけだという。コピーは元とずれるので、筆者は .claude/skills を ../.agents/skills へ向ける symlink を使っている。これもまた、本来なら製品が吸収してくれるべき手間を、ユーザーが逃がしている形だ。
私がこの件で少し強く感じたのは、AI 補助ツールほど「設定ファイルが読まれない」ことの影響が大きいという点だ。人間相手なら会話で埋められるが、agent は指示の取りこぼしをその場で自分で説明してくれない。だからこそ、読み込み失敗は silent であってはいけない。少なくとも、AGENTS.md があるのに無視したなら「今は telemetry が無効なので読みませんでした」と出すべきだったと思う。機能を隠すのではなく、動いていない事実を見せる。それだけで、かなりの混乱は避けられたはずだ。