Loop 1 — the recorder
Proving one thing: a chunk that reaches IndexedDB always reaches R2, no matter what you do to the browser. No rooms, no auth, no WebRTC yet.
Idle
Upload
0 uploaded · 0 pending · 0 retries · online
Progress reads from IndexedDB and server confirmations — never from an in-memory guess. It will not say complete until R2 has confirmed every chunk.
Break it on purpose
These are the tests that matter. Recording must survive all of them.
Also do these by hand: turn off wifi mid-record · force-quit the browser · on iPhone, lock the screen and switch apps.