Retry storm
The phone lost signal and retried. The customer bought one ticket.
Then Harbor, the studio's client portal, starts taking invoice payments. Every way that money can go missing gets a chapter here.
Six chapters, all running on a real database: a hundred payments against one balance, one payment tapped twenty times, a refund that goes out twice, books that stop adding up. Each time you break it first, then switch on the version that holds.
You press the buttons. The numbers in the black box are what visitors have done to it so far.
These are toys. The real versions hit a real database.
The same bugs as the chapters, small enough to break in a few clicks. The chapters run them against Postgres with real transactions, real locks and the SQL on screen.
A $100 balance. Fire payments at it faster than it can count.
The phone lost signal and retried. The customer bought one ticket.
Add 10¢ a thousand times in floating point. Count how often the total is wrong.
The button was disabled in the UI. The API was not.
Two UPDATEs. The server dies between them.
The payout job was slow, so someone ran a second copy.
$100 three ways. Where does the last cent go?
Providers deliver events late, twice and out of order. You pick the order.