Repeatable runbooks Copilot can execute. A fresh Copilot session auto-loads
../AGENTS.md, which maps trigger phrases to these files.
| Trigger phrase | Runbook | What it does |
|---|---|---|
| "score today's games" / "run the daily predictions" | DAILY.md |
Scores only today's games' questions (1–99) with the statistical models → analysis/<date>.md. Dry-run. |
| "run the bot cycle" | DAILY.md |
Full cycle: refresh markets → score → review → optional --submit → calibrate. |
| "enrich today's games" / "add odds and lineups" | ENRICH.md |
Adds sharp odds (data/odds/) + referee/weather/lineup context (games/NNN/context.json) so the bot anchors result/totals on the market and tilts the rest on real news. Dry-run. |
| "prep the next games" / "enrich the knockouts" | KNOCKOUT_ENRICH.md |
One command (scripts/enrich_fixture.py) resolves a knockout matchup to its bracket slot, materialises the games/ folder, and pulls sharp odds + props + weather + a per-question readiness report. Folder-agnostic (fixes the placeholder-slot gap). Dry-run. |
| "price all the games" / "save baselines" / "what changed before this game" | BASELINE.md |
Pre-price every upcoming game across all 3 lanes → save timestamped baselines (scripts/snapshot_predictions.py), re-price day-of, and diff (scripts/pred_drift.py) with each change tagged ODDS/LINEUP/MODEL-DRIFT. scripts/readiness.py shows the board. Dry-run. |
| "research referees" / "add the referee" | REFEREES.md |
Profiles match officials (all 52 in referees/) and assigns them to fixtures (referees/assignments.json) so cards/fouls/penalty markets reflect who is officiating. Dry-run. |
| "run an experiment" / "improve the model" | EXPERIMENTS.md |
Develop a model/pricing change in an isolated git worktree and merge it only if scripts/gate.py shows it beats the frozen backtest baseline (RBP-vs-crowd). |
| Command | What it does |
|---|---|
python scripts/backtest.py [--by-category] [--json] [--leak-check] |
Re-prices every settled game with the current model; reports model vs crowd Brier + RBP-vs-crowd per category. --leak-check flags games priced with post-game stats. |
python scripts/gate.py [--fast] [--update-baseline] |
The promotion gate: backtest + tests + validators vs results/backtest_baseline.json → GATE: PASS/FAIL. |
python scripts/data_audit.py [--today D] [--max-age-days N] [--json] |
Data health: actionable null rate fields, stale as_of, half-split violations, fixtures missing ref/odds. |
python scripts/calibration_report.py |
Reliability / resolution / temperature on settled forecasts. |
python scripts/snapshot_predictions.py --all-upcoming [--label baseline|dayof|final] |
Save a timestamped 3-lane baseline snapshot per upcoming game → predictions/baselines/<NNN>-<slug>/. |
python scripts/pred_drift.py --slug <slug> [--all --since D] |
Diff baseline vs latest snapshot; tags each change ODDS/LINEUP/MODEL-DRIFT → analysis/drift-<slug>.md. |
python scripts/readiness.py |
Pre-game board: kickoff countdown, markets-open?, baseline?, odds age, lineups → predictions/baselines/INDEX.md. |
Research notes (cited) live in ../research/: LITERATURE.md, GITHUB.md,
INDUSTRY.md, DIAGNOSIS.md.
Also available as a custom agent: .github/agents/daily-predictions.md (selectable via
/agent in the CLI, and used by the GitHub mobile/cloud Copilot agent).
Safety: every workflow is dry-run by default — nothing is submitted to the leaderboard
without an explicit --submit and your go-ahead. The API key is never committed.