Claude Code は、自分の開発スタイルに合わせて挙動をカスタマイズできる。Anthropic の公式ブログでは、Claude の振る舞いを指示する方法として7つの手段が整理されている。CLAUDE.md ファイル、ルール、スキル、サブエージェント、フック、出力スタイル、そしてシステムプロンプトへの追記だ。

重要なのは、これらが単なる「指示の書き場所」の違いではないという点だ。それぞれの手段は、いつコンテキストに読み込まれるか長いセッション(コンパクション)を越えて持続するかどれだけの権威(指示への追従度)を持つかという3つの軸で性質が異なる。同じ指示でも、置く場所を間違えるとトークンを無駄に消費したり、肝心なときに守られなかったりする。

7つの手段の早見表

まず全体像を一枚で押さえておく。読み込みタイミング・コンパクション挙動・コンテキストコスト・適した用途を並べると、各手段の住み分けが見えてくる。

手段読み込みタイミングコンテキストコスト適した用途
CLAUDE.md(ルート)セッション開始時。以降ずっと保持高。関係なくても毎行トークンを消費ビルドコマンド、ディレクトリ構成、コーディング規約、チームの慣習
CLAUDE.md(サブディレクトリ)そのディレクトリ配下のファイルを読んだとき低。作業中のディレクトリ分だけ特定ディレクトリ固有の規約
ルールセッション開始時、またはパス一致時のみ中。パススコープしない限り常時個別の制約(例: 全 API ハンドラは Zod で入力検証)
スキル名前と説明は開始時、本体は呼び出し時低。本体は呼び出し時のみ・共有予算内手続き的なワークフロー(デプロイ・リリース手順)
サブエージェント名前・説明・ツール一覧は開始時、本体は呼び出し時低。呼ばれるまでメインは消費ゼロ分離して動かしたい並列作業・サイドタスク
フックライフサイクルイベントで発火低。設定はメインコンテキスト外決定論的な自動化(lint、Slack 通知、コマンドブロック)
出力スタイルセッション開始時。システムプロンプトに注入高。ただしデフォルトを上書き大きな役割変更(コード支援→汎用アシスタント)
システムプロンプト追記セッション開始時。CLI フラグで渡す中。初回リクエスト後はキャッシュトーン、応答の長さ、フォーマットの好み

各手段の中身

CLAUDE.md ファイル

プロジェクトルートに置く Markdown ファイル。セッション開始時に読み込まれ、セッション中ずっとコンテキストに残る。ビルドコマンド、ディレクトリ構成、モノレポ構造、コーディング規約、チームの慣習などが自然に収まる。

2種類あり、挙動が異なる。ルート CLAUDE.md は常時ロードされ、コンパクション時にも再読み込みされるため長いセッションでも失われない。一方、サブディレクトリの CLAUDE.md はオンデマンドで、たとえば app/api/CLAUDE.mdapp/api 配下のファイルを読んだときだけ読み込まれる。

共有リポジトリでは、CLAUDE.md は所有者のいない設定ファイルと同じように肥大化していく。各チームが自分の指示を追記し、何も削除されない。全行がすべてのエンジニアの全セッションに読み込まれるため、コストは規模に応じて膨らみ、本当に重要な指示への追従が薄まる。200行以内に保ち、オーナーを決め、コードと同じようにレビューするのが推奨されている。

ルール(Rules)

.claude/rules/ に置く Markdown ファイルで、Claude に個別の制約や規約を与える。スコープなしのルールは CLAUDE.md と同様に常時ロードされ、関係ないタスクでもトークンを消費してしまう。

そこで パススコープルールを使う。paths フィールドを追加すると、関連するファイルを触ったときだけ読み込まれる。たとえば src/api/** にスコープしたルールは、ドキュメントだけを編集するセッションではコンテキストに入らない。

--- paths: - "src/api/**" - "**/*.handler.ts" --- All API handlers must validate input with Zod before processing.

「migrations は追記のみ」のようなファイル固有の制約は、paths frontmatter を付けたルールが最適。複数の箇所(ただし全体ではない)に現れる横断的な関心事には、ネストした CLAUDE.md よりパススコープルールを選ぶとよい。

スキル(Skills)

.claude/skills/ にフォルダとして置く、指示・スクリプト・リソースの集合。各スキルには名前・説明・本体を持つ SKILL.md がある。開始時に読み込まれるのは名前と説明だけで、本体はスキルが呼び出されたときに読み込まれる。発動はスラッシュコマンド(/code-review など)かタスクの自動マッチングによる。

コンパクション時には、呼び出されたスキルが共有予算の範囲内で再注入される。多くのスキルを使ったセッションでは、古いものから順に落ちていく。

デプロイ手順・リリースチェックリスト・レビュープロセスのような手続き的な指示は、CLAUDE.md ではなくスキルに置くのが鉄則だ。

サブエージェント(Subagents)

.claude/agents/ に置く Markdown ファイルで、特定のサイドタスク用の分離されたアシスタントを定義する。スキルと同様、名前・説明・ツール一覧は開始時に読み込まれるが、本体は自動発動しない。Claude が Agent ツール経由でプロンプト文字列を渡して呼び出す。

サブエージェントの本体は親の会話に一切入らない。独立した新しいコンテキストウィンドウで実行され、メインセッションに戻るのは最終メッセージ(多くは多数のサブタスクを集約した結果)とメタデータだけだ。サブエージェントは最大5階層までネストでき、動的ワークフローを使えば数十〜数百のバックグラウンドエージェントを編成できる。

この分離こそが、スキルではなくサブエージェントを選ぶ主な理由だ。深い検索・ログ解析・依存関係の監査など、後で参照しない中間結果でメイン会話を散らかしたくないときに使う。逆に、各ステップを見て操縦したいなら、メインスレッド内で展開されるスキルを選ぶ。

フック(Hooks)

ファイル編集・ツール呼び出し・セッション開始といった Claude のライフサイクル上の特定イベントで発火する、ユーザー定義のコマンド・HTTP エンドポイント・LLM プロンプト。settings.json、管理ポリシー設定、あるいはスキル/エージェントの frontmatter に登録する。

種類は command、HTTP、mcp_tool、prompt、agent の5つ。前者3つは決定論的に実行され、後者2つ(prompt・agent)はルールではなく Claude の判断を使って出力を決める。

設定や指示がメインコンテキスト外にあるためコンテキストコストは低い。ただしブロックフックの標準エラーのように、一部の出力はコンテキストに保存される(Claude が拒否理由を知るため)。これがフックを CLAUDE.md・ルール・スキルと根本的に異なるものにしている。「決定論的に必ず起きてほしいこと」——編集後の lint 実行、完了時の Slack 通知、特定コマンドのブロック——にフックを使う。

出力スタイル(Output styles)

.claude/output-styles/ に置くファイルで、システムプロンプトに指示を注入する。コンパクションされず、毎セッション開始時にロードされ、初回リクエスト後はキャッシュされる。システムプロンプトに座るため、ここまでの手段の中で最も指示追従の重みが大きい——だからこそ慎重に使う必要がある。

注意すべきは、出力スタイルの変更がデフォルトの出力スタイルを置き換えてしまう点だ(frontmatter で keep-coding-instructions: true を設定しない限り)。これにより、変更の範囲・コメントの付け方・セキュリティへの対応・テスト実行などの習慣といった、ソフトウェアエンジニアリング向けの重要なデフォルト指示が外れ、Claude Code は汎用アシスタント寄りになる。

カスタム出力スタイルを書く前に、組み込みの Proactive・Explanatory・Learning を確認するとよい。自律性・教育モード・協調的コーディングといった一般的なニーズは、スタイルファイルを保守せずともこれらでカバーできる。

システムプロンプトへの追記

出力スタイルの変更が大きく意図しない影響を及ぼしうるのに対し、append-system-prompt フラグは元のシステムプロンプトに加算的に働く。Claude の役割は変えず、デフォルトの役割に指示を追加するだけだ。呼び出し時に渡され、その呼び出しにのみ適用される。

コンテキストコストは中程度。入力トークンは増えるが、初回リクエスト後はプロンプトキャッシュで軽減される。トーン・出力フォーマット・ドメイン固有の知識を足すのに向く。ただし追従には逓減がある——この方法で渡す指示が多いほど、特に矛盾があると、Claude は厳密には守らなくなる。

置き場所を見直すサイン

次のような書き方をしている場合は、指示の置き場所を変えたほうがいい。

CLAUDE.md のアンチパターン

本物のガードレール: 「絶対にするな」を強制したいなら、PreToolUse フックがツール呼び出しを検査し、exit code 2 で拒否できる。さらに管理設定(managed settings)は管理者が配布し、ユーザーのローカル設定では上書きできない——組織全体で決定論的なガードレールを強制する唯一の方法だ。

まとめ

7つの手段は「機能の数」ではなく「指示を置く軸の数」として捉えると整理しやすい。事実は CLAUDE.md、横断的な制約はパススコープルール、手続きはスキル、分離したい作業はサブエージェント、決定論的な強制はフック——という対応がベースラインになる。

特に「コードで強制できるものはコードに」という観点では、CLAUDE.md に「絶対するな」と書くのではなく、フックと権限で機構的に止めるという設計が効いてくる。指示はプレッシャー下で破られうるが、ハーネスが実行するコードは破られない。

動くものがいくつか揃ったら、スキル・サブエージェント・フック・出力スタイルをプラグインとしてまとめ、チームやプロジェクト間で一貫したセットアップを共有できる。自分のハーネス設計を、この7軸に当てはめて棚卸ししてみるとよい。