C
Claude Academy
The Steering Map: Which Mechanism, When

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

約 13 分 · クイズ 4 問 · 演習 2 問
重要キーワード (5 語)
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点でクセが違います。

  • いつ読み込まれるか: セッション開始時にずっと持つのか、ファイルに触れた時だけか、呼び出した時だけか。
  • コンパクション(文脈圧縮)で消えるか: 会話が長くなると過去が要約・圧縮されます。その時に残るのか、回避(bypass)されるのか、消えてしまうのか。
  • コスト: 常に文脈に居座る指示はトークン(AIが読む文字の単位)を食い続けます。必要な時だけ読まれる指示は安いです。
  • 指示の強制力: 「お願い」レベルなのか、モデルの気分に関係なく決定論的(必ず同じ条件で発火する)に効くのか。

ここで大事な結論。何でも 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 はお願いなので、毎回確実には実行されません。「毎回必ず」は決定論的な仕組みの仕事です。

  • 正しい置き換え → Hooks。編集後に linter を走らせる、といった自動化は Hooks が決定論的に発火します。詳しくは Hooks の回。
# 例: 編集のたびに必ず prettier を走らせたい → PostToolUse フック(settings.json)
# CLAUDE.md に「毎回 prettier をかけて」と書くのではなく、ここで強制する

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

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

  • 正しい置き換え → ブロック機能付きの Hooks(PreToolUse フックは exit code 2 で拒否=deny できる)か、managed settings(管理ポリシー設定)。組織として禁止したいなら後者。
# PreToolUse フックの考え方: 危険なコマンドを検査し、ダメなら exit 2 で拒否
# 例) rm -rf を含むコマンドをブロックする、など
exit 2   # ← この終了コードで、そのツール呼び出しが拒否される

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

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

  • 正しい置き換え → Skills。本体(SKILL.md の全文)は呼び出した時だけ読み込まれます。開始時は「名前と説明」だけ。デプロイ手順やリリースチェックリストはこれが最適。詳しくは Skills の回。

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

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

  • 正しい置き換え → paths フィールドでスコープする。対象パスを書けば、そのファイルに触れた時だけ効きます。
---
paths:
  - "src/api/**"
  - "**/*.handler.ts"
---
すべての API ハンドラは、処理の前に Zod で入力を検証すること。

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

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

  • プロジェクト全体の規約・概要(ビルドコマンド、ディレクトリ構成、チームの慣習)→ ルート CLAUDE.md(ただし200行未満に保つ)
  • 特定ディレクトリだけのルール(例: app/api/ 配下の決まり)→ サブディレクトリ CLAUDE.md(そこに触れた時だけ読まれる)
  • 特定ファイル群への制約(例: API ハンドラは入力検証、マイグレーションは追記のみ)→ Rules(必ず paths でスコープ)
  • 手順・チェックリスト(デプロイ、リリース、レビューの段取り)→ Skills
  • 隔離したい大きな脇道タスク(深い検索、ログ解析、依存関係監査)→ Subagents(専用の新しいコンテキストで動き、最終メッセージだけ戻る。最大5階層までネスト可)
  • 「毎回必ず」「絶対するな」=決定論的に強制したい→ Hooks(ブロックは PreToolUse + exit 2、または managed settings)
  • 役割そのものを大きく変えたい→ Output Styles(ただし既定の指示が置き換えられて外れるので慎重に。残したいなら frontmatter に keep-coding-instructions: true)
  • 起動時に標準・フォーマットを足したいだけ(役割は変えない)→ --append-system-prompt(元のシステムプロンプトに足すだけ。キャッシュで初回以降は安い)

補足: チームでこれらの設定を共有したい時は 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 配下のハンドラは必ず入力検証させたい」

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

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

  • 4つの軸(読み込みタイミング / コンパクション / コスト / 強制力)で見れば、どの手法も役割が決まる。
  • 「全部 CLAUDE.md」は重くて弱い。お願いでいいなら CLAUDE.md、絶対守らせたいなら Hooks、長い手順は Skills、ファイル単位の制約は Rules(paths)。
  • 実際の構築の細部は各レッスン(ch6-l1〜ch6-l9)へ。

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

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

▶ Hands-on 演習

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

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

▶ Playground を開いて実行
💡 ヒント

模範解答の方向性: (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 に残すべきもの(プロジェクト概要・規約)と、外に出すべきものの線引きができているかを見ます。

▶ Playground を開いて実行
💡 ヒント

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

進捗保存にはログインが必要 クイズに挑戦 (4問)

💬 このレッスンへの質問 (0)

全質問を見る →
質問の投稿には ログイン が必要です。閲覧は誰でも可能です。

まだ質問はありません。最初の 1 件を投稿してみましょう。