🐱

Claude Code:rulesの適用pathsスコープは嘘?一度読み込まれたルールは二度と消えない

に公開

結論から

Claude Codeのrulesにおけるpathsフロントマターは、ドキュメントの説明と実際の挙動が異なります。

公式ドキュメントの説明

公式ドキュメントにはこう書かれています:

Rules can be scoped to specific files using YAML frontmatter with the paths field. These conditional rules only apply when Claude is working with files matching the specified patterns.

「マッチするパターンのファイルで作業しているときだけ適用される」と読めます。

実際の挙動

しかし検証したところ、一度読み込まれたルールはセッション終了まで適用され続けます
pathsで指定したディレクトリから離れても、ルールは消えません。

つまり paths は「適用スコープ」ではなく「読み込みトリガー」として機能しています。

検証:「にゃん」と「わん」で確かめる

わかりやすく検証するため、語尾を変えるルールを使いました。

セットアップ

# ~/.claude/rules/test-nyan.md
---
paths:
  - "works/my-project/**/*"
---
語尾に「にゃん」をつけること

このルールはworks/my-project/配下のファイルを操作するときだけ適用される...はずです。

検証結果

ステップ 期待する挙動 実際の挙動
~/ でセッション開始 にゃんなし にゃんなし ✓
~/works/my-project/ のファイルを編集 にゃんあり にゃんあり ✓
~/ のファイルを編集 にゃんなし にゃんあり

3番目がポイントです。
pathsで指定したディレクトリから離れても、ルールが適用され続けています。

CLAUDE.mdでも同じ現象

rulesだけでなく、階層的な CLAUDE.mdでも同様の累積的な挙動が確認できます。

セットアップ

設定内容 ファイルの場所
語尾に「にゃん」つけて ~/.claude/CLAUDE.md
語尾に「わん」つけて ~/works/my-project/CLAUDE.md

検証結果

  1. ~ でセッション開始 → 「にゃん」で応答 ✓
  2. ~/works/my-project/ のファイルを参照する指示 → 「わん」で応答 ✓
  3. ~ のファイルを参照する指示 → 「わん」のまま

下位ディレクトリの参照・操作時に、そこのCLAUDE.mdが読み込まれます。
そのディレクトリを扱う限り、そこのルールに従うのは期待通りの挙動です。

ただし、その指示プロンプトはセッション中ずっと維持されるため、そのまま上位ディレクトリの操作に戻っても下位ディレクトリのCLAUDE.mdで書いた指示は有効なままです。

何が問題か

この挙動は、下位ディレクトリにだけ特有の特別ルールを記載していた場合に問題となります。

1度でも下位ルールに触れたセッションは、その特別ルールを持ったまま上位ディレクトリの操作を行う可能性があるためです。
私はこれを「下位ルール汚染」と呼ぶことにしました。

たまにベストプラクティスとして、各ディレクトリにCLAUDE.mdを置いて分散管理する運用がありますが、この挙動を見る限り私はお勧めしません。

rulespath指定も同様で、どうしてもやるなら、ディレクトリごとに1セッションで運用すべきです。

なぜこうなるのか

検証から予測できる仕様をまとめます。

読み込みの仕組み

  • CLAUDE.md はカレントディレクトリから / まで上方向に再帰的探索
  • 子ディレクトリは遅延読み込み(アクセス時に初めて読み込み)
  • ~/.claude/CLAUDE.md は別枠で常に読み込み

累積的な適用

  • 一度読み込まれたルールはセッション全体に適用される
  • ディレクトリを離れても「スコープアウト」しない
  • pathsは(少なくとも現時点では)読み込みの条件であり、適用範囲の制限ではない

対策

現状の挙動を踏まえた運用方法です。

1. セッションをディレクトリごとに分ける

ディレクトリ固有のルールがある場合の最も確実な方法。
ディレクトリAの作業が終わったら、新しいセッションでディレクトリBの作業を始める。

2. 階層間で矛盾するルールを書かない

上位と下位で相反する指示を避ける。下位のCLAUDE.mdは「上書き」ではなく「追加・補足」に徹する。

3. 矛盾時の振る舞いを明示する

# ~/.claude/CLAUDE.md
- ルールの矛盾を見つけた場合は必ずユーザに確認すること

これを書いておくと、複数のルールが競合したときに確認してくれます。
私はAskUserQuestionツールで聞いてもらうようにしています。

anthropics/claude-codeにも報告済み

調べたところ、この挙動は既にissueとして報告されています。
ただ、「スコープアウトしない」という点が元のissueでは明示されていなかったため、私も非常に僭越ながら追加情報としてコメントしました。

まとめ

  • pathsフロントマターは「適用スコープ」ではなく「読み込みトリガー」
  • 一度読み込まれたルールはセッション終了まで累積的に適用される
  • 対策はセッション分離、ルールの整理、矛盾時の確認指示

ドキュメントと実際の挙動が異なるのは困りますが、仕様を理解した上で運用すれば問題を回避できます。
将来的に修正されることを期待しつつ、現状はこの挙動を前提に設計しましょう。

Discussion