The World Cup Monte Carlo simulator ignored the admin-populated knockout
draw and re-paired its own simulated group output sequentially, so bracket
paths from the Round of 32 onward did not match the real tournament. It
also silently invented 12 synthetic groups when none were configured,
discarding real group-stage results.
Rework the simulator around three regimes:
- draw set → simulate the real R32 matchups, advancing through the
bracket tree via the canonical ceil(matchNumber/2) rule (matching
advanceWinnerTemplate) so sim paths match the admin tooling.
- groups only → simulate remaining group matches, then seed the R32 with
the official 2026 group-position template + FIFA's exact Annex C
best-third-place allocation (495-row published table).
- neither → futures-seeded bracket fallback, flagged via result source.
Completed group and knockout matches still lock in real results at every
round.
New app/lib/fifa-2026-bracket.ts encodes the R32 group-position template
(official FIFA matches 73-88 mapped onto DB matchNumbers 1-16 so the tree
reproduces the real halves) and assignThirdPlaceSlots(). The Annex C table
is generated deterministically by scripts/gen-fifa-third-place.mjs into
app/lib/fifa-2026-third-place-allocation.ts.
Tests assert exact Annex C values, cross-check the template's eligible
groups against all 495 combinations, and cover each regime including the
partial-draw dedup and fully-drawn fast path.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>