User-level settings.json hooks silently ignored in v2.1.120 VSCode extension
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
- Install VSCode native extension
anthropic.claude-codev2.1.120 on Windows 11. - Place a
~/.claude/settings.jsoncontaining ahooksblock, e.g.:
``json``
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "echo 'hello' > C:/Users/User/hook-test.log",
"timeout": 5
}
]
}
]
}
}
- Open a workspace and start a Claude Code session in the extension.
- Observe:
C:/Users/User/hook-test.logis never created. - 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.exeversion 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
- Restore user-level hook registration in the extension's settings-loading path. Whichever branch loads
permissionsfromuserSettingsshould also loadhooks. - Surface a warning at startup when
settings.jsoncontains ahooksblock but registration count of user-settings hooks is zero — would have caught this on day one. - Add a
claude config checkor/hooksslash-command that reports which hooks are registered from which source (plugin vs user vs project), so users can self-diagnose.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗