
News Observation Lab for Future
同じ指摘が通用しないときの対策:停止フックでミスを物理的に防止

なぜ口頭での指摘が効かないのか
Claude Code の各セッションは独立しており、前回の「このコマンドはNG」という指摘は次回起動時に失われます。そのため、同じ指摘を何度繰り返しても効果がありません。
問題の具体例
「! コマンドで && を使わないで」と伝えても、July 16 2026 までに5回以上指摘しても、次のセッションで再び同じコマンドが現れました。これは設計上の問題であり、単なる怠慢ではありません。
停止フック(Stop Hook)による根本的な解決策
Claude Code には「Stop hook」機能があります。このフックはレスポンス生成直前に任意のシェルスクリプトを実行でき、スクリプトが exit 2 を返すとそのレスポンスはブロックされます。
46 行のシェルスクリプト bang_handoff_amp_guard.sh を作成し、! コマンドに && が含まれていたらエラーとしてブロックします。これにより、指摘が物理的に不可能となり、同じミスは二度と発生しません。
スクリプトの構造とポイント
- ブロック1:トランスクリプトパス取得とフェイルオープン – パスが空またはファイルが存在しない場合は exit 0 で通過させます。
- ブロック2:最後のアシスタントメッセージ抽出 – JSONL 形式のトランスクリプトから
typeまたはroleがassistantのエントリを集め、最新メッセージだけを対象にします。 - ブロック3:検知ロジック – 各行からコードフェンス(バックティック)を除去し、先頭が
!かつ&&を含むかを正規表現でチェック。該当行があれば標準出力に表示し、シェル側で exit 2 を返します。
設定への登録手順
~/.claude/settings.json の hooks セクションに以下を追加します。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/bang_handoff_amp_guard.sh"
}
]
}
]
}
}
スクリプトに実行権限を付与し (chmod +x ~/.claude/hooks/bang_handoff_amp_guard.sh)、以降のセッションで && を含む ! コマンドは自動的にブロックされます。
実装上の注意点
- 標準入力は一度しか読めないため、
input=$(cat)で全体を変数に保持してから再利用します。 - シェル環境は最小化されているので、Python はフルパス
/usr/bin/python3を使用します。 - ヒアドキュメントは
<<'PY'とシングルクォートで囲み、シェル展開を防ぎます。 - バックティックは
chr(96)で動的生成し、スクリプト内部に直接記述しないことで自己解析エラーを回避します。
まとめ
同じ指摘を口頭で繰り返すだけでは効果がなく、セッションごとの独立性が原因です。環境側でミスを排除する「停止フック」を導入すれば、指摘は物理的に不可能となり、開発者は自動化された安全なワークフローを維持できます。