- syncManager.start() di-wire di layout: listener online, heartbeat 30s,
drain awal, dan requeue progress lokal yang belum ter-ack
- completeLesson: POST langsung dulu, state resmi dari server; gagal
network -> mirror pending + outbox; guard hanya skip bila sudah ack
- payload kuis offline kini lengkap (attempt_id/status/score/occurred_at/
answers), tidak lagi poison 400
- dead-letter 4xx permanen & retry >= 5, network error tidak menghentikan
drain, X-Idempotency-Key diteruskan proxy, storage.persist()
- badge status sync di halaman lesson
- test sync-manager: online/heartbeat/dead-letter/recovery/requeue