Claude Media
Instruction file not loadedが出る3つの理由と直し方 — Claude Code

Instruction file not loadedが出る3つの理由と直し方 — Claude Code

Instruction file not loadedは、CLAUDE.mdやrulesが読み込まれなかった通知です。括弧内の3つの理由(Read deny・作業ディレクトリ外・リンクの自己参照)ごとに、直し方を示します。

Instruction file not loadedは、存在するCLAUDE.mdやrulesのファイルが、読み取り制限のせいで読み込まれなかったことを知らせる通知です。ファイルが壊れているわけではなく、Claude Codeが意図的に読まなかったという意味になります。理由は括弧の中に書かれ、3種類に分かれます。

理由

括弧に出る3つの理由

  • a Read deny rule covers it

    Readのdenyルールが、ファイルのパスかリンク先にマッチしています。

  • it's read from outside your working directories, where reads are blocked

    ファイルが作業ディレクトリの外に解決され、外部の読み取りを止める設定が有効です。

  • where it leads couldn't be worked out

    リンクの行き先を特定できません。リンクが自分自身に戻る場合が典型です。

この通知は、対話セッションの会話画面に表示されます。

通知はどんな形で出るか

文言は次の形です。1行目の括弧に理由、2行目に対象ファイルのパスが入ります。

Instruction file not loaded (a Read deny rule covers it):
path: .claude/rules/shared.md

v2.1.292より前は、ファイル名が同じ行の末尾に、理由の後ろへ続く形で出ていました。古いバージョンの画面と見比べるときは、この違いに注意してください。

サブディレクトリのCLAUDE.mdは、起動時ではなく、そのディレクトリのファイルをClaudeが扱うときに読み込まれます。読み込めなかった場合は、同じ行がそのターンの会話の中に出ます。取り上げきれないファイルがあると、and 3 more instruction files not loadedのように残りの件数が最後の行に付きます。

v2.1.292では、/cdや権限の変更のあとにこの行が古いままになったり出なかったりする不具合が直り、入れ子のファイルが読み込まれなかったときの記録行も加わりました。通知が出ない・消えないと感じたら、バージョンも確かめてください。

制限が意図したものなら、対処は不要です。そのセッションは、そのファイルの指示なしで動きます。

理由1: Read denyルールに一致している

括弧がa Read deny rule covers itなら、permissions.denyのどれかが、ファイルのパスに一致しています。一致の対象は、書かれたパスそのものだけではありません。ファイルがシンボリックリンクなら、リンク先のパスも見られます。

どのルールが当たったかを探す

CLAUDE.mdやrulesのための拒否ではなく、別の目的で書いた広いルールが当たる例が多そうです。権限ルールのパターン規則に照らすと、次の書き方が当てはまります。

  • denyに書いたRead(secrets/**)のような単一セグメントのディレクトリは、現在のディレクトリ配下の任意の深さにあるsecretsディレクトリに一致します。.claude/rules/secrets/のようなルール置き場があれば、その中のファイルも対象です
  • ユーザー設定(~/.claude/settings.json)のRead(/docs/**)は、プロジェクトのdocsではなく~/.claude/docs/**を指します。先頭の1スラッシュは、設定ファイルの出どころを基準にするためです
  • Read(.env)のように名前だけを書くと、gitignoreの規則で任意の深さに一致します

どこにdenyを書いたかは、/permissionsで確かめられます。プロジェクトの.claude/settings.json、.claude/settings.local.json、ユーザー設定、管理設定のどれにも書ける点に注意してください。

直し方

ルールを外すか、狭めます。そのあとで新しいセッションを始めると、ファイルが読まれます。設定を直しただけでは、動いているセッションには反映されません。

{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./config/credentials.json)"
    ]
  }
}

この例は、設定リファレンスにあるdenyの書き方の形に沿った一例です。./secrets/**のような広い指定を、実際に守りたいファイルを名指しする形に置き換えると、.claude/rules/配下は巻き込まれにくくなります。.envを守る書き方そのものは、Claude Codeで.envを読ませないRead denyの書き方と効く範囲に詳しくあります。

なお、WriteやGlobなどのツール名でパスを書いたルールは、ファイルの権限チェックでは参照されません。この警告は別の通知なので、is not matched by file permission checksの対処法で見分けてください。

理由2: 作業ディレクトリの外にある

括弧がit's read from outside your working directories, where reads are blockedなら、ファイルが作業ディレクトリの外に解決されています。同時に、permissions.blockReadsOutsideWorkingDirectoriesが有効です。

この設定は、Read・Grep・Glob・LSPによる作業ディレクトリ外の読み取りを、どのパーミッションモードでも拒否します。bypassPermissionsでも同じです。要件はv2.1.257以降です。auto modeでは、作業ディレクトリ外を初めて読もうとしたときに、このブロックを有効にするか尋ねられます。承諾すると、設定ファイルにtrueが書かれます。自分で有効にした覚えがないのに通知が出るなら、ここが原因かもしれません。

作業ディレクトリに数えられるもの

作業ディレクトリは、起動したディレクトリを基本に、次の方法で広げられます。

  • 起動時に--add-dir <path>
  • セッション中に/add-dir
  • 設定のadditionalDirectories

このブロックに限っては、リポジトリ側の設定だけに書いたディレクトリは数えられません。.claude/settings.jsonに書いたものがそうで、.claude/settings.local.jsonも、gitが追跡していない場合を除いて同じ扱いです。git管理外のディレクトリや、gitが追跡中のときは、settings.local.jsonもリポジトリ設定として扱われます。残したいディレクトリは、ユーザー設定に書くのが確実です。

直し方

ファイル、またはリンク先を作業ディレクトリの中へ移します。移したら新しいセッションで確かめます。共有ルールをホームのどこかに置いて、.claude/rules/からリンクしている構成が典型例です。

前と後

共有ルールの置き場を変える

BEFORE

外部を指すリンク

.claude/rules/sharedが~/shared-claude-rulesへのシンボリックリンクで、リンク先がプロジェクトの外にある。

AFTER

プロジェクト内に実体を置く

共有ルールをリポジトリ内の.claude/rules/へ置くか、全プロジェクト共通なら~/.claude/rules/に置く。

~/.claude/rules/は、ユーザースコープのルール置き場です。このブロックの下でも、~/.claude/のスキル・プラグイン・ルール・エージェント・コマンド・CLAUDE.mdは、Claude Code自身が必要とするものとして読み取れるままです。

リンクを張った.claude/rules/に関する承認の仕組みは、別の話です。外部を指すルールは、外部importと同じ承認ダイアログを通ります。そちらは.claude/rulesのシンボリックリンクが読み込まれない原因と対処で扱っています。ブロックの通知が出ていないのに読み込まれないなら、そちらを見てください。

v2.1.290では、作業ディレクトリの外へリンクされたプロジェクトのCLAUDE.md・ルール・AGENTS.mdが、このブロックやReadのdenyをすり抜けて読み込まれる不具合も直っています。それ以前のバージョンでは、通知なしに読み込まれていた可能性があります。更新後に急に通知が出始めたときの理由として、頭に入れておくと切り分けが速くなります。

理由3: リンクの行き先を特定できない

括弧がwhere it leads couldn't be worked outなら、リンクの行き先を解決できませんでした。エラーリファレンスが挙げる例は、リンクが自分自身に戻る場合で、直接でも、ほかのリンクを経由してでも同じです。

シェルで確かめるには、次の2つが手がかりになります。

ls -l CLAUDE.md .claude/rules/
find -L . -maxdepth 3 -type l

ls -lは、リンクの行き先を->の右側に表示します。find -Lは、辿ったうえでなお「リンクのまま」残るものだけを列挙するので、壊れたリンクや循環したリンクが引っかかります。いずれもシェルの一般的な使い方で、Claude Codeの仕様ではない点に注意してください。

直し方

自己参照のリンクなら、実在するファイルへ張り直すか、通常のファイルに置き換えます。反映には新しいセッションが要ります。

rm CLAUDE.md
cp ~/team-docs/CLAUDE.md CLAUDE.md

AGENTS.mdとCLAUDE.mdを共有する目的でリンクを使っているなら、Windowsではシンボリックリンクの作成に管理者権限か開発者モードが要ります。Gitが通常のテキストファイルとしてチェックアウトする場合もあります。共有の方法としては、CLAUDE.mdに@AGENTS.mdのimportを書く手もあります。選び方はAGENTS.mdとCLAUDE.mdで設定を統合する運用パターンにまとめています。

読み込み状況を自分で確かめる

通知を待たずに状況を見たいときは、3つの手段があります。

手順

読み込み状況を見る3つの手段

  1. 1

    /contextで起動時の読み込みを見る

    Memory filesの一覧に、読み込まれるはずのCLAUDE.mdとCLAUDE.local.mdが出ているか確かめます。一覧に無ければ、Claudeには見えていません。

  2. 2

    サブディレクトリは「Loaded」行を待つ

    サブディレクトリのCLAUDE.mdは起動時には一覧に出ません。そのディレクトリのファイルをClaudeに読ませたときに、パス付きのLoaded行が出ます。

  3. 3

    InstructionsLoadedフックで記録する

    どのファイルが、いつ、なぜ読み込まれたかを記録できます。パス限定ルールや遅延読み込みのデバッグに向きます。

フックの設定例は、Claude Code Setup/InstructionsLoadedフックの実務設定にあります。

サブディレクトリのCLAUDE.mdを試すときは、Claudeに書かせず、シェルから作るのがコツです。作ったあとで、そのサブディレクトリのファイルを読ませます。

通知が出ないのに指示が効かないとき

Instruction file not loadedが出ていないなら、別の原因です。CLAUDE.mdの内容は、システムプロンプトではなく、システムプロンプトの後のユーザーメッセージとして渡されます。厳密な遵守は保証されず、曖昧な指示や矛盾する指示で特にぶれます。次の点を順に見てください。

  • 指示を具体的にする。「2スペースでインデントする」は「きれいに整形する」より効く
  • 複数のCLAUDE.mdで、同じ振る舞いに矛盾する指示を書いていないか
  • コミットやPRの規則は、Claude Code組み込みの指示と競合しないか
  • 特定のタイミングで必ず実行したい処理は、CLAUDE.mdではなくフックに書く

ファイルが4MiBを超えると、Claude Codeはそのファイルを読み飛ばします。200行を超えると、指示の遵守率が下がります。通知とは別の理由でも、読まれないことはあります。

まとめ

括弧の理由で、直す場所が決まります。a Read deny rule covers itならpermissions.deny、it's read from outside your working directories, where reads are blockedならファイルの置き場かリンク先、where it leads couldn't be worked outならリンクそのものです。どの場合も、直したあとは新しいセッションから確かめます。

迷ったら、まず対象ファイルが通常のファイルかリンクかをls -lで見ます。リンクなら、行き先がプロジェクトの内側にあるかを確かめます。通常のファイルなら、denyに広いパターンが残っていないかを見ます。この順番だと、3つの理由のうち2つを短い手順で切り分けられます。

この記事を共有:XはてブLinkedIn