Follow Discord
Sweep 22 Oct 2026 · 04:32Z Build v2.1.308 527 read Stable v2.1.308 Latest v2.1.308 Next v2.1.308 Feeds RSS JSON llms.txt llms-full.txt Unofficial

Claude Code v2.1.223 ·

SDK stream emits a permission_denied system message

SDK clients now get an explicit system message when a tool call is denied instead of guessing.

You'll notice Notable No documentation found New Features
JSON All of v2.1.223
You'll noticeTier: how much it should matter to you
3Useful: my rating, 1 to 5
0Signal: worth watching, 1 to 5
SDKArea: what it touches
New FeaturesKind: in v2.1.223,
What probably matters to youSection of the release
What

The control-protocol session can now push a system message to the SDK stream whenever a tool call is denied, so clients can react to denials instead of inferring them from the tool result.

Details
  • New emitPermissionDenied method on the control-protocol session class enqueues a message with type: "system" and subtype: "permission_denied".
  • Payload carries tool_name, tool_use_id, agent_id, decision_reason_type, a serialized decision_reason, the deny message, a uuid and the session id.
  • On the stdio createCanUseTool path it fires on any deny.
  • On the non-stdio path it fires only when a new helper confirms the tool_use id actually appears in the message content and the abort signal has not fired.
Evidence

decision_reason_type

Strings lifted out of the shipped bundle, so the claim above can be checked against them.

Read from
Names in the bundlepermission_denied

See this entry in the whole of v2.1.223 →

Feedback