Hold lifecycle: guarded states of one seat

Guards on every arrow: version, TTL and payment decide; cancel and correct are fresh events (teaching numbers)

Hold lifecycle: guarded states of one seat Guards on every arrow: version, TTL and payment decide; cancel and correct are fresh events (teaching numbers) Seat hold path Waiting + expiry watch Terminal exits Free · version v, bookable · Seat hold path · open 01 Free version v, bookable open Version guard · append iff v matches · Seat hold path · referee 02 Version guard append iff v matches referee Held · hold_id + expiry · Seat hold path · claimed 03 Held hold_id + expiry claimed Confirmed · ticket sent once · Seat hold path · paid 04 Confirmed ticket sent once paid TTL watch · sweeper sweep due · Waiting + expiry watch · 10 min TTL watch sweeper sweep due 10 min Awaiting payment · confirm or release · Waiting + expiry watch · pause Awaiting payment confirm or release pause Canceled · BookingCanceled event · Terminal exits · terminal Canceled BookingCanceled event terminal Closed · history kept · Terminal exits · terminal Closed history kept terminal HoldSeat please version matches stale: SeatTaken TTL armed HoldExpired, same hold_id confirm requested paid in time timeout, seat freed ticket done, idempotent BookingCanceled BookingCorrected, fresh event Legend initial state active waiting decision success neutral final state