[BUG] Stop Hook is not triggered if stopping immediately after tool call

Resolved 💬 2 comments Opened Jul 7, 2025 by johnmatthewtennant Closed Jul 14, 2025

Environment

  • Platform (select one):
  • [x] Anthropic API
  • [ ] AWS Bedrock
  • [ ] Google Vertex AI
  • [ ] Other: <!-- specify -->
  • Claude CLI version: 1.0.43 (Claude Code) (also tested 1.0.37)
  • Operating System: Mac OS 15.5 (24F74)
  • Terminal: Terminal App

Bug Description

The stop hook is not triggered if Claude ends its turn immediately after using a tool.

Steps to Reproduce

  1. Create a stop hook that matches everything and always blocks
  2. Ask claude to read a file and then stop without saying anything else

Expected Behavior

Claude should be blocked from stopping by the stop hook

Actual Behavior

The stop hook is not executed

Additional Context

stop hook in settings.json:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "echo '{\"decision\": \"block\"}'"
          }
        ]
      }
    ]
  }
}

Here's a log

~/Development/claude-stop-hook-test claude --debug
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Saving project config for /Users/jtennant/Development/claude-stop-hook-test to /Users/jtennant/.claude.json
[DEBUG] Acquiring lock on /Users/jtennant/.claude.json.lock for config save (PID: 11598)
[DEBUG] Lock acquired successfully after 6ms
[DEBUG] Re-reading config from /Users/jtennant/.claude.json after acquiring lock
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Creating backup of config at /Users/jtennant/.claude.json.backup
[DEBUG] Backup created successfully
[DEBUG] Writing config to /Users/jtennant/.claude.json atomically
[DEBUG] Config written successfully
[DEBUG] Releasing config lock
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Saving project config for /Users/jtennant/Development/claude-stop-hook-test to /Users/jtennant/.claude.json
[DEBUG] Acquiring lock on /Users/jtennant/.claude.json.lock for config save (PID: 11598)
[DEBUG] Lock acquired successfully after 0ms
[DEBUG] Re-reading config from /Users/jtennant/.claude.json after acquiring lock
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Creating backup of config at /Users/jtennant/.claude.json.backup
[DEBUG] Backup created successfully
[DEBUG] Writing config to /Users/jtennant/.claude.json atomically
[DEBUG] Config written successfully
[DEBUG] Releasing config lock
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Saving global config to /Users/jtennant/.claude.json
[DEBUG] Acquiring lock on /Users/jtennant/.claude.json.lock for config save (PID: 11598)
[DEBUG] Lock acquired successfully after 1ms
[DEBUG] Re-reading config from /Users/jtennant/.claude.json after acquiring lock
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Creating backup of config at /Users/jtennant/.claude.json.backup
[DEBUG] Backup created successfully
[DEBUG] Writing config to /Users/jtennant/.claude.json atomically
[DEBUG] Config written successfully
[DEBUG] Releasing config lock
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
╭───────────────────────────────────────────────────────────╮
│ ✻ Welcome to Claude Code!                                 │
│                                                           │
│   /help for help, /status for your current setup          │
│                                                           │
│   cwd: /Users/jtennant/Development/claude-stop-hook-test  │
╰───────────────────────────────────────────────────────────╯


 ※ Tip: Press Esc twice to edit your previous messages
[DEBUG] Saving global config to /Users/jtennant/.claude.json
[DEBUG] Acquiring lock on /Users/jtennant/.claude.json.lock for config save (PID: 11598)
[DEBUG] Lock acquired successfully after 0ms
[DEBUG] Re-reading config from /Users/jtennant/.claude.json after acquiring lock
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Creating backup of config at /Users/jtennant/.claude.json.backup
[DEBUG] Backup created successfully
[DEBUG] Writing config to /Users/jtennant/.claude.json atomically
[DEBUG] Config written successfully
[DEBUG] Releasing config lock
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] AutoUpdaterWrapper: Installation type: npm-global, using native: false
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json

> can you please read a file and then stop? do not say anything else
[DEBUG] MCP server "ide": Calling MCP tool: closeAllDiffTabs
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] MCP server "ide": Tool call succeeded: {"content":[{"type":"text","text":"CLOSED_0_DIFF_TABS"}]}
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Stream started - received first chunk

⏺ I'll read the file for you.
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] executePreToolHooks called for tool: Read
[DEBUG] Executing hooks for PreToolUse:Read
[DEBUG] Getting matching hook commands for PreToolUse with query: Read
[DEBUG] Found 0 hook matchers in settings
[DEBUG] Matched 0 hooks for query "Read"
[DEBUG] Found 0 hook commands to execute
[DEBUG] Executing hooks for PostToolUse:Read
[DEBUG] Getting matching hook commands for PostToolUse with query: Read
[DEBUG] Found 0 hook matchers in settings
[DEBUG] Matched 0 hooks for query "Read"
[DEBUG] Found 0 hook commands to execute

⏺ Read(.claude/settings.json)
  ⎿  Read 15 lines (ctrl+r to expand)
[DEBUG] MCP server "ide": Calling MCP tool: getDiagnostics
[DEBUG] MCP server "ide": Tool call succeeded: {"content":[{"type":"text","text":"[\n  {\n    \"uri\": \"file:///Users/jtennant/Development/claude-stop-hook-test/.claude/settings.json\",\n    \"diagnostics\": []\n  }\n]"}]}
[DEBUG] Reading config from /Users/jtennant/.claude.json
[DEBUG] Config parsed successfully from /Users/jtennant/.claude.json
[DEBUG] Stream started - received first chunk

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗