door · moonlight sessions · vol ix · fri apr 24 · 9pm
● online · sync ok
✓
valid · admit one
maya chen · ga
scanned by you · 21:41:04 · door a
live · door a · cam rear
q 0 · buffer oktorch off
validation state machine
decode
event match
status check
entries left
commit scan
every code is a signed token. decode fails → invalid. event mismatch → wrong event. status ∈ {refunded, transferred_out, canceled} → void. entries_used ≥ max_entries → already scanned. else → commit, decrement, vibrate + tone, log to device and queue for sync.
the door.
281 scanned · 19 left · 94%
281
in
19
left
6
dup
2
void
94% of 300 · 47 scans in last 10 min · p95 scan 420ms
✓
maya chen · ga
t-2041 · 1/1 entries · door a
21:41:04
you · ios
◆
jules park · vip · +2 guests
t-2039 · 3/3 entries · door a
21:40:51
you · ios
✓
river ng · ga
t-2038 · 1/1 entries · door b
21:40:38
sam · ios
◑
avery quinn · already in
t-2012 · 1/1 · scanned 21:12 door a
21:40:19
sam · ios
✓
leo mendez · ga
t-2031 · 1/1 entries · door a
21:39:54
you · ios
✕
code t-1907 · refunded
order refunded mar 30 · do not admit
21:39:28
you · ios
✓
priya saul · ga · earlybird
t-1902 · 1/1 entries · door b
21:38:40
sam · ios
✕
code t-8810 · wrong event
belongs to “late bird · warehouse set”
21:37:12
you · ios
offline & conflicts.
● online · sync real-timequeue · 0 · last sync 0.4s ago
local queue · will upload on reconnect
— queue is empty —synced
multi-door conflict test
press simulate. two door phones try to scan t-2077 within 900ms while offline; the winner is decided on the server by earlier scanned_at, the loser gets a reversal push.
scan rules
· each ticket = signed token + max_entries (usually 1, vip bundles = 2–4)
· once entries_used ≥ max, further scans are logged as already scanned — door can still manually admit
· refunds, transfers out, and cancellations void the token immediately
· volunteer accounts can scan + check-in by name, can’t refund or see revenue
· offline scans queue locally and reconcile on next sync