VI EN ZH JA
Inside ClaudeKit · No. 03claudekit-engineer@2.19.1
Inside ClaudeKit · Guard rails deep dives

Guard rails:モデルとアクションの間のブレーキ層

エージェントがファイルの読み取り、シェルの実行、コードの編集、PRのshipができる状態において、プロンプト内の一言の注意書きでは不十分です。ツールが実際に実行される前に検査する層が必要です。

4guard層
7guard railグループ
2config層
8既知のgap
13セクション
Case

小さなタスク、広すぎる権限

エージェントに小さな作業を依頼しました:あるモジュールのバリデーションを修正する。より確実にしたいと判断したエージェントは追加でいくつかのディレクトリをスキャンし、センシティブなconfigファイルを開き、さらについでに無関係なcleanupもまとめて同じPRに含めました。

一見すると問題なさそうです。テストもpassしています。しかしcontextには不要なファイルが混入し、secretがtranscript(あなたとエージェントの会話の全記録)に入り込んだ可能性があり、修正すべき部分と「ついで」の部分が同じPRに混在しているためレビューが散漫になっています。

guard railなし

  • Globが広すぎる — contextが汚染される
  • cat .env — secretがtranscriptに入る
  • スコープ外のcleanup — レビューが散漫になる
  • テストがpassしたので続行 — スコープ確認ステップが欠如

guard railあり

  • Globが広すぎる — scout-block exit 2
  • .env — privacy-blockがユーザーに確認
  • スコープ逸脱 — rule/hard-gateがメインタスクへ戻るよう促す
  • ship前 — simplify/review gateがdiffを再確認

エージェントは自然と慎重にはなりません。ただ、何かを実行しようとする前に、「これは実行を許可すべきか?」と問う層が立ちはだかるのです。

要点

Hookが本物のブロック層です。

Guard railはモデルをより賢くするわけではありません。ツールが実行される前にアクションを検査します。Rule、hard-gate、guard skillは追加の方向付け層であり有用ですが、モデルまたはユーザーが呼び出すかどうかに依存します。

I. 概念

Section 01

agentic codingにおけるguard railとは

Guard railはエージェントとアクションの間に立つ層です:リスクのある操作はブロックし、疑わしい操作は警告します。階段の端にある手すりのようなもので、歩き方が上手くなるわけではありませんが、一歩踏み外しても事故になる可能性を減らします。プロンプト内の指示(prompt instruction)と異なり、guard railはモデルが「覚えているか」に依存せず、ツール調整層で動作します。

Guard railと指示の違い

Guard rail指示
動作する場所Harness、モデルの外側context内、モデルが読む
強制力コードで実際にブロックモデルが自発的に従う
contextが長い場合引き続き動作忘れやすい・スリップしやすい
モデルが誤解した場合引き続きブロック(クラッシュしなければ)モデルに従って誤解
変更方法コード・configの修正が必要テキスト修正で完了
Section 02

Guard railの動作原理

Harnessはモデルを包むruntime層です。モデルは「このファイルを読みたい」または「このコマンドを実行したい」と決定するだけで、harnessがtool callを受け取り、権限を管理し、hookを呼び出し、ツールを実行またはブロックし、結果をモデルに返します。Hookは、検査や状態記録のために介入するため、harnessがtool callのライフサイクル(prompt受信時、tool前、tool後)の固定タイミングで自動的に呼び出す小さなスクリプトです。すべての実際のアクションがharnessを通過するため、guard railを組み込む場所はここです。

概念の背景についてはこちら:Duy /zuey/ による Harness Engineering とは?

ClaudeKit Hooksマップ

ClaudeKit Hooksの詳細はVividKit Guidesで読めます。

CLAUDE CODE LIFECYCLE User prompt task / intent Model ツール呼び出しを要求 UserPromptSubmit simplify-gate · dev-rules-reminder PreToolUse scout-block · privacy-block ツール実行 Read · Bash · Edit · Write PostToolUse / Stop plan-format · session-state allow exit 0 · ツール実行 block exit 2 · 理由を返す inject additionalContext remember logs / state settings.json wire event .ck.json runtime flag ENV override payload: event · tool · input · cwd

HookはモデルI内にはありません。Claude Codeのライフサイクルに位置します:settings.jsonがどのhookを呼び出すかを決定し、.ck.json/ENVがruntime behaviorを決定します。hookの出力は、実行を許可・ブロックし、contextをinjectし、ツールまたはセッション終了後にstate/artifactを記録できます。

guard railを通過するtool callのフロー

HARNESS RUNTIME User prompt Prompt gate UserPromptSubmit · block? pass Model ツール呼び出しを決定 tool call: Read / Bash / Edit Pre-tool hook PreToolUse · scout / privacy exit 0 (allow) Tool exec 読み取り・書き込み・実際の実行 result Post-tool hook PostToolUse · validate, scan Resultをモデルへ block ブロック ユーザーにprompt修正を促す exit 2 ツール非実行 理由をモデルへ返す

重要なポイント:pre-tool hookはexit codeを返します。Exit 0でツール実行、exit 2でブロックして理由をモデルへ送信。フロー内の3つの主要な介入ポイントには対応する技術名があります:UserPromptSubmit(prompt受信時)、PreToolUse(tool前)、PostToolUse(tool後)。Stop/SubagentStopはセッションまたはsubagent終了時に実行されるため、上のライフサイクルマップに示されています。

Exit codeの意味

Exit codeはプロセス終了時に返す数値です。Claude Codeはこれを読んでツールを実行するか決定します:

  • exit 0 — OK、ツール実行。stdoutをJSON outputとして読み取ります。
  • exit 2ブロック。stdoutを無視し、stderrをエラーメッセージとしてモデルへ送信。
  • exit 1(またはその他のコード)— エラーだがブロックしない。エラーを報告してもツールは続行します。

exit 2だけが実際にブロックします。ポリシーを強制したいhookは必ずexit 2を使用してください。Unix習慣で誤ってexit 1を使うと、guard railがオンのつもりで実際にはオープンになります。

2種類のブロック

Hard · コード

Hook exit 2、ツール実行なし。ただしhookがクラッシュするとClaude Codeは通過させます(fail-open)。hookのバグがguardをサイレントに無効にします。

Soft · テキスト

contextにテキストを追加します(rule、hard-gate)。モデルが自発的に従う必要があります。強度はモデルに依存します。

メリット
  • contextをクリーンに保つ · secretをtranscriptから守る
  • リズムを維持:plan → simplify → review
  • リスクが広がる前に早期ブロック — エージェントが.envを読もうとする、広すぎるスキャン、スコープ外のcleanupをPRに引き込む
  • 複数の層が互いを補完 — hookがfail-openになる可能性があり、ruleをモデルが無視する可能性があり、guard skillが呼び出されない可能性がある。複数の層に分けることで単一のブロックポイントへの依存を減らします

II. CKにおける実装

Section 03

CKの7つのguard railグループ

重要な注意

freshなCKインストール後、file-access guardはscout-blockprivacy-blockなどのPreToolUse hookに存在します。Claude Codeセッションがpermission promptをスキップするモードで動作している場合も、これらのhookはCKの主要なブロック層です。ただしCKのhookはfail-openです:クラッシュまたは無効化された場合、tool callはそのまま通過する可能性があります。

グループメカニズム強制力
ファイル・パスのブロックPreToolUsescout-blockコード · fail-open
誤ったステップのブロックUserPromptSubmitsimplify-gatecode
contextの追加UserPromptSubmitdev-rules-remindercode
クリーンな命名の維持Pre/Post/Stopdescriptive-nameコード · 促す
Hard-gate skillXML markdown<HARD-GATE>指示
Ruleによる指示CLAUDE.mdreview-audit指示
Guard skillユーザーが呼び出すck:security-scanuser

各グループはどこで参照するか

ファイル・パスのブロックscout-blockprivacy-block · Section 05-06
誤ったステップのブロックsimplify-gate、workflow gate · Section 07-08
contextの追加dev-rules-reminder がテキストをpromptにinject · Section 10
クリーンな命名の維持descriptive-name · Section 04のhook grid
Hard-gate skill<HARD-GATE> · Section 09
Ruleによる指示CLAUDE.md のruleはinjectされるコンテンツ · Section 10
Guard skillck:security-scanck:ship · Section 11

よくある9つのシナリオ

シナリオ処理する層
node_modules/react/ を読み取るscout-block、exit 2
.env を読んでkeyを確認privacy-block、exit 2 + approval prompt
ルートで **/*.ts をGlobscout-block broad-pattern
diffが膨らんだ状態でshipをpromptsimplify-gate(gate.enabled=true の場合)
plan・reviewなしでコーディングを開始ck:cook HARD-GATE
ユーザーが確定したthresholdを変更review-audit rule:変更前に再確認
曖昧な名前の新ファイルdescriptive-name, PreToolUse(Write)
Planが誤ったフォーマットのリンク・テキストを使用plan-format-kanban, PostToolUse(Edit/Write/MultiEdit)
2人のteammateが同じファイルに触れるteam-coordination rule、Agent Team内のみ
Section 04
Configマップ · hookが実際に動作しているか確認する場所

SettingsとConfig層

どのguardが動作するかを決定する2つのconfig層:settings.jsonがhookをClaude Codeのライフサイクルに組み込み、.ck.jsonが各hookのオン・オフを切り替え、thresholdを調整します。

# グローバルスコープ
~/.claude/settings.json
~/.claude/.ck.json
~/.claude/hooks/*.cjs
# プロジェクトスコープ
.claude/settings.json
.claude/.ck.json
.claude/hooks/*.cjs

settings.json:どのhookがどのタイミングで動作するか

以下のsnippetはfreshなCKインストールにおけるPreToolUseの一断面のみを示しています:CKはscout-blockprivacy-blockを提供し、ツール実行前にClaude Codeが呼び出せるようライフサイクルにwireします。インストール済み環境のfull hook configにはさらに多くのlifecycle eventがあります。確認すべき場所はClaude Codeのsettings.jsonです。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash|Glob|Grep|Read|Edit|Write",
        "hooks": [
          { "command": "node \".claude/hooks/scout-block.cjs\"" },
          { "command": "node \".claude/hooks/privacy-block.cjs\"" }
        ]
      }
    ]
  }
}

settings.jsonはlifecycleマップです:ユーザーがpromptを送信したときにどのhookが動作するか、ツール実行前にどのhookが呼び出されるか、ツール完了後にどのhookが処理を続けるか。グローバルインストールの場合、CLIはテンプレート内の相対コマンドをnode "$HOME/.claude/hooks/scout-block.cjs"形式に変換します。プロジェクトインストールの場合、pathは通常.claude/hooks/...形式のままです。

3つのラベルでhookテーブルを読む

すべてを「デフォルトでオン・オフ」と単純化しないでください。hookの状態には3つの異なる層があります:

ラベル監査時の意味
script file.cjsファイルが.claude/hooks/に存在します。ファイルが存在するだけではhookが動作しているとは言えません。
wiredsettings.jsonがスクリプトをClaude CodeのLifecycle eventに組み込んでいます。wireしていないとClaude Codeはそのhookを自動呼び出ししません。
runtime flaghookが呼び出された後、内部のコードが.ck.json/DEFAULT_CONFIG/ENVを読んで実際に処理を続けるか決定します。privacyBlocksimplify.gate.enabledなどのサブスイッチを持つguardもあります。

以下のテーブルは stable claudekit-engineer@2.19.1 時点の hook リストのスナップショットです。2026-06-09 更新:claudekit-engineer@2.19.2-beta では task-completed-handlerteammate-idle-handler の削除が準備されています。upstream ClaudeKit が新しい version を release すると、このリストは14 hookになる可能性があります。

session-initwired
SessionStart · runtime flag true

起動・再開・クリア・compactのプロジェクト・環境セットアップ。

usage-quota-cache-refreshwired
SessionStart · UserPromptSubmit · PostToolUse · no flag

hook flagは個別に読み取らない。wireされたときに動作。

simplify-gategate off
UserPromptSubmit · runtime flag true

スクリプトは呼び出されますが、simplify.gate.enabledはデフォルトでfalse。

dev-rules-reminderwired
UserPromptSubmit · runtime flag true

dev rules・contextをinjectします。

subagent-initwired
SubagentStart · runtime flag true

subagentにcontextをinjectします。

descriptive-namewired
PreToolUse(Write) · runtime flag true

ファイル・スクリプトに分かりやすい名前をつけるよう促します。

scout-blockwired
PreToolUse(Bash/Glob/Grep/Read/Edit/Write) · runtime flag true

重いディレクトリと広すぎるglobをブロックします。

privacy-blockwired
PreToolUse(Bash/Glob/Grep/Read/Edit/Write) · runtime flag true · privacyBlock true

secretパスをブロックし、approvalを求めます。

plan-format-kanbanwired
PostToolUse(Edit/Write/MultiEdit) · no flag

hook flagは個別に読み取らない。planフォーマットについて警告。

session-statewired
PostToolUse · SubagentStop · Stop · runtime flag true

session・taskの状態を記録します。

cook-after-plan-reminderwired
SubagentStop(Plan) · keyなし = enabled

DEFAULT_CONFIG.hooksに個別keyはないが、isHookEnabled()はflagがfalseのときのみ無効化。

workflow-artifact-gatenot wired
runtime flag false

artifact gateのopt-in:hookのwireとflag・gate configの有効化が必要。

task-completed-handlerremoving
TaskCompleted · 2.19.2-betaで削除予定

Agent Teamsのtask完了。2.19.1以降も残る安定hookとして扱わないでください。

teammate-idle-handlerremoving
TeammateIdle · 2.19.2-betaで削除予定

Agent Teamsのteammate idle。2.19.1以降も残る安定hookとして扱わないでください。

team-context-injectnot wired
keyなし = enabled

DEFAULT_CONFIG.hooksに個別keyはなし。workflow・team layerが呼び出す場合のみ意味を持ちます。

usage-context-awarenessnot wired
runtime flag true

Usage・context injection hook。settings.jsonテンプレートには含まれていません。

見落としやすいポイント:isHookEnabled()hooks.<name>falseのときのみ無効化されます。keyがなければ通常enabledとみなされます。ただし個別のスイッチを持つguardもあります:privacy-blockは旧keyprivacyBlock=falseを読み取り、simplify-gatesimplify.gate.enabledとENV変数CK_SIMPLIFY_DISABLED=1を持ちます。

手動でのオン・オフと自己確認

素早く変更するには、対象スコープの.ck.jsonを編集します。keyが明示的に設定されている場合、プロジェクトconfigがグローバルより優先されます。keyがなければinherit・デフォルトに従います。settings.jsonでwire済みのhookに対しては、falseで無効化し、上位スコープで無効化されていた場合はtrueで再有効化できます。以下のHook列のhook名はhooks.<name>で使用するkeyと同じです。

// .claude/.ck.json または ~/.claude/.ck.json
{
  "hooks": {
    "scout-block": false,
    "privacy-block": true
  },
  "privacyBlock": true,
  "simplify": {
    "gate": {
      "enabled": true
    }
  }
}
やりたいことどこで変更するか注意
wire済みhookを無効化する
.ck.json{"hooks":{"scout-block":false}}
hookスクリプトは残りますが、runtimeは通過させます。
グローバルで無効化されたhookを再有効化する
project .ck.json{"hooks":{"scout-block":true}}
ローカルのkeyが明示的にグローバルをoverrideします。
privacy guardを無効化する
.ck.json{"hooks":{"privacy-block":false}}
.ck.json(旧key){"privacyBlock":false}
privacyBlock=falseは旧keyですが有効です。
simplify-gateを実際のブロックモードで有効化する
.ck.json{ "hooks": { "simplify-gate": true }, "simplify": { "gate": { "enabled": true } } }
simplify.gate.enabled=trueがなければgateのブロックモードは有効になりません。
session・スコープごとにsimplify-gateを無効化する
settings.json{ "env": { "CK_SIMPLIFY_DISABLED": "1" } }
EnvのoverrideはconfigのgateよりI強力です。
workflow-artifact-gateを有効化する
settings.jsonUserPromptSubmit / PreToolUse(Bash) をwireする
.ck.json{"hooks":{"workflow-artifact-gate":true}}
freshインストールはデフォルトでwireされていないため、<code>.ck.json</code>の変更だけでは不十分です。

hookがトリガーされるか確認したいときは、ファイル名ではなくlifecycle eventを確認してください。同じhookスクリプトは、settings.jsonのevent・matcherが現在のアクションと一致するときのみ動作します。以下のテーブルは各hookを素早く確認する方法です。not wiredのhookは先にwireするか、スクリプトが対応していれば手動CLIで呼び出す必要があります。

Hook手動トリガー注記
session-initClaude Codeセッションを開く・再開・クリア・compact。SessionStart(startup|resume|clear|compact)
usage-quota-cache-refreshセッションを開く、新しいpromptを送信、またはTask・Todoを更新する。Usageをキャッシュ。hook flagは個別に読み取らない。
simplify-gatediffが十分大きい状態でship・merge・pr・deploy・publishの意図を持つpromptを送信する。simplify.gate.enabled=trueが必要。デフォルトはブロックしません。
dev-rules-reminder新しいpromptを送信する。UserPromptSubmit。TTLに従ってrulesをinject。
subagent-initTask・agent flowでsubagentを起動する。SubagentStart.
descriptive-nameClaudeにWriteでファイルを作成させる。PreToolUse(Write)。ファイル名を分かりやすくするよう促します。
scout-blockClaudeにnode_modulesdistを読ませるか、広すぎるglobを使わせる。Bash・Glob・Grep・Read・Edit・WriteへのPreToolUse
privacy-blockClaudeに.env・keyファイル・secretパスを読ませる。PreToolUseprivacyBlockも使用。
plan-format-kanbanClaudeにEdit・Write・MultiEditでplanファイルを編集させる。PostToolUse。フォーマットについて警告。hook flagは個別に読み取らない。
session-stateTask・Todoを更新し、subagentを終了、またはturnを終了する。PostToolUseSubagentStopStop
cook-after-plan-reminderPlanのsubagentをI終了させる。SubagentStop(Plan)。keyなしでもenabled。
workflow-artifact-gateUserPromptSubmit/PreToolUse(Bash)にwireするか、--stage付きでスクリプトを実行する。freshインストールではhookモードが自動トリガーされません。
task-completed-handlerAgent Teamsでtaskを完了する。TaskCompletedclaudekit-engineer@2.19.2-betaで削除予定です。
teammate-idle-handlerAgent TeamsのteammateがI作業を終えてidleになる。TeammateIdleclaudekit-engineer@2.19.2-betaで削除予定です。
team-context-injectSubagentStartにwireし、teamのsubagentを起動する。agent idがteamに所属する場合のみスクリプトが意味を持ちます。
usage-context-awareness目的のeventにwireするか、既にwireされているhookキャッシュのリフレッシュを使用する。usage quota cache refreshのレガシーラッパーです。
// ~/.claude/settings.json または .claude/settings.json
{
  "env": {
    "CK_SIMPLIFY_DISABLED": "1"
  }
}
Section 05
Guardグループ · ファイル・パスのブロック

scout-block — 不要なディレクトリの読み取りをブロック

エージェントはよくnode_modules/を読んだり、ルートで**/*.tsをglobしたり(globはパスマッチングパターン。**/*.tsはすべてのサブディレクトリのすべての.tsファイルを意味します)、dist/index.jsをcatしたりします。その都度、数万tokenがcontextに詰め込まれ、コストと次のturnの品質を低下させます。scout-block.cjsはPreToolUseを登録し、すべてのRead・Bash・Glob・Grepの前に動作します。

# ベースライン .ckignore — pattern-matcher.cjs が処理
node_modules
dist
build
.next
.nuxt
__pycache__
.venv
venv
vendor
target
.git
coverage
重要なAllowlist

ビルドコマンドは通過します。npm buildgo buildmakedocker buildなどのコマンドは、ビルドプロセスがnode_modulesdistに触れる場合でも実行されます。このグループをブロックすると、CKのship・testフローがビルドステップで自己ブロックしやすくなります。

Gap #1 — hookがクラッシュした場合

Fail-open:parseエラーはすべてexit 0につながり、ツールは通過します。hookにバグがある → その層のguardがサイレントに無効化されます。

Section 06
Guardグループ · センシティブなファイル・パスのブロック

privacy-block — secretをブロックし、ユーザーの明示的な承認を求める

エージェントが.envid_rsa*.pemcredentials.yamlに触れると — secretがtranscriptに漏れます。一度contextに入ると、ログに残ったり、reviewer outputに引用されたり、PRにペーストされる可能性があります。

@@PRIVACY_PROMPT_START@@
{ "type": "PRIVACY_PROMPT", "question": {...}, "options": [...] }
@@PRIVACY_PROMPT_END@@

ClaudeはJSONをparseし、AskUserQuestionを呼び出します。ユーザーが承認した場合、hookメッセージは承認済みの方法でファイルを読むよう案内します。例えば確認後にcat ".env"を実行するなど。コードはプレフィックスAPPROVED:もサポートしています。重要な点:明示的なapprovalが必要であり、モデルに同意を自己解釈させません。

Gap #2 — Bashの例外

privacy-blockはBashを通過させ、警告のみを出します。Bashを実行する権限があれば誰でもapprovalフローなしにsecretを読み取れます。

警告:すでに漏洩した場合

Privacy-blockはREADのみをブロックします。すぐにcredentialをrotateし、会話ログを監査し、git historyでsecretがcommitされていないか確認してください。

Section 07
Guardグループ · 誤ったステップのブロック

simplify-gate — diffがスコープを超えて膨らんだときにshipをブロック

小さなタスクが多数のファイルに触れるPRに膨らむことがあります:バリデーションの修正、cleanupの追加、フォーマット変更、周辺helperの調整。エージェントが「OK ship」と言うとき、simplify-gate.cjsはUserPromptSubmitを登録し、git diff HEADを読み取り、promptに以下のいずれかが含まれる場合のみ評価します:ship merge pr deploy publish

400diff合計LOC >
8変更ファイル数 >
2001ファイルの追加LOC >

simplify.thresholdのデフォルト値:追加+削除行の合計、変更ファイル数、1ファイル内の最大追加行数。gateがブロックするのはsimplify.gate.enabled=trueの場合のみで、これらの値は.ck.jsonでoverrideできます。

Gap #3 — デフォルトは誤解されやすい

hooks.simplify-gate = trueはClaude Codeがスクリプトを呼び出すことを許可するだけです。スクリプトを実際にPRの肥大化をブロックさせるには、simplify.gate.enabled = trueを追加で有効化する必要があります。freshインストールではこのフラグが有効になっていないため、gateは軽いチェックのみを行いブロックしません。

// プロジェクト .ck.json — 実際に有効化する
{ "simplify": { "gate": { "enabled": true } } }

matchedSeverity()"don't ship"を無視し、"ship on"から"ship on Friday"も通過します。あるスコープのすべてのセッションでgateを無効にするには、settings.jsonenvキーにCK_SIMPLIFY_DISABLED=1を設定してください。

Section 08
Guardグループ · Workflow・artifact gate

workflow-artifact-gate — 5つのartifact JSON

フルパイプライン → 各フェーズが決定を記録したJSONファイルを残します。各ステップ後の領収書のようなものです。このhookはUserPromptSubmit + PreToolUse(Bash)にアタッチするよう設計されていますが、freshインストール後のデフォルトのhookセットには含まれておらず、使用するにはopt-inが必要です。

Artifactフェーズ内容
context-snippets.jsonscout/plan読み取ったコードスニペット
risk-gate.jsonpredict高リスクフラグ、自動停止
verification.jsonfix/cook5項目チェックリスト
review-decision.jsoncode-reviewReviewerの判定
adversarial-validation.jsonadversarialAdversarialパス

このgateには2段階の処理があります。ship・push・PR・deployなどのリスクの高いステップでは、hookはフローを即座に停止し、理由をモデルに返せます(emitBlock())。finalizeやcommitなどの軽いステップでは、hookはフローを続行しながら、モデルが自己修正できるよう警告をcontextに追加します(emitSoft())。

Gap #4 — workflow gateはopt-inが必要

workflow-artifact-gateは最も強力なartifact検査層ですが、freshインストールでは自動的に呼び出されません。使用するには、settings.jsonでhookをwireし、.ck.jsonでconfigを有効化する必要があります。この手順を省くと、ship・push・PR・deployはgateによってブロックされません。

Section 09
Guardグループ · Hard-gate skill

Skill markdownのHard-gate XML

Hookはtool callのみをブロックします。tool callではなく順序の問題があります:plan前のコーディング、scout前のfix。CKはskill markdownに<HARD-GATE>を組み込んでいます。

<HARD-GATE>
Do NOT write implementation code until a plan exists
and has been reviewed. Exception: --fast skips research
but still requires a plan step. User override: if user
explicitly says 'just code it', respect their instruction.
</HARD-GATE>

ck:cookck:fixはそれぞれ4つのhard-gate(plan/scout-first、exact-reqまたはroot-cause、no-side-effects)を持ちます。

「hard」と呼ばれる理由

「hard」という言葉は誤解されやすいですが、コードによるブロックではありません。promptの中の指示です。モデルが無視した場合、exit 2でブロックすることはありません。XMLラップは、モデルが近道を正当化しにくくするため、通常のruleより強いシグナルを作ります。

Section 10
Guardグループ · Contextの追加

dev-rules-reminder — ruleをcontextに組み込む

dev-rules-reminder.cjsはUserPromptSubmitを登録し、各promptにrulesテキストをinjectします。ここで明確に区別すべき2つの層があります:hookはcontextをinjectするメカニズムであり、CLAUDE.md内のruleはinjectされるコンテンツです。TTLは(sessionId, baseDir)ごとに5分で、tokenの無駄遣いを防ぎます。

ファイル防ぐもの特性
review-audit-self-decision確認済み決定の監査による覆しverified sticky
development-rulesテストのスキップ・フェイクデータYAGNI/KISS/DRY
team-coordination-rules2つのエージェントが同じファイルを編集ownership glob
commit-messages長いコミットbodysingle-line
orchestration-protocol全履歴を渡すcontext isolation
共通の特性

Ruleはコードではなくcontextのテキストです。ユーザーのpromptが上書きするとClaudeは逸脱する可能性があります。その代わり、追加・修正が非常に容易です。セキュリティguardよりもスタイル規約に向いています。

Section 11
Guardグループ · ユーザーが呼び出すGuard skill

Guard skills — ユーザーが呼び出すguard層

Skill使用タイミング検出対象
ck:security-scanPre-releaseSecret、CVE、SQLi、XSS、path traversal
ck:predictリスクの高い機能の前5つのペルソナ、GO・CAUTION・STOP
ck:scenarioPre-impl12次元のエッジケーススイープ
ck:shipPre-PRテスト失敗で停止、force-pushなし

code-reviewerエージェントは9項目のチェックリストを実行します:concurrency、error boundary、API contract、backwards compat、input validation、auth/authz、N+1、data leak、fact-check。マージ前の最後のguardです。

III. 制限と実践

Section 12

既知のGap

Guard railの誤解を避ける
  1. File-access guardはhookに存在する → freshなCKインストールはscout-block/privacy-blockに依存し、secret・重いディレクトリ用の専用permissions.denyリストはない
  2. BashはPrivacy-blockが免除 → 警告のみで、approvalフローを通過しない
  3. workflow-artifact-gateはopt-inが必要 → 有効化しなければ最強のgateが動作しない
  4. simplify-gateはデフォルトでブロックしない → 明示的に有効化が必要
  5. simplify-gateはphrasingで回避される → "ship on Friday"は通過する
  6. .ckignoreがnode_modulesをnegateする可能性がある → 直接確認が必要
  7. Ruleは指示 → Claudeは逸脱する可能性がある
  8. HARD-GATE XMLも指示 → "User override"が存在する
Rate-limit・quota guardは存在しない

制御を失ったエージェントは数千のRead・Glob・Bashを呼び出す可能性があります。CKのhookはtool callの回数を数えず、quotaの枯渇が近づいても自動停止しません。quota・costの制限はClaude Code、プロバイダー、またはアカウントの課金側にあり、このguard railには存在しません。

Section 13

ベストプラクティスと落とし穴

ベストプラクティス

  • インストール後にsettings.json + .ck.jsonの両方を確認する
  • 本番shipするリポジトリにはworkflow-artifact-gateを有効化する
  • simplify-gateを実際にブロックさせるには:gate.enabled = trueを設定する
  • node_modulesが必要な場合:プロジェクトの.ckignoreでoverride
  • .envのapproval:よく読んで、auto-yesしない

よくある誤解

  • グローバルconfigを編集しているのにリポジトリのconfigを編集していると思い込む
  • simplify-gateがブロックしていると思い込むが、デフォルトではブロックモードが有効になっていない
  • hookがエラーになればツールがブロックされると思い込む。実際はhookが失敗した場合、通常は通過する
  • promptのruleもコードhookと同様にブロックできると思い込む
  • secretがcommitに入った後になってprivacy-blockに頼る

Guard railを信頼する前の6つの確認事項

Glossary

用語集

用語簡潔な説明
harnessモデルとマシンの間の調整層:toolコマンドの送信、権限管理、hookの実行を担います。Guard railを組み込む場所です。
hookprompt・tool・sessionのライフサイクルの固定タイミングで、検査や状態記録のためにharnessが自動呼び出しする小さなスクリプトです。
lifecycle eventhookが呼び出されるタイミング:UserPromptSubmit(prompt受信時)、PreToolUse(tool前)、PostToolUse(tool後)、Stop/SubagentStop(session・subagent終了時)。
exit codeプロセス終了時に返す数値。0は通過、2はブロック、1はエラーだがブロックしません。
fail-openhookがエラー・クラッシュした場合、harnessはブロックせずにツールの実行を継続します。guardがサイレントに無効化されます。
transcriptセッションにおけるユーザーとエージェントの会話の全記録。
contextモデルが推論時に「見ている」情報の領域。不要なファイルで溢れるとコストが上がり、品質が低下します。
globパスマッチングパターン。**/*.ts = すべてのサブディレクトリのすべての.tsファイル。
secretセンシティブな情報:APIキー、秘密鍵、credential。transcriptへの漏洩はリスクです。
LOCLines of code — コードの行数。diffのサイズ測定に使用します。
artifact各フェーズのパイプラインが残すJSONファイルで、次のフェーズが確認できるよう決定を記録します。

正しい層を読み、適切に信頼する

エージェントが広い権限を持つ場合、「CKをインストールすれば安全」とは結論づけないでください。Guard railを信頼する前に、2つの場所を確認してください:settings.jsonがどのhookをwireしているか、.ck.jsonが何を有効・無効にしているか。

各層はそれぞれ異なるリスクを保護します:hookはtool callをブロックし、ruleは動作を促し、hard-gateはプロセスを維持し、guard skillは呼び出されたときのみ動作します。どの層が動作していて、どの層が単なる指示なのかを把握することで、バグがPRに入り込んでPRODに上がる前に、適切な場所で監査できます。

ClaudeKitをまだ持っていない場合

guardrailsシステムを構築しているなら、ClaudeKitで実際に使われているpatternsを参考にできます。 hooks、skills、workflow guard railsを自分で組み合わせる代わりに、ClaudeKitの購入を検討している場合は、このreferral linkから20%割引で購入できます。

20%割引を使う
Inside ClaudeKit · Guard rails deep dives · claudekit-engineer@2.19.1