brackt/app/services
Claude cdf86d1682
Feed each AFL Elimination Final into the Semi-Final of the same number
The Elimination Final winners were crossed into the Semi-Finals — EF1's winner
met the QF2 loser and EF2's the QF1 loser. The AFL feeds them straight through:
SF1 is the QF1 loser against the EF1 winner and SF2 the QF2 loser against the
EF2 winner. The crossover in this system lands a round later, at Semi-Final →
Preliminary Final, so a Qualifying Final loser cannot meet the side that just
beat it — that part was already right and is unchanged.

In 2026 that drew Fremantle v Adelaide and Brisbane v Geelong, when Fremantle
played Geelong and Brisbane played Adelaide.

Placement now reconciles both Semi-Final slots on every Elimination Final
result rather than writing the one it was called for, so correcting a recorded
result moves the qualifier instead of leaving the beaten team alive in a semi.
A slot held by anyone who never played an Elimination Final still raises
"already filled", and a Semi-Final that has been played refuses the move rather
than rewriting who contested it.

The simulator paired the Semi-Finals the same crossed way, which biased every
projection running off an undecided Elimination Final; it now feeds straight
through too.

Brackets already advanced under the crossover keep their wrong pairings, since
no admin action re-runs advancement — a completed match cannot be re-submitted.
Admin → the event's bracket gains a "Fix Semi-Final Pairings" button that runs
the same reconciliation over a bracket as it stands.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MSDeNWAXvK7nznJqjxn7Jo
2026-09-11 18:10:30 +00:00
..
__tests__ Stop the simulator re-run from trampling its caller's side effects 2026-08-29 03:46:12 +00:00
match-sync Stop the simulator re-run from trampling its caller's side effects 2026-08-29 03:46:12 +00:00
simulations Feed each AFL Elimination Final into the Semi-Final of the same number 2026-09-11 18:10:30 +00:00
standings-sync Sync IndyCar standings from OC Blacktop, fall back to ESPN 2026-07-06 21:20:47 -07:00
bracket-simulator.ts Replace console.* with structured logger, fix no-inferrable-types (closes #98) (#199) 2026-03-21 13:41:39 -07:00
brackt.server.ts Add Brackt as a league-private meta-sport (#200) (#377) 2026-05-04 20:31:44 -07:00
discord.ts Merge QP scoreboard into a single Drafted Participants list with a Points Bubble divider 2026-07-09 23:22:24 -07:00
draft-autostart.ts Add auto-start draft at scheduled time (#437) (#438) 2026-05-16 23:37:29 -07:00
draft-discord.server.ts claude/discord-pick-notification-refactor-FeusJ (#58) 2026-05-29 16:24:22 +00:00
draft-email.server.ts Add draft email notifications feature (#459) 2026-05-20 15:35:43 -07:00
ev-calculator.ts fix: address VORP code review issues (#283) 2026-04-08 23:20:02 -04:00
icm-calculator.ts Replace console.* with structured logger, fix no-inferrable-types (closes #98) (#199) 2026-03-21 13:41:39 -07:00
probability-engine.ts claude/indycar-ev-sims-probability-fpzfx6 (#139) 2026-08-17 22:50:35 +00:00
probability-updater.ts Stop the simulator re-run from trampling its caller's side effects 2026-08-29 03:46:12 +00:00
qualifying-points-discord.server.ts Merge QP scoreboard into a single Drafted Participants list with a Points Bubble divider 2026-07-09 23:22:24 -07:00
sync-tournament-results.ts Fix mirrored tournaments dropping QP knockout announcements 2026-07-04 16:24:36 +00:00