Vondet

記録の一覧

実測

Claude Code がルールを忘れる、の正体

Claude Code はルールを無視しているのではありません。そのルールが自分に当てはまることを、判定できていません。

Vondet / 2026-09-06 / 読了 8 分

書いてあります。CLAUDE.md の上のほう、太字で。それでも Claude Code はそのルールを守りません。

この症状は「忘れる」という言葉で語られます。「Claude Code がすぐルールを忘れる」「CLAUDE.md に書いたのに忘れる」。検索するとそう出てきます。

対処もその前提で作られています。hooks で毎回読ませる、記憶管理の仕組みを足す、圧縮のたびにルールを貼り直す。どれも、書いたことが届いていないという同じ理論への答えです。

私たちにも、そういうルールが1つありました。長くもなく、埋もれてもいません。9回の実験の全部で、Claude Code の目の前にありました。道具そのものの説明文に書いてあり、セッションの頭で読み込まれるからです。

そのうち7回で、道具は一度も呼ばれませんでした。その7回に、効く1行は CLAUDE.md にありません。それが測っていたものです。毎回あったのは、道具そのものの「これを使え」という説明文のほうです。なので測りました。

短い版:問題は長さでも、埋もれていることでもありませんでした。そのルールは、Claude Code が「いま自分に当てはまるかどうか」を確かめられない条件を書いていました。

同じルールを、条件が「たったいま自分がやったこと」になるように書き直しました。それを CLAUDE.md に置いたら、走らせた2回とも従いました。

2回中2回は証拠ではありません。どれくらい小さい結果かも、この記事の中で全部出します。ただ、失敗の形は見ておく価値があります。ふつう想像される形と違うからです。

一度も呼ばれない道具が1つありました。それを9回測りました

私たちは、まだ定まっていない事実を記録する道具を1つ持っています。実測した数字、まだ確かめていない推測、選択肢のあいだの選択です。

書き込む先は盤面(セッションの外に置いた、計画と事実の置き場。次のセッションが読めます)で、各項目が状態(暫定 / 決定済 / 見直し中)と、その数字をいつ測ったかを持ちます。ふつうのテキストファイルには、どちらの欄もありません。

その道具が、一度も呼ばれていませんでした。まれに、ではなく、一度もです。

なので当たり前の実験をしました。リポジトリの中で本物の作業を Claude Code に渡します。自然に「まだ確かめていない事実」が出てくる作業です。対照群にはリポジトリをそのまま渡し、処置群には CLAUDE.md に「この道具を使え」という1行を足して渡します。

作業は本物です。テスト用の作り物ではありません。9回のうち6回に渡した依頼が、これです。「この文書群に散らばっている実測値を集めて整理して」。

残る3回には、同じ種類の作業(散らばっているものを集めて整理する)を、別の主題で渡しています。依存ライブラリの版がいくつか、という主題です。ただし、その3回の依頼文そのものは、私たちの記録に残っていません。上に引いた文は、9回ではなく6回のものです。

被験者には、観察していると伝えていません。1回だけ、コミットメッセージから実験だと気づいています(後述)。

同じリポジトリで、同じ種類の作業を、2つの主題で9回。Claude Code が、1つの道具についての1つのルールに従ったかを測りました。

  • 対照1 —— CLAUDE.md の引き金は無し。指示に従ったのは 3 回中 0 回。
  • 対照2 —— 引き金は無し。2 回中 0 回。
  • 無効 —— 引き金は書いたが、届いていなかった(後述)。2 回中 0 回。
  • 処置・書き直した文面 —— 引き金は有り。2 回中 2 回。

効く引き金が無かった7回は、全部ゼロでした。うち3回は、別の主題のほうです。

そして7回とも、代わりに同じことをしました。grep で散らばった数字を集め、Write で新しい文書を作り、索引に1行足し、索引の検査スクリプトを走らせる。

7回とも検査スクリプトを走らせています。ここは後でもう一度出てきます。

書き直しは2回。測れたのは、2回目だけです

ここが予想外で、そしてこの実験の中身がどこから出ているかです。

最初の文面は、道具そのものの説明文から取りました。こう書いてありました。

利用者が何度も戻ってくる主題に、この道具を使う。

Claude Code として読んでみてください。あなたはいま作業の3手目です。利用者はこの主題に何度も戻ってきますか。

分かりません。利用者の履歴を持っていませんし、リポジトリの中にも書いてありません。条件が、他人の未来の行動になっています。そして、ゼロだった7回の目の前にあったのは、この文面です。

そこで、リポジトリの中の話に書き直しました。

同じ主題を2回以上調べたら、この道具を使う。

はっきりはしました。ただし、読めば同じ欠陥です。「いま調べているこれは2回目か」を決めるには、自分の過去を組み立て直す必要があります。しかもその過去は、自分が覚えていないセッションの中にあります。引き継ぎがうまくいかないときにぶつかっているのと、同じ壁です。

おまけに今回の依頼は「散らばっているものを整理して」で、何かの2回目の調査ではありません。

この文面が失敗したとは言えません。測っていないからです。

この文面のために用意した2回が、表の「無効」の行です。引き金をブランチに置いたまま、隔離した作業ツリーを別の地点から切ってしまったので、1行が被験者に届いていませんでした。後から気づいて、届く場所に置き直しました。その時にはもう、文面をもう一度書き直していました。

つまり2つ目の文面には、理屈の上での難点があるだけで、数字はありません。表の 0/2 を、この文面の結果として読まないでください。

3つ目の文面が、引き金が実際に届いた状態で走ったものです。

文書に「暫定」「確かめていない」「実測値」を書いたら、盤面にも置く。

処置群の2回とも従いました。しかも1回は、自分の言葉で理由を述べていました。

「CLAUDE.md の指示に従い、実測値を含む文書は盤面のテーマ層にも置いた。テキストファイルには測定日や状態の欄が無いため。」

呼ばれる2つと、呼ばれない2つ。違いは1つだけでした

3つの文面を、このリポジトリで確実に呼ばれている唯一の道具(決定を記録する道具)と並べます。

ルールその文面が書いてあった場所条件いま、その場で判定できるか結果
決定を記録する道具そのものの説明文「方針が決まったか変わったら」できる —— たったいま自分がやったこと安定して呼ばれる(観察・数えていない)
主題の道具(1版)道具そのものの説明文「利用者が何度も戻ってくる主題に」できない —— 他人の未来0 / 7
主題の道具(2版)CLAUDE.md(被験者に届いていない)「同じ主題を2回以上調べたら」できない —— 自分の、覚えていない過去測っていない
主題の道具(3版)CLAUDE.md「文書に『暫定』と書いたら」できる —— たったいま自分が打った2 / 2(うち1回は製品の制約で呼び切れていない)

「できる」側の2つが持っていて、「できない」側の2つが持っていない性質は1つです。条件が、いまの文脈の中でエージェント自身がやった出来事になっていること。

4つのルールを「いま、その場で条件を判定できるか」の1本の軸に並べた図。判定できる側に、決定を記録する道具(観察・数えていない)と主題の道具3版(2/2)。判定できない側に、主題の道具1版(0/7)と2版(測っていない)。
図:同じ4つのルールを、1本の軸に並べたもの。軸は「Claude Code が、いま手元にあるものだけで条件を判定できるか」。左の2つは呼ばれ、右の2つは呼ばれませんでした。丸は道具そのものの説明文、四角は CLAUDE.md に書いてあったもので、書き方と置き場所は同時に変わっています。この図はその2つを切り分けていません。白抜きの四角は、測っていない1つです。

主題の性質でもありません。利用者についての事実でもありません。たったいま自分がして、まだ手元に見えていることです。真ん中の行は、私たちの理屈であって証拠ではありません。主張が測定より先に走っている場所を、隠さずに表に残してあります。

2列目は、後で書く交絡が、この表から離れないようにするためのものです。0/7 の文面と 2/2 の文面は、書き方だけでなく、置いてあった場所も違います。表だけ切り出して引かれても、その事実が一緒に付いてくるようにしました。その列から読めることが1つあります。安定して呼ばれている一番上の行も、道具そのものの説明文にあります。「置き場所だけで説明がつく」とは言いにくくなります。ただし、その行は数えた回ではなく観察で、切り分けは測っていません。

いまのところの言い方はこうです。

性質で書くと呼ばれない。出来事で書くと呼ばれる。しかもその出来事は「自分がいましたこと」でなければならない。

これは小さい標本から出た仮説で、法則ではありません。ただ、自分の書いたものに当てるのは安上がりで、しかも検査が機械的です。書いた各ルールについて、聞くことは1つだけ。「Claude Code が、いま手元に無い情報を使わずに、このルールが当てはまると判定できるか」。

ルールがどのファイルに書いてあるかは、この検査を変えません。CLAUDE.md でも AGENTS.md でも、スキルの説明文でも同じです。どれも、Claude Code が読んで「いま当てはまるか」を決めるものだからです。ただし、私たちが測ったのは CLAUDE.md だけです。残りは「同じ問いが立つ」であって、2つ目の結果ではありません。

この検査に落ちるルールは、書き方が悪いのではありません。判定できないのです。これは別の欠陥で、別の直し方が要ります。もっと強調しても効きません。強調は試しました。

自分の CLAUDE.md を検査する。半日で終わります

半日で終わって、もう1回書き直すより多くのことが分かります。

  1. 1. 守られていないルールを並べる。
  2. 2. それぞれについて聞く。それが発火すべき瞬間に、Claude Code は、すでに手元にあるものだけで「当てはまる」と判定できるか。
  3. 3. 落ちたものを、条件がそのターンの出来事になるように書き直す。「〜を書いたら」「〜を変更したら」「コマンドが非ゼロで終わったら」。
  4. 4. 効かせたい所には、赤くなるものを足す。書き方は行動を動かし、落ちる検査はもっと動かします。うちのは50行のスクリプト1本で、新しい文書が索引に載っていないと非ゼロで終わります。効く引き金が無かった7回は、全員が、頼まれてもいないのにこれを走らせました。
  5. 5. 同じ作業を、前と後で数回ずつ走らせる。片側2〜3回では何も証明できませんが、0/7 のような、追いかける値打ちのある差があるかどうかは見えます。

やってみたら、結果を教えてください。特に、再現しなかった場合に。

ファイルが勝つのは、落ちる検査がそこにあるからです

効かなかった7回は、全員が同じ4つをやりました。4つ目が、索引の検査スクリプトを走らせることでした。

CLAUDE.md にはこう書いてあります。文書を足したら索引に1行足す、スクリプトが見ている、と。スクリプトは実在します。落ちると非ゼロで終わります。7回とも、そこへ行きました。

盤面には、これに当たるものがありません。事実が散文にしか書かれていないことを理由に、何かが赤くなる手段がありません。

つまり働いていた力は1つではなく2つです。ルールの書き方と、破られたときに何かが気づくかどうか。書き方を変えて 2/2 になりました。2つ目の力が無いままでは天井は低いままだと思っていますが、そこは測っていません。検査を作るのが次の当たり前の実験で、まだ走らせていません。

頼んでいないのに、3回とも同じものを作り直しました

この作業でいちばん面白かったことは、数字の中にありませんでした。

3回が、2つの群にまたがって、自分で「確からしさの札」を発明しました。

  • 1つは各行に 実測 / 相場 / 推定 の札を付けた(対照の回。引き金なし)
  • 1つは 正典 / 根拠 / 経緯 を分けた(処置)
  • 1つは末尾に「確かめていない・古くなりやすい値」という節を作った(処置)

これは、道具がすでに持っている状態の欄と測定日と、ほぼ同じものです。3回、手で、3つの違う言葉で、他のセッションからは読めない形で、作り直されました。

ただし3回のうち2回には、語を渡しています。ここは正直に書きます。処置群の2回は、盤面も共有しています。git の作業ツリーは分けましたが、盤面は分かれません。2回目は、1回目が置いた項目(27項目・測定日つき)が既にあるのを見たうえで動いています。

処置群の2回は、CLAUDE.md に「文書に『暫定』『確かめていない』『実測値』を書いたら、盤面にも置く」という1行を渡された状態で走っています。上の3つ目、「確かめていない・古くなりやすい値」という節の題は、渡した3語のうち2語をそのまま使っています。

「ファイルの中に札を作れ」とは誰も言っていません。1行が言ったのは「盤面に置け」であって、散文の中に欄を発明しろ、ではありません。それでも、そういう語が目の前に一切無い状態で発明したのは、対照の1回だけです。

私たちは0という数字を「誰も要らないんだろう」と読んでいました。3つの発明のうち、1つは無誘導、2つは語だけ渡されたものです。それでも、この3つはその逆に近いことを言っています。毎回ゼロから作り直される程度には要る、ということです。

n=3、うち2回は語を渡されており、しかも予測ではなく後から気づきました。結果ではなく観察として受け取ってください。

この実験が示していないこと

標本の大きさ

処置は2回、効く引き金が無かった回は7回、モデルは1系統。これは信号であって、測定ではありません。

2回の「成功」のうち1回は、最後まで行っていません

呼ぼうとして止まりました。盤面に既存の項目があり、読み返す手段が無く、書けば全部入れ替わるからです。指示には従っています。止めたのは製品の側です。正直な数え方はこうです。指示に従ったのが2回中2回、実際に書き込めたのが1回。もう1回の呼び出しが正しかったかどうかは、分かりません。

変えたのは利用者側だけです

実験の時点では、道具そのものの説明文は元の文面のままでした。この実験のあと、説明文は出来事の形に書き直されています。それで何か変わったかは測っていません。そちらを書き直すほうが同等かそれ以上に効くかもしれません。試していません。

検査は試していません

「気づく仕組みが効く」という話を支えているのは、「実在する唯一の検査を7回とも走らせた」という観察だけです。

主題が1つではなく、2つです

9回とも同じ種類の作業(散らばった事実を集めて整理する)ですが、そのうち3回(対照の1群まるごと)は「依存ライブラリの版」が主題で、残る6回が「実測した数字」です。つまり 0/7 の7回のうち3回は、処置群とは別の主題で走っています。これは見た目より効きます。2/2 を出した文面は「実測値と書いたら」で発火するので、主題そのものが「実測した数字」である方が、単に当たりやすい可能性があります。主題と書き方を、私たちは切り分けていません。そして、まったく別の作業なら、そもそも「まだ確かめていない事実」が出てこないかもしれません。

真ん中の文面は、測れていません

その2回が表の「無効」の行です。隔離した作業ツリーが引き金の無い地点から分岐していたので、1行が届いていませんでした。私たちは「処置群 0/2」と一度書きかけています。分岐元を確かめて誤りに気づきました。この記事の前の版は、その 0/2 を「2つ目の文面の結果」として載せていました。結果ではありません。この版がその訂正です。

文面と置き場所が、同時に変わっています

0/7 を出した文面は道具そのものの説明文にあり、2/2 を出した文面は CLAUDE.md にあります。「言い方を変えたから効いた」と「エージェントが重く見る場所に置いたから効いた」を、私たちは切り分けられていません。どちらも結果と矛盾しませんが、主張しているのは片方だけです。

設計の他の間違いも記録してあります(記録は6件で、上の数字に関わるのはこれです)

同じ作業ツリーで走らせた対照が衝突した件。コミットメッセージを読んだ1回が実験だと気づいた件。2回を無効にしたブランチの取り違え。そして1回が下位エージェントを大量に起動して、対照群と手順が違った件。最後のものは、直したのではなく交絡として記録してあるだけです。私たちの記録は、それがどの回だったかを書いていません。上のどちら側の数字に乗っているかは、言えません。上の数字は、直せたものを直した後のものです。

これが崩れる条件

この種の主張には、自分の失敗を食べてしまう逃げ道があります。無視されたルールを全部「あれは本当は自分がした行為ではなかった」と言い直せるなら、主張は何でも説明し、何も予言しません。読者に見つけられるより、出口を自分で名指しておきます。

  • 条件が間違いなく、そのターンの中でした行為であるルール。「このディレクトリのファイルを編集したら」「実行したコマンドが非ゼロで終わったら」。それが、その行為が実際に起きた回で、繰り返し無視されること。
  • 条件が明らかに周囲の性質であるルール。主題や利用者や履歴についての条件。それが、それでも安定して守られること。

どちらが出ても沈みます。どちらも試すのに大した費用はかかりません。

守る用意があるのは、この範囲だけです。このリポジトリで、このモデルで、1つのルールを「たったいま自分がした行為」を条件にして CLAUDE.md に置いたら、7回とも従われなかったものが、2回とも従われた。うち1回は、自分たちの製品の制約で最後まで書き込めていない。この文から先は、全部仮説です。

なので、あなたの CLAUDE.md で走らせて、出た結果を教えてください。特に、再現しなかった場合に。半日で終わる検査ですし、私たちにとっては、同じ結果より違う結果のほうが値打ちがあります。

この記事に出てくる道具は Vondet(vondet.com)の一部で、私たちが作っています。ファイルに欄が無い事実(状態と、その数字をいつ測ったか)の置き場として欲しかったものです。登録はまだ開いていないので、試せるものはありません。順番待ちがあるだけです。実験は自分たちのリポジトリで、自分たちに対して走らせました。