Follow Discord
Sweep 03 Oct 2026 · 20:28Z Build v2.1.289 510 read Stable v2.1.285 Latest v2.1.289 Next v2.1.289 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 Improvements
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
Plugin HooksArea: what it touches
ImprovementsKind: in v2.1.289,
What probably matters to youSection of the release

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 doubtHow the hook name is used after it is accepted, and whether plugin hooks of this kind are on by default, is not clear.

See this entry in the whole of v2.1.289 →

Feedback