Fix MLB simulator: projected wins drive seeding, perf fix, + surface simulate errors #65

Merged
chrisp merged 2 commits from fix/simulate-route-error-handling into main 2026-06-01 20:50:04 +00:00

2 commits

Author SHA1 Message Date
Chris Parsons
0b53570723 Fix MLB simulator: use projected wins for playoff seeding + perf + cleanup
All checks were successful
🚀 Deploy / 🧪 Test (pull_request) Successful in 2m20s
🚀 Deploy / ʦ🔍 Typecheck & Lint (pull_request) Successful in 1m15s
🚀 Deploy / 🐳 Build (pull_request) Has been skipped
🚀 Deploy / 🚀 Deploy (pull_request) Has been skipped
- Replace hardcoded FanGraphs p_div/p_wc draws with Binomial regular-season
  simulation so that admin-entered projected wins drive playoff qualification
  odds, not just in-bracket game win probability
- Add getRegularSeasonStandings call so mid-season current wins feed into
  projected final standings
- Use normal approximation (Box-Muller) in sampleBinomial for n≥30: drops
  seeding phase from ~243M to ~3M Math.random() calls per 50K-sim run
- eloToRDif now calls rawWinRateFromElo instead of inlining the same formula
- Warn when recognized teams lack a standings row during mid-season simulation
  (silent wrong seeding result with no diagnostic previously)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 11:55:24 -07:00
Chris Parsons
ba970cd571 Fix simulate route crash and surface actual error messages
All checks were successful
🚀 Deploy / 🧪 Test (pull_request) Successful in 2m24s
🚀 Deploy / ʦ🔍 Typecheck & Lint (pull_request) Successful in 1m19s
🚀 Deploy / 🐳 Build (pull_request) Has been skipped
🚀 Deploy / 🚀 Deploy (pull_request) Has been skipped
When a simulation action threw (e.g. readiness check failure), React Router
tried to render the simulate route via GET to display the error — but the
route had no loader, so the real error was completely swallowed by React
Router's own 400 "no loader" message.

Four issues fixed:
- Move simulate into the intent-dispatch pattern on the season page (matching
  delete/rescore/sync-standings/finalize-standings), so errors surface via
  actionData instead of being lost
- Eliminate the ?simulationError= query param approach, which left stale error
  messages in browser history and reflected user-controlled text in the UI
- Match the existing bg-destructive/15 error styling used elsewhere on the page
- Strip the now-unused action from simulate.tsx; keep a loader-only redirect
  stub so any bookmarked URLs degrade gracefully to the season page

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 23:42:35 -07:00