brackt/app/models
Claude 1bd23a4419
Add LLWS 20-team double-elimination bracket
The Little League Baseball World Series runs two independent 10-team
double-elimination brackets — United States and International — each
producing a side champion, then a World Championship game and a
Consolation Third Place game between the side runners-up. 38 games in
all. No existing template could express it: every one is single
elimination, at most with a bolted-on third-place game.

Adds the llws_20 template plus dedicated generation and advancement,
following the same bespoke-routing pattern afl_10 and nba_20 use rather
than the generic ceil(matchNumber / 2) advancement.

The core of the change is loser routing. In the winners bracket a loss
is not an elimination — it drops the team into the elimination bracket
at a specific slot, including the deliberate cross-overs the official
bracket uses (Elimination Round 1 pairs L4/L6 and L2/L8; Elimination
Round 3 pairs each semifinal loser with the winner from the opposite
half). In the elimination bracket a loss is final. Matching the official
modified double-elimination format, there is no "if necessary" game: the
winners-bracket champion is eliminated if it loses the side
championship, dropping to the consolation game.

Rounds are shared across both sides, U.S. taking the low match numbers
and International the high ones, so the scoring config stays one entry
per stage. The existing phases/groups display machinery splits them back
apart into United States / International / Championship tabs.

Scoring lands on exactly 8 point-earning teams, which is the field size
when Elimination Round 4 begins: the two finals decide 1st–4th,
Elimination Final losers take 5th–6th, and Elimination Round 4 losers
7th–8th. 3rd and 4th are distinct because the consolation game is real,
and 5–8 splits into two two-team tiers so surviving Elimination Round 4
is worth more than losing it.

Also:

- Adds an optional nonScoringWinnerFloor to BracketRound. The engine
  hardcoded a 5th-place floor for winners of non-scoring rounds feeding
  a scoring one, which is wrong inside a losers bracket where a win can
  guarantee only 7th. Opt-in, so no existing template changes behavior.

- Fixes TabbedBracketLayout's mobile path, which built its match map
  unfiltered and so would have merged U.S. and International games into
  one column. No-op for NCAA and NBA, whose groups already cover every
  match in their phases.

- Rewrites the LLWS Monte Carlo simulator, which still modelled the
  retired pool-play format (5 teams per pool, then a 4-team bracket per
  side) and no longer described the tournament being scored. It now runs
  the real 10-team double elimination and splits the 5–8 probabilities
  into the correct tiers instead of one even four-way split. Legacy
  "US:A"/"Intl:B" externalIds are still accepted, read as the side
  alone, so seasons configured for the old format keep loading.

Tests replay all 38 games through the pure advancement resolver and
assert each one against the feed labels printed on the official bracket.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAxqBVzfmKJe6WQ6VF9guj
2026-08-03 18:06:56 +00:00
..
__tests__ Add LLWS 20-team double-elimination bracket 2026-08-03 18:06:56 +00:00
account.ts Add opt-in Discord pings to standings notifications (#429) 2026-05-15 10:06:54 -07:00
audit-log.ts Migrate auth from Clerk to BetterAuth (#354) 2026-04-29 10:03:50 -07:00
autodraft-settings.ts Add Storybook stories for new components from staged changes (#321) 2026-04-23 22:09:25 -07:00
canonical-golf-skills.ts Canonical golf skills migration + copy participants feature (#369) 2026-05-02 10:29:28 -07:00
canonical-surface-elo.ts Canonical golf skills migration + copy participants feature (#369) 2026-05-02 10:29:28 -07:00
commissioner.ts Refactor user profile to comprehensive settings page (#403) 2026-05-10 17:26:14 -07:00
cs2-major-stage.ts claude/discord-qualifying-points-t55s3x (#121) 2026-07-01 17:29:45 +00:00
draft-pick.ts Fix QP tie rounding and finalized scoring (#440) 2026-05-17 21:58:53 -07:00
draft-queue.ts feat: proactively prune ineligible queue items after each pick (#59) 2026-03-02 22:07:22 -08:00
draft-slot.ts Fix draft order initialization for teams added mid-season (#449) 2026-05-19 18:22:47 -07:00
draft-timer.ts Fix draft timer creation for teams without existing timers (#26) 2026-02-22 17:27:16 -08:00
draft-utils.ts Fix draft timer: broadcasts, increments, reconnect sync, overnight pause (#72) 2026-06-06 05:57:46 +00:00
ev-snapshot.ts User/chris/ev f1 framework (#93) 2026-03-09 15:34:31 -07:00
event-result.ts Add not-participating exclusion support for event results (#446) 2026-05-19 11:13:32 -07:00
golf-skills.ts Canonical golf skills migration + copy participants feature (#369) 2026-05-02 10:29:28 -07:00
group-stage-match.ts Fix World Cup group stage display and upcoming events (#55) 2026-05-27 05:43:08 +00:00
index.ts claude/great-lovelace-r3bznh (#88) 2026-06-12 22:35:35 +00:00
league.ts admin fixes (#85) 2026-06-11 00:32:22 +00:00
participant-expected-value.ts Centralize futures odds onto the simulator page and fix bulk import (#117) 2026-06-30 17:05:52 +00:00
participant-result.ts claude/bracket-wins-minimum-qp-el8z14 (#99) 2026-06-19 01:25:17 +00:00
participant-season-result.ts sync racing standings (#80) 2026-06-10 04:25:48 +00:00
participant.ts Canonical tournament layer: schema + backfill (1/2) (#365) 2026-05-01 20:13:18 -07:00
pending-standings-mappings.ts Add regular season standings for NBA/NHL (fixes #89) (#192) 2026-03-21 00:12:01 -07:00
playoff-match-game.ts Add playoff match game scheduling and odds management (#135) 2026-03-11 14:17:43 -07:00
playoff-match-odds.ts Add playoff match game scheduling and odds management (#135) 2026-03-11 14:17:43 -07:00
playoff-match.ts Add LLWS 20-team double-elimination bracket 2026-08-03 18:06:56 +00:00
qualifying-points.ts claude/wimbledon-qp-scoring-bug-xevhlf (#127) 2026-07-03 21:40:11 +00:00
regular-season-standings.ts Deduplicate soccer simulator helpers (#391) 2026-05-07 11:48:57 -07:00
scoring-calculator.ts Add LLWS 20-team double-elimination bracket 2026-08-03 18:06:56 +00:00
scoring-event-types.ts Fix Docker build failure caused by server-only import reaching client bundle 2026-07-01 22:36:25 +00:00
scoring-event.ts claude/wimbledon-qp-scoring-bug-xevhlf (#127) 2026-07-03 21:40:11 +00:00
scoring-rules.ts Add LLWS 20-team double-elimination bracket 2026-08-03 18:06:56 +00:00
season-match.ts claude/great-lovelace-r3bznh (#88) 2026-06-12 22:35:35 +00:00
season-participant.ts claude/charming-tesla-re9ur7 (#93) 2026-06-16 22:11:01 +00:00
season-sport.ts claude/sports-templates-conversion-ILWAM (#71) 2026-06-04 21:31:49 +00:00
season-template-sport.ts claude/sports-templates-conversion-ILWAM (#71) 2026-06-04 21:31:49 +00:00
season-template.ts claude/sports-templates-conversion-ILWAM (#71) 2026-06-04 21:31:49 +00:00
season.ts claude/funny-maxwell-vcyb19 (#91) 2026-06-15 22:05:25 +00:00
simulator.ts Centralize futures odds onto the simulator page and fix bulk import (#117) 2026-06-30 17:05:52 +00:00
sport.ts Add public sports overview page (#451) 2026-05-19 23:02:58 -07:00
sports-season.ts Address code-review findings on draft schedule Gantt 2026-07-02 02:33:15 +00:00
standings.ts Add Storybook stories for new components from staged changes (#321) 2026-04-23 22:09:25 -07:00
surface-elo.ts Canonical tournament layer: 2026-05-01 21:04:48 -07:00
team-score-events.ts claude/charming-tesla-re9ur7 (#93) 2026-06-16 22:11:01 +00:00
team.ts Enforce unique team names within a season 2026-05-23 16:55:08 -07:00
tournament-group.ts Add oxlint linting setup with zero errors (#194) 2026-03-21 09:44:05 -07:00
tournament-result.ts Canonical tournament layer: schema + backfill (1/2) (#365) 2026-05-01 20:13:18 -07:00
tournament.ts Improve shared-tournament/event management UX 2026-07-02 05:17:37 +00:00
user.ts Add admin user management interface with search and username editing (#431) 2026-05-15 12:07:51 -07:00
watchlist.ts Mobile draft room improvements: watchlist, collapsible picks feed, autodraft controls (#355) 2026-04-29 11:49:26 -07:00