CLAUDE.mdにルールを書いたのに、守られる時と守られない時がある。しかも長く書けば書くほど、効かなくなっているような気がしていた。
自分もしばらくこれで悩んでいたのだけど、公式ドキュメントを読み直してみたら、原因は書き方ではなくファイルの置き方にあった。ドキュメントにはちゃんと全部書いてあって、自分が読めていなかっただけだった。
この記事では、その仕様を整理して、実際に使っている構成と一緒にまとめておく。
検証環境: Claude Code(デスクトップアプリ)/2026年8月時点の公式ドキュメントに準拠。このあたりは更新が速いので、細かい部分は末尾の出典で最新を確認してください。
要点
- CLAUDE.mdは200行以内が目安。長くなるほどコンテキストを使うので、指示が守られにくくなる
@importで分けてもコンテキストは減らない。起動時に全部展開して読み込まれる- 読み込む量を減らしたいなら
.claude/rules/にpathsを付ける。該当するファイルを触ったときだけ読み込まれる - CLAUDE.mdはシステムプロンプトではなく、その後ろにユーザーメッセージとして渡されるので、強制力はない
- 必ず実行させたい処理は、CLAUDE.mdではなく hooks に書く
こんな人に読んでほしい
- Claude Codeを使っていて、ルールが守られたり守られなかったりする人
- とりあえず全部CLAUDE.mdに書いていて、ファイルが膨らんできた人
- コーディング規約やデザインのルールを、毎回言い直さずに済ませたい人
自分は制作会社でデザインとコードの両方を担当していて、案件ごとの仕様をClaude Codeに渡しながら作っている。最初は思いついたルールを片っ端からCLAUDE.mdに書き足していて、丁寧に書くほど精度が上がると思っていた。
ところが実際は逆で、書き足すほど守られなくなっていった。しかも、どのルールが無視されるのかも予想できない。調べてみると、原因は次の3つだった。
誤解1:長く書くほど正確になる
実はこれが逆だった。公式ドキュメントには、1ファイル200行未満を目安にする事と、長いファイルはコンテキストを使うので指示に従いにくくなる事がはっきり書かれている。
もうひとつ知っておきたいのが、CLAUDE.mdがどういう形で渡されているか。中身はシステムプロンプトの一部ではなく、その後ろにユーザーメッセージとして追加される。設定として強制されるわけではなく、あくまで文脈として渡されるので、守るかどうかは最終的にモデルの判断になる。
なので、次の2つは書いてもあまり意味がない。
- 曖昧な指示 … 守りようがない
- 矛盾した指示 … どちらか片方が勝手に選ばれる
書くときに気をつけているのは、守れたかどうかを確認できるくらい具体的に書く事。
効かない書き方 | 効く書き方 |
|---|---|
コードを綺麗にフォーマットして | インデントは半角スペース2つ |
ちゃんとテストして | コミット前に |
ファイルを整理して | APIハンドラは |
パフォーマンスに配慮して | 画像は |
それと、コードを読めば分かる事は書かないようにしている。ディレクトリ構成や依存パッケージの一覧、アーキテクチャの説明などは、書いた分だけ他の指示が埋もれてしまう。残しておくのは、ハマりやすい所と、なぜそうしているのかという理由、一般的なやり方と違う部分くらい。
誤解2:@importで分ければ軽くなる
自分がいちばん勘違いしていたのが、ここだった。
CLAUDE.mdは @path/to/file と書くと他のファイルを読み込める。ただ、読み込まれたファイルは起動時に展開されてコンテキストに入るので、使うトークンの量は減らない。分割するのは整理の為であって、軽くする為ではない。
# CLAUDE.md
@docs/design-system.md ← 起動時に全文がコンテキストへ
@docs/coding-rules.md ← これも全文がコンテキストへあわせて、知っておくと便利な挙動が3つある。
- 入れ子のインポートは4階層まで
- 相対パスは作業ディレクトリからではなく、インポート元のファイルからの相対で解決される
- コードブロックやバッククォート内の
@は読み込まれない。文章中でパスに触れたいだけなら囲んでおけば安全

.claude/rules と paths で読み込む量を減らす
実際にコンテキストを節約できるのはこちら。.claude/rules/ に置いたルールに paths を書いておくと、そのパターンに一致するファイルをClaudeが読んだときだけルールが読み込まれる。
your-project/
├── .claude/
│ ├── CLAUDE.md # 常に読み込まれる(200行以内に抑える)
│ └── rules/
│ ├── css.md # CSSを触るときだけ
│ ├── html.md # HTMLを触るときだけ
│ └── deploy.md # 常に読み込まれる(paths なし)---
paths:
- "**/*.{css,scss}"
---
# CSSルール
- カスタムプロパティは `:root` にまとめる。値の直書きは禁止
- メディアクエリはコンポーネントごとに書く。末尾にまとめない
- z-indexは定義済みの変数以外を使わないpaths を書かなかったルールは常に読み込まれる。glob記法が使えるので、まとめて指定する事もできる。
---
paths:
- "src/**/*.{ts,tsx}"
- "tests/**/*.test.ts"
---複数の案件で同じルールを使いたい場合は、シンボリックリンクにしておくと便利。案件ごとに同じ規約をコピーしている人は、かなり手間が減ると思う。
ln -s ~/shared-claude-rules .claude/rules/sharedどこに何を書くか
やりたいこと | 置き場所 |
|---|---|
全体に効かせたい方針・規約 |
|
特定のファイルだけの規約 |
|
絶対にやらせたい処理 | hooks |
ツールやコマンドごと禁止したい | 権限設定( |
手順の長い定型作業 | Skills(必要なときだけ読み込まれる) |
コピペ用テンプレート(Web制作向け)
使い回せるのは中身ではなく、見出しの骨組みの方。案件が変われば絶対ルールや品質基準は変わるけれど、この5つの枠はどの案件でも同じように使える。
# プロジェクト概要
(1〜2行。コードを読んでも分からない前提だけ)
## コマンド
(毎回使うものだけ。開発・確認・デプロイ)
## 絶対ルール
(破られると作り直しになるもの。「〜しない」で書けると強い)
## 品質基準
(数値で書く。守れたか判定できるもの)
## 迷ったとき
(勝手に進めてほしくない場面の指示)埋め方の例として、自分が静的サイトの案件で使っている中身も載せておく。Claudeがコードから読み取れない事だけを書くと、だいたい30行くらいに収まる。
# プロジェクト概要
静的なコーポレートサイト。バンドラは使わず、素のHTML/CSS/JSで作る(npm scriptsは画像最適化などに使う)。
## コマンド
- ローカル確認: `npx serve public`
- 画像最適化: `npm run img`
## 絶対ルール
- CSSフレームワークを入れない
- JavaScriptライブラリを追加しない(jQuery含む)
- 画像はAVIFを主、WebPをフォールバックにして `<picture>` で出す
- すべての `<img>` に width / height を書く
- 色とフォントサイズは `tokens.css` の変数以外を使わない
## 品質基準
- LCP 2.5秒以内 / INP 200ミリ秒未満 / CLS 0.1以下
- WCAG 2.2 AA(コントラスト比・キーボード操作・フォーカス可視化)
## 迷ったとき
- 実装せずに選択肢を出す
- 既存のコンポーネントで代替できないか先に確認するこれ以外のルールは全部 .claude/rules/ に移している。常に読ませる物は短くして、細かいルールは条件付きで読ませる、というのが基本的な考え方。
読み込まれているか確認する
書いただけで満足してしまうのがいちばん危ないので、確認する方法も書いておく。
/context… いま読み込まれているメモリファイルの一覧が出る。ここに出ていなければ、そのファイルは無いのと同じ/memory… CLAUDE.mdやauto memoryを一覧して編集できる/doctor… 膨らんだCLAUDE.mdの削減案を出してくれる。コードから読み取れる情報を削って、落とし穴や判断理由は残す挙動。この機能はv2.1.206以降InstructionsLoadedフック … どの指示ファイルが、いつ、なぜ読み込まれたかをログできる。pathsのデバッグ用
指示が効かないと感じたら、書き直す前にまず /context を見てみてください。そもそも読み込まれていなかったという事がよくあって、自分の場合もこれが原因だった。
auto memoryにも上限がある
CLAUDE.mdが人が書く指示なのに対して、auto memoryはClaudeが自分で書いていくメモ。保存先はプロジェクトごとの ~/.claude/projects/<プロジェクト>/memory/。
CLAUDE.md | auto memory | |
|---|---|---|
書く人 | 自分 | Claude |
中身 | 指示・ルール | 気づき・パターン |
読み込み | 毎回全文 | 毎回(先頭200行 または 25KBまで) |
注意したいのは、起動時に読まれるのは MEMORY.md の先頭200行か25KBの、どちらか先に達したところまでという事。それを超えた部分は読まれない。トピック別のファイル(debugging.md など)は起動時には読まれず、必要になったときにClaudeが自分で開きに行く。
なので MEMORY.md は索引として短く保つのがいいと思う。放っておくと、保存はされているのに一度も読まれない部分が少しずつ増えていく。たまに /memory で中身を確認して、間違って覚えている事は消しておいてください。古くて間違ったメモは、メモが無いよりも害がある。
/compact のあとルールが守られなくなる理由
長いセッションで、さっきまで守られていたルールが急に無視され始める事がある。これも仕様を知ると理由が分かる。
- プロジェクトルートのCLAUDE.mdはコンパクションを生き延びる(
/compactのあとディスクから読み直されて再注入される) - サブディレクトリのCLAUDE.mdと
paths付きのルールは自動では戻らない。次にそのファイルを読んだタイミングで読み込み直される - 会話の中だけで伝えた指示は、当然消える

対策としては、会話の中で伝えた大事なルールは、その場でCLAUDE.mdに書いておく事。同じ指摘を2回したら、それはファイルに書いておくべき内容だと思う。
絶対にやらせたいならhooksに書く
考え方として、いちばん大事なのはここだと思う。
CLAUDE.mdはあくまで文脈として渡されるもので、強制する仕組みではない。コミット前に必ずlintを走らせる、保存したら必ずフォーマッタをかける、といった必ずやってほしい事は、CLAUDE.mdではなく hooks に書く。hooksは決まったタイミングでシェルコマンドとして実行されるので、Claudeの判断に関係なく動いてくれる。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "npx prettier --write $CLAUDE_FILE_PATHS"
}
]
}
]
}
}使い分けとしては、破られたら困る事はhooks、破られても直せる事はCLAUDE.md、と考えている。

よくある質問
Q. 200行を超えたら動かなくなりますか。
いいえ、読み込みはされます。ただ長いほどコンテキストを食って、守られにくくなります。200行は実用的な目安です。
Q. 分割したのにコンテキストが減りません。@import は起動時に全文展開されるので減りません。減らしたいなら .claude/rules/ の paths を使ってください。
Q. /init で自動生成するのはアリですか。
出発点としてはアリです。ただ生成されたものにはコードから読み取れる情報が多く入るので、そこから削る作業が本番になります。
Q. Web制作でも意味ありますか。
むしろ相性がいいです。デザイントークン、命名規則、アクセシビリティ要件みたいに、毎回同じことを言い直している内容ほど効果が出ます。
まとめ
- CLAUDE.mdは200行以内に収まっているか
- コードから読み取れる情報を書いていないか
- 指示は確認できる粒度になっているか
- 矛盾したルールが複数のファイルに残っていないか
- 一部でしか使わないルールを
.claude/rules/に逃がしたか /contextで本当に読み込まれているか確認したかMEMORY.mdが200行/25KBを超えていないか- 破られたら困る処理をhooksに移したか
AIに書かせる前提の制作だと、生産性を左右するのはプロンプトの上手さよりも指示ファイルの設計だと感じている。ここを見直しただけで、同じモデルでも出力がかなり安定するようになった。
まずは自分のCLAUDE.mdが何行あるか、数えてみるところから始めてみてください。
関連記事
書いた人
NIGO / 制作会社のデザイナー兼エンジニア。デザインとコードの両方を担当していて、コーポレートサイトや店舗サイトを作っています。制作のご相談はお問い合わせからどうぞ。
参考・出典
- Claude Code 公式ドキュメント「How Claude remembers your project」 — CLAUDE.mdの200行目安、
@pathインポートが起動時に展開されコンテキスト削減にならない仕様、インポートの最大4階層と相対パス解決、.claude/rules/のpathsスコープ、auto memoryの200行/25KB上限、/compact後の再注入挙動、/doctorのトリム提案(v2.1.206以降)、CLAUDE.mdがシステムプロンプトではなくユーザーメッセージとして注入される点 - Claude Code 公式ドキュメント「Hooks reference」 — hooksの設定スキーマとライフサイクルイベント
- Claude Code 公式ドキュメント「Skills」 — 必要なときだけ読み込まれる定型作業の格納先
- Google web.dev「Core Web Vitals」 — LCP 2.5秒以内 / INP 200ミリ秒未満 / CLS 0.1以下、実ユーザーの75パーセンタイルで判定
- W3C「Web Content Accessibility Guidelines (WCAG) 2.2」
