brackt/drizzle
Chris Parsons dbffddc9ff
Partial bracket scoring, code review fixes, and double-chance logic (#156)
## Partial bracket scoring
- `processMatchResult`: new exported function that scores a single match
  immediately (loser → final placement, winner → provisional floor).
  Called from `set-winner` and `set-round-winners` so points are awarded
  as soon as a winner is set, before the full round is complete.
- `set-winner`: passes `eventName` to `processMatchResult`.
- `set-round-winners`: batches side effects — calls `recalculateAffectedLeagues`
  and `updateProbabilitiesAfterResult` once after the loop instead of per-match
  (`skipSideEffects: true` per match).

## Code review fixes
- **ROUND_CONFIG** (S1): extracted a `RoundScoringConfig` lookup table +
  `getRoundConfig()` helper, eliminating three parallel `if/else` chains in
  `processPlayoffEvent`, `processMatchResult`, and `getGuaranteedMinimumPosition`.
  AFL template overrides live in `TEMPLATE_ROUND_CONFIG` with an explanatory
  comment about why the `bracketTemplateId` guard is required.
- **skipSideEffects** (C2): new param on `processMatchResult`; bracket server
  uses it to batch standings/probability recalc in `set-round-winners`.
- **eventName** (W1): passed through `processMatchResult` → `recalculateAffectedLeagues`.
- **Round validation** (W2): `set-round-winners` now guards `match.round === round`
  before processing each assignment.
- **Comments** (C3/S3/W3): added notes on non-scoring loser assumption,
  `isScoring ?? true` default, and AFL Semi-Finals template requirement.

## PlayoffBracket eliminated-teams fix + tests
- Fixed `computeEliminatedByRound` to track participant *appearances* (not just
  wins), so AFL QF losers who advance to Semi-Finals via double-chance are
  correctly excluded from the QF eliminated list.
- Extracted the logic as an exported pure function for testability.
- Added 4 tests: standard elimination, AFL QF loser → SF win, AFL QF loser →
  SF loss, and normal advancement not protecting a later loser.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 10:50:30 -07:00
..
meta Partial bracket scoring, code review fixes, and double-chance logic (#156) 2026-03-17 10:50:30 -07:00
0000_short_donald_blake.sql
0001_serious_la_nuit.sql
0002_tired_iron_man.sql feat: add commissioner model and league management features 2025-10-11 00:29:04 -07:00
0003_public_shadowcat.sql feat: add user model, routes, and Clerk webhook integration 2025-10-11 00:53:39 -07:00
0004_spicy_zarda.sql feat: add user model, routes, and Clerk webhook integration 2025-10-11 00:53:39 -07:00
0005_abnormal_thunderbird.sql refactor: remove guest book feature and update league settings success flow 2025-10-11 01:03:31 -07:00
0006_needy_junta.sql feat: add current season tracking and active league listing by user 2025-10-11 21:10:01 -07:00
0007_pink_nebula.sql feat: add sports and participant models with admin user functionality 2025-10-12 21:16:00 -07:00
0008_salty_trauma.sql feat: add icon support for sports with file upload and active seasons display 2025-10-13 10:30:47 -07:00
0009_fuzzy_korvac.sql refactor: remove isRequired field from season sports and templates 2025-10-13 15:00:59 -07:00
0010_complex_the_stranger.sql feat: add invite code system for league seasons with member access control 2025-10-14 12:20:36 -07:00
0011_gifted_mystique.sql feat: add username field to users and display in league views 2025-10-14 21:20:58 -07:00
0012_yielding_phil_sheldon.sql feat: add team settings route and logo URL field to teams table 2025-10-14 22:04:37 -07:00
0013_pink_the_order.sql feat: add draft order management with UI for manual and random ordering 2025-10-15 08:58:35 -07:00
0014_lowly_gateway.sql feat: add bulk participant creation and expected value field 2025-10-15 21:21:33 -07:00
0015_exotic_loners.sql feat: add draft rounds configuration to league settings 2025-10-15 21:50:02 -07:00
0016_majestic_roulette.sql feat: add draft date/time selection to league creation and settings 2025-10-15 22:02:21 -07:00
0017_calm_zarda.sql feat: add draft pick, queue, and timer models with database schema updates 2025-10-16 00:32:48 -07:00
0018_numerous_stardust.sql feat: add public draft board and simplify draft speed settings 2025-10-20 15:03:11 -07:00
0019_acoustic_ben_grimm.sql feat: add autodraft status and team connection indicators to draft grid 2025-10-21 23:22:17 -07:00
0020_slim_spacker_dave.sql feat: Add comprehensive scoring system database schema 2025-10-28 23:40:11 -07:00
0021_fair_ser_duncan.sql feat: Implement bracket expansion plan to support various tournament structures 2025-11-03 09:36:16 -08:00
0022_shiny_mother_askani.sql feat: Implement bracket expansion plan to support various tournament structures 2025-11-03 09:36:16 -08:00
0023_cynical_jack_power.sql Refactor code structure for improved readability and maintainability 2025-11-03 13:16:37 -08:00
0024_faithful_mesmero.sql feat: implement Expected Value System with ICM probability calculator 2025-11-17 22:19:46 -08:00
0025_rename_participant_ev_season_to_sports_season.sql feat: implement Expected Value System with ICM probability calculator 2025-11-17 22:19:46 -08:00
0026_add_source_odds_to_participant_ev.sql feat: implement Expected Value System with ICM probability calculator 2025-11-17 22:19:46 -08:00
0027_add_projected_points_to_team_standings.sql feat: add FIFA World Cup 48-team bracket template with group stage and projected scoring 2026-02-14 22:30:12 -08:00
0028_add_tournament_groups.sql feat: add FIFA World Cup 48-team bracket template with group stage and projected scoring 2026-02-14 22:30:12 -08:00
0029_change_participant_ev_to_decimal.sql Change participant expectedValue from integer to decimal (#1) 2026-02-19 11:26:40 -08:00
0030_add_draft_picks_unique_slot.sql fix: harden draft timer system with race-condition safety and DRY refactor (#34) 2026-02-23 23:23:24 -08:00
0031_add_autodraft_queue_only.sql Claude/redesign autodraft queue c4 kp r (#40) 2026-02-27 22:16:26 -08:00
0032_consolidate_playoff_pattern.sql User/chris/ev f1 framework (#93) 2026-03-09 15:34:31 -07:00
0033_add_schedule_event_type.sql fix: add statement-breakpoint to schedule_event enum migration (#86) 2026-03-07 22:45:59 -08:00
0034_add_ev_snapshots.sql User/chris/ev f1 framework (#93) 2026-03-09 15:34:31 -07:00
0035_increase_prob_precision.sql User/chris/ev f1 framework (#93) 2026-03-09 15:34:31 -07:00
0036_increase_ev_precision.sql User/chris/ev f1 framework (#93) 2026-03-09 15:34:31 -07:00
0037_add_simulator_type_to_sports.sql User/chris/ev f1 framework (#93) 2026-03-09 15:34:31 -07:00
0038_sad_wilson_fisk.sql feat: progressive floor scoring for playoff brackets (#100) 2026-03-10 10:27:58 -07:00
0039_add_ucl_bracket_simulator_type.sql Fix bad migration. 2026-03-11 14:38:45 -07:00
0040_fat_puma.sql Found it in a second spot. 2026-03-11 14:47:19 -07:00
0041_great_magma.sql Add event_starts_at timestamp to scoring events for sub-day ordering (#146) 2026-03-15 10:22:42 -07:00
0042_migrate_event_date_to_starts_at.sql Add event_starts_at timestamp to scoring events for sub-day ordering (#146) 2026-03-15 10:22:42 -07:00
0043_demonic_vanisher.sql Add per-event configurable region config for NCAA-style brackets (#149) (#149) 2026-03-15 21:52:47 -07:00
0044_add_ncaam_bracket_simulator_type.sql Add NCAAM and NCAAW bracket Monte Carlo simulators (#150) 2026-03-15 23:31:47 -07:00
0045_add_ncaaw_bracket_simulator_type.sql Add NCAAM and NCAAW bracket Monte Carlo simulators (#150) 2026-03-15 23:31:47 -07:00
0046_add_nba_bracket_simulator_type.sql Add NBA playoff bracket Monte Carlo simulator (#154) 2026-03-16 21:43:39 -07:00
0047_fix_nba_bracket_simulator_type.sql Fix NBA simulator missing from dropdown and enum not applied to prod DB 2026-03-16 22:18:50 -07:00
0048_mean_enchantress.sql Partial bracket scoring, code review fixes, and double-chance logic (#156) 2026-03-17 10:50:30 -07:00