← レッスンに戻る
第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)=Rulespaths: ["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 を明示しない限り既定の指示が外れる恐れがあり慎重に使う。