User-level settings.json hooks silently ignored in v2.1.120 VSCode extension

Resolved 💬 2 comments Opened Apr 27, 2026 by Crispydug Closed Jun 2, 2026

Summary

Hooks defined in user-level ~/.claude/settings.json are silently dropped at startup in Claude Code v2.1.120 running as the VSCode native extension. The same settings.json is read successfully for permissions, enabledPlugins, and additionalDirectories — only the hooks block is ignored. No error, warning, or telemetry surface notifies the user. Plugin-bundled hooks register normally.

This is a silent-failure regression: hooks that previously worked stop firing without any indication, breaking SessionStart/PostToolUse/PreCompact/SessionEnd contracts that downstream tooling depends on.

Expected

User-level ~/.claude/settings.json hooks block registers and fires alongside plugin-bundled hooks, as documented at https://docs.claude.com/en/docs/claude-code/hooks.

Actual

User-level hooks block is read into memory but never registered. Only plugin-bundled hooks fire.

Repro

  1. Install VSCode native extension anthropic.claude-code v2.1.120 on Windows 11.
  2. Place a ~/.claude/settings.json containing a hooks block, e.g.:

``json
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "echo 'hello' > C:/Users/User/hook-test.log",
"timeout": 5
}
]
}
]
}
}
``

  1. Open a workspace and start a Claude Code session in the extension.
  2. Observe: C:/Users/User/hook-test.log is never created.
  3. Inspect ~/AppData/Roaming/Code/logs/<session>/window1/exthost/Anthropic.claude-code/Claude VSCode.log.

Log evidence

The extension log shows settings.json is read (permissions update succeeds), but only plugin hooks register:

[DEBUG] Applying permission update: Adding 3 allow rule(s) to destination 'userSettings': [...]
[DEBUG] Loading hooks from plugin: superpowers
[DEBUG] Loading hooks from plugin: ralph-loop
[DEBUG] Loading hooks from plugin: hookify
[DEBUG] Loading hooks from plugin: security-guidance
[DEBUG] Loading hooks from plugin: episodic-memory
[DEBUG] Loading hooks from plugin: double-shot-latte
[DEBUG] Loading hooks from plugin: codex
[DEBUG] Registered 12 hooks from 23 plugins

There is no Loading hooks from user settings (or equivalent) line. The user-settings hooks block — in our case 16 hooks across 6 events — never appears in the registration count or any subsequent debug line.

Workaround

Move the hooks block from ~/.claude/settings.json into a project-level .claude/settings.json in each workspace cwd. Project-level hooks register and fire correctly. This requires duplicating the block across every working directory and is brittle for users with many projects.

Impact

Silent breakage of any user-level hook. In our case this disabled:

  • A SessionStart health-gate hook that surfaces RED/AMBER infrastructure status before the session begins (designed precisely to prevent silent infra failures).
  • A PostToolUse heartbeat that tracks tool use to a long-term context store.
  • PreCompact / SessionEnd hooks that capture conversation state to a Postgres-backed memory store.

Because there's no error or warning, the failure mode is invisible until downstream data goes missing.

Environment

  • OS: Windows 11 Pro 10.0.26200
  • Extension: anthropic.claude-code-2.1.120-win32-x64 (VSCode native extension)
  • claude.exe version per log: 2.1.120
  • VSCode: stable channel
  • Last working version (per our LCM data): 2.1.119 (hooks fired correctly through 26 Apr 07:59 UTC; broke after extension auto-update)

Suggested fix priorities

  1. Restore user-level hook registration in the extension's settings-loading path. Whichever branch loads permissions from userSettings should also load hooks.
  2. Surface a warning at startup when settings.json contains a hooks block but registration count of user-settings hooks is zero — would have caught this on day one.
  3. Add a claude config check or /hooks slash-command that reports which hooks are registered from which source (plugin vs user vs project), so users can self-diagnose.

View original on GitHub ↗

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