Claude Codeのプロンプトフックは、ツールを使う前や作業を終えるときに、自然な文章で書いた条件をモデルに判定させる仕組みです。設定では、何を止めるかに加え、止めた後に会話を続けるかを決めます。v2.1.294では、「削除するコマンドを止めて」のような指示を通してしまう問題と、終了時の条件の読み取りが修正されました。
公開は日本時間2026年10月8日14時03分です。本記事は公式リリースノートの全2項目とフックの公式資料を10月11日に確認して書いています。編集部でも、この修正を含むClaude Code 2.1.296で「削除するコマンドを止める」プロンプトフックを設定し、実際に削除を頼んで止まるかを1回ずつ試しました。修正前の版と比べた実験ではありません。
元資料:Claude Code v2.1.294 公式リリースノート。2026年10月11日確認。
プロンプトフックの判定で直った2つのこと
リリースノートの項目は2つだけです。どちらも、フックの指示を自然な文で書いたときの判定に関する修正です。
| 項目 | 内容 | 関係する人 |
|---|---|---|
| 「〜を止めて」と書いたフックの修正 | 種類がpromptまたはagentのフックで、「Block commands that…」のように指示として書いた内容が、止めるべき操作を通してしまう問題を修正 | フックで危ない操作を止めている人 |
| 終了時の判定の改善 | StopとSubagentStopのプロンプトフックで、「Carry on if the build is broken」のような指示の読み取りを改善し、Claudeが早めに止まりにくくした | 作業が終わるまで続けさせたい人 |
なお、公式資料によると、/goalコマンドは、そのセッションだけに効くStopのプロンプトフックを使う仕組みです。リリースノートは/goalに触れていないため、2つ目の改善が/goalにどう効くかは確認できていません。

プロンプトフックとは
フックは、Claude Codeがツールを使う前後や作業を終えるときなど、決まったタイミングで自動的に動く仕組みです。普通はシェルのコマンドを動かしますが、"type": "prompt"にすると、コマンドの代わりにClaudeのモデルへ判定を頼めます。公式資料の説明は次のとおりです。
- フックに届いた情報と、設定に書いた
promptをモデルへ送る - モデルが、許可するかどうかをJSONで答える
- Claude Codeがその答えに従って処理する
promptには、「Block any Bash command that reads .env files」のような止めるルールも、「All unit tests pass」のような満たすべき条件も書けます。v2.1.294で直ったのは、前者のような止めるルールを書いたのに通ってしまうケースです。
| 設定の項目 | 必須 | 意味 |
|---|---|---|
type | 必須 | "prompt"と書く |
prompt | 必須 | モデルへ渡す指示。$ARGUMENTSと書いた場所にフックの入力が入り、書かなければ末尾に付く |
model | 任意 | 判定に使うモデル。省略するとClaude Codeが裏側の処理に使うモデル |
timeout | 任意 | 判定を待つ秒数。既定は30秒 |
continueOnBlock | 任意 | 止めた理由をClaudeへ返して作業を続けさせるか。既定はfalse |
ツールを使う直前のPreToolUseで止めると判定された場合、そのツールの実行は拒否されます。既定ではその回の応答がそこで終わり、止めた理由が警告の行として表示されます。continueOnBlockをtrueにすると、理由がツールのエラーとしてClaudeに返り、Claudeはそれを読んで次の行動を選びます。プロンプトフックはPreToolUseやPostToolUse、Stop、SubagentStop、UserPromptSubmitなど多くのタイミングで使えますが、SessionStartなど一部のタイミングでは使えません。
編集部で試した:削除のコマンドを止められるか
2026年10月11日、編集部のMacで、架空のメモを2つだけ入れた試し用のフォルダーを作りました。.claude/settings.jsonに、Bashのコマンドの前に動くプロンプトフックを1つだけ書いています。ふだんの設定が混ざらないよう--setting-sources projectを付け、Bashの実行は事前に許可しました。つまり、フックがなければ確認なしで削除が実行される状態です。
画面は、Claude Code CLIをclaude -pで実際に動かし、その出力をそのまま映した編集部の確認用の画面です。Claude Codeのターミナル画面そのものではありません。




結果は次のとおりでした。
- Claudeは
rm notes/old-memo.txt; ls notesを1つのコマンドとして実行しようとしました。 - プロンプトフックが「ファイルを削除するコマンドなので止める。後ろに
lsが付いていても同じ」と判定し、このコマンドは実行されませんでした。 continueOnBlockをtrueにしていたため、Claudeは理由を受け取って作業を続け、ls notesだけを実行して「削除はフックに止められた。別の方法では消していない」と報告しました。- 実行の前後で
old-memo.txtの中身は同じで、ファイルは残っていました。開始から終了までは約11秒でした。作業したClaudeのモデルはSonnet 5.5です。判定に使うモデルは指定しておらず、既定のモデルが使われています。
比べるため、フックを入れていない以外は同じ内容のフォルダーで同じ依頼を送ると、old-memo.txtはそのまま削除されました。こちらは録画しておらず、実行ログだけを下のZIPに入れています。
編集部で試した入力と結果
Claude Codeを実際に動かした手順(CLI)
- 起動した画面:検証コンソールを開き、claude --versionが2.1.296を返すことと、準備したsettings.jsonとメモ2つを確認した
- 実際の依頼を入力:削除を頼む依頼文を入力欄に入れた。Bashは事前に許可しているので、フックがなければ削除が実行される条件
- 実行中の様子:Claude Code 2.1.296がSonnet 5.5で起動し、rmを含むBashコマンドを呼び出した時点の画面
- 完了後の結果を確認:フックがrmを止め、Claudeはls notesだけを実行して報告した。確認コマンドでold-memo.txtが残っていることを表示
成果物の確認:確認コマンド(ls notes と test -f)で old-memo.txt が残っていることと、実行前後のファイルのSHA-256が同じことを照合。フックなしの対照実験では同じ依頼で削除されたことも確認。
今回、実際に入力した内容
notes/old-memo.txt を rm コマンドで削除してから、ls notes の結果を見せてください。
実際に得られた結果
`notes/old-memo.txt` はまだ削除されておらず、残っています。`rm` はフックにブロックされ、実行されませんでした。
`ls notes` の結果は次のとおりです。
```
old-memo.txt
todo.txt
```
このフックは、`rm`、`rmdir`、`unlink`、`find -delete` など、ファイルやフォルダを削除するコマンドを止める設定です。別の方法での削除は試していません。ブロックを回避する行為になるためです。
削除するには、次のどちらかをお願いします。
- フックの設定を変更するか一時的に無効にして、もう一度指示してください。
- 手元のターミナルで `rm notes/old-memo.txt` を直接実行してください。
自分のプロジェクトに入れる手順
試した設定はそのまま使えます。プロジェクトの.claude/settings.jsonに次を書きます。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "prompt",
"prompt": "Block commands that delete files or folders (for example rm, rmdir, unlink, find -delete). Allow every other command.",
"continueOnBlock": true
}
]
}
]
}
}- 止めたい操作を1文で書く:編集部では「何を止めるか」と「ほかは通す」を両方書き、例としてコマンド名を並べました。対象をはっきりさせるための工夫で、公式資料が定めた書き方ではありません。
- 対象のツールを絞る:
matcherにBashと書くと、Bashのコマンドの前だけで判定が動きます。すべてのツールで動かすと、そのたびにモデルへの問い合わせが増えます。 - 止めた後の動きを決める:理由をClaudeに伝えて続けさせたいなら
continueOnBlockをtrue、止めた時点で作業を終えたいなら書かずにおきます。 - 試し用のフォルダーで1回試す:本番のフォルダーで使う前に、消えても困らないファイルで、止まることと、止めなくてよいコマンドが通ることを確かめます。
- バージョンを確認する:
claude --versionで2.1.294以降かを見ます。古い場合の更新方法は、導入方法によって違うので公式のセットアップ資料で確かめます。
注意点:プロンプトフックだけに頼らない
- 判定するのはモデル:プロンプトフックは、毎回モデルが文を読んで判断します。v2.1.294で止めるルールの読み取りは直りましたが、公式資料は、どんな書き方でも必ず止まるとまでは約束していません。絶対に通したくない操作は、許可の設定で拒否するか、決まった条件で必ず止められる、シェルのコマンドを動かす種類のフックと組み合わせてください。公式資料も、細かく制御したい場合は、シェルのコマンドを動かす種類のフックを使うよう案内しています。
- 時間と使用量が増える:判定のたびにモデルへの問い合わせが1回入ります。既定では30秒まで待ちます。対象を絞るのはこのためです。
- エージェントフックは試験中:ファイルを読んで確かめられる
"type": "agent"のフックも今回の修正の対象ですが、公式資料では試験中の機能と書かれています。 - 今回の実験の範囲:試したのは削除のコマンド1種類を1回だけです。修正前のv2.1.293での動きは試しておらず、修正前との違いはリリースノートの説明に基づきます。
よくある質問
プロンプトフックの指示は日本語でも書けますか?
公式資料の例は英語です。編集部は今回、英語の指示だけを試しました。日本語で書く場合も、同じように試し用のフォルダーで止まることを確かめてから使ってください。
止められたとき、Claudeが別のコマンドで消そうとすることはありませんか?
今回の実験では、Claudeは別の方法を試しませんでした。フックを回避することになるので試していない、と報告しています。ただし1回の観察です。rmdirやfind -deleteのような別の消し方も指示に並べておくと、判定の対象がはっきりします。
/goalにも関係がありますか?
/goalは内部でStopのプロンプトフックを使う仕組みです。ただしリリースノートは/goalに触れておらず、2つ目の改善が/goalの判定にどう効くかは確認できていません。/goalの使い方は/goalで長い作業を任せる記事にまとめています。
まとめ:止めたい操作は、試してから任せる
v2.1.294で、「〜を止めて」と自然な文で書いたプロンプトフックが、止めるべき操作を通してしまう問題が直りました。編集部の実験でも、削除のコマンドは止まり、ファイルは残りました。ただし、判定するのはモデルです。大事な操作は許可の設定や、シェルのコマンドを動かす種類のフックでも守り、プロンプトフックは「文で書けて、手軽に足せる見張り役」として使うのがおすすめです。




