メインコンテンツまでスキップ

フィーチャーフラグ:あなたの Claude Code が私のものと違う理由

上級

2人の開発者が、同じ OS、同じリポジトリに、同じバージョンの Claude Code をインストールします。片方には使える機能がもう片方にはなく、どちらにもエラーメッセージは出ません。これは都市伝説ではなく、ドキュメントに記載された設計どおりの挙動です。Claude Code は一部の機能を、起動時に Anthropic から取得するフィーチャーフラグで有効にしており、善意で行った普通の設定のいくつかが、その取得を完全に止めてしまいます。

人々を驚かせる帰結があります。純粋にローカルな操作が、ネットワーク呼び出しに依存することがあるのです。2026年9月、自分のディスク上の Markdown ファイルを読むのにそれが必要になっていたことが判明し、437ポイントを集めるハッカーニュースのスレッドになりました。

What you'll learn
  • Claude Code のリモートフィーチャーフラグが、どのように取得・キャッシュ・評価されるか
  • フラグの取得を黙って無効にする4つの構成
  • DISABLE_TELEMETRY=0 でもオプトアウトになるのに、DO_NOT_TRACK=0 ではならない理由
  • 取得をオフにすると失う15の機能
  • ゲーティングを2分で検出し、問題が起きないよう挙動を固定する方法

仕組み​

Claude Code にはすべてのフラグにコード上のデフォルト値が組み込まれており、そのうえで実際の値の取得を試みます。プロバイダーは GrowthBook です。専用の DISABLE_GROWTHBOOK 環境変数があり、変更履歴にも「GrowthBook のフィーチャーが null と評価されたときのクラッシュ修正」(v2.1.214)のようなエントリがあります。

このシステムの4つの性質を理解すれば、遭遇する奇妙なケースのほとんどを説明できます。

Guided walkthrough1 of 4
  1. バイナリが知っているのは、フラグ名と、それぞれのフォールバック値だけです。セッションで何ができるかを決める値は、ネットワーク経由で Anthropic から届きます。取得がなければ、すべてのフラグはコード上のデフォルトに戻り、ロールアウト途中の機能ではたいていオフです。

取得が行われなくなる4つのケース​

ドキュメントはこの点を明記しています。Claude Code は次のセッションでフラグの取得をスキップします。

  • 4つの環境変数のいずれかを設定している:DISABLE_GROWTHBOOK、DISABLE_TELEMETRY、DO_NOT_TRACK、CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC。
  • サードパーティのプロバイダーを使っている:Amazon Bedrock、Claude Platform on AWS、Google Cloud の Agent Platform、Microsoft Foundry。ただし、Claude Code を組み込むホストプラットフォームが CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST を設定している場合を除きます。
  • Claude apps ゲートウェイのセッションである。
  • 新規インストールまたはアップグレード後の最初のセッションである:フラグがまだ届いていません。詳細は後述します。

最初の2つの共通点に注目してください。どちらもセキュリティ意識の高い企業が選ぶ構成です。テレメトリを無効にして Bedrock 経由にする可能性が最も高い層が、黙って最も小さい機能セットを受け取ることになります。

Watch out
  • テレメトリの無効化は、プライバシーの選択であるだけでなく、機能のスイッチでもあります。ドキュメントには、DISABLE_TELEMETRY は『DISABLE_GROWTHBOOK と同じ効果でフィーチャーフラグの取得も無効にする』と書かれています。
  • 機能を失わずにプライバシーを確保したい場合、両立する組み合わせはありません。ドキュメント化されたテレメトリの停止方法はどれも、フラグの取得も止めます。
  • HOME が一時的な CI ランナーは、毎回が新規インストールと同じなので、毎回フラグなしのケースになります。

値の罠:3つの変数、3つの解析ルール​

ここで多くの人が午後を丸ごと失います。これらの変数は同じファミリーに属し、同じことをするように読めますが、値は3つの異なるルールで解析されます。

変数値の読み方したがって =0 の意味
DISABLE_TELEMETRY空でない値ならオンになる**それでもオプトアウトになる。**再び有効にするには unset する
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC空でない値ならオンになる**それでもトラフィックは無効のまま。**再び有効にするには unset する
DISABLE_ERROR_REPORTING空でない値ならオンになる**それでもオプトアウトになる。**再び有効にするには unset する
DISABLE_GROWTHBOOK標準的な真偽値。1 か true を設定する取得はオンのまま
DO_NOT_TRACK標準的な真偽値。1 を設定するテレメトリはオンのまま

この表を2回読んでください。DISABLE_TELEMETRY=0 はテレメトリを無効にします。DO_NOT_TRACK=0 は無効にしません。どちらもドキュメントに記載された意図的な仕様で、しかも正反対です。

What you'll learn
  • ドキュメントはルールを直接述べています。一部の変数は『設定されているかどうかだけを読み、0 を含む空でない値はすべてその挙動をオンにする』。
  • そうした変数を元に戻すには、変数を unset するか空の値に設定する必要があります。0 や false を代入してもオフスイッチにはなりません。
  • これが最も効いてくるのは、誰かが 1 を 0 に変えて『オフにした』Dockerfile や CI 設定です。

実際に何を失うのか​

フラグの取得をオフにすると、ドキュメントに記載された15の機能が使えなくなります。失うものごとにまとめると次のとおりです。

権限と起動

  • Pro、Max、Team プランで、セッションがデフォルトで auto モードで始まらない
  • VS Code 拡張機能が、開始時の権限モードのために設定ファイルを読めない
  • /auto-mode-setup が autoMode.environment のエントリを下書きできない

ローカルのセッションの外に及ぶすべてのもの

  • Remote Control
  • 他のマシン上のセッションへのメッセージ送信(同一マシン内のメッセージ送信は引き続き動作)
  • claude.ai アカウントで有効なスキルとプラグインをターミナルのセッションに同期すること
  • アーティファクトへのコメントの読み取りまたは返信
  • アドバイザーツール

コマンドと診断

  • claude import と /import コマンド
  • /skill-doctor と、/plugin の Stats タブにあるそのレポート

黙って起きる挙動の変化(危険なグループ)

  • MCP:API が拒否するであろう入力スキーマを持つ MCP ツールを、Claude Code が除外しなくなります。スキーマはそのまま送信され、リクエストは、位置でツールを指す 400 で失敗します
  • MCP:MCP_PROTOCOL_NEGOTIATION=auto を設定しない限り、claude.ai コネクタサーバーに対してプロトコルリビジョン 2026-07-28 のプローブが行われません
  • 大きなペーストが、入力されたテキストではなくペーストされたテキストとして扱われなくなります。[Pasted text #N] というプレースホルダーの背後にある内容が、マークなしで Claude に届きます
  • Git Bash がインストールされた Windows では、claude.ai と Console のアカウントにデフォルトで PowerShell ツールが提供されません。CLAUDE_CODE_USE_POWERSHELL_TOOL=1 を設定してください
  • Claude が下書きするフィードバックがオフになります

最後のグループこそ、肝に銘じておくべきものです。スラッシュコマンドがなければ、そのこと自体が分かります。しかし、配列内の位置でツールを指す 400 エラーは、テレメトリの設定のようには見えず、環境変数を確認しようと思いつくまでに、MCP サーバーを1時間デバッグすることになります。

影響範囲には前例がある​

フラグやテレメトリの設定は、誰も予測しない場所に波及してきました。変更履歴から、修正済みですが示唆に富む例を2つ挙げます。

  • v2.1.108 では、DISABLE_TELEMETRY を設定した購読者が、プロンプトキャッシュの TTL が 1時間ではなく5分にフォールバックする問題が修正されました。プライバシーのための変数が、長いセッションのたびに黙ってお金を余計に使わせていました。キャッシュ期間が12分の1になっていたわけです。
  • v2.1.105 では、あるプロジェクトの設定に CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC を設定すると、そのマシン上のすべてのプロジェクトで使用状況メトリクスが恒久的に無効になる問題が修正されました。

どちらも修正済みです。どちらもリスクの形を示しています。これらのスイッチは、無関係に見えるサブシステムを横断して効いてしまいます。

インストールまたはアップグレード後の最初のセッション​

これは独立した見出しに値します。典型的な「再現できない」バグ報告を生み出すからです。

Claude Code をインストールした直後の最初のセッションや、機能が追加されるバージョンへのアップグレード後の最初のセッションでは、フラグ制御の機能が単に欠けていることがあり、通常は auto モードで始まるプランでも、セッションが Manual モードで始まることがあります。Claude Code はそのセッション中にフラグを取得するので、次回は両方とも揃います。

ここから2つの帰結が導かれます。

  • 自然に直ります。だからこそ報告しにくいのです。誰かが調べる頃には、2回目のセッションでフラグが揃っています。
  • **一時的な環境では決して直りません。**CI ランナー、新しいコンテナ、使い捨てのホームディレクトリを使うあらゆる構成は、毎回が最初のセッションです。

ドキュメントは1つの緩和策にも触れています。新規インストール後、claude -p、Agent SDK、VS Code 拡張機能のような非対話型のセッションは、開始時の権限モードを選ぶ前にフラグを取得できる場合があります。

ケーススタディ:AGENTS.md、リモートスイッチの背後にあるローカルファイル​

このパターン全体の最も分かりやすい例で、トップページを飾ったものです。

Guided walkthrough1 of 5
  1. 変更履歴のエントリ:CLAUDE.md のないプロジェクトでは、Claude Code は代わりに AGENTS.md を読みます。/config の『Project instructions』で変更できます。エントリ自体が、Bedrock、Vertex、Foundry ではまだ対応していないと注記しています。

この教訓は、このバグ1件を超えて一般化できます。Claude Code の新機能については、*これはゲートされているか?*と問うてください。ゲートされているなら、あなたのテレメトリの方針、プロバイダー、そしてインストールからの経過時間のすべてが、それが動くかどうかへの入力になります。

2分で診断する​

推測する必要はありません。3つのチェックを、手軽なものから順に行います。

**1. そもそも設定が存在するかを確認する。**AGENTS.md サポートが利用できない場合、/config パネルに Project instructions の行がまったく表示されません。設定がないこと自体が診断です。機能がオフなのではなく、存在しないのです。

**2. 対話セッションが教えてくれることを見る。**動作しているとき、Claude Code は会話の中に no CLAUDE.md found; AGENTS.md loaded: /home/you/repo/AGENTS.md のような行を表示します。行がなければ、読み込まれていません。

**3. カナリアを走らせる。**元の報告を解決した手法です。ファイルの中に、他のどこにも現れない単語を入れ、クリーンな非対話型セッションでその単語を尋ねます。単語が返ってくれば、ファイルはモデルに届いています。これはどの指示ファイルでも、どのバージョンでも使えます。

カナリアテスト:指示ファイルは本当に読み込まれたか?

mkdir -p /tmp/canary && cd /tmp/canary
echo 'The project codeword is PERIWINKLE.' > AGENTS.md
claude -p 'What is the project codeword? Answer with one word.'

まず通常の環境で1回、次にプライバシー関連の変数をクリアした状態で1回実行し、比較してください。空文字列を代入している点に注意してください。DISABLE_TELEMETRY=0 ではクリアされないことを思い出してください。

フラグの取得を許可した同じテスト:ゼロではなく空の値に注意

cd /tmp/canary
env DISABLE_TELEMETRY= CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC= DISABLE_GROWTHBOOK=false \
claude -p 'What is the project codeword? Answer with one word.'

4. 詳細が必要なら、デバッグログを有効にする。--debug か /debug で起動すると、ログは ~/.claude/debug/<session-id>.txt に書き出されます。1つ注意点があります。DEBUG 環境変数が受け付ける真と見なされる値は 1、true、yes、on だけで、他のツールから残っている DEBUG=express:* のような名前空間パターンでは有効になりません。

フラグに頼らず挙動を固定する​

根本的な解決策は、ゲートに依存するのをやめることです。2つのパターンがあります。

設定を明示的に固定する。指示ファイルについては、Project instructions の値をデフォルトに任せず、組み込みプラグインの ID の下で設定ファイルに書けます。重要な制限が1つあります。Claude Code は、プロジェクト設定ファイルとローカル設定ファイルではこのキーを無視し、~/.claude/settings.json、--settings ファイル、または管理設定からしか読みません。リポジトリの .claude/settings.json に書いても何も起きません。

CLAUDE.md と AGENTS.md を一緒に読み込む:ユーザー設定または管理設定のみ

{
"pluginConfigs": {
  "agents-md@builtin": {
    "options": { "instructionFiles": "claude-md-and-agents-md" }
  }
}
}

ゲートされたことのない経路を使う。AGENTS.md をインポートする CLAUDE.md は、すべてのバージョン、すべてのプロバイダー、テレメトリがオフの状態でも動作してきました。フラグ付きのコードパスではなく、通常の @path インポート展開だからです。これは、Bedrock、Vertex、Foundry のセッションに対してドキュメント自身が推奨している方法です。

フラグを一度も必要としなかった、1行の CLAUDE.md

@AGENTS.md

この方法を採る場合の微妙な点が1つあります。設定を通じて読み込まれた AGENTS.md は、インポートで取り込まれたものとは少し挙動が異なります。InstructionsLoaded フックは、設定経由のパスでは発火しませんが、CLAUDE.md がインポートまたはシンボリックリンクしている AGENTS.md では通常どおり発火します。指示の読み込みにフックを設定している場合は、インポートのほうが安全な経路です。

フラグゲーティング早見表
Enter キーまたはスペースキーでカードを裏返します。左右の矢印キーでカードを移動できます。用語を表示しました。
1 / 8

理解度チェック​

理解度チェック

0/4
  1. Dockerfile に、同僚が『テレメトリを元に戻した』として ENV DISABLE_TELEMETRY=0 と書かれています。実際には何が起きていますか?
  2. ある CI ジョブで、Claude Code がリポジトリの AGENTS.md をまったく読み込まないと報告されていますが、開発者のノート PC ではどれも問題なく動きます。最も可能性の高い原因は?
  3. フラグの取得が無効なとき、フラグの設定にさかのぼって原因を突き止めるのが最も難しい障害はどれですか?
  4. Amazon Bedrock で、どのバージョンでも AGENTS.md を確実に読み込ませたいとします。堅実な方法はどれですか?
Key takeaways
  • Claude Code は Anthropic(GrowthBook)からフィーチャーフラグを取得し、ディスクにキャッシュし、バージョンとサブスクリプションのティアに対して評価します。そのため、同一のインストール同士でも、正当に挙動が異なることがあります。
  • 4つの環境変数、3つのサードパーティプロバイダー、apps ゲートウェイのセッション、そしてインストール後の最初のセッションは、いずれもこの取得をスキップし、ドキュメント化された15の機能を失わせます。
  • DISABLE_TELEMETRY、CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC、DISABLE_ERROR_REPORTING は、0 を含む空でない値をすべてオンとして扱います。DO_NOT_TRACK と DISABLE_GROWTHBOOK は本物の真偽値です。ゼロにせず、unset してください。
  • 最悪の損失は黙って起きます。フィルタリングされない MCP スキーマが引き起こす位置指定の 400 と、マークのないペーストされたテキストです。
  • AGENTS.md はケーススタディでした。v2.1.277 からネイティブ対応、ゲートされ、v2.1.281 で修正。@AGENTS.md を含む CLAUDE.md は、フラグを必要としたことがありません。

次へ​

出典とさらなる読み物​