ノーコードサロン ClaudeCode入門講座 / 29
SECTION 29

29|ルールの階層と優先度:影響範囲が広いほど、優先度は低い

ClaudeCodeへの指示は、~/.claude/CLAUDE.md・プロジェクトの CLAUDE.md・サブディレクトリの CLAUDE.md・その場の会話、と複数の層に分かれて存在します。ここでは、それぞれの層がどこまでの範囲に効き、ぶつかったときにどちらが優先されるかを、実際のファイル配置に沿って説明します。

29-1 ルールが増えると、必ず矛盾する

07番で作った CLAUDE.md にルールを書き足していくと、あるとき必ずぶつかります。全プロジェクト共通のルールと、この案件だけのルールが、正反対のことを言っている状態です。

たとえば、~/.claude/CLAUDE.md(あなたの全プロジェクトに効く)に「ブランドの声は落ち着いたトーンで」と書いてある。一方、ある案件のクライアントは「明るく親しみやすく」を求めている。どちらも正しい指示です。

矛盾している状態
~/.claude/CLAUDE.md      → 「ブランドの声は落ち着いたトーンで」
./client-a/CLAUDE.md     → 「明るく親しみやすいトーンで」

この状態でClaudeCodeを動かすと、どちらが採用されるかは安定しません。公式ドキュメントも「2つのルールが矛盾する場合、Claudeはどちらか一方を任意に選ぶことがある(Claude may pick one arbitrarily)」と明記しています。その場で「今回は明るくして」と口頭で直すことはできますが、次に同じ状況が来たとき、同じ結果になる保証はありません。

ルールは足し算では管理できません。上下関係(階層)をつける必要があります。

29-2 抽象度が高いほど影響範囲が広く、優先度は低い

ここが直感に反するところです。「全体の共通ルール」は、いちばん偉そうに見えて、いちばん弱い。

理由は単純です。全体ルールはすべての成果物に適用されます。だからこそ、すべての成果物が満たせるものしか書けません。一つでも例外があるなら、そもそもそこに書いてはいけない。

逆に「このLPの、この一箇所だけ」というルールは、影響範囲が針の先ほどしかありません。だからこそ、そこでは確実に守られます。CSSを書いたことがあれば、詳細度と同じだと分かるはずです。body { color: black } より #header .title { color: red } が勝つ。範囲が狭いほど強い。

影響範囲 広い → 狭い 優先度 弱い → 強い 全体(自分のすべての案件) ~/.claude/CLAUDE.md 例外のないものだけ 案件・プロジェクト ./CLAUDE.md この案件で例外のないもの 相手・領域 .claude/rules/*.md 相手固有のこと 成果物・媒体 lp/CLAUDE.md 媒体特有の作法 例外 会話中の指示 今回だけ 地盤 ── 安全・法務(どの層からも上書きできない) permissions.deny / PreToolUse hook / 承認モード
上にいくほど広く効き、そのぶん弱い。下にいくほど狭く、そのぶん強い。安全・法務だけはピラミッドの一部ではなく、ピラミッドが立っている地面として別に扱う(29-6)。

ClaudeCodeでは、どのファイルがどの層か

ClaudeCodeは、作業ディレクトリから上へディレクトリをたどりながら CLAUDE.md を探して読み込みます。つまり、フォルダの深さがそのまま層になります。

案件フォルダの構成例
~/.claude/CLAUDE.md            ← 全体:全案件に効く
~/.claude/rules/*.md           ← 全体:個人の好み

client-a/                      ← ここでClaudeCodeを起動
├── CLAUDE.md                  ← 案件:この案件すべてに効く
├── .claude/
│   ├── settings.json          ← 案件:権限・環境変数(チームで共有)
│   ├── settings.local.json    ← 例外:自分のマシンだけ(gitignore)
│   └── rules/
│       └── tone.md            ← 相手:paths指定で対象を絞れる
├── CLAUDE.local.md            ← 例外:自分だけ(gitignore)
├── design.md                  ← 08番のデザイン仕様
└── lp/
    └── CLAUDE.md              ← 成果物:lp/ の中を触るときだけ読まれる
ClaudeCodeでの実体影響範囲強さそこに書けること
全体~/.claude/CLAUDE.mdすべての案件最も弱い例外のないものだけ
案件./CLAUDE.mdその案件すべて弱いその案件で例外のないもの
相手・領域.claude/rules/*.md指定したファイル群相手固有・領域固有のこと
成果物サブディレクトリの CLAUDE.mdそのフォルダだけ強い媒体特有の作法
例外CLAUDE.local.md・会話中の指示一箇所・一回だけ最も強い今回だけの事情
.claude/rules/ には paths を書けます。paths: ["lp/**/*.html"] と指定すると、そのファイルを触るときだけルールが読み込まれます。「影響範囲を自分で狭める」ための機能です。

設定ファイル(settings.json)も同じ向き

文章のルールだけでなく、権限や環境変数を決める settings.json も、まったく同じ「狭いほど強い」で並んでいます。

優先度ファイル性質
1(最強)managed-settings.json組織が配布。誰も上書きできない
2コマンドライン引数この起動のときだけ
3.claude/settings.local.jsonこのプロジェクト・自分のマシンだけ
4.claude/settings.jsonこのプロジェクト(チーム共有)
5(最弱)~/.claude/settings.json自分の全プロジェクト

ただし 権限(permissions)だけは例外で、各層が上書きではなくマージされます。どこか一つの層で deny されていれば、他の層で allow していても拒否されます。禁止は強いほうに倒れる、という設計です(06番)。

29-3 読む順と、勝つ順は逆

混乱しやすいので、分けて覚えます。

  • 読む順 広いほうから狭いほうへ降りる。全体 → 案件 → 相手 → 成果物 → 例外
  • 勝つ順 その逆。狭いほうが強い
読む順(ClaudeCodeが読み込む順) 勝つ順(指示として効く強さ) 全体 ~/.claude/CLAUDE.md 案件 ./CLAUDE.md 相手・領域 .claude/rules/*.md 成果物 lp/CLAUDE.md 例外 CLAUDE.local.md・会話中の指示
ClaudeCodeはファイルシステムのルート側から作業ディレクトリへ向かって読み込む。あとに読まれた具体的な指示ほど、直前の文脈として効きやすい。

ここで重要なのは、ClaudeCodeが各層を上書きしているのではなく、すべて連結して読んでいることです。公式ドキュメントにも「発見されたすべてのファイルは、互いを上書きするのではなく連結される」とあります。つまり各層はフィルタであって、置き換えではありません。

上から降りながら、選択肢がだんだん絞られていくイメージです。

全体:「日本語で書く」 ここで英語という選択肢が消える 案件:「である調は使わない」 日本語のうち、である調が消える 相手:「絵文字は使わない」 さらに絞られる 残った書き方 日本語・ですます調・絵文字なし
各層は上書きではなくフィルタ。下の層は、上の層が残した選択肢の中からさらに絞る。
階層は「読み込みの仕組み」であって、「実行の保証」ではありません。公式ドキュメントは CLAUDE.md について「これはコンテキストであり、強制される設定ではない。厳密な遵守は保証されない」と明記しています。確実に守らせたいものは、29-6で扱う仕組み側で止めます。

29-4 「ルールがない」と「まだ確認していない」は別物

相手のルールが何も書かれていなければ、その層は飛ばして次へ進みます。上の層のルールがそのまま生きる。これは正常な動作です。

ただし、それは相手のドキュメントを開いて「特に指定なし」と確認した場合の話です。開いてすらいないのなら、それは通過ではなく手抜きです。

AIに任せるとき、ここが最も事故る場所です。ClaudeCodeには、確認できる手段が用意されています。

  1. /memory を実行するそのセッションで実際に読み込まれている CLAUDE.mdCLAUDE.local.md・rules ファイルの一覧が表示されます。ここに出てこないファイルは、ClaudeCodeから見えていません。
  2. サブディレクトリの読み込みタイミングを理解するサブフォルダの CLAUDE.md は起動時ではなく、そのフォルダのファイルを実際に読むときに読み込まれます。「まだ読まれていないだけ」を「ルールがない」と誤解しないこと。
  3. 参照した証拠を残させるNotion(14番)やドキュメントを参照させるときは、「参照したページのURLを必ず出力に記録する」と指示しておく。確認したという証拠が残ります。

27番で作ったレビューAIに、この記録の有無をチェックさせるのが実用的です。「参照URLが書かれていなければ差し戻す」という基準を1行足すだけで、確認漏れが検出できます。

確認していないことを、ルールがないことと同じに扱わない。

29-5 矛盾は、上の層が書きすぎているサイン

階層がきれいに入れ子になっていれば、矛盾は原理的に起きません。起きたということは、上位の層に「配下の一部しか満たせないこと」が書いてあるということです。

✕ 上位層に書きすぎている ~/.claude/CLAUDE.md(全体) 「ブランドの声は落ち着いたトーンで」 自社の発信 ○ 満たせる client-a ✕ 明るくと言われる 配下の一部しか満たせない=上位に書けない その場で下位を優先しても、 次の案件でまた同じ衝突が起きる ○ 一つ下の層に降ろす ~/.claude/CLAUDE.md(全体) トーンの指定は書かない 自社の発信 own/CLAUDE.md 落ち着いたトーン client-a client-a/CLAUDE.md 明るいトーン どちらの層も、配下すべてが満たせる 矛盾は構造的に起きなくなる
矛盾は、下の層で握りつぶすのではなく、上の層から降ろして解消する。

29-1の例に戻ります。「相手ルールのほうが具体的だから採用」と処理すると、その場は動きます。ですが間違いは修正されません。次の案件でも、その次でも、同じ衝突が起き続けます。

正しい対処は、全体ルールから「ブランドの声」を降ろすことです。あれは自社の発信に適用されるルールであって、顧客の代わりに書く仕事には適用されない。一つ下の層に置くべきものでした。

矛盾は、バグではなくルール設計の欠陥を知らせるアラートです。

ClaudeCodeには claudeMdExcludes という設定があり、特定の CLAUDE.md を読み込み対象から外せます。他チームのファイルを避けるには有効ですが、自分のルールの矛盾をこれで隠すのは対症療法です。原因は上位層の書きすぎであって、読み込みの設定ではありません。

ルールを書くときの唯一の原則。上位層には、配下のすべてが満たすものだけを書く。

29-6 例外は、安全と法務だけ

誇大表現をしない。他人の著作物を勝手に使わない。個人情報を書かない。

これらは最も広く適用され、かつ最も強い。下位のどの層からも上書きできません。だから29-2の図では、ピラミッドの一部ではなく、ピラミッドが立っている地面として描いています。

そしてもう一つ、重要なことがあります。地盤は、文章では守られません。

CLAUDE.md に「勝手に投稿しないこと」と書いても、それはお願いです。公式ドキュメントの表現を借りれば、CLAUDE.md は「コンテキストであって、強制される設定ではない」。長い作業の途中や曖昧な状況では、従わないことがあります。本当に守りたいなら、権限設定やフック(実行前に走るチェック処理)で機械的に止める必要があります。

文章で書いた場合(すり抜けることがある) AIの判断 CLAUDE.md の一文 「勝手に投稿しないこと」 実行された 保証はない 仕組みで止めた場合(判断の前に落ちる) AIの判断 permissions.deny PreToolUse hook・承認モード ここで停止 実行されない
文章は説明であって、強制力ではない。地盤に置きたいものは、実行前に機械的に落とす。

ClaudeCodeで地盤を作る手段は3つです。

  • permissions.deny:特定のコマンドやファイルパスへの操作を禁止する。どこか一つの層でdenyされていれば、他の層のallowでは覆せません。
  • フック(PreToolUse):ツールが実行される直前に、こちらのスクリプトを走らせて可否を判定する。AIの判断に関係なく必ず動きます。
  • 承認モード:実行のたびに人間に確認を求める。06番で扱った考え方が、そのままここに効いてきます。
組織で配布する managed-settings.json と、その場所に置く CLAUDE.md は、ユーザー側の設定では除外も上書きもできません。会社として絶対に守らせたいものは、この層に置きます。

29-7 どこで使えるか

この構造はClaudeCodeへの指示に限りません。影響範囲と優先度を逆向きに並べる、というだけの話なので、ルールが増える場所すべてに使えます。

対象広い(弱い) → 狭い(強い)
ClaudeCodeへの指示~/.claude/CLAUDE.md → プロジェクトの CLAUDE.md.claude/rules/ → サブフォルダの CLAUDE.md → 会話中の指示
外注・チーム運用会社ルール → 部署 → 案件 → 個別指示
Discord運営サーバールール → チャンネル → イベント → その回だけ
デザインシステムグローバル → テーマ → コンポーネント → インスタンス

「なんとなくルールが増えて、誰も守らなくなった」という状態は、たいてい全部を同じ平面に並べていることが原因です。階層に置き直すだけで、どれが強いかが自明になります。

点検のしかた

  1. ~/.claude/CLAUDE.md を開く一行ずつ「これは本当に全部の案件で守れるか」を確かめる。
  2. 守れない行を見つける一つでも例外がある行が、降ろすべきルールです。
  3. 一つ下の層へ移すその案件の CLAUDE.md、あるいは .claude/rules/paths 付きで移す。
  4. 安全・法務の行を分ける「絶対に守らせたい」ものが文章として書かれていたら、permissions.deny やフックに移す。文章のままにしない。
  5. /memory で確認する移したあと、意図したファイルが読み込まれているかを確認する。