Each button fires a real, signed sequence into the real webhook route — redelivery, out-of-order, reversal and all. Watch the system absorb it, live.
The identical delivery, same svix-id, twice.
The second one is rejected by the unique constraint. The projection doesn't move.
The OCR result arrives before the scan that produced it.
Both are stored. The state reaches OCR-ready and stays there — a later, older event can't drag it back.
A check is transcribed, then settles with no processing event.
It settles cleanly. Nothing assumes processing happened.
A check settles, then fails — a reversal that pulls the funds back out.
Two ledger entries, a settle and a reversal. The balance returns to zero. The settled entry is never touched.
A perfectly valid body, signed with the wrong secret.
400. Nothing is stored.
A check fails, then claims to complete.
The completion is stored and marked rejected, with a reason. No ledger entry is written for it.