powered by TechFeed
表示モード
Deep Dive

テレメトリをオフにするとAGENTS.mdが無警告でスキップされる — Claude Codeの隠れた仕様と回避策

9月23日、blog.szypowi.czが「Claude Code reads AGENTS.md only when telemetry is on」と題した記事を公開した。Claude Codeでテレメトリをオフにしている場合、リポジトリに配置したAGENTS.mdが一切読み込まれず、しかも警告すら表示されない。ユーザーはモデルがプロジェクト指示を無視していることに気づかないまま、プロンプトの書き方を延々と改善しようとしてしまう——そういう事態が静かに起きている。

9月23日、blog.szypowi.czが「Claude Code reads AGENTS.md only when telemetry is on」と題した記事を公開した。Claude Codeでテレメトリをオフにしている場合、リポジトリに配置したAGENTS.mdが一切読み込まれず、しかも警告すら表示されない。ユーザーはモデルがプロジェクト指示を無視していることに気づかないまま、プロンプトの書き方を延々と改善しようとしてしまう——そういう事態が静かに起きている。


テレメトリをオフにすると、AGENTS.mdが読まれない

Claude Code 2.1.277でAGENTS.mdのサポートが追加された。プロジェクトにCLAUDE.mdが存在しない場合、代わりにAGENTS.mdをプロジェクト指示として読み込む仕様だ。

AGENTS.mdはもともとOpenAI Codexが採用したフォーマットで、複数のAIエージェント間でプロジェクト指示を共通管理するための事実上の共通仕様として普及しつつある。Claude CodeがAGENTS.mdをサポートしたことで、ツールを乗り換えてもプロジェクト指示ファイルをそのまま流用できるというメリットが生まれた——少なくとも、設計通りに動いていれば。

しかし、この筆者はシェルでテレメトリをオフにしており、リポジトリに配置したAGENTS.mdが一切読み込まれないことに気づいた。Issue #95690を調査した結果、原因はバンドル内に組み込まれたプラグインの実装にあることが判明した。

問題の根本:リモートフラグで制御されている

2.1.280のバンドルを解析すると、AGENTS.mdの読み込みを担うagents-mdプラグインの登録コードは次のようになっている。

var W = !1;
var B = () => Oa("tengu_agents_md_mod", W);

WisOnByDefault)はfalseBisAvailable)はtengu_agents_md_modというリモートフラグをサーバーに問い合わせ、フェッチできなければフォールバック値falseが使われる。つまり、サーバーからフラグを取得できない環境では、ローカルのAGENTS.mdは存在していても読み込まれない。

ワーキングディレクトリのMarkdownファイルを読むだけの処理に、ネットワーク越しのサーバー判定が必要な設計だ。

実測した結果

「カナリアワード」を使った検証を行った。AGENTS.mdに識別用の単語(PERIWINKLE)を書き込み、claude -pでその単語を答えさせる方法だ。最初のセッションでフラグをフェッチし、2回目のセッションで使用されるため、各設定で2セッション実行している。

echo 'The canary word is PERIWINKLE.' > AGENTS.md
claude -p 'What is the canary word from the project instructions? Answer NONE if you have none. Do not read files.'

検証でわかったことを整理する。

  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 を設定すると、AGENTS.mdは読み込まれない
  • DISABLE_TELEMETRY=1 を設定しても同様にスキップされる
  • どちらかの変数を=0にしてもブロックは解除されない(ドキュメントには「任意の値が有効」と書かれており、この点は見落としやすい)
  • プロジェクトの.claude/settings.jsonenvブロックで両変数をクリアしても効果なし。単一リポジトリ単位でこの機能をオンにする方法はない
  • セッションレベルの上書きは2回目のセッション以降で機能する:
claude --settings '{"env":{"DISABLE_TELEMETRY":"","CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC":""}}'

そしていずれのケースでも警告は一切表示されない。セッションは普通に始まり、モデルはプロジェクト指示なしで回答し、ファイルがスキップされたことを示すメッセージはどこにも出ない。

企業ユーザーへの影響:BedrockとVertex AIも対象

この問題はテレメトリを個人的にオフにしているユーザーだけの話ではない。Issue内ではAWS BedrockやGoogle Vertex AI経由でClaude Codeを使う場合も同じ問題が発生すると指摘されている。これらの環境ではAnthropicのサーバーへのアクセス経路がなく、リモートフラグをtrueに解決できないためだ。

プロキシゲートウェイを社内で運用する企業チームも同様で、ポリシーとして非本質的な外部通信を遮断しているケースでは、AGENTS.mdによるプロジェクト指示の共通管理という機能がそのまま使えない。AGENTS.mdを採用したいユーザー層——複数エージェントで指示ファイルを統一管理するような慎重なチーム——が、まさにこの制約に引っかかりやすい構造になっている。

回避策:1行のCLAUDE.mdで解決

CLAUDE.mdは@path形式のインポートをサポートしており、こちらはリモートフラグに依存しない。AGENTS.mdと同じディレクトリに以下の1行を書いたCLAUDE.mdを置けば、テレメトリオフ状態でも読み込まれる。

echo '@AGENTS.md' > CLAUDE.md

この状態でCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1を設定したままカナリアテストを実行すると、正しくワードが返ってくることを確認済みだ。代償はリポジトリごとに余分なファイルが1つ増えること。AGENTS.mdサポートがまさに解消しようとした問題がそのまま残る形だ。

なぜこれが問題なのか

筆者はこの設計を明確に批判している。

テレメトリをオフにしたのは意図的な選択であり、その代償はいくつかの診断情報が得られないことだけのはずだ。ところが実際には、自分のディスク上のファイルを読むだけの機能がサイレントに無効化される。

特に深刻なのは「無警告」であることだ。モデルがプロジェクト指示を無視しているように見えるため、ユーザーはファイルがモデルに届いていないのに、プロンプトの書き方を延々と改善しようとしてしまう。筆者自身もカナリアワードとバイナリの文字列検索で初めて原因を特定できた。

筆者が求めること

  • ローカルファイルの読み込みをテレメトリに依存させないこと。段階的ロールアウトが必要なら、AGENTS.mdが存在するのにスキップされた場合に起動時の警告を出すだけでも大きく改善される
  • ユーザーレベルのグローバルAGENTS.md対応(現状はプロジェクトディレクトリのみ。Codex~/.codex/AGENTS.mdをグローバルに読む)

筆者は当面の間、CLAUDE.mdの1行インポートとシンボリックリンクで対処するとしている。

詳細はClaude Code reads AGENTS.md only when telemetry is onを参照していただきたい。