Document
Schedule building cheat sheet (ADs)
One-page guide for Missouri girls D1 lacrosse schedule clusters and risk matrix on Powerwise.
What to sort on
| Use case | Column | Where |
|---|---|---|
| Schedule tiers (6–8 teams) | projected_margin_rating |
Team strength / schedule clusters |
| Board vote line | recommended_rank_adjusted |
Ranking board |
| Default slot (stable teams) | Prior finish rank | Same as last season's final order |
| Override slot (flagged teams) | slot_rank |
Shift watchlist — model rank when flagged |
Cluster method: fixed buckets of 8 teams on projected_margin_rating (strongest first). ~5 tiers for a 36-team league.
Shift watchlist (review queue)
~20–25 teams per season are flagged — not a full re-rank of the league.
| Signal | Meaning | Slot direction |
|---|---|---|
talent_loss_rebuild |
Heavy graduation + thin returning pool | Down (worse tier) |
sleeper_talent_pool |
Strong returning/margin vs low prior finish | Up (better tier) |
margin_overrated |
Prior finish much better than game margins | Down |
model_large_move_* |
Roster model proposes ≥4 rank move | Up or down |
- Default: teams not on the watchlist keep prior finish as their slot rank.
- Flagged: use recommended rank as
slot_rank. - ★ Core override: heavy turnover or large model move — strongest override signal.
Reading the risk matrix
- Row vs column: positive cell = row team projected to win by that many goals.
- k·Δmargin: expected margin from projected margin rating differential (MO-vs-MO calibrated).
- Blowout flag: |margin| ≥ 10 goals — avoid scheduling these pairs if possible.
- Within tier: blowout rate should be near zero; most blowouts are across tiers.
Building a schedule
- Open Schedule risk for the forecast year (2027 forward, 2026 backtest).
- Review shift watchlist — confirm ★ teams are slotted where you expect.
- Use cluster cards — pick 6–8 opponents from the same tier for competitive blocks.
- Scan blowout pairs — don't stack multiple blowouts on the same team.
- Cross-check borderline teams against the ranking board if margin and roster disagree.
When to override the model
Override slot_rank manually when:
- You know roster/stats are stale (late transfers, club injuries).
- A program has a coaching change not captured in history.
- Conference alignment requires a public-school subset (use conference alignment tool separately).
Document overrides on the ranking board (program_notes) so the next season's board sees the rationale.
Evidence / backtest
- Walk-forward grid on
/backtest— roster line vs prior finish across 20+ seasons. - 2024-25 → 2026 holdout — published audit season (tier A ground truth).
- Shift detection targets large movers (≥4 ranks), not league-wide average error.
Quick commands (staff)
cd glax-pipeline
python3 scripts/run_seasonal_refresh.py # standard: pipeline + audits + import
python3 scripts/run_seasonal_refresh.py --profile quick # forward refresh only
python3 scripts/run_seasonal_refresh.py --profile full --with-tests # end of season
Full runbook: docs/SEASONAL_REFRESH.md
Manual one-offs:
python3 run_glax_analysis.py --season 2025-26
python3 scripts/validate_schedule_clusters.py --forward
python3 scripts/audit_shift_detection.py --forward
After pipeline run, import to website:
cd website
uv run python scripts/import_data.py --only schedule_shift_watchlist backtest_grid --skip-migrations