Verification gates (every cloud run)
- GATE 1 —
pytest tests/incl. the leakage guard (shift(1) contract). - GATE 2 —
scripts/math_checks.py: Phi numerics, cumsum identity (max-diff 0.00e+00 expected), spread-sign on freshly fetched data. - GATE 3 —
scripts/validate_results.py: file presence, row counts, metric ranges, JSON schema. Fail-closed: any gate red = no deploy. - GATE 4 — post-deploy HTTP checks on the published URLs.
No gate outputs committed yet for the latest run.
How to reproduce (any machine, cloud or local)
git clone <this repo> pip install -r requirements.txt python scripts/fetch_nflverse.py python -m pytest tests -q python scripts/math_checks.py python scripts/backtest_markets.py python scripts/validate_results.py python scripts/build_site.py --out dist
Embed contract
Any dashboard can embed these views without modifying itself:
<iframe src="https://abet-nfl-models.pages.dev/embeds/models.html"></iframe> <iframe src="https://abet-nfl-models.pages.dev/embeds/math.html"></iframe>
Machine-readable status: /data/latest.json. No auth, no cookies, no external
runtime dependencies (KaTeX is served same-origin from vendor/).
Honest limitations
- Pure models do NOT beat closing lines: spread MAE margin ≈10.6 vs market ≈9.8; totals ≈10.9 vs 10.4. Hybrid variants (closing line as a feature) match the line by construction.
- Prop probabilities vs real book lines are untested (no historical prop lines in nflverse); evaluation is vs the player's own trailing mean.
- Interception-like stats are near-noise (corr ≈0.15) — sigma floors flag them unreliable.