- SyncEngine: CancellationException volta a propagar (não vira erro falso) - SyncWorker: Failed (4xx/5xx) agora é failure, só NetworkDown retenta - ApiClient: métodos suspend com delay() em vez de Thread.sleep - SseClient: cancelamento fecha o socket; parse tolera 'data:' sem espaço - Room v3: migração real 2->3 (índice único outbox) sem apagar a fila - versionCode 4 / versionName 0.2.2