{
    "version": "1.0",
    "title": "ZenHodl vs Pinnacle Closing Line — NHL Playoffs 2026 Calibration Benchmark",
    "published_at": "2026-05-08T13:50:00Z",
    "opponent": "pinnacle",
    "opponent_display_name": "Pinnacle",
    "opponent_tagline": "the canonically-sharpest sportsbook's closing line",
    "scope": {
        "sport": "NHL",
        "window": "2026 Stanley Cup Playoffs Conference Semifinals through Stanley Cup Finals (inclusive)",
        "first_eligible_game_after": "2026-05-08T14:00:00Z",
        "last_eligible_game_before": "2026-06-25T00:00:00Z"
    },
    "snapshot": {
        "timing": "Both predictions captured no later than T-60 minutes before official puck drop",
        "zenhodl_source": "ZenHodl NHL pregame win probability via internal SignalEngine.get_pregame_predictions('NHL')",
        "pinnacle_source": "Pinnacle two-way moneyline (game-winner H2H market) via The Odds API at https://api.the-odds-api.com/v4. Decimal odds are multiplicatively devigged to remove Pinnacle's overround (typically 2-5pp on NHL), producing a true implied probability for the home side.",
        "matching": "Each NHL game matched to its Pinnacle market by team-name resolution (Odds API full team name → ZenHodl tricode via core/api/benchmarks/sports.py NHL_TEAM_MAP). 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='zenhodl_unavailable' or 'polymarket_unavailable' (used as the generic opponent-unavailable status flag) in the public raw.jsonl, with the actual cause in the row's opponent_error field."
    },
    "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_pinnacle": "Pinnacle is the canonically-sharpest sportsbook in the industry — every CLV claim in traditional sports analytics is implicitly benchmarked against Pinnacle's closing line. Their volume is dominated by syndicate bettors and their margins are the lowest in the business. Beating Pinnacle on calibration is the gold-standard demonstration of forecasting skill in a way actual hockey bettors recognize.",
    "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/nhl-playoffs-2026-vs-pinnacle",
        "raw_data_jsonl": "https://zenhodl.net/benchmarks/nhl-playoffs-2026-vs-pinnacle/raw.jsonl",
        "manifest_file": "https://zenhodl.net/benchmarks/nhl-playoffs-2026-vs-pinnacle/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."
}
