Extend HFA DEFAULT_LEAGUES to 28 leagues (was 19)
HFA signal was null for 9 leagues because DEFAULT_LEAGUES in hfa-monitor.ts was a 19-league whitelist. getCurrentHFA() gated on this before even checking files — so bets in ucl, mls, austria-bl, arg-b-nacional,
HFA signal was null for 9 leagues because DEFAULT_LEAGUES in hfa-monitor.ts was a 19-league whitelist. getCurrentHFA() gated on this before even checking files — so bets in ucl, mls, austria-bl, arg-b-nacional, arg-primera, brazil-a, liga-mx, uruguayan-primera, eerste-divisie, j-league never got evaluated.
The fotmob-match-xg files for all these leagues ship with the image (already in data/fotmob-match-xg/), and mi-params/latest/ has params for each. The only missing piece was the whitelist entry.
Changes:
- Added FOTMOB_FILE_PREFIX mirror of the FOTMOB_FILE_MAP in
backfill-shadow-signals.ts (arg-b-nacional → argentine-b-nacional etc.) with a comment telling future-me to keep them in sync.
- loadFotmobMatches() now looks up the prefix via the map and accepts
bare-array OR {matches: [...]} file formats (seen both in practice).
- DEFAULT_LEAGUES: added 10 missing entries (9 for the HFA gaps plus
j-league). Extracted EURO_SEASONS + CALENDAR_SEASONS constants and bumped them both to include 2025-26 / 2026 — the existing 19 leagues were capped at 2024-25 so the rolling HFA window lagged a full season.
Smoke test (12 leagues via scripts/smoke-hfa.ts before removing it): ucl goals=1.315 xg=1.161 n=100 mls goals=1.583 xg=1.218 n=100 austria-bl goals=1.123 xg=1.104 n=100 arg-b-nacional goals=1.887 xg=1.319 n=100 uruguayan-primera goals=0.913 xg=1.119 n=100 brazil-a goals=1.471 xg=1.320 n=100 liga-mx goals=1.254 xg=1.173 n=100 arg-primera goals=1.326 xg=1.319 n=100 eerste-divisie goals=1.112 xg=1.136 n=100 j-league goals=1.330 xg=1.207 n=100 epl goals=1.039 xg=1.193 n=100 (no regression) championship goals=1.056 xg=1.359 n=100 (no regression)
Expected: HFA 143/182 → 182/182 on next backfill run.
Not fixing in this commit:
- AggV2 Big-5 (62 bets): by design, the v2 signal is trained on Big-5
and applied to non-Big-5 only — 62 "missing" Big-5 bets are the designed behavior.
- XGVar / MatchXG early-season bets: 10-match lookback is the validated
signal parameter (variance-regression-filter in signal-registry). Lowering it is a pre-registered signal experiment, not a backfill fix.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>