- Extract VOLATILITY_DECAY_FACTOR named constant (was magic 0.7) with docstring
- Replace two complementary allEvents.filter() calls with a single for-loop pass
- Move blendedProbs construction inside the in-season else branch (was built
unconditionally even in pre-season where it was never read)
- Flatten nested totalCurrentPoints/pts conditions to a single ternary
- Emit a console.warn when participants are missing from standings data, so
degraded blending is visible rather than silent
- Add AutoRacingSimulator test suite covering pre-season path, in-season
standings-dominant blending, zero-points fallback, missing-standings warning,
schedule_event exclusion, and column normalization
https://claude.ai/code/session_01FyG28zxsjSrgr8aKYuy6xY
Championship futures odds rate mid-season drivers by likelihood to win the
title, which understates a driver like Hamilton (2nd in standings) because
the odds reflect the difficulty of closing a gap — not where he'll likely
finish. The simulator was using those odds as-is for all remaining race
win probabilities, making the current standings irrelevant to EV.
Fix: blend each driver's odds-derived strength with their share of total
current championship points, weighted by season progress (completedRaces /
totalRaces). Pre-season remains pure futures-odds; mid-season is a 50/50
blend; late-season standings dominate. Additionally scale PARTICIPANT_VOLATILITY
down by up to 70% as the season progresses to prevent unrealistic swings
when few races remain.
Applies equally to F1 and IndyCar via AutoRacingSimulator.
https://claude.ai/code/session_01FyG28zxsjSrgr8aKYuy6xY