{
  "title": "Snooker position evaluator — frozen public evidence",
  "observed_at": "2026-10-22T11:55:00Z",
  "published_at": "2026-10-27",
  "source": "Retained frame-eval-20261022 report and calibration SVG, recorded 22 October 2026",
  "source_sha256": {
    "frame_eval_20261022_report": "23f544fc74452ac5f55143494512dacc7a796f40a3d9a4fce94202955e0aeef7",
    "calibration_svg": "4cdab08b18fd4b69a101f98f33890b56e91f05f44ffe8c3fe4cc9e05ffd66ed9",
    "demo_readme": "5a82f5470c9d4fba5f772b13f479ab31e5c7f612873bd822d5050d82a39d63ff"
  },
  "scope": "Historical offline research snapshot, not a live-service or current-dataset benchmark. Later filtering and model changes are not included.",
  "population": {
    "source_stills": 129451,
    "source_videos": 457,
    "scored_positions": 77885,
    "scored_frames": 2067,
    "unit": "One eligible observation per shot; positions from a frame share its outcome."
  },
  "method": {
    "evaluation": "Five-fold match-grouped out-of-fold evaluation; same-match and same-player-pair videos remain together.",
    "intervals": "Paired percentile intervals from 1000 bootstrap resamples of whole matches.",
    "score": "Mean log loss in nats per eligible position; lower is better.",
    "target": "Probability that the player to move wins the frame; the replay converts this to named-player probabilities.",
    "labels": "Outcomes inferred from broadcast score-bar evidence and frame-boundary checks, not a fully human-adjudicated benchmark.",
    "hindsight": "The retained replay uses some within-frame smoothing and per-video information. It is not a strictly causal online test."
  },
  "models": [
    { "label": "Base rate", "log_loss": 0.6292 },
    { "label": "Score only", "log_loss": 0.4799 },
    { "label": "Score + layout", "log_loss": 0.4710 },
    { "label": "Score + layout + visit", "log_loss": 0.4698 }
  ],
  "layout_gain": {
    "definition": "Score-only tree log loss minus score-plus-layout tree log loss; positive means improvement.",
    "value": 0.0089,
    "interval_95": [0.0074, 0.0106],
    "mean_probability_change_percentage_points": 4.4,
    "share_positions_change_over_10_percentage_points": 0.115
  },
  "slices": [
    { "label": "All positions", "positions": 77885, "gain": 0.0089, "interval_95": [0.0074, 0.0106] },
    { "label": "Reds phase", "positions": 69945, "gain": 0.0078, "interval_95": [0.0063, 0.0094] },
    { "label": "Colours phase", "positions": 7940, "gain": 0.0185, "interval_95": [0.0132, 0.0237] },
    { "label": "Score-only 20–80%", "positions": 45316, "gain": 0.0114, "interval_95": [0.0091, 0.0135] }
  ],
  "calibration": {
    "definition": "Ten equal-width probability bins. Bin means and counts transcribed from the retained source SVG tooltips, rounded there to three decimals. No intervals are implied.",
    "score_only": [
      [0.033, 0.034, 2356], [0.155, 0.171, 1494], [0.255, 0.283, 2458],
      [0.352, 0.383, 3416], [0.456, 0.456, 5777], [0.551, 0.552, 13803],
      [0.644, 0.644, 10161], [0.748, 0.739, 9701], [0.848, 0.842, 10454],
      [0.967, 0.964, 18265]
    ],
    "score_layout": [
      [0.037, 0.030, 2332], [0.155, 0.166, 1852], [0.252, 0.275, 2570],
      [0.352, 0.362, 3300], [0.461, 0.473, 7712], [0.546, 0.541, 10777],
      [0.651, 0.647, 9909], [0.749, 0.740, 10256], [0.850, 0.848, 10566],
      [0.967, 0.967, 18611]
    ]
  },
  "demo": {
    "match": "Neil Robertson v Stuart Bingham, Players Championship 2025, last 16",
    "frame": "Eighth frame; Bingham led the match 4–3",
    "story": "Robertson trailed 29–66, recovered from needing snookers and won the frame 67–66.",
    "prediction_kind": "Out-of-fold research replay, with some within-frame smoothing; selected as an illustrative comeback, not an average-case performance test."
  }
}
