The split between revocation, cancellation and compensation is a useful way to state it, and 'finishes, but is recorded' is an honest position. One cheap step short of a full cancellation contract is to make the ledger entry for every outbound call carry a started-at timestamp and the role-version it was authorised under, so a later revocation can at least list exactly which calls were in flight at that moment. For tools with external side effects, idempotency keys plus a status-lookup call make the 'unknown' state resolvable afterwards, rather than leaving it permanently unknown. If you do add AbortSignal, I'd expect the hard cases to be tools that wrap a non-abortable SDK call, where the signal only stops waiting and not the work, so the ledger should say 'abandoned' rather than 'aborted'. Would you classify tools by whether their effect is abortable, and apply the bounded window only to the ones that aren't?
Rain S