Cinema reservation event log and projections
Cinema log: one race, one winner, three views
teaching numbers: 300 seats, 50 bookings/s peak, 10 min hold
Commands
HoldSeat A5 (u1)
HoldSeat A5 (u2)
a please, may fail
guard: seat v == read v
Event log: append-only, ordered
1 SeatHeld
u1 wins A5
2 SeatTaken
u2 loses, retries
3 SeatConfirmed
u1 pays, done
4 HoldExpired / Canceled
frees the seat, history stays
5 BookingCorrected
fresh event, never edit
Send guard
key: event id
first send: ticket
repeat: blocked
replay never sends
Seat map view
seat: status + hold_id
late Held never relocks
Sales report view
confirmed minus cancels
replay rebuilds it free
Ticket print view
consumer + sent-table
lost ticket: resend, same key
the seat version referees, never the view - crash between append and send is safe to retry
replay rebuilds views with no external effect - a fix is always a fresh compensating event