claude/llws-simulator-logic-0aqbjb #142
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "claude/llws-simulator-logic-0aqbjb"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Four fixes from code review of the previous commit. 1. Preserve the futures board's dispersion (llws-simulator.ts). convertFuturesToElo finishes by rescaling any field onto a fixed 1250-1750 Elo span, discarding how spread out the board actually is: a board with a 22%-priced favorite and one with a 6%-priced favorite both came out 500 Elo wide. On a tight board that inflated the favorite from 6% to 13% -- worse than the raw-futures model it replaced (RMSE 0.025 vs 0.005), so the previous commit was a regression in that regime. buildLLWSElos now maps decompressed strengths by their log-ratio to the field's geometric mean, so Elo span tracks real dispersion. Re-swept the parity factor across three board shapes rather than one: 550 minimizes total error. Simulated vs priced favorite, with RMSE: wide 21.8% -> 20.7% (0.0055), elo span 1355-1682 top-heavy 28.2% -> 25.6% (0.0085), elo span 1354-1733 tight 6.0% -> 5.8% (0.0026), elo span 1484-1518 2. Rate an unpriced team at the field's median, not 1500. DEFAULT_ELO is the midpoint of the Elo output range, not of the field; on a typical board it ranked an unpriced team ~6th of 20, so blanking a team's odds promoted it. buildLLWSElos now returns the priced field's median alongside the ratings (ranks 11th of 20 on the same board). 3. Pick the bracket event deterministically. scoringEvents.findFirst with no ordering returned an arbitrary row when a season had more than one llws_20 playoff event; landing on a stale one silently reverted to a randomized draw that ignored all recorded results. Now takes the most recent, matching world-cup-simulator.ts. 4. Fail on a partially seeded bracket instead of discarding it. readBracketSlots returned null on any single missing participant, throwing away the draw and every completed result with no warning. Since playoff_matches participant columns are ON DELETE SET NULL, removing and re-adding one participant mid-tournament was enough to put eliminated teams back in contention. It now distinguishes "generated but not seeded" (0 slots filled -> randomized draw) from "partially seeded" (throws). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X5vQZMPeokzfMqHQjq1RDZ