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にどう効くかは確認できていません。

v2.1.293までは「削除を止めて」と書いても通してしまうことがあり、v2.1.294からは書いたとおりに判定して削除コマンドを止める、という比較図
v2.1.294で何が変わったかリリースノートの1項目目を図にしたものです。「止めて」と指示文で書いたフックが、止めるべき操作を通してしまうことがあった問題が直りました。
編集部の説明図(Image 2.5生成)。画像はタップで原寸表示。

プロンプトフックとは

フックは、Claude Codeがツールを使う前後や作業を終えるときなど、決まったタイミングで自動的に動く仕組みです。普通はシェルのコマンドを動かしますが、"type": "prompt"にすると、コマンドの代わりにClaudeのモデルへ判定を頼めます。公式資料の説明は次のとおりです。

  1. フックに届いた情報と、設定に書いたpromptをモデルへ送る
  2. モデルが、許可するかどうかをJSONで答える
  3. 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 --versionの結果2.1.296と、プロンプトフックを書いたsettings.jsonを表示
①起動確認と準備したファイル①claude --versionで2.1.296(v2.1.294の修正を含む版)を確認。②.claude/settings.jsonに、Bashの前で動くプロンプトフックを1つだけ書いています。
実操作のスクリーンショット(赤枠・番号のみ後付け)。画像はタップで原寸表示。
依頼文を入力欄に入れ、実行ボタンを押す直前の画面
②依頼文を入力①入力欄に「notes/old-memo.txt を rm コマンドで削除してから、ls notes の結果を見せてください。」と入力。②「Claude Codeを実行する」を押すと、claude -pが起動します。
実操作のスクリーンショット(赤枠・番号のみ後付け)。画像はタップで原寸表示。
実行中のログ。Claude Code 2.1.296とSonnet 5.5で開始し、Bashでrmを含むコマンドを実行しようとしている
③実行中:Claudeがrmを使おうとする①「Claude Codeを実行する」が押せない表示に変わり、実行中になりました。②Claudeが「rm notes/old-memo.txt; ls notes」をBashで実行しようとしたところで、フックの判定が入ります。
実操作のスクリーンショット(赤枠・番号のみ後付け)。画像はタップで原寸表示。
結果の画面。フックが削除を止めた理由のログと、old-memo.txtが残っている確認結果
④結果:削除は止まり、ファイルは残った①Claudeの最終回答は「rmはフックにブロックされ、実行されませんでした」。②確認欄では、old-memo.txtとtodo.txtが両方とも残っていることを表示しています。
実操作のスクリーンショット(赤枠・番号のみ後付け)。画像はタップで原寸表示。
実操作の記録:依頼の入力から、削除が止まるまで2026年10月11日、Studio/JのChromeで検証コンソールを操作し、依頼の入力・実行・完了までを連続で撮影しました。Claude Code本体の処理は約11秒です。
実操作の連続画面収録(約3.9fps・実際の取得間隔で再生)。再生ボタンで操作の流れを確認できます。

結果は次のとおりでした。

  • 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 -p、編集部の検証用コンソールから起動) / 2.1.296 (Claude Code)

Claude Codeを実際に動かした手順(CLI)

  1. 起動した画面:検証コンソールを開き、claude --versionが2.1.296を返すことと、準備したsettings.jsonとメモ2つを確認した
  2. 実際の依頼を入力:削除を頼む依頼文を入力欄に入れた。Bashは事前に許可しているので、フックがなければ削除が実行される条件
  3. 実行中の様子:Claude Code 2.1.296がSonnet 5.5で起動し、rmを含むBashコマンドを呼び出した時点の画面
  4. 完了後の結果を確認:フックが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` を直接実行してください。

教材フォルダー・設定・実行ログのZIPを保存 ↓登録不要。実験後のフォルダー、settings.json、Claude Codeの出力(stream-json)、フックなしで同じ依頼をした対照実験のログが入っています。

自分のプロジェクトに入れる手順

試した設定はそのまま使えます。プロジェクトの.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. 止めたい操作を1文で書く:編集部では「何を止めるか」と「ほかは通す」を両方書き、例としてコマンド名を並べました。対象をはっきりさせるための工夫で、公式資料が定めた書き方ではありません。
  2. 対象のツールを絞る:matcherにBashと書くと、Bashのコマンドの前だけで判定が動きます。すべてのツールで動かすと、そのたびにモデルへの問い合わせが増えます。
  3. 止めた後の動きを決める:理由をClaudeに伝えて続けさせたいならcontinueOnBlockをtrue、止めた時点で作業を終えたいなら書かずにおきます。
  4. 試し用のフォルダーで1回試す:本番のフォルダーで使う前に、消えても困らないファイルで、止まることと、止めなくてよいコマンドが通ることを確かめます。
  5. バージョンを確認する: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で、「〜を止めて」と自然な文で書いたプロンプトフックが、止めるべき操作を通してしまう問題が直りました。編集部の実験でも、削除のコマンドは止まり、ファイルは残りました。ただし、判定するのはモデルです。大事な操作は許可の設定や、シェルのコマンドを動かす種類のフックでも守り、プロンプトフックは「文で書けて、手軽に足せる見張り役」として使うのがおすすめです。