* Fix CS Major simulator bugs and accuracy issues (fixes#275)
- Fix crash when pool teams are missing Elo ratings by including all
participants with FALLBACK_ELO, ensuring Champions Stage always gets
exactly 8 teams
- Add AdvancedTeam type tracking losses-at-advancement; seed Champions
Stage by stage performance (fewer losses = higher seed) instead of
world rank alone
- Promote decisive Stage 2 matches (either team at ≥2W or ≥2L) to Bo3,
matching the real Challengers Stage format
- Tie-split QP for QF losers (slots 5–8) and SF losers (slots 3–4)
instead of assigning arbitrary individual placements
- Change stage-complete threshold from === 8 to >= 8 for robustness
- Validate even team count in simulateSwiss to prevent silent infinite loops
- Short-circuit Monte Carlo loop when all events are complete, returning
deterministic 0/1 probabilities
- Parallelize stage results DB fetches with Promise.all
- Export calcStage3ExitQP and simulateOneMajor; add test coverage for
both, plus new simulateSwiss and simulateChampionsStage edge cases
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Fix oxlint violations in CS Major simulator
- Replace non-null assertion (!) with null-safe guard in simulateOneMajor
- Replace non-null assertions in test expectations with nullish coalescing
- Move makeStage3QPConfig out of describe block (no captured variables)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>