Follow Discord
Sweep 06 Nov 2026 · 01:32Z Build v2.1.319 537 read Stable v2.1.311 Latest v2.1.318 Next v2.1.319 Feeds RSS JSON llms.txt llms-full.txt Unofficial

Claude Code v2.1.289 ·

Permission decisions can now name the hook that made them

Permission decisions gain an optional hook field, which plugin tool.check hooks can set, and rules inside nested commands are now found

Group of 2 Use it now Internal Changes
JSON All of v2.1.289
Use it nowTier: how much it should matter to you
3Useful: my rating, 1 to 5
2Signal: worth watching, 1 to 5
PermissionsArea: what it touches
Internal ChangesKind: in v2.1.289,
What probably matters to youSection of the release

Unclear It is not clear where the new hook field is shown or sent.

What

Before Claude Code runs a tool (such as a shell command), it decides whether to allow it, ask you, or refuse. The record of that decision held decision, reason and rule. It now also has an optional hook field saying which hook made the decision. A hook is a piece of plugin or user code that runs at a set moment.

  • Plugin hooks: a tool.check hook can now return a hook string with its decision. A non-string value is rejected with the message "a reason, rule or hook that is not a string".
  • Filling the field: hook comes from the hook's own answer or is looked up from the decision's decisionReason.hookName, ignoring tool.check.
  • Nested commands: the rule lookup now searches inside nested subcommandResults. Before, it checked only one level deep, so a compound command could miss the rule that decided it.

Why

Tools and SDK users reading these decisions can tell when a hook, and which one, allowed or blocked a tool. Compound commands now report their deciding rule more reliably.

How sure we are
Something disagreesSomething we can check disagrees with this entry, or the writer said they could not settle it.
The writer flagged doubtIt is not clear where the new `hook` field is shown or sent.

See this entry in the whole of v2.1.289 →

Feedback