Front-load pricing: compute a baseline for every upcoming game now, save the numbers, then re-price closer to kickoff with fresh odds/lineups and diff the two so you see exactly what moved and whether it was a real signal or gut/code drift. Dry-run by default — firing is a separate, explicit step.
- A ready baseline means no kickoff scramble (avoids the ENG-COD by-position mishap, ~+57 lost).
- The baseline→day-of diff quantifies how much confirmed lineups + sharp-odds moves are worth — the only overrides the memories say beat the model. Everything else is gut-drift (−EV).
python scripts/snapshot_predictions.py --all-upcoming --label baseline # every future game w/ markets
python scripts/snapshot_predictions.py --slug brazil-vs-norway # or one gameWrites predictions/baselines/<NNN>-<slug>/<UTCstamp>_baseline.json — all three lanes
(honest / slight / aggressive) per question, plus the anchor source (odds / prop / model) and a
fingerprint (git SHA + odds fetched_at). It prints a sanity scan: any >97 / <3 honest number
on a market without a sharp anchor is a red flag for an unhandled market type — investigate before
trusting it.
Pull fresh sharp odds/props (they move most after lineups drop) and confirmed lineups:
python scripts/enrich_fixture.py --slug brazil-vs-norway # refresh odds/props/weather
# add confirmed XI / referee to games/<NNN>-<slug>/context.json if announced
python scripts/snapshot_predictions.py --slug brazil-vs-norway --label dayofpython scripts/pred_drift.py --slug brazil-vs-norway # earliest baseline vs latestEach moved question is tagged:
- ODDS-DRIVEN — the sharp 1X2/totals line moved → justified.
- LINEUP-DRIVEN — the sharp prop line moved or the referee changed → justified.
- MODEL-DRIFT ⚠ — the number moved with no market signal → a code change or a gut lean.
Review every MODEL-DRIFT flag; the memories say gut overrides are −EV, so only keep it if a
code fix explains it.
Writes
analysis/drift-<NNN>-<slug>.md.
python scripts/readiness.py # kickoff countdown, markets open?, baseline?, odds age, lineups→ predictions/baselines/INDEX.md, sorted by kickoff (next game on top).
The manual lane is the honest numbers you enter by hand (match by question text, not row
position). The two bot lanes fire via the API — only when you say so, per game (never the
--today batch early). After firing, snapshot the final state:
python scripts/snapshot_predictions.py --slug brazil-vs-norway --label finalpython scripts/pred_drift.py --all --since 2026-07-04Rolls up drift by family × cause: which markets move most day-of, whether odds moves are
systematic (favourites shorten? unders firm?), and whether our MODEL-DRIFT is +EV or noise. Feed
findings into python -m bot calibrate and the lane strategy.
- Never fire stale. If
readiness.pyshows odds age > a few hours, refresh before firing. - Confirmed info only overrides the baseline day-of (lineups / sharp odds), never gut leans.
- Dry-run first, always; submit only on an explicit per-game instruction.