Skip to content

Latest commit

 

History

History
71 lines (61 loc) · 3.52 KB

File metadata and controls

71 lines (61 loc) · 3.52 KB

Workflow — Baselines & drift ("price all incoming games, save, diff before each game")

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.

Why

  • 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).

The loop (per game)

1. T-24h+ — save the baseline

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 game

Writes 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.

2. T-2h — refresh inputs & re-snapshot

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 dayof

3. Diff — see what changed and why

python scripts/pred_drift.py --slug brazil-vs-norway         # earliest baseline vs latest

Each 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.

4. Check the board

python scripts/readiness.py     # kickoff countdown, markets open?, baseline?, odds age, lineups

predictions/baselines/INDEX.md, sorted by kickoff (next game on top).

5. Fire — only on explicit go-ahead

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 final

Pattern review (every couple of days)

python scripts/pred_drift.py --all --since 2026-07-04

Rolls 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.

Guardrails

  • Never fire stale. If readiness.py shows 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.