CLAUDE.mdが無視される?肥大化を防ぐ3層構造と棚卸しチェックリスト

chars:4060 tbl:5 code:3 int:9 ext:0 faq:4

CLAUDE.mdが無視される、反映されない、守らない——Claude Codeを使い込むほどぶつかるこの問題。原因は「肥大化」。この記事では、肥大化を防ぎ、遵守率を上げる実践的な方法を全て解説する。

CLAUDE.mdが無視される3つの原因

原因1: 200行を超えている

CLAUDE.mdは先頭約200行がセッション開始時にロードされる。200行を超えた部分は読み込まれにくく、ルールが無視される原因になる。

# 行数チェック
wc -l CLAUDE.md
# 200以下なら安全、60以下が理想

原因2: ルールが多すぎて埋もれている

20個のルールを全て同じ重要度で書くと、Claudeは「どれを優先すべきか」が分からない。結果として「sedでPHP編集しない」(致命的)と「コミットメッセージは日本語で」(軽微)が同列に扱われ、致命的なルールが無視される。5行ルール」で最重要ルールを冒頭に集約するのが解決策。

「コードから分かる情報を書くな」の具体例:

書いてしまいがち(NG)なぜNGか
「このプロジェクトはReact 18を使用」package.jsonを見れば分かる
「srcディレクトリにソースコードがある」ディレクトリ構造を見れば分かる
「TypeScriptを使用」tsconfig.jsonの存在から分かる
「テストはjest」jest.config.jsの存在から分かる
「ESLintでlintしている」.eslintrc.jsの存在から分かる

これらをCLAUDE.mdに書くのは全てトークンの無駄。Claude Codeはこれらのファイルを自動で読んで技術スタックを把握する。書くべきは「コードからは分からない情報」のみ: プロジェクト固有の禁止事項、チームの慣習、過去のトラブル事例など。

原因3: セッション後半で古い指示が埋もれる

CLAUDE.mdはセッション開始時に1回だけ読み込まれる「ユーザーメッセージ」。会話が長くなると、新しいメッセージに押されて相対的に古くなり、遵守率が下がる。長いセッションでは/compactで圧縮すると改善する。

具体的には、セッション開始時にCLAUDE.mdの60行がコンテキストの先頭に注入される。その後の会話が100メッセージを超えると、CLAUDE.mdの内容はコンテキストの「遠い過去」になり、最近のメッセージに比べて影響力が低下する。これがセッション後半でのルール無視の根本原因。

対策は3つ: (1) /compactで中間メッセージを圧縮(CLAUDE.mdの相対的な影響力が回復)、(2) .claude/rules/でファイル操作時にルールを再注入、(3) Hooksで編集前に自動表示。

Hooksによるルール自動注入

セッション後半でルールが忘れられる問題の高度な解決策がHooks。ファイル編集前にルールを自動表示させる設定:

// .claude/settings.json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "command": "echo '⚠️ ルール確認: sedでPHP編集禁止。Pythonで行単位編集すること。'"
      }
    ]
  }
}

この設定で、Claude Codeがファイルを編集するたびにルール確認メッセージが表示される。セッション後半でもルールが「再注入」されるため、忘却問題を根本解決できる。ただし設定が複雑なため、まずはrules/の条件付きロードから始めるのがおすすめ。

「腐ったCLAUDE.md」の危険性

腐ったCLAUDE.mdは、ないよりも有害。古いルールや矛盾するルールが残っていると、Claude Codeの判断を誤らせる。例えば:

  • 「テストはjestで書く」と書いてあるが、プロジェクトはvitestに移行済み → Claude Codeがjestでテストを書く
  • 「Node.js 16を使用」と書いてあるが、実際はNode.js 20 → 互換性のない書き方をする
  • 「APIエンドポイントは/api/v1/」と書いてあるが、v2に移行済み → 古いAPIを呼ぶコードを生成する

これらは「CLAUDE.mdがない」状態より悪い。Claude Codeは「コードから分かること」より「CLAUDE.mdに書いてあること」を優先するため、古い情報が積極的に害を及ぼす。3ヶ月ごとの棚卸しが必須な理由はここにある。

腐敗を検知する方法: Claude Codeに「CLAUDE.mdに書いてあるルールの中で、現在のプロジェクトの実態と矛盾しているものはあるか?」と聞く。Claude Codeはコードベースとpackage.jsonを読んだ上で矛盾を指摘してくれる。例えば「CLAUDE.mdに『Node.js 16を使用』と書いてあるが、.nvmrcには20が指定されている」といった矛盾を発見できる。

もう1つの方法は、/initで新しいCLAUDE.mdを生成し、既存のCLAUDE.mdと比較すること。差分が大きければ大きいほど、既存のCLAUDE.mdが「腐っている」可能性が高い。バックアップを取ってから/initで再生成→必要なルールだけ手動で追加し直すのが最も確実な「リフレッシュ」方法。

肥大化した CLAUDE.md の移行例

実際に200行超のCLAUDE.mdを60行に削減した移行例:

内容移行前移行先理由
最重要ルール5行CLAUDE.mdCLAUDE.md(そのまま)毎回必要
PHP編集ルールCLAUDE.md 20行.claude/rules/php.mdPHP操作時のみ必要
テストルールCLAUDE.md 15行.claude/rules/test.mdテストファイル操作時のみ
デプロイ手順CLAUDE.md 30行.claude/commands/deploy.mdデプロイ時のみ(Skill化)
コードレビュー手順CLAUDE.md 25行.claude/commands/review.mdレビュー時のみ(Skill化)
モデル仕様(回帰係数等)CLAUDE.md 50行.claude/commands/predict.md予測時のみ(Skill化)
package.jsonの内容CLAUDE.md 10行削除Claudeが直接読める

結果:200行→60行(70%削減)。ルールの遵守率が体感で大幅に改善し、特に「sedでPHPを編集しない」ルールの違反が月2-3回→0件に。

移行の具体的な手順

# Step 1: バックアップ
cp CLAUDE.md CLAUDE.md.backup

# Step 2: 行数確認
wc -l CLAUDE.md  # 200行超→移行必要

# Step 3: ディレクトリ作成
mkdir -p .claude/rules .claude/commands

# Step 4: ファイル種別ルールをrules/に移動
# CLAUDE.mdからPHP関連20行を切り出し→ .claude/rules/php-safety.md

# Step 5: ワークフローをSkills化
# CLAUDE.mdからレビュー手順25行を切り出し→ .claude/commands/review.md

# Step 6: コードから分かる情報を削除
# package.jsonの依存関係一覧→削除

# Step 7: 行数再確認
wc -l CLAUDE.md  # 60行以内になっているか確認

1回の移行で10-20行ずつ削減していくのが安全。全てを一度にやろうとしない。

.claude/rules/ の使い方

.claude/rules/はYAML frontmatter(ファイル冒頭の---で囲まれた設定エリア)で条件指定できるルールファイル。特定のファイルを操作する時だけ読み込まれるため、CLAUDE.mdの行数を減らせる。

# .claude/rules/php-safety.md
---
description: PHP editing safety rules
globs: "**/*.php"
---
- sedでPHPファイルを編集しない(Pythonで行単位編集すること)
- 編集後は php -l で構文チェック
- functions.phpの}を消さないこと

このファイルはPHPファイルを操作する時だけ自動ロードされる。セッション開始時には読み込まれないため、トークンを節約できる。

セッション後半で忘れる問題の対策

方法効果手軽さ
.claude/rules/ の条件付きロード◎ ファイル操作時に再注入◎ ファイル置くだけ
/compact で圧縮○ コンテキスト整理で遵守率改善◎ コマンド1つ
ソースコード先頭コメント○ ファイル読み込み時に目に入る△ 全ファイルに追加必要
Hooksで自動注入◎ 編集前にルールを自動表示△ 設定が複雑

最も手軽で効果が高いのはrules/の条件付きロード。次点で/compact。

CLAUDE.mdの棚卸しチェックリスト

3ヶ月に1回、以下のチェックリストでCLAUDE.mdを見直す。

  • □ 200行を超えていないか?(wc -l CLAUDE.md
  • □ コードから分かることを書いていないか?(package.jsonの情報等)
  • □ Claude Codeのアップデートで不要になったルールはないか?
  • □ 特定タスクでしか使わないルールがないか?(→ Skillsに移動)
  • □ ファイル種別ごとのルールがないか?(→ rules/に移動)
  • □ 最重要ルールが冒頭5行にあるか?
  • □ 全ルールにWHY(理由)がついているか?
  • □ 同じルールがCLAUDE.mdとrules/の両方に書かれていないか?(重複削除)
  • □ 3ヶ月前に追加したルールで、今も有効なものはどれか?

このチェックリストを3ヶ月ごとに実行するだけで、CLAUDE.mdの品質を維持できる。チェックリスト自体をSkill化(/claudemd-audit)して自動化するのも有効:

# .claude/commands/claudemd-audit.md
CLAUDE.mdの品質を監査してください。

チェック項目:
1. 行数が60行以内か(wc -l CLAUDE.md)
2. コードから分かる情報が含まれていないか
3. 重複するルールがないか
4. .claude/rules/ に移動すべきルールがないか
5. Skillsに移動すべきワークフローがないか
6. 不要になったルールがないか
7. 全ルールにWHY(理由)がついているか

改善提案を箇条書きで出してください。

このSkillで/claudemd-auditを実行するだけで、Claude Code自身がCLAUDE.mdの品質をチェックしてくれる。人間が1行ずつ確認するより効率的で、見落としも少ない。

よくある質問

Q: 何行が最適?

公式推奨は200行以内。実務最適は60行前後。最重要5行 + プロジェクト概要 + 自己改善プロトコル で構成するのがベスト。→「書き方ガイド」の5行ルール参照。

Q: /initで作り直してもいい?

はい。バックアップを取ってから/initで再生成し、必要なルールだけ追加し直すのが最も確実な棚卸し方法。

まとめ|肥大化を防ぐ3つのルール

  1. 60行以内に収める(200行超は危険)
  2. 3層構造で分散(CLAUDE.md → rules/ → Skills)
  3. 3ヶ月ごとに棚卸し(チェックリストで見直し)

CLAUDE.mdの書き方は「書き方ガイド」、テンプレートは「テンプレート集」、3ファイルの違いは「agents.md比較」、Skillsは「Skills完全ガイド」、使い方は「使い方ガイド」、コマンドは「コマンド早見表」を参照。

肥大化の兆候チェック

以下のサインが出たらCLAUDE.mdが肥大化している可能性が高い:

  • ⚠️ wc -l CLAUDE.mdで100行を超えている
  • ⚠️ セッション後半でClaude Codeがルールを無視するようになった
  • ⚠️ CLAUDE.mdに「この手順でやって」系のワークフローが5つ以上ある
  • ⚠️ package.jsonやtsconfig.jsonの内容をCLAUDE.mdに転記している
  • ⚠️ PHPルール、テストルール、デプロイ手順が全て同じファイルに混在している

肥大化を防ぐ方法|3層構造(Progressive Disclosure)

CLAUDE.mdの肥大化を防ぐ最も効果的な方法は、情報を3つのレイヤーに分散するProgressive Disclosure(段階的開示)設計。Anthropicのベストプラクティスでも推奨されている手法。

Layer何を置くか読み込みタイミングサイズ目安
Layer 1: CLAUDE.md最重要ルール(5行ルールセッション開始時(毎回)60行以内
Layer 2: .claude/rules/ファイル種別ごとのルール条件付き(該当ファイル操作時)各ファイル20行以内
Layer 3: Skillsワークフロー・手順書呼び出し時のみ制限なし

Layer 3のSkillsが肥大化解決の本命。Skillsはセッション開始時にロードされないため、いくら増やしてもトークン消費に影響しない。CLAUDE.mdに書いていたワークフロー(「コードレビューの手順」「デプロイ手順」等)をSkillsに移すだけで、CLAUDE.mdが劇的に軽くなる。

rules/ディレクトリの活用パターン

rules/ファイルの実用的なパターンを紹介。全てglobs指定で条件付きロードされるため、CLAUDE.mdの行数を増やさずにルールを追加できる。

# .claude/rules/testing.md
---
description: テストファイル操作時のルール
globs: "**/*.test.*,**/*.spec.*"
---
- テストフレームワークはvitest(jestは使わない)
- describe/it形式で書く
- テスト名は日本語で書く
- 正常系と異常系の両方を必ず書く

# .claude/rules/git-commit.md
---
description: Git操作時のルール
globs: null
---
- コミットメッセージはConventional Commits形式
- 日本語で書く
- 1コミット = 1論理単位

globsをnullにすると、手動で@.claude/rules/git-commit.mdで参照した時だけ読み込まれる。公式ドキュメントにglobs指定の詳細がある。

肥大化のBefore/After実測データ

指標Before(200行超)After(60行+rules/+Skills)
CLAUDE.md行数200行以上60行
sedによるPHP破壊事故月2〜3回0回
/clear回数(1日)5〜6回3回
ルール無視の発生頻繁(特にセッション後半)ほぼなし
セッション開始のトークン消費小(1/3以下)
Proプランでの1日利用時間1.5〜2時間3〜4時間

最も効果が大きかったのは「Proプランでの利用時間が2倍になった」こと。CLAUDE.mdが軽くなったことでセッション開始時のトークン消費が減り、その分実作業に使えるトークンが増えた。月$20の投資効果が倍増した形。

よくある質問(追加)

Q: rules/ファイルはいくつまで作れる?

制限はない。ただし該当ファイルを操作するたびにロードされるため、1ファイルあたり20行以内に収めるのが推奨。10個以上のrules/ファイルを作る場合は、本当に条件分けが必要か見直すこと。

Q: 棚卸しを自動化できる?

/memoryコマンドでClaude CodeにCLAUDE.mdを分析させると、「不要なルール」「重複」「コードから分かる情報」を指摘してくれる。完全自動とはいかないが、人間が1行ずつ確認するよりはるかに効率的。3ヶ月ごとに/memoryを実行して提案に従う運用がおすすめ。

# 棚卸しのコマンド例
> CLAUDE.mdの内容を分析して。以下の観点でチェック:
> 1. コードから分かる情報が含まれていないか
> 2. 重複するルールがないか
> 3. 不要になったルールがないか
> 4. rules/やSkillsに移動すべきルールがないか
> 改善提案を出して。

Q: CLAUDE.mdなしで始めて後から追加しても大丈夫?

問題ない。最初はCLAUDE.mdなしで使い始め、Claude Codeが間違いを犯した時に初めてルールを追加するのが最も効率的な始め方。「推測でルールを書く」のではなく「失敗からルールを学ぶ」アプローチが、肥大化を防ぐ最大のコツ。→「書き方ガイド」の5行ルール

肥大化の経時変化と対策タイムライン

時期CLAUDE.mdの状態やるべきこと
Day 10行(/initで10-20行を自動生成)/initを実行。まだルールは追加しない
Week 1-210-30行Claude Codeが間違えた時だけルール追加
Month 130-60行最適サイズ。このまま維持
Month 2-360-100行⚠️ 肥大化開始。ワークフロー部分をSkillsに移動
Month 3+100行超🔴 危険。rules/への分離と棚卸しが必須

Month 1の30-60行が最適ゾーン。これを超えたら移行のサイン。放置すると200行超まで膨らみ、ルール遵守率が目に見えて下がる。私の経験では、100行を超えた時点で「sedでPHP編集しない」ルールが無視される事故が発生し始めた。60行に戻したら即座に改善した。

CLAUDE.mdのサイズ vs 遵守率の関係

私の実体験に基づく、CLAUDE.mdのサイズとルール遵守率の関係:

CLAUDE.md行数遵守率(体感)トークン消費への影響Proプランでの利用時間
20行以内◎ ほぼ100%最小4時間+
40-60行◎ 95%+3-4時間
80-100行○ 80-90%2-3時間
150行△ 60-70%1.5-2時間
200行超✗ 50%以下最大1-1.5時間

注目すべきは「Proプランでの利用時間」の列。CLAUDE.mdが重いと、毎セッションで大量のトークンを消費するため、実作業に使えるトークンが減る。200行のCLAUDE.mdを60行に削減するだけで、利用時間が1.5倍になる。これは月$20の投資効果を直接的に高める改善。

参考文献・公式リソース