Claude Code project-level hooks in .claude/settings.local.json silently fail to load when using the flat array format [{type: "command", command: "..."}]. Zero hooks register, zero errors or warnings in output. Debug log shows Registered 0 hooks from 0 plugins. The flat format only works in the global ~/.claude/settings.local.json. Project-level settings require the v2 nested format with explicit matcher and hooks wrapper.
Use the nested v2 format for project-level .claude/settings.local.json hooks:\n\njson\n{\n \"hooks\": {\n \"Stop\": [\n {\"matcher\": \"\", \"hooks\": [{\"type\": \"command\", \"command\": \"my-hook\"}]}\n ]\n }\n}\n\n\nNot the flat format:\njson\n{\n \"hooks\": {\n \"Stop\": [\n {\"type\": \"command\", \"command\": \"my-hook\"}\n ]\n }\n}\n\n\nThe flat format works only in ~/.claude/settings.local.json (global). Use --debug hooks to verify hooks load — look for hook_execution_start log lines.