メインコンテンツへスキップ

作る段:助言と手順と強制を分ける

  • レッスン 3
  • 12分

このレッスンで

終わる頃には、次ができるようになります

  • CLAUDE.md・スキル・フックの3層が、それぞれ何を担うかを説明できる
  • 一貫して守られるべきルールを、どの層に置くべきか判断できる
  • フックが権限モードを超えて機能する理由を説明できる

前のレッスンで作った計画(plan.md)をもとに、実際にコードを書く段に入ります。ここで最初につまずきやすいのが、「チームのルールをどこに書けばいいか分からない」という問題です。CLAUDE.mdに書いたのに守られない、スキルを作ったのに呼ばれない、ということが起こります。

原因は、3つの層それぞれの強さが違うことです。

CLAUDE.md:毎回読まれるが、あくまで助言

CLAUDE.mdは、セッションが始まるたびに読み込まれる、チーム共通のルールを書く場所です。技術構成・命名規則・落とし穴などを書いておくと、新しく加わったメンバーが必要とする文脈をClaudeに渡せます。

ただし、CLAUDE.mdは強制される設定ではなく、文脈として扱われます。公式ドキュメントも、CLAUDE.mdと自動メモリはどちらも会話の最初に読み込まれるが、Claudeの判断に関わらず行動を確実にブロックしたい場合は、あとで説明するフックを使うべきだと述べています。CLAUDE.mdに「本番のデータベースには触らない」と書いても、それは強いお願いであって、鍵のかかったドアではありません。


スキル:組織の知識を、手順として配る

一貫して適用したい組織的な知識は、CLAUDE.mdに書き足すのではなく、スキル(SKILL.md)として切り出します。CLAUDE.mdが「常に読む前提知識」なのに対し、スキルは特定の作業に関連するときだけClaudeが判断して読み込む、または/名前で明示的に呼び出す形です。

CLAUDE.md向き

技術構成、命名規則、プロジェクト全体で常に効かせたい前提

スキル向き

決まった手順の作業(デプロイの手順、レビューの観点、定型のチェックリストなど)

CLAUDE.mdとスキルの使い分け

スキルは.claude/skills/に置いてリポジトリにコミットすれば、チーム全員に配布されます。個人用に持ち回りたい手順は~/.claude/skills/に置けば、そのマシンで開くすべてのプロジェクトに効きます。指示の置き場所の全体像は、指示の置き場所でさらに詳しく扱っています。


フック:決定論的に強制する

CLAUDE.mdもスキルも、あくまでClaudeへの「助言」です。絶対に破ってほしくないルールは、フックに任せます。フックは、Claude Codeのライフサイクルの特定の時点で実行されるユーザー定義のシェルコマンドです。公式ドキュメントは、フックについて「LLMが選ぶかどうかに頼らず、特定の行動を必ず起こす、決定論的な制御を与える」ものだと説明しています。

たとえば、保護したいファイル(.envやpackage-lock.jsonなど)への書き込みを防ぎたいとき、PreToolUseというイベントで、編集(Edit・Write)が実行される前にチェック用のスクリプトを走らせます。対象のパスに一致したら、スクリプトは終了コード2で処理を止めます。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": ".claude/hooks/block-protected-paths.sh" }
        ]
      }
    ]
  }
}

止められた理由はClaudeにそのまま伝わるので、Claudeは別のやり方を考え直せます。ここが、単に「やってはいけません」と書いたCLAUDE.mdとの決定的な違いです。**フックが返す拒否は、権限モードをどれだけ緩めても上書きできません。**公式ドキュメントも、PreToolUseフックはあらゆる権限モードより先に働き、bypassPermissionsのように何でも許可するモードであっても、フックが拒否と答えればツールの実行は止まる、と明記しています。ユーザーが権限モードを変えても回避できないポリシーを、ここで作れるということです。


3つの層を、目的で選ぶ

3つの層の強さ

1

CLAUDE.md

毎回読まれる前提知識。強制力はなく、書いても守られないことがある

2

スキル

決まった手順を配る。呼ばれれば効くが、呼ばれなければ効かない

3

フック

決定論的な強制。権限モードを変えても回避できない

チームのルールを作るときは、まず「これは破られたら困るのか、それとも忘れられたら困るだけなのか」を自分に問うとよいでしょう。破られたら困るものはフックへ、忘れられたら困るだけのものはCLAUDE.mdやスキルへ、という振り分けです。個人でツールを作っている場合も同じで、あとで自分がうっかり触ってしまいそうな箇所には、最初からフックを仕掛けておくと安心です。


やってみよう

演習1:自分のCLAUDE.mdを棚卸しする

いま使っているCLAUDE.md(または似た指示書)を開いて、書かれている項目を1つずつ見てください。「絶対に守られてほしい」ものと、「知っておいてほしいだけ」のものに分けてみましょう。前者がいくつかあれば、フック化の候補です。

演習2:フック化する1つを選ぶ

演習1で見つけた「絶対に守られてほしい」項目のうち、最も事故の被害が大きそうなものを1つ選び、どのイベント(PreToolUseなど)でどう止めるかを、実装する前に言葉で書き出してみましょう。


今日のまとめ

3行で振り返ります。

  • CLAUDE.mdは毎回読まれる助言、スキルは呼ばれたときだけ効く手順、フックは権限モードを超えて機能する決定論的な強制
  • 「破られたら困るか、忘れられたら困るだけか」で、どの層に置くかを判断する
  • フックの拒否はbypassPermissionsのような緩いモードでも上書きできない

次のレッスンでは、書いたコードを完了と報告する前に、Claude自身に確かめさせる「確かめる段」を見ていきます。実装を始める前の心構えは、チャットからClaude Codeへでも一人で作る人向けに扱っています。

セルフチェック

1. CLAUDE.mdの性質として正しいものはどれですか。

2. フックの拒否(deny)についての説明として正しいものはどれですか。

3. スキルとCLAUDE.mdの使い分けとして、本文が挙げているものはどれですか。

SourceDOCUMENTATION
Claude Code公式: CLAUDE.mdと自動メモリ

CLAUDE.mdが強制ではなく文脈として扱われること、確実にブロックしたいときはフックを使うべきだという一次情報

Webcode.claude.com/docs
code.claude.com/docs/en/memory
SourceDOCUMENTATION
Claude Code公式: Agent Skillsの構造

SKILL.mdの書き方、個人用とチーム共有の置き場所の違いの一次情報

Webcode.claude.com/docs
code.claude.com/docs/en/skills
SourceDOCUMENTATION
Claude Code公式: フックによる自動化

PreToolUseフックでの拒否と、権限モードを超えて機能する仕組みの一次情報

Webcode.claude.com/docs
code.claude.com/docs/en/hooks-guide

このレッスンは役に立ちましたか?