A new 'permission-stop' abort reason makes denied tool calls end the turn cleanly instead of being logged as a plain interruption
What
- A new abort/interrupt reason,
permission-stop, was added alongside the existinginterrupt,turn-abort, andrefusal-fallback-editreasons, with its own error mapping. - When a tool call is denied while the abort reason is
permission-stop, the resulting tool-result message now carries atoolDenialEndsTurnflag. A new helper walks backward through the conversation and treats a user message with this flag set as one that ended the turn, rather than one that was merely interrupted. - This
toolDenialEndsTurnflag is now carried through the rest of the tool-result plumbing (alongside existing fields liketoolDenialKind/userFeedback) and is checked to short-circuit processing when a denial should end the turn. - Subagents are affected too: when a synchronous subagent is stopped for this reason, it's now recorded distinctly (
permission_stop_sync) in telemetry and cleaned up as a system action rather than being reported as a plain user cancellation.
Why
Previously, denying a tool call during a permission stop could be misclassified as a generic interruption. This change makes Claude Code correctly recognize that the turn ended because of the permission denial, so the conversation transcript and telemetry reflect what actually happened.
tengu_fizzy_grove Not enough to sayNothing here resolved what this flag was doing on this version, so nothing here should be read as on or off.
This account: no value returned · anonymous baseline: no value returned · compiled default in v2.1.280: off
These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
Read once, for one account on one subscription tier, against v2.1.280. It isn't a statement about your account. What a flag value here can and cannot tell you