entry.Join(ctx, …)
The join path is merged and already idempotent under a concurrent double-tap. It was written to place a fee hold; a free contest is the same call with a zero hold, which is why the pivot cost this rail nothing.
HTTP transport, fixture feed, the 42-minute clock
No Go module has an HTTP transport yet, so nothing on this screen has ever been fetched. The fixture, the countdown and the 1,248 are invented by this file.
scoring: rulesets are versioned and immutable
A contest binds a ruleset version when it is created and is scored against that version forever. The projection shown here is a guess; the ruleset that turns it into a real number is merged and cannot be edited underneath a live round.
projections, squad rules, the eleven names
There is no projection model and no rule about how many players per club or per position a pick may contain. Every number and every name on this screen is invented by this file.
the kickoff lock
The lock is enforced in the database, not in this button. A late pick fails at the write; it is not merely hidden from the screen. That is why there is no disabled control here — after kickoff the control does not exist.
push notification at kickoff
Nothing tells a player the round has started. Today they would have to open the app and look.
scoring engine + ingest spine
Both are merged. Match facts are append-only: a correction writes a VOID row rather than editing history, and the score is folded from whatever survives. The fold is order-independent, so two facts arriving out of sequence cannot produce two different totals.
points are centipoints, and never rendered raw
The engine stores −100, meaning −1.0. Every figure here is a data-cp integer put through one formatter. Nothing on this screen types a decimal by hand.
ranking order: score desc, then created_at asc, then id asc
The tie-break is merged and deterministic, in that order — highest score first, earliest entry next, and the row id last so two entries created in the same millisecond still rank in a fixed order rather than in whatever order the database returns. It is printed on the screen because a player who thinks a tie was settled arbitrarily does not come back.
display names
Identity has no display name today, so a real board would be a list of UUIDs. Every handle here is invented. This is the same unresolved decision prototype 1 raises on its conversion screen.
Pick'em is the only arcade surface with a real backend underneath it. Entry, the kickoff lock, settlement, ranking, the scoring engine and its ingest spine are all merged on main. Every other layer of the funnel would have been drawn entirely on air.
Screen 5 is not an exit. A player who finishes 4th is shown the next round starting in twenty minutes, on the same screen, in the primary action. "You're never out of it" is either true in the layout or it is a slogan.
Real, merged on main: free entry and its idempotent join, the kickoff lock, versioned immutable rulesets, the append-only match-event log with VOID corrections, order-independent scoring, settlement, and the ranking tie-break printed on screen 5.
Invented by this file: the fixture, the eleven names, every projection, the countdowns, the room size, all five handles, and every pixel here. There is still no HTTP transport on any Go module.
Not a design decision yet. This is a prototype to argue with, not a spec. What survives a real person's hands becomes a ticket.