{
 "generated_at": "2026-08-29T00:22:58-05:00",
 "generator": "scripts/export_portfolio_summary.py",
 "models": {
  "checkpoints": [
   {
    "definition": "end of the 1st quarter",
    "id": "Q1"
   },
   {
    "definition": "halftime",
    "id": "half"
   },
   {
    "definition": "end of the 3rd quarter",
    "id": "Q3"
   }
  ],
  "holdout": {
   "definition": "the newest 25% of slate dates in the historical dataset, locked before any v2 selection: model and calibration were chosen and fitted on the older 75% only, and this window was evaluated exactly once. Disjoint from training by construction and from the prospective sample by date (the dataset ends 2026-08-01; the prospective sample starts 2026-08-18).",
   "games": null,
   "log_loss": {
    "Q1": {
     "n": 127,
     "v1": 0.591,
     "v2": 0.573
    },
    "Q3": {
     "n": 127,
     "v1": 0.448,
     "v2": 0.453
    },
    "half": {
     "n": 126,
     "v1": 0.488,
     "v2": 0.473
    }
   },
   "provenance": {
    "commit": "4ad529ac08fb1ed3d350a9a236f9eb35c6710c89",
    "file_sha256": "3be1a581b1d50b6497268e5b7291dd46fe55daeea95f53bd319e7478658aff08",
    "how": "read from file",
    "key": "checkpoints.<cp>.locked / locked_v1",
    "path": "docs/research/inplay_prior_v2/v2_training_report.json"
   }
  },
  "training": {
   "games": 503,
   "provenance": [
    {
     "commit": "4ad529ac08fb1ed3d350a9a236f9eb35c6710c89",
     "file_sha256": "3c4eca625d7baa982eea353f9de29bf425219850d3659dc0b3494cae9b69cdde",
     "how": "read from file",
     "key": "503 games / 1,493 observations, reconciles: true",
     "path": "docs/research/inplay_prior_v2/checkpoint_coverage.json"
    }
   ],
   "seasons": [
    2025,
    2026
   ]
  },
  "type": "logistic regression",
  "versions": {
   "v1": {
    "features": [
     "score_diff",
     "net_rating_diff",
     "elo_diff"
    ],
    "provenance": {
     "commit": "7d8c0c07c97a723019dc6a8cfd12ee4513206494",
     "file_sha256": "9de37454fc67b359ac1ef47c265e6ee1151cd649d57a7362e712915e87b4e537",
     "how": "read from file",
     "key": "features",
     "path": "artifacts/inplay/inplay_q1_v1.json"
    }
   },
   "v2": {
    "features": [
     "score_diff",
     "prior_logit"
    ],
    "provenance": {
     "commit": "7d8c0c07c97a723019dc6a8cfd12ee4513206494",
     "file_sha256": "e7359016ec0080d04850f4a8ea33e9e4075aebac2b4c12c048d60e863b9abfd7",
     "how": "read from file",
     "key": "features",
     "path": "artifacts/inplay/inplay_q1_v2.json"
    }
   }
  }
 },
 "negative_results": [
  {
   "detail": "sportsbook closing-line log loss 0.586 vs the only prospectively executable pregame model at 0.648 (shared n=359 games); clean_beats_market_log_loss: false; every model-vs-market date-block paired bootstrap interval (10,000 resamples) spanned zero and the pre-registered pregame promotion criteria were never met -- nothing pregame was ever promoted or scheduled",
   "provenance": [
    {
     "commit": "4ad529ac08fb1ed3d350a9a236f9eb35c6710c89",
     "file_sha256": "4ac122aa79c95097fe66b1ef86057058cf81b85e3bd374b5006febd42debbc5a",
     "how": "read from file",
     "key": "clean_beats_market_log_loss / log_loss",
     "path": "docs/research/v41d_baseline/postfix_ablation_star_missing_diff.json"
    },
    {
     "commit": "4ad529ac08fb1ed3d350a9a236f9eb35c6710c89",
     "file_sha256": "40bee0ceb10890d51223ba97ccf3dd2ef07ad86621b7aae6fcc7268370965df7",
     "how": "read from file",
     "key": "market-close-baseline.forecast_metrics.log_loss",
     "path": "docs/research/v41d_baseline/postfix_shared_sample_metrics.json"
    },
    {
     "commit": "c64b099235626cfd857b39ab8289a2e26b976561",
     "file_sha256": "cbaabc85613e652b886e5bb478065856692988bb1152e047e50ac91e53d039cc",
     "how": "read from file",
     "key": "bootstrap table (10,000 resamples; 1 of 21 intervals excludes zero)",
     "path": "docs/phase2_baseline_selection.md"
    }
   ],
   "statement": "Pregame models did not beat closing lines"
  }
 ],
 "notes": [
  "market-midpoint metrics cover n=82 of the 83 settled checkpoints (invalid two-sided quotes are omitted, never clipped); on the matched n=82 subset the v2 log loss is 0.338",
  "an earlier (pre-date-fix) freeze in docs/phase2_baseline_selection.md shows market close log loss 0.5940 vs models 0.6388-0.6583; the post-date-fix archive is the authoritative version per docs/research/v41d_baseline/INDEX.md (non-frozen values: none)",
  "comparison block is null: no statistical test of prospective v2 vs the market midpoint exists or is preregistered; the registered forward test is the paired v1-vs-v2 promotion gate set in model/inplay/train_v2.py::PROMOTION_GATES (a different comparison), not yet reached",
  "holdout.games is null: the locked window's distinct-game count is not recorded as a single field; per-checkpoint n (one game each) is 127 / 126 / 127",
  "pipeline counts describe the archived prospective paired-era window only, not lifetime database totals (which live in the production database and are not readable from this machine)",
  "test counts are the release-gate registration; the full repository holds 61 suites / 1,785 test functions including research-gate and CI-only integration suites"
 ],
 "pipeline": {
  "collection_window": {
   "end": "2026-08-27",
   "start": "2026-08-18"
  },
  "frame_definition": "one recorded Polymarket websocket event -- a full order-book snapshot, a price-change delta, or a stream-reset marker -- stamped at arrival",
  "frames_archived": 20724533,
  "frames_archived_display": "20.7M",
  "games_collected": 28,
  "guards": "fail-closed freshness guards",
  "parse_errors": 0,
  "provenance": [
   {
    "commit": null,
    "file_sha256": null,
    "how": "counted from the per-slate stream-audit records (gitignored local research data, derived from the immutable snapshot data/v2_swing_snapshot)",
    "key": "sum of frames_total / parse_errors / monotonic_violations over *.audit.json",
    "path": "data/v2_swing_study/cache_tracked"
   },
   {
    "commit": "9f26f2b291c19d93263424062c5cf11cc37e2bd9",
    "file_sha256": "abd37e5e23dcb3c405a4a536249813212d709011a523b4ae302d258181e58cb6",
    "how": "read from file",
    "key": "services.postgres.image",
    "path": ".github/workflows/tests.yml"
   },
   {
    "commit": "4ad529ac08fb1ed3d350a9a236f9eb35c6710c89",
    "file_sha256": "8b94f8e949cab40152e90627ae562822dc5b45b5e987cb7642f64a5338705865",
    "how": "read from file",
    "key": "job lines",
    "path": "deploy/cron.template"
   },
   {
    "commit": "b3e03359d05e320c2a7dfac9e014ced941bd105e",
    "file_sha256": "73445d59adac6769e41059ee635fc7da31e6864a1096b0781f92325b013cffd3",
    "how": "read from file",
    "key": "MAX_GAME_STATE_AGE / MAX_MARKET_BOOK_AGE",
    "path": "model/inplay/freshness.py"
   }
  ],
  "scheduler": "cron on a Linux VPS",
  "sequence_errors": 0,
  "slates": 10,
  "storage": "PostgreSQL 17"
 },
 "prospective": {
  "brier": {
   "market_midpoint": 0.11,
   "v2": 0.103
  },
  "checkpoint_breakdown": {
   "Q1": 28,
   "Q3": 27,
   "half": 28
  },
  "comparison": {
   "ci95_diff": null,
   "method": null,
   "p_value": null,
   "preregistered": false,
   "resamples": null
  },
  "fingerprint": "dd4e1543b71acec11b1da85c16b0f63128615279105d0ccfbfcc3c2a64687a1b",
  "frozen": true,
  "frozen_at": "2026-08-28",
  "games": 28,
  "log_loss": {
   "market_midpoint": 0.35,
   "v2": 0.333
  },
  "market_definition": "midpoint-normalised two-token probability from the frozen order-book quotes at the checkpoint decision instant: mid_home / (mid_home + mid_away), valid only when both tokens carry finite 0<=bid<=ask<=1 quotes",
  "n": 83,
  "n_unit": "game-checkpoints (one evaluated frozen v2 decision per game per checkpoint; all settled)",
  "paper_only": true,
  "provenance": [
   {
    "commit": "a5e76fe0cd4a3aa7a4e4a9c3ed2daf08d9a2b12b",
    "file_sha256": "dd4e1543b71acec11b1da85c16b0f63128615279105d0ccfbfcc3c2a64687a1b",
    "how": "read from file",
    "key": "exploratory_sample / analysis_through",
    "path": "experiments/v2_swing_prereg.json"
   },
   {
    "commit": null,
    "file_sha256": null,
    "how": "counted from data/v2_swing_snapshot/*/inplay_forecasts.jsonl and live_game_state.jsonl (immutable local copy of the production slate archives); log loss/Brier computed by this script from those frozen records",
    "key": "n / checkpoint_breakdown / log_loss / brier",
    "path": "data/v2_swing_snapshot"
   }
  ],
  "sample_definition": "every non-abstained frozen v2 decision recorded live during the paired-era slates 2026-08-18 to 2026-08-27 (origin LIVE_SHADOW), one per (game, checkpoint); the sample boundary is registered in experiments/v2_swing_prereg.json (analysis_through 2026-08-28T03:38:12.311768+00:00)",
  "slates": 10
 },
 "release": {
  "ci_database": "postgres:17",
  "manifest": "per-release sha256 manifest of every staged file, plus a deterministic archive sha256",
  "provenance": [
   {
    "commit": "9f26f2b291c19d93263424062c5cf11cc37e2bd9",
    "file_sha256": "5a549f131f88fcd60a33ed29de9dca7d481280f94c77d429b653e7ceaa4f5c71",
    "how": "read from file",
    "key": "UNIT_SUITES (counted: suites and 'def test_' functions per registered file)",
    "path": "deploy/build_release.sh"
   },
   {
    "commit": "9f26f2b291c19d93263424062c5cf11cc37e2bd9",
    "file_sha256": "abd37e5e23dcb3c405a4a536249813212d709011a523b4ae302d258181e58cb6",
    "how": "read from file",
    "key": "unit / migrations / research jobs",
    "path": ".github/workflows/tests.yml"
   }
  ],
  "reproducible_bundles": true,
  "secret_scan": true,
  "suites": 53,
  "tests": 1600
 },
 "repo": {
  "head_commit": "e07861455ce72d3a3160c1a22c728a5ee54ae23f",
  "name": "Xilithh/wnba-model",
  "worktree_clean": false
 },
 "schema_version": "1.0",
 "sources": {
  "espn": {
   "label": "ESPN game state",
   "method": "HTTP polling",
   "poll_interval_seconds": 15.0,
   "provenance": {
    "commit": "2dcea679eb743f5b6ed893d1fd4f395904072388",
    "file_sha256": "96851544baedf93d40a73157bd626b07c4c79fa6f1a44d26b753f23b84f3533b",
    "how": "read from file",
    "key": "start(state_interval=...)",
    "path": "model/inplay/stack.py"
   }
  },
  "polymarket": {
   "channel": "wss://ws-subscriptions-clob.polymarket.com/ws/market",
   "label": "Polymarket order books",
   "method": "WebSocket",
   "provenance": {
    "commit": "0678ba4b1ebbcf58ceaa6717198b1f978d64eaf2",
    "file_sha256": "8c22a6cdb9c60208d3068690164a783de10dc64e39a4dbb716436e856b16e845",
    "how": "read from file",
    "key": "WS_URL",
    "path": "ingest/inplay/live_market.py"
   }
  },
  "sportsbook_prior": {
   "label": "Sportsbook pregame line",
   "provenance": {
    "commit": "35b79f57f390f5159c42b005e4bf2c1eba06e728",
    "file_sha256": "99fd1fdf362dce5ca8642993037f15f83e586b45308d8bf8b7b158e8753c7c2b",
    "how": "read from file",
    "key": "module docstring (prior rule)",
    "path": "model/inplay/train_v2.py"
   },
   "source_description": "pregame moneyline consensus across sportsbooks, de-vigged per book and averaged; Elo fallback when no pre-tip price exists"
  }
 }
}
