Skip to content

2026-06-23 — Tournament resolution

Stage 3 of a Sit-n-Go's lifecycle — completion — now runs end-to-end. The resolution chain (playing → ended → settling → closed, winner paid on-chain, betting market settled, winner page collectible) was fully coded but had never once run in production: live DB diagnosis on 2026-06-22 found zero payout_intents rows ever created, every tournament stuck in playing with all players sitting_out and no elimination_order assigned.

The reframe

Tournaments do play — the logs show active hands, blind escalation, and auto-folds. The "stuck" tables were abandoned (players left → sitting_out), and a forceEnd that landed on starting was just racing the 3-second reconstruction window (a reconstructed mid-playing tournament resets through registering → starting → playing and re-deals, since engine stacks aren't persisted in V0). The resolution machine was sound; two gaps stopped it short.

What was fixed

  • Betting now settles on forceEnd. dispatchBettingSettle lived only in the bust-driven assignSurvivorAndTransitionToEnded; it moved into onPlayingEnded, so both end paths (natural bust-down and operator force-end) settle the tournament's betting market.
  • Wrong-winner bug (fund-path). computeActualPayouts and the betting-settle both derived the winner from the in-memory this.eliminations, which on a force-ended reconstructed tournament carried a stale entry that disagreed with the DB write — so the prize and the betting payout went to the position-2 loser. A new readAuthoritativeStandings() reads table_players.elimination_order (the same source the results page serves), and both the payout and the betting winner now derive from it. Verified live: DB winner == payout winner == betting winner.

Verification

T1/T2/T3/T5/T6 verified live. T4 (winner-page UI polish) remains. The natural bust-driven conclusion works but is slow (blind erosion does the eliminating).

Residuals (follow-ups)

  • Tournament play isn't durable across restarts — a reconstructed tournament re-deals from a fresh start (engine stacks aren't persisted in V0). A persistence follow-up.

Now-current pages: Tournament Resolution guide · SnG Tournaments guide · SnG Tournaments decision.