CLAUDE.mdに書いたのに守ってくれない、という話をよく見る。うちも同じことで困っていた。
このサイトの記事29本は、同じCLAUDE.mdを読ませて書いた。守られた項目と守られなかった項目を数えたら、分かれ目は文章の上手さではなかった。機械が検査している項目かどうかだった。
以下の仕様は、2026年9月20日にAnthropicの公式ドキュメントのメモリの項で確かめた。29本の集計は、このサイトの記事ファイルと検査スクリプトを自分で数えた結果だ。
公式には、強制ではないと書いてある
ドキュメントの書き方の話に入る前に、位置づけを確かめておきたい。公式ドキュメントにはこう書かれている。CLAUDE.mdもauto memoryも文脈として扱われるのであって、強制される設定ではない。何があっても実行を止めたいなら、代わりにPreToolUseのhookを使う。指示が具体的で簡潔なほど、一貫して従われる。
別の項には、もっとはっきりした説明がある。CLAUDE.mdの中身はシステムプロンプトの一部ではなく、その後ろに置かれるユーザーメッセージとして渡される。読んで従おうとはするが、厳密に守られる保証はない。曖昧な指示や、互いに食い違う指示だと特にそうなる。
つまりCLAUDE.mdは、規約ではなく依頼だ。ここを取り違えたまま書き方だけ磨いても、守られる割合は頭打ちになる。
7つ書いて、機械が見ているのは3つだった
うちのCLAUDE.mdは22行、955字しかない。守ることの節に7つのルールが並んでいる。そのうち検査スクリプトが実際に見ている項目を数えた。
| ルール | 機械が検査する | 29本での違反 |
|---|---|---|
| タイトルと見出しの禁止語 | する | 0本 |
| 日本語と英数字の間の半角スペース | する | 0本 |
| 文体の決まり(文の長さ、接続、表や箇条書きの量) | する | 0本 |
| 料金や仕様の数値に出典と確認日を添える | しない | 0本 |
| 廃止した名称を使わない | しない | 0本 |
| 記事はキューの順に書く | しない | 数えようがない |
| アフィリエイトは専用の部品を通す | しない | 0本 |
完成した記事だけを見れば、全部守られている。ここで終わると「CLAUDE.mdに書けば守られる」という結論になるが、それは間違いだった。
4割は、機械に止められて直っていた
完成品を見ても、はじめから守れたのか、途中で止められて直したのかは区別がつかない。書いている最中の記録を数えた。
直近14本のうち、検査で指摘が出たのは6本。内訳は、日本語と英数字の間の半角スペースが2本、感嘆符が1本、順序を示す語の使いすぎが1本、禁止語の混入が1本、半角の括弧が1本。
どれもCLAUDE.mdか文体の決まりに明記してある項目だ。書いてあっても4割強は一度違反した。検査がなければ、そのまま公開していた。
逆に言えば、機械が見ていない3つの項目で違反0という数字には意味がない。私が毎回思い出したというだけで、次に忘れない保証がない。実際、出典と確認日の行を書き忘れて公開直前に足したことは何度もある。記録に残らないので数えられなかった。
検査が動いていないことに気づいていなかった
いちばん怖かったのはこれだ。検査スクリプトが29本すべてで0件と出ていたのに、7本はタイトルの検査を素通りしていた。
原因は改行コードだった。フロントマターを切り出す正規表現がこうなっていた。
m = re.match(r"^---\n(.*?)\n---\n", text, re.S)
Windowsで作ったファイルの改行はCRLFなので、この\nに当たらない。当たらないと空の辞書が返り、タイトルが空文字になり、タイトル向けの検査が何も実行されないまま通過する。エラーは出ない。0件と表示される。
29本のうち7本がCRLFだった。つまり24%の記事で、タイトルの禁止語と半角スペースの検査は最初から動いていなかった。
直したのは1行だ。読み込んだ直後にCRLFをLFへ置き換える。
raw = path.read_text(encoding="utf-8").replace("\r\n", "\n")
直して全件を流し直したら、結果は0件のままだった。7本のタイトルはたまたま無事だった。無事だったから気づけなかったとも言える。ルールを書き、検査も作り、緑の表示を見ながら7本を公開していた。
検査を足したら、その検査が本当に反応するかを一度試す。わざと違反を入れて、指摘が出ることを確かめる。これを飛ばすと、今回のように何も守っていない緑が出続ける。似た話はAIが書いた文書を照合する記事にも書いた。照合する側が壊れていると、照合した気分だけが残る。
参照で済ませた行は効かなかった
効き方の差は、書き方にも出た。
うちのCLAUDE.mdには「記事はdocs/writing-style.mdに従う」という行がある。この行だけでは、細かい決まりは守られなかった。別のファイルを開いて読むまで判断材料がないからだ。読みに行くこともあれば、行かないこともある。
一方で、禁止語をCLAUDE.md本体に直接並べた行は、最初からよく守られた。宣伝口調の見出し語を4つ名指しで挙げ、これを使わないと書いてある行だ。
公式ドキュメントの説明とも合う。曖昧な指示より具体的な指示のほうが一貫して従われる、という例として、インデントを2スペースにするという書き方が、コードをきれいに整えるという書き方より効くと書かれている。
判断の材料をその場に置くか、どこかから持ってこさせるか。この差が効き方を分けた。守らせたい語は、参照先ではなくCLAUDE.mdに書く。どこまで任せてどこから自分で決めるかの線引きはAIに任せる判断を切り分ける記事の考え方と同じだ。
長さと置き場所
22行955字で足りている。増やしていない理由は、増やした行が守られる保証がないからだ。守らせたい項目が増えたときは、CLAUDE.mdに行を足すのではなく、検査スクリプトに条件を足すようにした。
公式ドキュメントによると、auto memoryは毎回の会話で先頭200行か25KBまでが読み込まれる。CLAUDE.md自体の上限とは別の話だが、際限なく長くできるものではないという目安にはなる。複数のCLAUDE.mdで食い違う指示があると、どちらかが勝手に選ばれるとも書かれている。
項目が増えるなら、.claude/rules/に分ける方法がある。1ファイルに1つの話題を書き、フロントマターのpathsで対象のファイルを絞れる。絞ったルールは、その種類のファイルを触るときだけ読み込まれる。うちはまだ22行なので使っていない。
踏んだ失敗
検査が動いていないのに気づかず7本公開した件が最大の失敗だった。原因は改行コードという、記事の内容とは何の関係もないところにあった。
禁止語を増やしすぎて、自分でも全部言えなくなった時期もある。今は検査スクリプトに書いてあるものが正で、CLAUDE.mdには代表的な語だけ残している。二重に管理すると食い違う。
半角スペースの決まりは、何度も破った。日本語と英数字の間を空けたほうが読みやすいと手が勝手に覚えているせいだ。これは人の注意では直らなかった。毎回、機械に見つけてもらっている。CLAUDE.mdが遅く感じるときの原因を調べた話はClaude Codeが遅いときの記事に分けて書いた。
確認していないこと
hookで止める形は試していない。公式ドキュメントが勧めている方法だが、今回の集計はすべて検査スクリプトを手で流した結果だ。コミット前に自動で走らせる形にすれば、流し忘れも防げる。
.claude/rules/のpathsによる絞り込みも試していない。22行では分ける必要がなく、効果を測れなかった。
29本という母数は小さい。同じ比率が他のプロジェクトでも出るとは限らない。言えるのは、同じ設定で書いた29本の範囲では、機械が見る項目と見ない項目で守られ方の確かさが違ったということだけだ。
出典(2026年9月20日確認): Anthropic「How Claude remembers your project」のCLAUDE.md vs auto memory、Organize rules with .claude/rules/、Troubleshoot memory issuesの各項。



