0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CLAUDE.mdを二層に分ける。「毎回復唱させるルール」と「廃止した方針」を別々に持つ型

0
Posted at

Claude Code に毎回ルールを復唱させると、決めたことが守られやすくなる、という手法があります。CLAUDE.md の中に「このルール一式を毎回の応答の冒頭に出力せよ」という項目を含めることで、ルールの存在自体が毎ターン思い出される、というものです。

自分も、この仕組みの部分だけ取り入れました。振る舞いは安定した感触があります(体感で、定量では測っていません)。心配していたコンテキストの消費も、実際にはほとんど気になりませんでした。

ただ、1年運用していて、この方式では保てないものがあることも分かりました。過去に捨てた方針が、あとから戻ってくる現象です。復唱では、これは止まりませんでした。

なので、CLAUDE.md を二層に分けて持つようにしています。その形を置いておきます。

なぜ二層になるのか

扱っているものが、性質の違う2種類だったからです。

振る舞いのルールは、「どう動くか」です。実行前に確認を取る、勝手に迂回しない、報告の形式を守る。これは毎ターン目に入っていれば保たれます。復唱が効くのは、この層です。

決定の履歴は、「過去に何を選び、何を捨てたか」です。以前 A の書き方でいくと決めて、あとで A をやめて B にした。この「A を捨てた」という事実は、B を毎回復唱しても伝わりません。しばらくすると A が戻ってきます。

前者は現在形、後者は過去形の情報です。同じファイルに混ぜて書いていたときは、後者が機能していませんでした。

型(コピペ用)

<law>
# 作業の原則

第1原則: ファイルの生成・更新・コマンド実行の前に、作業計画を提示し、
        承認を得るまで実行しない。

第2原則: 計画が失敗したら、勝手に別の方法へ迂回せず、次の計画を提示して
        承認を得る。

第3原則: 依頼が非合理に見えても、勝手に最適化しない。疑問があれば実行前に聞く。

第4原則: 「廃止した方針」に載っているやり方は使わない。それが出てきた場合は、
        古い指示として扱う。

第5原則: 応答の冒頭で、この原則すべてを毎回そのまま出力してから本題に入る。
</law>

<every_response>
[作業の原則]

[本題]
</every_response>

# プロジェクト概要

- 何を作っているか(1〜2行)
- 技術スタックとバージョン
- 動作環境の制約

# 守ってほしい書き方

- 関数は◯行以内、ネストは◯段まで
- 命名の規則
- エラー処理の方針
- テストの置き場所

# やらないこと

- 触ってはいけないファイル / ディレクトリ
- 使ってはいけない関数(理由を一行添える)
- 勝手にやらないでほしい操作(依存の追加、大規模なリファクタ、削除)

# 廃止した方針

<!-- 消さずに残す。古い方針が戻ってきたときの、否定の根拠になる -->

- ~~A の書き方~~ → 廃止(理由)。今後は B を使う。
  A が出てきたら、それは古い指示。
- ~~C のディレクトリ構成~~ → 廃止(理由)。今後は D の構成。

第5原則が、全体を支えている

この形の要は、最後の第5原則です。

「毎回出力せよ」というルールを普通に書くと、そのルール自体が忘れられます。指示を忘れるのだから、当然です。

そこを、原則一式の中に「原則一式を毎回出力せよ」を含めることで解いています。原則を出力すると、その中に「毎回出力せよ」も含まれているので、次のターンでも出力する必要があることが、毎回目に入る。自分で自分を維持する形になります。

中身は自由に差し替えて構いませんが、この第5原則にあたる項目だけは残してください。これが抜けると、他の原則も数ターンで薄れます。

第4原則を足した理由

元の形にはない項目を、ひとつ足しています。第4原則、「廃止した方針に載っているやり方は使わない」です。

これがないと、二層構造が機能しません。ファイルの下のほうに「廃止した方針」を書いておいても、そこを見る動機がないからです。毎回復唱される原則の中に、廃止リストを参照する指示を入れておくことで、二つの層がつながります。

「廃止した方針」の書き方

削除ではなく、廃止として残すのが要です。

❌ 該当行を削除する
   → 手元からは消えるが、振る舞いには残ることがある。
     しかも「A は捨てた」という情報まで消えるので、A が戻ってきたときに
     否定する根拠がなくなる

✅ 取り消し線 + 理由 + 「古い指示」の明記
   - ~~エラーを戻り値で返す~~ → 廃止(例外に統一したため)。
     今後は例外を投げる。戻り値方式が出てきたら、それは古い指示。

方針を変えるときも、新しいものだけを足さないようにしています。

❌ 「これからは B の形でお願いします」

✅ 「以前は A の形で頼んでいたが、(理由)のため A は廃止した。
    これからは B の形にしてほしい。
    A の形が出てきたら、それは古い指示として扱ってほしい」

古いほうを名指しで否定してから、新しいのを渡す。それだけですが、戻ってくる頻度が減りました。

コンテキストの消費について

毎回原則を出力させると、コンテキストを圧迫するのではないか、と最初は思いました。

実際に運用してみると、ほとんど気になりませんでした。原則一式はせいぜい数百トークンで、繰り返しても積み上がる量は限られます。コンテキストを本当に消費しているのは、ファイルの読み込みとツールの実行結果のほうでした。大きなファイルを一つ読ませるだけで、数千から数万トークンが載ります。

削るなら、そちらです。復唱のぶんを惜しんで原則を短くしすぎると、肝心のルールが薄くなって、本末転倒になります。

長くしすぎない

ただし、CLAUDE.md 全体を膨らませるのは別の話です。

自分は一度、あれもこれもと書き足して肥大化させ、いちばん守ってほしいルールが埋もれたことがあります。長い文書の中では、一つひとつの記述の存在感が薄まります。

常駐させるのは、プロジェクトの間ずっと変わらないものだけにしています。特定の作業でだけ必要な指示は、そのときの依頼文で渡す。この線引きをしてから、書いたルールが効く率が上がりました。

「廃止した方針」も、増えすぎたら古いものから畳んでいきます。半年以上出てこなくなった項目は、消しても戻ってこないことが多いです。

早見でまとめ

  • CLAUDE.md は二層で持つ。振る舞いのルール(現在形)と、決定の履歴(過去形)
  • 振る舞いは、毎回復唱させると保たれる。原則の中に「毎回出力せよ」を含めるのが要
  • 決定の履歴は、復唱では保てない。廃止リストとして残し、原則から参照させる
  • 方針変更は、古いほうを名指しで否定してから新しいのを渡す
  • 復唱のコンテキスト消費は誤差。食っているのはファイル読み込みとツール出力
  • 全体は長くしない。常駐は、ずっと変わらないものだけ

振る舞いが安定しない、と感じるときと、決めたはずのことが戻ってくる、と感じるときでは、打つ手が違います。同じ「守ってくれない」に見えるのですが、層が別なので。役に立ったらストックして、CLAUDE.md を組み直すとき見返してください。


ふだんはraplsworks.comで、WordPressプラグイン開発やClaude Codeまわりのことを書いています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?