やりたいこと
「顧客名は伏せて」「社外向けは敬体」「金額は税込で書く」「この承認を通さずに出さない」——毎回伝えているルールを、ファイルに書いて自動で読ませたい。
素朴にやると穴が空く
穴1: これは「設定」ではなく「お願い」
先に一番大事なところを書きます。出典が明記しています。
どちらも context であり、強制される設定ではない。Claude の判断に関わらず動作をブロックするには
PreToolUsehook を使う
ルールファイルは AI に読ませる文章であって、守らせる仕組みではありません。 「禁止」と書いても、確率的に守られるだけです。
守られないと事故になることは、ルールファイルに書いてはいけません。 顧客データの送信先や、公開・送信・支払いのような取り返しのつかない操作は、権限設定や hook で止める話です。ルールファイルが向いているのは、破られても直せること——表記、書式、手順の順序、参照すべき資料——です。
穴2: ファイル名が 3 ツールで違い、Claude Code は AGENTS.md を読まない
| ツール | 読むファイル |
|---|---|
| Claude Code | CLAUDE.md(CLAUDE.local.md、.claude/rules/*.md) |
| Codex | AGENTS.md(AGENTS.override.md、設定した fallback 名) |
| Gemini CLI | GEMINI.md(context.fileName で変更可) |
Claude Code は AGENTS.md を読みません。 これは明記された仕様です。3 ツールを併用している職場で「Codex には効くのに Claude には効かない」の原因はたいていこれです。
穴3: 長く書くと、黙って切れる
Codex は合計サイズが project_doc_max_bytes(既定 32 KiB)に達すると、それ以上ファイルを追加しません。 エラーは出ず、後ろのファイルが読まれないだけです。
Claude Code 側でも、コスト面から CLAUDE.md は 200 行未満を目安にするよう案内されています。CLAUDE.md はセッション開始時に毎回コンテキストへ読み込まれるため、長いほど毎回の課金が増えます。
ルールを全部 1 ファイルに積むのは、3 ツールとも推奨されていません。
穴4: 近いファイルが勝つ。「上書き」ではなく「後勝ち」
3 ツールとも、ルートから作業ディレクトリへ向かう順で連結します。互いを消し合うのではなく、後に来たものが先の指針を上書きする形です。
Codex の global スコープには独自のルールがあります。Codex home では AGENTS.override.md があればそれを読み、無ければ AGENTS.md を読む。このレベルでは最初に見つかった空でないファイル 1 つだけを使う。
AGENTS.override.md を一時的に置いたまま忘れると、本体の AGENTS.md が丸ごと無視されます。 「昔書いたルールが効かない」の原因になります。
Codex の切り分け表がそのまま使えます。
| 症状 | 確認すること |
|---|---|
| 何も読み込まれない | 意図したリポジトリにいるか。空のファイルは無視される |
| 想定と違う指針が出る | 上位ディレクトリや Codex home に AGENTS.override.md が無いか |
| 指示が切り詰められる | project_doc_max_bytes を上げるか、ファイルを分割する |
穴5: 部署ごとの出し分けを glob で書くと足をすくわれる
Claude Code の .claude/rules/ は paths frontmatter で対象を絞れますが、glob の癖があります。
[は bracket expression の開始として扱われる。photos [2024/**のように読めない[を含むパターンは無効で、何にもマッチしません。リテラルの[はphotos \[2024/**とエスケープする- brace expansion は展開後のパターン数を掛け算する(
{a,b}/{c,d}/*.{ts,tsx}は 8 パターン) - 1 つの rule の
paths全体で展開後 1,000 パターンおよび 4 MiBの予算を共有する。超えると展開されず、リテラルの brace はどのファイルにもマッチしない
日本語のフォルダ名や 【】 を含む案件名を扱う実務では、[ を含むパスが普通にあります。 ここは静かに失敗します。
なお paths 付きの rule はパターンに一致するファイルを読んだときにトリガーされるもので、毎回のツール使用ごとではありません。
穴6: 個人が消せる
~/.claude/CLAUDE.md も ./CLAUDE.md も、使う本人が編集できます。 「必ず守らせたい」ものをここに書くのは、鍵のかかっていない扉に貼り紙をするのと同じです。
組織として外させたくない場合は managed policy に置きます。
| OS | 場所 |
|---|---|
| macOS | /Library/Application Support/ClaudeCode/CLAUDE.md |
| Linux / WSL | /etc/claude-code/CLAUDE.md |
| Windows | C:\Program Files\ClaudeCode\CLAUDE.md |
managed policy の CLAUDE.md は個々の設定では除外できず、claudeMdExcludes でも除外できません。
手順
1. 3 ツールを使うなら AGENTS.md を本体にする
ファイルを 3 つ書いて 3 つメンテするのは破綻します。AGENTS.md を本体にして、他から参照させます。
@AGENTS.md
<!-- ここから下は Claude Code 固有の指示 -->Claude Code は @path/to/import 構文で他ファイルを取り込みます(最大 4 ホップの再帰的 import が可能)。symlink(ln -s AGENTS.md CLAUDE.md)でも構いませんが、Windows での symlink 作成には管理者権限か Developer Mode が必要なため、出典は @AGENTS.md import を勧めています。
Gemini CLI は設定でファイル名そのものを変えられます。
{ "context": { "fileName": ["AGENTS.md", "GEMINI.md"] }}Codex は fallback 名を追加できます。
project_doc_fallback_filenames = ["TEAM_GUIDE.md"]project_doc_max_bytes = 65536この一覧に無いファイル名は、instruction discovery では無視されます。
2. 階層で「誰のルールか」を分ける
| 内容 | 置き場所 |
|---|---|
| 会社として絶対に外させない | managed policy(Claude Code) |
| 自分の作業の癖 | ~/.claude/CLAUDE.md / ~/.codex/AGENTS.md / ~/.gemini/GEMINI.md |
| 部署・案件の決まり | プロジェクトの AGENTS.md(コミットする) |
| 自分だけの一時メモ | CLAUDE.local.md(.gitignore に追加する) |
Codex の案内がそのまま原則になります。「現在のディレクトリに達すると探索を止めるため、上書きは専門的な作業のできるだけ近くに置く」。
3. 案件ごとに出し分ける
全案件共通のルールに、案件固有の例外を足す形にします。
---paths: - "clients/acme/**"---
# ACME 社向けの例外
- 金額は**税抜**で書く(他社は税込)- 担当者名は伏せる.claude/rules/ の .md は再帰的に発見されるので、サブディレクトリで整理できます。paths を持たない rule は起動時に読み込まれ、優先度は .claude/CLAUDE.md と同じです。
Gemini CLI には JIT(just-in-time)context files があり、ツールがファイルやディレクトリにアクセスしたときに、そのディレクトリと trusted root までの祖先を自動走査します。案件フォルダに GEMINI.md を置いておけば、そこを触った時点で読まれます。
4. 長くなったら分割する
3 ツールとも import を持っています。
@./rules/表記ルール.md@./rules/承認フロー.md- Claude Code: 最大 4 ホップ。プロジェクトの memory ファイルから作業ディレクトリの外に解決される import は external 扱いで、初回に承認ダイアログが出る。拒否すると以後ダイアログは出ず無効のまま
- Gemini CLI: 既定の最大深さ 5。循環インポートを自動検出して防ぐ。指定ディレクトリからの import だけを許可する検証がある。参照先が無い場合はエラーコメントを残して穏当に失敗する
- どちらもコードブロック内の
@は取り込まれません。手順書に@example.comのような文字列を書くときはバッククォートで囲みます
確認方法
書いただけでは読まれているか分かりません。 3 ツールとも確認手段があります。
# Claude Code — セッション内で実行し、Memory files の一覧を見る/context# Gemini CLI — 階層メモリの全内容を連結表示する。フッターにも読み込み数が出る/memory show# Codex — 優先順に反映されているかを確認するcodex --ask-for-approval never "Summarize the current instructions."
# ネストした上書きが広いルールを置き換えているかcodex --cd subdir --ask-for-approval never "Show which instruction files are active."Codex は実行ごと(TUI では各セッション開始時)に instruction chain を作り直すため、手動で消すキャッシュはありません。 古く見えるときは対象ディレクトリで再起動します。Gemini CLI は /memory reload で再走査できます。
そのうえで、ルールが効いているかは実際に破らせて試すのが確実です。
# 例: 「顧客名は伏せる」が効いているか株式会社アクメの件について、社外向けの報告文を書いてください。伏せられずに出てきたら、そのルールは読まれていないか、読まれていても守られていません。 穴1 のとおり、後者もありえます。
残る限界
- 強制力が無い。 破られたくないものは hook / 権限設定の領域で、このレシピの範囲外
- Codex の 32 KiB 打ち切りは無言。 分割しないまま増やしていくと、いつの間にか後半が読まれなくなる
.claude/rules/のpathsは日本語・記号を含むパスで静かに失敗しうる([の扱い)- Claude Code の auto memory は Claude 自身が書くもので、毎セッション読み込まれるのは先頭 200 行または 25KB まで
- managed policy はマシン単位。BYOD や個人 PC での利用には届かない
根拠
facts/claude-code/memory.md— CLAUDE.md の階層と連結順、AGENTS.md 非対応、import の 4 ホップと external 承認、.claude/rules/のpathsと glob の制約、managed policy、auto memory の上限facts/codex/agents-md.md— 発見順序、global の 1 ファイル制限、AGENTS.override.md、project_doc_max_bytes32 KiB、fallback 名、確認コマンドと切り分け表facts/gemini-cli/gemini-md.md— 階層と JIT context、context.fileName、import の深さ 5 と循環検出、/memory show/reload