Отмена кооперативная: Job переводится в cancelling; suspend-точки (delay, withContext, ensureActive) проверяют статус и бросают CancellationException.
Разбор
job.cancel() / отмена scope.
- CPU-цикл без suspend нужно поллить
isActive/ensureActive.
CancellationException не логировать как ошибку приложения.
finally/NonCancellable для cleanup с оговорками.
Итог
Отмена работает только если код уважает cancellation points.