Prototype buildv0.8 · 8ff40cb
9:41▮▮▮ ⌁ 100%
Happy Hour Gaming (reversed)
MK
Challenge from
@MercyOnTheMic
Beat
my score
8 /10
Five questions. Sixty seconds. Football only.
Top score this week takes KES 500 airtime. Free to enter.
No signup. Start playing in one tap.

What this screen actually does

ON MAIN
identity.StartGuest(ctx)

Fires here, silently, before a single question is answered. VerifyPhoneCode(ctx, phone, code, guest *UserID) only preserves the user_id if a guest row already exists and has already accumulated something. Mint it at the signup prompt instead and the "keep this score" promise on screen 4 is empty.

DOESN'T EXIST
creator link → challenge payload

Creator mechanics, the share token, the score-to-beat lookup. None of it is written. The handle, the 8/10 and the prize line are invented by this prototype.

9:41▮▮▮ ⌁ 100%
Question 3 of 5
Which Kenyan striker has scored the most goals in the Harambee Stars shirt?
Tap an answer. Faster answers score more.

What this screen actually does

DOESN'T EXIST
trivia: questions, rounds, scoring

The entire acquisition layer is unwritten. No question bank, no round object, no timer scoring, no persistence. This screen runs on four hardcoded strings.

CONVENTION
correct = BLUE, never green

Blue is the positive colour in this system and there is no green and no amber in the palette. Every state also carries the word, because the token file's hard rule is no state by colour alone.

9:41▮▮▮ ⌁ 100%
Your score
9 /10
You beat Mercy
You
9
@MercyOnTheMic
8
That puts you 14th on this week's board. Top score takes the airtime.

What this screen actually does

DOESN'T EXIST
share loop, weekly board, display names

Sharing is unwritten. So is the weekly leaderboard — and identity has no display name at all today, so a real leaderboard would currently be a list of UUIDs. That's why "@MercyOnTheMic" needs the handle decision on screen 4.

ON MAIN
the score is already attached to a user_id

Because StartGuest ran on screen 1, this 9/10 belongs to a real row. Screen 4 doesn't create the player — it upgrades one that already exists.

9:41▮▮▮ ⌁ 100%
Keep
this score
9/10
Saved against your phone, entered into this week's contest, and it counts toward the airtime.
Your number
+254
One code by SMS. We use it to send your airtime if you win — nothing else, and no calls.

What this screen actually does

ON MAIN
identity.RequestPhoneCode → VerifyPhoneCode(…, guest)

Passing the guest flips the same row GUEST → REGISTERED, keeps the user_id, and rotates the session. The 9/10 survives because it was never anonymous.

DELIBERATELY HOSTILE
no merge, ever

A correct code for a number that already belongs to someone returns that account and leaves the guest untouched. Someone who signs in on a friend's number does not absorb the friend — so this screen must never promise a merge.

DOESN'T EXIST
handle, SMS code screen, contest entry

Decided: a free-text handle captured during phone verification. Needs a uniqueness rule and a moderation rule. Not drawn here — prototype 1 stops at the ask.

The first
sixty seconds

Prototype 1 · Happy Hour Gaming · 25 Aug 2026
Four screens, real brand values, no backend. Built to answer one question: does a stranger who taps a creator's link get far enough to hand over a phone number?

Built for the handset, not for this window

Open this on a phone and it fills the screen — there is no fake bezel and no fake status bar, because on a real device those are just wasted pixels. The frame you are looking at now only exists above 900px.

The one thing this proves

The guest session mints on screen 1, not screen 4. VerifyPhoneCode only preserves a user_id when a guest is passed in, and that guest row has to already hold the score. Get the order wrong and screen 4's whole promise — keep this score — is one the backend cannot honour.

What is real and what is invented

Real, merged on main: guest sessions, phone OTP, session rotation, the no-merge rule, pick'em contests, kickoff lock, settlement, leaderboard ranking, the scoring engine and its ingest spine.

Invented by this file: the whole trivia layer, creator links and sharing, the weekly board, display names, and every pixel here. There is also no HTTP transport on any Go module yet.

Mobile rules this file obeys

Not a design decision yet. This is a prototype to argue with, not a spec. What survives a real person's hands becomes ticket-d003.