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.