Simulated broadcast and enriched commentary

milestone match-day, commentary, broadcast

Match day is the product’s theatre: if the scoreboard merely flips to full time, the afternoon never happened. Late June’s stake was presence without lying — managers should feel a fixture unfold in wall-clock time, and the words in the timeline should sound like a broadcast, while the underlying simulation remained fair and reproducible.

What shipped was two layers that wanted each other. The engine gained a data-driven commentary registry: weighted, anti-repetition variants, token expansion for players and teams, multi-line sequences for open-play shots and goals, and an isolated commentary RNG so flavor never nudged outcomes. Optional match seeds made identical inputs reproduce events, stats, and wording. Tactical settings tightened opponent-relative effects without pretending familiarity was decoration. On the product side, competitive matches could simulate ahead of kickoff, hide spoiler-bearing side effects until a broadcast window closed, and let every client deterministically reveal the stored timeline minute-by-minute from scheduled kickoff — no websocket theatre required. Friendlies stayed exempt: simulate at kickoff, publish immediately, optional cosmetic replay only. In simple terms, league nights could feel live while remaining honest about when the maths actually ran.

The challenges were spoiler discipline and exemption edges. Persist-without-publish is powerful and dangerous if standings or news leak early; friendlies that freeze the league UI would punish managers for arranging a bounce game. A shared timing model between API gating and client reveal was the load-bearing choice — multiplicity of clocks would have produced “live” disagreements. The strength of client-side reveal is scale and sameness; the drawback is that anyone who can read the wire still needs server-side withholding of scores and events during the window, which we treat as product behavior rather than a security whitepaper.

Paths not taken included true realtime simulation streaming, forcing friendlies through the same broadcast freeze, or keeping single-line commentary forever. Realtime streaming is romantic and operationally heavy for a management game; freezing friendlies would confuse the calendar; monosyllabic event strings would have left the new broadcast band sounding like a debug log.

What it unlocked was match detail as appointment viewing, a global commentary band under the nav, and a clearer split between cosmetic narration and competitive truth — a split later worker and API-role work could respect when background jobs owned the heartbeat and Nest remained the door.

← All entries