{"version":"2.1.299","anchor":"cancel-of-a-re-run-interrupted-turn-can-be-declined","canonical_anchor":"cancel-of-a-re-run-interrupted-turn-can-be-declined","heading":"cancel_async_message can now be declined for a re-run of an interrupted turn","tier":"notice","area":"SDK","scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.299\/e\/cancel-of-a-re-run-interrupted-turn-can-be-declined","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.299","markdown":"### `cancel_async_message` can now be declined for a re-run of an interrupted turn\n\nSDK cancels of a queued re-run that also answers other clients' messages are now declined until an interrupt lists the message\n\n**What**\n\n`cancel_async_message` is a request that programs using the Claude Code SDK (the kit for running it from other software) send to cancel a queued message. A turn is one round of Claude answering. The SDK documentation now describes a new case:\n\n- When the message's uuid (its unique id) belongs to a queued re-run of an interrupted turn that also answers for other client messages, the cancel does nothing and returns `cancelled=false`. This applies on a worker that recognises held messages.\n\n- The cancel is accepted once an interrupt for that re-run has listed the uuid under `still_queued`. The other messages are then cancelled with it.\n\nBefore, `cancelled=false` only meant the message was no longer in the queue, and the only documented no-op was a message already taken off the queue to run.\n\n**Why**\n\nIf you build on the SDK, a declined cancel no longer always means the message already left the queue. In this case it may still be waiting, and you need an interrupt that lists it under `still_queued` before the cancel takes effect, which also cancels the other messages it answers for.\n\n- Area: SDK\n- Names: `cancel_async_message`\n- Tier: You'll notice\n- Useful: 2\/5\n- Signal: 2\/5\n- Scope: individual\n- Heads-up: no"}