{"version":"2.1.296","anchor":"hook-registration-tags-the-source-as-personal-or-checkout","canonical_anchor":"hook-registration-tags-the-source-as-personal-or-checkout","heading":"Hooks are now tracked by source, and matcher errors no longer crash matching","tier":"notice","area":"Hooks","scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.296\/e\/hook-registration-tags-the-source-as-personal-or-checkout","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.296","markdown":"### Hooks are now tracked by source, and matcher errors no longer crash matching\n\nHooks are labelled personal or checkout by source, checkout hooks cannot silently replace settings hooks, and a failing matcher stops its hook running\n\n**Unclear.** What the personal and checkout labels change about how those hooks run is not shown.\n\n**What**\n\nHooks are commands Claude Code runs at set points, and they can come from your own settings or from the project you have checked out. Claude Code now keeps these apart:\n\n- When hooks are registered, they are labelled `personal` for one source and `checkout` for another. Before, only one case was distinguished.\n\n- Session hooks gain a `checkout` flag, and removing duplicate hooks now tracks which came from settings and which from the checkout.\n\n- A command hook result that blocks no longer lets a settings hook be silently replaced by a checkout hook.\n\n- If a hook's matcher (the rule deciding which events it applies to) throws an error, the error is caught and the hook is recorded as not tested instead of the error spreading.\n\n- A hook that could not be tested is not run. The result records that it did not run and reports a blocking error or the message.\n\n**Why**\n\nHooks shipped with a repository can no longer quietly take the place of hooks from your own settings, and a broken matcher now fails visibly instead of silently.\n\n- Area: Hooks\n- Tier: You'll notice\n- Useful: 2\/5\n- Signal: 2\/5\n- Scope: individual\n- Heads-up: yes"}