{
  "version": "1.1",
  "title": "ZenHodl vs Polymarket Consensus — NBA Playoffs 2026 Calibration Benchmark",
  "published_at": "2026-05-04T20:00:00Z",
  "scope": {
    "sport": "NBA",
    "window": "2026 Conference Semifinals through Finals (inclusive)",
    "first_eligible_game_after": "2026-05-05T00:00:00Z",
    "last_eligible_game_before": "2026-06-25T00:00:00Z"
  },
  "snapshot": {
    "timing": "Both predictions captured no later than T-60 minutes before official tip-off",
    "zenhodl_source": "ZenHodl pregame win probability via internal SignalEngine.get_pregame_predictions('NBA')",
    "polymarket_source": "Polymarket NBA game-winner market YES-side mid price (best bid + best ask) / 2, fetched from clob.polymarket.com",
    "matching": "Each NBA game matched to its Polymarket market by team names + game date. Matching script published in this repo so the join is auditable.",
    "tie_handling": "If either source is unavailable at T-60, the game is excluded from BOTH model's metrics. Recorded with status='polymarket_unavailable' or 'zenhodl_unavailable' in the public raw.jsonl."
  },
  "metrics": {
    "headline": "Expected Calibration Error (ECE), 10 equal-width bins",
    "auxiliary": [
      "Brier score",
      "Log loss",
      "Accuracy"
    ],
    "ece_formula": "Sum over bins of |bin_avg_pred - bin_avg_outcome| weighted by bin sample fraction",
    "confidence_interval": "95% bootstrap CI on ECE with 1000 resamples, published alongside point estimate"
  },
  "why_polymarket": "Polymarket's market price represents the consensus probability of every smart-money trader actively wagering real capital. Beating it on calibration is the canonical hedge-fund-grade benchmark for any sports forecasting model, equivalent to closing-line value (CLV) in traditional sports analytics.",
  "model_versioning": {
    "policy": "ZenHodl model weights as deployed at T-60 of each game are what counts. Each prediction row in raw.jsonl includes the model version ID so post-hoc retrains do not invalidate prior predictions.",
    "retrains_during_window": "Permitted. Disclosed in the per-game row's model_version field."
  },
  "publication": {
    "live_url": "https://zenhodl.net/benchmarks/nba-playoffs-2026",
    "raw_data_jsonl": "https://zenhodl.net/benchmarks/nba-playoffs-2026/raw.jsonl",
    "manifest_file": "https://zenhodl.net/benchmarks/nba-playoffs-2026/manifest.json",
    "we_publish_when_we_lose": true
  },
  "rule_changes": "Once this manifest's SHA-256 hash is broadcast on Polygon, the rules above are frozen. If ZenHodl edits this file at any later point, the on-chain hash will not match the served file. Anyone can verify by hashing the served manifest.json and comparing to the on-chain transaction data field."
}
