← レッスンに戻る
第6章 · Claude Code応用

Rules・Output Styles・システムプロンプト追記

Rules, Output Styles & Appending the System Prompt · 約 13 分

重要キーワード

English日本語説明
Rules ルール .claude/rules/ に置く制約。paths で対象ファイルにスコープできる
paths (frontmatter) パスのスコープ Rule をどのファイルに効かせるか限定する frontmatter 項目
Output Styles 出力スタイル .claude/output-styles/ の指示。既定のシステムプロンプトを置き換える
keep-coding-instructions 既定指示の保持 出力スタイルの frontmatter に付けると既定のコーディング指示を残せるオプション
--append-system-prompt システムプロンプト追記 起動時に既定プロンプトへ指示を足すだけのフラグ。役割は書き換えない
Prompt Cache プロンプトキャッシュ 同じ前置きを再利用してコストを下げる仕組み。追記は初回以降が安い

このレッスンのゴール

第6章ではこれまで Slash CommandsHooksSkillsMCPSubagents と、Claude Code を操る手法を見てきました。今回は まだ扱っていない残り3つ を学びます。

特に (B) と (C) は超混同しやすい(置き換える vs 足すだけ)ので、対比で腹落ちさせます。最後に「7つの操縦法をどう使い分けるか」の地図は次の 操縦法の地図(ch6-l10) でまとめます。

原典: Anthropic ブログ「Steering Claude Code — Skills, Hooks, Rules, Subagents, and More」。Claude Code のカスタマイズ手法は7種類あり、それぞれ「いつ読み込まれるか/コンパクション(文脈の圧縮)で消えるか/コスト/強制力」が違うので、何でも CLAUDE.md に書くのではなく目的に合った手法を選ぶのが肝、という話です。


(A) Rules — ファイル単位の「制約」

Rules は .claude/rules/ に置く Markdown ファイル です。役割は「特定の制約(constraint)を効かせる」こと。例えば「マイグレーションは追記のみ(append-only)」「API ハンドラは必ず入力検証する」のような、ファイル単位で守らせたいルールにピッタリです。

最小例(frontmatter + 本文)

frontmatter の paths で、どのファイルに効かせるかをスコープできます。

---
paths:
  - "src/api/**"
  - "**/*.handler.ts"
---

すべての API ハンドラは、処理を始める前に Zod で入力を検証すること。
検証に失敗した場合は 400 を返し、内部の例外メッセージはそのまま外に出さない。

これで「src/api/ 配下や *.handler.ts を Claude が触ったときだけ」このルールが効きます。フロントエンドのコンポーネントを編集している間は読み込まれず、トークンを消費しません。

paths を付けないと「常に」トークンを消費する

paths を省くと、その Rule は 常時ロード(unscoped) になり、ルート CLAUDE.md と同じく セッション開始時から常にロード されます。常に効いてほしい全体ルールならそれでもよいですが、API 専用ルールのように対象が限られているものは、必ず paths でスコープしてください。スコープしないと、関係ないファイルを触っている間もずっとトークンを食い続けます。

CLAUDE.md との違い(なぜ Rules を使うのか)

CLAUDE.md にも規約は書けますが、CLAUDE.md は「プロジェクト全体の説明・規約」を書く場所。一方 Rules は「特定パスに効く強めの制約」を分離して管理できるのが利点です。「絶対これをするな」という本当のガードレールが必要なら、Rules よりさらに強い Hooks(ch6-l2) のブロック機能(exit code 2 で拒否)や managed settings を使う、という棲み分けになります。

▶ 試す
あなたは Claude Code のルール設計者です。「DB マイグレーションファイル(migrations/ 配下)は追記のみで、既存の up/down を書き換えてはいけない」という制約を、.claude/rules/ に置く Markdown として書いてください。frontmatter の paths でスコープし、本文は日本語で。完成したファイルの全文を返してください。

(B) Output Styles — 「役割そのもの」を変える

Output Styles は .claude/output-styles/ に置くファイルで、指示を システムプロンプトに注入します。性質が独特です。

ここまでだと「常に効く便利な指示」に聞こえますが、重要な落とし穴があります。

警告: デフォルトの出力スタイルを「置き換える」

出力スタイルを変更すると、Claude のデフォルトの出力スタイルが置き換え(replace)られます。デフォルトには、表に出ていないだけで次のような既定の指示が含まれています。

出力スタイルを差し替えると、こうした既定の振る舞いが まとめて外れてしまうのが基本動作です。だから Output Styles は「役割そのものを大きく変えたいときだけ、慎重に」使うものです。まずは組み込みの Learning や Explanatory を選ぶところから始め、いきなり自作で全置換しないのが安全です。

既定のコーディング指示を残したいとき

原典ブログによれば、出力スタイルの frontmatter に keep-coding-instructions: true を付けると、既定のコーディング指示(絞り込み・コメント基準・セキュリティ配慮など)を残したまま、自分のスタイルを足せます。「役割は変えたいが、Claude らしい安全な振る舞いは消したくない」ときの保険として覚えておくとよいです。

---
keep-coding-instructions: true
---

あなたは新人エンジニアに教える先生です。回答は手順を1ステップずつ説明し…

(C) --append-system-prompt — 「足すだけ」

--append-system-prompt は Claude Code 起動時に渡すフラグで、元のシステムプロンプトに指示を 足すだけ(additive) です。

claude --append-system-prompt "出力するコードは必ず日本語コメント付き。変数名はスネークケース。回答末尾に参照したファイル名を列挙すること。"

ここが Output Styles との 決定的な違いです。

つまり「Claude らしさ(変更範囲を絞る・セキュリティ配慮など)はそのままに、自社のコーディング規約・出力フォーマット・ドメイン知識だけ上乗せしたい」ときは 追記 が一番素直です。

コスト

追記した内容は プロンプトキャッシュ に乗るため、セッション内の 初回リクエスト以降はコストが下がります。毎回フルで課金されるわけではないので、規約や定型フォーマットを足す用途に向いています。

▶ 試す
私はチーム共通のコーディング規約を Claude Code に常に守らせたいです。(1) Output Styles で書くべきケースと (2) --append-system-prompt で書くべきケースを、それぞれ具体例つきで3つずつ挙げ、なぜそちらが適切かを一言で説明してください。

3つを並べて比較

手法 置き場所 / 渡し方 何をする いつ使う 注意点
Rules .claude/rules/*.md ファイル単位の制約 「マイグレは追記のみ」等 paths なしだと常時トークン消費
Output Styles .claude/output-styles/ 役割を置き換える 役割を大きく変える時だけ 既定の絞り込み/セキュリティ配慮が外れる(keep-coding-instructions で保持可)
追記 --append-system-prompt 既定に足すだけ 規約/フォーマット/知識を上乗せ 初回以降はキャッシュで安い

ブログ準拠の「読み込まれるタイミング / コンパクション時 / コスト」でも整理しておきます。

手法 読み込み コンパクション時 コスト
Rules セッション/パスでスコープ 再注入される 中(paths スコープで減)
Output Styles セッション開始 決して圧縮されない
システムプロンプト追記 起動時 初回以降キャッシュ

Hooks・Skills とは「役割が違う」

混同しないように一言。今回の3つは「Claude に 何を守らせ・どんな役割にし・何を足すか」という 指示・制約 の話です。一方:

似ているようで担当が違います。「毎回必ず実行したい」なら Rules ではなく Hooks、「長い手順」なら Output Styles ではなく Skills、という具合です。7種類の全体像と使い分けの地図は次の 操縦法の地図(ch6-l10) でまとめます。


まとめ

演習問題

演習 1: 自分のプロジェクト用に paths スコープ付き Rule を1つ書く

あなたが今触っている(または想像上の)プロジェクトを1つ選び、.claude/rules/ に置く Rule を1つ書いてください。

条件: 1. frontmatter の paths で、効かせたいファイル(例: src/api/**)に必ずスコープする 2. 本文は「ファイル単位で守らせたい制約」を1〜2行で

観察ポイント: paths を外したらどうなるか(常時トークン消費になる)を意識しながら、なぜスコープが必要かを自分の言葉で言えるようにする。

スタータープロンプト:
私のプロジェクトには認証まわりのコードが src/auth/ に、API ハンドラが src/api/ にあります。`.claude/rules/auth-no-plaintext.md` を作ってください。frontmatter の paths で src/auth/** にスコープし、本文は『パスワードや API キーを平文でログ出力・コミットしてはいけない。必ずハッシュ化またはマスクすること』という制約を日本語で。完成したファイルの全文を返してください。
ヒントを見る

frontmatter は必ず --- で囲み、paths: は YAML のリスト(ハイフン+スペース)で書きます。ワイルドカードは **(任意の深さ)が使えます。

サンプル解答を見る
---
paths:
  - "src/auth/**"
---

パスワード・API キー・トークンを平文でログ出力したりコミットしてはいけない。
保存・ログ時は必ずハッシュ化またはマスク(先頭4文字以外を伏字)すること。

演習 2: Output Styles と追記の使い分けを言語化する

「Learning 出力スタイル」と「--append-system-prompt でのコーディング規約追記」を、それぞれ どんな場面で選ぶか を自分の言葉で説明してください。

観察ポイント: Claude の回答が『置き換える(役割が変わる/既定指示が外れる)』と『足すだけ(役割はそのまま)』の違いをちゃんと押さえているか確認する。

スタータープロンプト:
Claude Code の『Learning 出力スタイル』と『--append-system-prompt によるコーディング規約の追記』を比較してください。(1) それぞれの目的、(2) 既定のシステムプロンプトを置き換えるか足すだけか、(3) 私(チームでコーディング規約だけ常に守らせたい)はどちらを選ぶべきか、を表にまとめてから結論を1行で述べてください。
ヒントを見る

ポイントは『役割を変えたい?それとも規約を足したいだけ?』。役割を変えたいなら Output Styles(既定指示を残したいなら frontmatter に keep-coding-instructions: true)、規約・フォーマットの上乗せだけなら追記。

理解度チェック

  1. Output Styles と --append-system-prompt の決定的な違いは?
    1. Output Styles は役割を置き換える / 追記は既定に足すだけ
    2. Output Styles は足すだけ / 追記は役割を置き換える
    3. どちらも既定を完全に消す
    4. どちらも CLAUDE.md と同じ動作
  2. Rules で `paths` を付けない(unscoped)とどうなる?
    1. そのルールは無効になる
    2. 対象ファイルを触ったときだけ読み込まれる
    3. 常時ロードされ、関係ないファイルでもトークンを消費し続ける
    4. コンパクションで必ず消える
  3. Output Styles を自作で差し替えるときの主なリスクは?
    1. 起動が遅くなる
    2. frontmatter で keep-coding-instructions: true を付けない限り、既定の『変更範囲を絞る』『セキュリティ配慮』等の指示が外れる
    3. Rules が読み込まれなくなる
    4. Hooks が発火しなくなる
  4. 「DB マイグレーションは追記のみ(append-only)」のような、ファイル単位の制約に最も適した手法は?
    1. Output Styles
    2. --append-system-prompt
    3. Rules(.claude/rules/)
    4. Subagents
解答と解説を見る
  1. A — Output Styles は既定のシステムプロンプトを置き換え、--append-system-prompt は足すだけ(役割は変えない)。これが最重要の違い。
  2. C — paths なしはルート CLAUDE.md と同じく常時ロード。API 専用ルール等は paths でスコープしてトークンの無駄を減らす。
  3. B — 出力スタイルは既定を置き換えるため、明示しない限り表に出ていない既定指示(絞り込み・コメント基準・セキュリティ配慮)がまとめて外れる。keep-coding-instructions: true で残せる。
  4. C — ファイル単位の制約は Rules が最適。paths で migrations/ 配下にスコープすれば無駄なく効かせられる。