フィーチャーフラグ:あなたの Claude Code が私のものと違う理由
2人の開発者が、同じ OS、同じリポジトリに、同じバージョンの Claude Code をインストールします。片方には使える機能がもう片方にはなく、どちらにもエラーメッセージは出ません。これは都市伝説ではなく、ドキュメントに記載された設計どおりの挙動です。Claude Code は一部の機能を、起動時に Anthropic から取得するフィーチャーフラグで有効にしており、善意で行った普通の設定のいくつかが、その取得を完全に止めてしまいます。
人々を驚かせる帰結があります。純粋にローカルな操作が、ネットワーク呼び出しに依存することがあるのです。2026年9月、自分のディスク上の Markdown ファイルを読むのにそれが必要になっていたことが判明し、437ポイントを集めるハッカーニュースのスレッドになりました。
- Claude Code のリモートフィーチャーフラグが、どのように取得・キャッシュ・評価されるか
- フラグの取得を黙って無効にする4つの構成
- DISABLE_TELEMETRY=0 でもオプトアウトになるのに、DO_NOT_TRACK=0 ではならない理由
- 取得をオフにすると失う15の機能
- ゲーティングを2分で検出し、問題が起きないよう挙動を固定する方法
仕組み
Claude Code にはすべてのフラグにコード上のデフォルト値が組み込まれており、そのうえで実際の値の取得を試みます。プロバイダーは GrowthBook です。専用の DISABLE_GROWTHBOOK 環境変数があり、変更履歴にも「GrowthBook のフィーチャーが null と評価されたときのクラッシュ修正」(v2.1.214)のようなエントリがあります。
このシステムの4つの性質を理解すれば、遭遇する奇妙なケースのほとんどを説明できます。
- バイナリが知っているのは、フラグ名と、それぞれのフォールバック値だけです。セッションで何ができるかを決める値は、ネットワーク経由で Anthropic から届きます。取得がなければ、すべてのフラグはコード上のデフォルトに戻り、ロールアウト途中の機能ではたいていオフです。
- 取得した値はセッション間で保持されるため、期待した実行の1回あとに機能が現れることがあります。変更履歴にはこれがうまくいかなかった例が記録されています。v2.1.70 では、起動初期に読み取られたフラグがディスクキャッシュを更新しないという問題が修正され、古い値がセッションをまたいで残っていました。
- 評価では、Claude Code のバージョンとサブスクリプションのティアが考慮されます。v2.1.227 では、有効期限切れのログイントークンでセッションが始まったとき、ユーザーのティアなしでフラグが評価される問題が修正されました。これにより Max プランのユーザーに、使用クレジットの有効化が誤って促されていました。v2.1.261 では、新しいバージョンを対象にしたフラグが、同じマシンで動く古い Claude Code に適用されることがある問題が修正されました。
- v2.1.214 では、OAuth トークンのローテーション後、長時間動くセッションでフィーチャーフラグが古くなる問題が修正されました。何時間も動き続けるセッションが、開始時と同じ機能セットを保っている保証はありません。
取得が行われなくなる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 経由にする可能性が最も高い層が、黙って最も小さい機能セットを受け取ることになります。
- テレメトリの無効化は、プライバシーの選択であるだけでなく、機能のスイッチでもあります。ドキュメントには、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 は無効にしません。どちらもドキュメントに記載された意図的な仕様で、しかも正反対です。
- ドキュメントはルールを直接述べています。一部の変数は『設定されているかどうかだけを読み、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、リモートスイッチの背後にあるローカルファイル
このパターン全体の最も分かりやすい例で、トップページを飾ったものです。
- 変更履歴のエントリ:CLAUDE.md のないプロジェクトでは、Claude Code は代わりに AGENTS.md を読みます。/config の『Project instructions』で変更できます。エントリ自体が、Bedrock、Vertex、Foundry ではまだ対応していないと注記しています。
- ロールアウトがフラグ制御だったため、取得をスキップするセッションはコード上のデフォルトであるオフにフォールバックしました。カレントディレクトリから Markdown ファイルを読むという、ネットワークの要素がまったくない操作が、ネットワーク呼び出しに依存する条件付きのものになったのです。
- 警告もログ行もエラーもありません。指示は単にモデルに届かないため、症状は『Claude が AGENTS.md を無視している』と読めます。その結果、環境変数を確認するのではなく、ファイルを書き直すことになります。
- 『Claude Code's AGENTS.md Support: A Local Feature Locked Behind a Remote Switch』として起票されました。報告者は 2.1.278 と 2.1.280 で再現し、DISABLE_TELEMETRY、DISABLE_GROWTHBOOK、nonessential-traffic-off のすべてがこれをブロックすること、さらに新規インストール後の最初のセッションでもブロックされることを確認しました。
- メモリのドキュメントには今、はっきりと書かれています。『v2.1.281 より前は、Amazon Bedrock 上や、テレメトリを無効にしたセッションなど、一部のセッションでは CLAUDE.md ファイルしか読まれませんでした。それらのバージョンでは、Claude Code を更新してください。』2.1.281 未満に固定している場合、この問題は今も残っています。
この教訓は、このバグ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 では通常どおり発火します。指示の読み込みにフックを設定している場合は、インポートのほうが安全な経路です。
理解度チェック
理解度チェック
0/4- 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 は、フラグを必要としたことがありません。
次へ
- AGENTS.md とツール間の相互運用 — このページがケーススタディに使った機能と、フラグに依存しない同期パターン
- 設定と構成 —
pluginConfigsとenvキーの置き場所、そしてどの設定ファイルが読まれるか - セルフホスト環境とエンタープライズ環境 — Bedrock、Vertex、ゲートウェイの構成。取得をスキップする、まさに同じセッションです
出典とさらなる読み物
- Claude Code environment variables — Features that need feature-flag fetching — 信頼できる一覧と、変数ごとの値のセマンティクス
- Claude Code memory docs — AGENTS.md — 優先順位の表、Project instructions の設定、サポートが利用できない場合
- Claude Code CHANGELOG — v2.1.277(AGENTS.md サポート)、v2.1.281、そして v2.1.70、v2.1.108、v2.1.214、v2.1.227、v2.1.261 でのフラグシステムの修正
- anthropics/claude-code issue #95690 — 元の報告と、2.1.278 および 2.1.280 でのコミュニティによる再現
- Claude Code reads AGENTS.md only when telemetry is on — これを明るみに出した記事と、カナリアワード手法