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

操縦法の地図 — どれをいつ使うか

The Steering Map: Which Mechanism, When · 約 13 分

重要キーワード

English日本語説明
Compaction コンパクション(文脈圧縮) 会話が長くなった時、過去のやり取りを要約して圧縮する処理。何が消えて何が残るかが手法ごとに違う。
Load timing 読み込みタイミング その指示が「いつ」Claudeの文脈に入るか。常時か、触れた時か、呼んだ時か。
Deterministic 決定論的 モデルの気分に左右されず必ず同じ条件で発火すること。Hooks の最大の特徴。
Path-scoped パススコープ Rules の paths で対象ファイルを限定し、関係ない時はトークンを消費させない仕組み。
Steering 操縦(ステアリング) Claude Code の振る舞いを目的に合わせて誘導・カスタマイズすること。

このレッスンのゴール — 「迷ったら戻る1枚の地図」

第6章ではここまで、スラッシュコマンド・Hooks・Skills・MCP・Subagents・settings.json・Worktrees・デバッグループと、Claude Code を操縦(ステアリング、=振る舞いを目的に合わせて誘導すること)する手法を1つずつ深掘りしてきました。さらに直前の ch6-l9 で Rules・Output Styles・システムプロンプト追記の3つを足しました。

このレッスンはそれらの総まとめです。新しい機能は出てきません。代わりに「どの手法を、いつ使うか」を1枚の地図にします。これは原典ブログ「Steering Claude Code」の核心そのものです。深い使い方は各レッスンに譲るので、本文からどんどんリンクへ飛んでください。迷ったらこの地図に戻ってくる、という使い方を想定しています。

まず「判断軸」 — なぜ全部 CLAUDE.md に書くのが悪手か

手法を選ぶには、まず4つの違いを見ます。どの手法も同じではなく、次の4点でクセが違います。

ここで大事な結論。何でも CLAUDE.md に書くのは悪手です。理由は2つあります。

  1. CLAUDE.md はセッション中ずっと文脈に居座るので、書けば書くほどトークンを食い、肝心の作業の余地を圧迫します。だからルート CLAUDE.md は200行未満に保つのが推奨です(さらに、オーナー=管理者を決めて、コードと同じようにレビューするのが良いとされています)。
  2. CLAUDE.md はお願いであって強制ではない。「毎回必ずYせよ」「絶対するな」と書いても、モデルがその通り動く保証はありません。本当に止めたいなら別の仕組み(Hooks など)が要ります。

つまり「常に効かせたい/必要な時だけ効かせたい」「お願いでいい/絶対守らせたい」を切り分けて、目的に合う手法を選ぶのがこのレッスンの全てです。

1枚の比較表 — 8つの置き場所

ここが地図の本体です。原典ブログの比較表(列=Method / When it's loaded / Compaction behavior / Context cost / When to use)を、CLAUDE.md のルート版・サブディレクトリ版を分けて8行で示します。

手法 読み込まれるタイミング コンパクション時の挙動 コスト 主な用途
ルート CLAUDE.md セッション開始時 メモ化されて再読込される 高 プロジェクト概要・規約
サブディレクトリ CLAUDE.md 該当ファイルに触れた時(オンデマンド) 触れるまで失われている 低 そのディレクトリ固有のルール
Rules セッション常時 or paths でスコープ 再注入される 中(paths スコープでコスト減) ファイル単位の制約(constraints)
Skills 名前は開始時・本体は呼び出し時 バジェット内で再注入(多いと古いものから落ちる) 低 手続き的ワークフロー(手順)
Subagents 名前は開始時・本体は隔離コンテキスト 最終メッセージのみメインに戻る 低 並列・隔離タスク
Hooks ライフサイクルイベントで発火 コンパクションを回避(bypass) 低 決定論的な自動化
Output Styles セッション開始時 決してコンパクションされない 高 役割そのものの変更
システムプロンプト追記 起動時(--append-system-prompt) 初回以降はキャッシュ 中 フォーマット・標準の追加

各行の深掘りは既存レッスンにあります。関連リンクをまとめておきます。

表の読み方のコツ。「高コスト」の2つ(ルート CLAUDE.md と Output Styles)は常に文脈に居座るので、ここに何でも詰めるとすぐ重くなります。逆に Skills・Subagents・Hooks は「必要な時だけ」なので安く、強い武器です。

各手法の置き場所(ファイルパス)早見

地図と一緒に、各手法が「どこに書くファイルか」を確認しておきます。原典ブログ準拠の正確なパスです。

手法 置き場所
CLAUDE.md ルート / 各サブディレクトリ(例: app/api/CLAUDE.md)
Rules .claude/rules/ の Markdown
Skills .claude/skills/ 配下のフォルダ(SKILL.md に手順を書く)
Subagents .claude/agents/ の Markdown(YAML frontmatter + 本文)
Hooks settings.json / 管理ポリシー設定 / スキル・エージェントの frontmatter
Output Styles .claude/output-styles/(組み込みは Proactive / Explanatory / Learning)
システムプロンプト追記 起動フラグ --append-system-prompt

やってはいけないパターンと、正しい置き換え

原典ブログがはっきり警告している「CLAUDE.md の誤用」と、その直し方です。ここが一番実戦的です。

NG1: 「Xしたら毎回必ずYせよ」を CLAUDE.md に書く

CLAUDE.md はお願いなので、毎回確実には実行されません。「毎回必ず」は決定論的な仕組みの仕事です。

# 例: 編集のたびに必ず prettier を走らせたい → PostToolUse フック(settings.json)
# CLAUDE.md に「毎回 prettier をかけて」と書くのではなく、ここで強制する

NG2: 「絶対にこれをするな」を CLAUDE.md に書く

「絶対するな」は CLAUDE.md では本当のガードレールになりません。守られない時があります。

# PreToolUse フックの考え方: 危険なコマンドを検査し、ダメなら exit 2 で拒否
# 例) rm -rf を含むコマンドをブロックする、など
exit 2   # ← この終了コードで、そのツール呼び出しが拒否される

NG3: 30行の手順を CLAUDE.md に書く

長い手順を CLAUDE.md に置くと、毎セッション常に読み込まれてトークンを浪費します。

NG4: paths の無い「API 専用ルール」

Rules に paths を付けないと、API と無関係なファイルを触っている時も常にトークンを食います。

---
paths:
  - "src/api/**"
  - "**/*.handler.ts"
---
すべての API ハンドラは、処理の前に Zod で入力を検証すること。

決定の早見 — どれを選ぶか(フローチャート風)

迷ったら上から順に当てはめてください。これがこの地図の「結論」です。

補足: チームでこれらの設定を共有したい時は plugins(プラグイン) でまとめて配布できる、と原典ブログは触れています。

▶ 試す
操縦法を診断してもらう: あなたは Claude Code の操縦法アドバイザーです。私がこれから「やりたい制御」を1つ貼ります。次の8択から最適なものを1つ選び、理由を3行で述べてください。選択肢=(1)ルートCLAUDE.md (2)サブディレクトリCLAUDE.md (3)Rules(pathsでスコープ) (4)Skills (5)Subagents (6)Hooks (7)Output Styles (8)--append-system-prompt。判断軸は「いつ読み込まれるか/コンパクションで消えるか/コスト/強制力(お願いか決定論的か)」です。やりたい制御=「src/api 配下のハンドラは必ず入力検証させたい」

まとめ — この地図に戻ってくる

新しい手法を覚える必要はもうありません。覚えるべきは選び方です。

次に自分のリポジトリで「これ、どこに書こう?」と迷ったら、上の決定の早見をもう一度なぞってください。それがこのレッスンの使い方です。

▶ 試す
自分の規約を仕分ける: あなたは Claude Code の設定設計の相談相手です。私のプロジェクトには次の3つの決まりがあります。それぞれ「ルートCLAUDE.md / サブCLAUDE.md / Rules / Skills / Subagents / Hooks / Output Styles / append-system-prompt」のどれに置くのが最適か、理由つきで表にしてください。(1)『API ハンドラは必ず入力検証する』(2)『ファイルを編集したら毎回 prettier をかける』(3)『本番デプロイは10ステップの決まった手順がある』

演習問題

演習 1: 3つの要求を最適な手法に仕分ける

あなた(または架空)のリポジトリにある3つの要求を、根拠つきで最適な手法に割り当てる演習です。観察ポイント: Claude が単に手法名を挙げるだけでなく、「いつ読み込まれるか / コンパクションで消えるか / コスト / 強制力」という4つの判断軸のどれを根拠にしているかを確認してください。特に『毎回必ず』系が Hooks に、『長い手順』が Skills に、『ファイル群の制約』が paths 付き Rules に向く理由を説明できているかが鍵です。

スタータープロンプト:
あなたは Claude Code の操縦法アドバイザーです。私のリポジトリには次の3つの要求があります。それぞれを以下8択から最適な1つに割り当て、「読み込みタイミング/コンパクション時の挙動/コスト/強制力(お願いか決定論的か)」のどの軸を根拠にしたかを各2〜3行で説明してください。選択肢=ルートCLAUDE.md / サブディレクトリCLAUDE.md / Rules(pathsでスコープ) / Skills / Subagents / Hooks / Output Styles / --append-system-prompt。要求=(A)『src/api/ 配下のハンドラは処理前に必ず入力検証する』(B)『ファイルを edit したら毎回 prettier を走らせる』(C)『本番デプロイは決まった10ステップの手順がある』。最後に Markdown の表でまとめてください。
ヒントを見る

模範解答の方向性: (A)=Rules を paths: ["src/api/**"] でスコープ(ファイル単位の制約、無関係な時はトークンを食わない)。(B)=Hooks(『毎回必ず』は決定論的強制なので CLAUDE.md ではなく PostToolUse フック)。(C)=Skills(長い手順は本体が呼び出し時だけ読まれる)。

サンプル解答を見る
要求 最適な手法 根拠の軸
A: API ハンドラの入力検証 Rules(paths でスコープ) コスト+強制力: 該当ファイルに触れた時だけ効き、制約として再注入される
B: edit のたびに prettier Hooks(PostToolUse) 強制力: 『毎回必ず』は決定論的に発火させる必要があり CLAUDE.md では不十分
C: 10ステップのデプロイ手順 Skills コスト: 長い手順は本体を呼び出し時だけ読み込み、常時のトークン浪費を避ける

演習 2: CLAUDE.md の誤用を直す

わざと『何でも CLAUDE.md に詰め込んだ』設定を Claude に見せて、ブログの警告に沿ってリファクタしてもらう演習です。観察ポイント: 『絶対するな』がブロック Hooks か managed settings に、『毎回必ず』が Hooks に、長い手順が Skills に、API 専用ルールが paths 付き Rules に振り分けられるか。CLAUDE.md に残すべきもの(プロジェクト概要・規約)と、外に出すべきものの線引きができているかを見ます。

スタータープロンプト:
次は私の肥大化した CLAUDE.md です。原典ブログ『Steering Claude Code』の方針に沿って、各項目を『CLAUDE.md に残す / Hooks へ / Skills へ / Rules(paths)へ / managed settings へ』のどこに移すべきか仕分け、理由を添えてください。

--- CLAUDE.md ここから ---
1. このリポジトリは Next.js のモノレポです。ビルドは pnpm build。
2. ファイルを編集したら毎回必ず prettier をかけること。
3. 絶対に本番DBに対して migration を直接実行しないこと。
4. デプロイ手順: (1) テスト (2) ビルド (3) タグ付け (4) ステージング確認 (5)〜(30) …と30行続く。
5. src/api 配下のハンドラはすべて Zod で入力検証すること。
--- ここまで ---

仕分け後、『CLAUDE.md に残す版』が何行くらいになるかの目安も教えてください(200行未満が推奨という前提で)。
ヒントを見る

期待される仕分け: 1=CLAUDE.md に残す(プロジェクト概要)。2=Hooks(毎回必ず=決定論的)。3=ブロック Hooks(PreToolUse + exit 2)か managed settings(絶対するな=ガードレール)。4=Skills(長い手順は呼び出し時だけ読む)。5=Rules を paths: ["src/api/**"] でスコープ。

理解度チェック

  1. 原典ブログが「何でも CLAUDE.md に書くのは悪手」と言う主な理由はどれか。
    1. CLAUDE.md は Markdown でしか書けず表現力が低いから
    2. ルート CLAUDE.md はセッション中ずっと文脈に居座ってトークンを食い、しかも『お願い』で強制力がないから
    3. CLAUDE.md はコンパクションで必ず消えてしまうから
    4. CLAUDE.md はチームで共有できないから
  2. 「ファイルを編集したら毎回必ず linter を走らせたい」。最適な手法と、その根拠となる性質の組み合わせはどれか。
    1. CLAUDE.md / 常に読み込まれるから確実
    2. Hooks / ライフサイクルイベントで決定論的に発火するから
    3. Output Styles / 決してコンパクションされないから
    4. Subagents / 隔離コンテキストで動くから
  3. Rules に paths フィールドを付ける目的として正しいものはどれか。
    1. ルールの内容を暗号化して隠すため
    2. 対象ファイルに触れた時だけ効かせ、無関係な時のトークン消費(コスト)を減らすため
    3. 複数人で同時編集できるようにするため
    4. ルールをコンパクションから守るため
  4. Output Styles と『--append-system-prompt(システムプロンプト追記)』の決定的な違いはどれか。
    1. Output Styles は無料だが append-system-prompt は有料
    2. Output Styles は役割そのものを置き換える(frontmatter で keep-coding-instructions を明示しない限り既定の指示が外れる副作用あり)が、append-system-prompt は元のプロンプトに足すだけで役割を書き換えない
    3. append-system-prompt はコンパクションで消えるが Output Styles は消えない以外に違いはない
    4. 両者は完全に同じで呼び名だけ違う
解答と解説を見る
  1. B — 高コスト(常時ロード)かつ非決定論的(お願い)という2点が悪手の理由。だから200行未満が推奨される。
  2. B — 『毎回必ず』はモデルの気分に左右されない決定論的な発火が必要で、それが Hooks の役目。
  3. B — paths でスコープすると常時ロードを避けられる。API 専用ルールなどは必ず paths を付けるのがブログの推奨。
  4. B — append は additive(足すだけ)で役割を保つ。Output Styles は置き換えなので、keep-coding-instructions: true を明示しない限り既定の指示が外れる恐れがあり慎重に使う。