コンテンツにスキップ

会社のルールを AI に守らせる

表記ゆれ・禁止事項・承認フローを毎回口頭で伝えるのをやめ、部署ごとに出し分け、読まれているか確認できるようにする

対象 Claude Code / Codex / Gemini CLI確認 1 か月前(2026年8月16日)

やりたいこと

「顧客名は伏せて」「社外向けは敬体」「金額は税込で書く」「この承認を通さずに出さない」——毎回伝えているルールを、ファイルに書いて自動で読ませたい。

素朴にやると穴が空く

穴1: これは「設定」ではなく「お願い」

先に一番大事なところを書きます。出典が明記しています。

どちらも context であり、強制される設定ではない。Claude の判断に関わらず動作をブロックするには PreToolUse hook を使う

ルールファイルは AI に読ませる文章であって、守らせる仕組みではありません。 「禁止」と書いても、確率的に守られるだけです。

守られないと事故になることは、ルールファイルに書いてはいけません。 顧客データの送信先や、公開・送信・支払いのような取り返しのつかない操作は、権限設定や hook で止める話です。ルールファイルが向いているのは、破られても直せること——表記、書式、手順の順序、参照すべき資料——です。

穴2: ファイル名が 3 ツールで違い、Claude Code は AGENTS.md を読まない

ツール読むファイル
Claude CodeCLAUDE.md(CLAUDE.local.md、.claude/rules/*.md)
CodexAGENTS.md(AGENTS.override.md、設定した fallback 名)
Gemini CLIGEMINI.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
WindowsC:\Program Files\ClaudeCode\CLAUDE.md

managed policy の CLAUDE.md は個々の設定では除外できず、claudeMdExcludes でも除外できません。

手順

1. 3 ツールを使うなら AGENTS.md を本体にする

ファイルを 3 つ書いて 3 つメンテするのは破綻します。AGENTS.md を本体にして、他から参照させます。

CLAUDE.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 名を追加できます。

~/.codex/config.toml
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 を持っています。

AGENTS.md
@./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
Terminal window
# 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_bytes 32 KiB、fallback 名、確認コマンドと切り分け表
  • facts/gemini-cli/gemini-md.md — 階層と JIT context、context.fileName、import の深さ 5 と循環検出、/memory show / reload

根拠

公式仕様(facts)

出典のあるページです。原文を確認したい場合はこちらへ。