{
  "apiVersion": "1",
  "generatedAt": "2026-11-15T02:26:20.239Z",
  "mode": "published-snapshot",
  "live": false,
  "data": {
    "schemaVersion": 1,
    "asOf": "2026-11-08T18:04:23Z",
    "status": "experimental",
    "validated": false,
    "deploymentApproved": false,
    "researchGatePassed": true,
    "notice": "Retrospective holdout only. A passed research gate is not prospective validation and is not a betting recommendation.",
    "trainingSource": "public-ufcstats-mirror",
    "includeAge": true,
    "ageFeatures": [
      "age",
      "age_sq",
      "over_35"
    ],
    "dataAudit": {
      "UFC": {
        "bouts": 8988,
        "events": 796,
        "boutsWithPairedStrikingStats": 8967,
        "firstEvent": "1994-03-11T00:00:00+00:00",
        "lastEvent": "2026-11-07T00:00:00+00:00",
        "sidesWithDob": 17669,
        "dobCoverage": 0.9829216733422341
      },
      "PFL": {
        "bouts": 0,
        "events": 0,
        "boutsWithPairedStrikingStats": 0,
        "firstEvent": null,
        "lastEvent": null
      }
    },
    "sourceCrosswalk": {
      "source": "research/elo_baseline/raw",
      "commit": "c742842f29466758fedc3906dbad28d6d320a8da",
      "note": "Public UFCStats mirror. The private cache was not used."
    },
    "availabilityLimitation": "Public UFCStats mirror pinned at Greco1899 commit c742842f29466758fedc3906dbad28d6d320a8da. Not the private Sportradar-enriched cache. Dates of birth are the tale-of-the-tape profile values.",
    "method": "Separate promotion logistic models; prior-event-day statistics; 60/10/10/20 chronological partitions; tuning then temperature calibration then untouched test. Fight-night age (years, years squared, over 35) is included unless --no-age. Research gate: walk-forward elo-tuned-v1 (K=64, new-fighter boost 1, tau 4, finish bonus 0.25, inactivity 0.10/year) on the same event-level holdout, paired event-cluster bootstrap of 2000 draws (seed 71). Passes only if the upper 95% CI of (model - tuned Elo) log loss is below 0. validated stays false unless that passes. An existing model file is replaced only when that gate passes. Descriptive K=32 Elo and coin-flip Brier intervals still use 1000 event-day resamples and do not open the gate.",
    "models": {
      "UFC": {
        "promotion": "UFC",
        "status": "experimental_retrospective",
        "validated": false,
        "deploymentApproved": false,
        "researchGatePassed": true,
        "reason": "Retrospective holdout only. A passed research gate is not prospective validation and is not a betting recommendation.",
        "includeAge": true,
        "ageFeatures": [
          "age",
          "age_sq",
          "over_35"
        ],
        "trainedThrough": "2021-04-17",
        "calibratedThrough": "2023-03-04",
        "chosenC": 0.01,
        "temperature": 1.0707406377762307,
        "eligibleBouts": 3879,
        "decisiveBouts": 8832,
        "split": {
          "train": {
            "bouts": 1884,
            "days": 426,
            "first": "1994-03-11",
            "last": "2019-06-01"
          },
          "tune": {
            "bouts": 414,
            "days": 79,
            "first": "2019-06-08",
            "last": "2021-04-17"
          },
          "calibrate": {
            "bouts": 515,
            "days": 79,
            "first": "2021-04-24",
            "last": "2023-03-04"
          },
          "test": {
            "bouts": 1066,
            "days": 159,
            "first": "2023-03-11",
            "last": "2026-11-07"
          }
        },
        "test": {
          "bouts": 1066,
          "logLoss": 0.6440078895723265,
          "brier": 0.22540647667046992,
          "accuracy": 0.6407129455909943
        },
        "testCoverage": 0.5506198347107438,
        "testEventDays": 159,
        "baselines": {
          "coinFlip": {
            "bouts": 1066,
            "logLoss": 0.6931471805599453,
            "brier": 0.25,
            "accuracy": 0.5
          },
          "tunedElo": {
            "logLoss": 0.6603929513763138,
            "brier": 0.23401011785078424
          }
        },
        "gate": {
          "baseline": "elo-tuned-v1",
          "passed": true,
          "n": 1066,
          "events": 159,
          "matchRate": 1,
          "logLossDifference": -0.016385061803987355,
          "logLossDifference95CI": [
            -0.029731368880190075,
            -0.002255792816750528
          ],
          "brierDifference": -0.008603641180314342,
          "brierDifference95CI": [
            -0.014690327898814769,
            -0.002443106412677644
          ],
          "model": {
            "logLoss": 0.6440078895723265,
            "brier": 0.2254064766704699
          },
          "eloTuned": {
            "logLoss": 0.6603929513763138,
            "brier": 0.23401011785078424
          },
          "cluster": "event",
          "bootstrapDraws": 2000,
          "bootstrapSeed": 71
        }
      },
      "PFL": {
        "promotion": "PFL",
        "status": "insufficient_history",
        "eligibleBouts": 0,
        "decisiveBouts": 0,
        "split": {
          "train": {
            "bouts": 0,
            "days": 0,
            "first": null,
            "last": null
          },
          "tune": {
            "bouts": 0,
            "days": 0,
            "first": null,
            "last": null
          },
          "calibrate": {
            "bouts": 0,
            "days": 0,
            "first": null,
            "last": null
          },
          "test": {
            "bouts": 0,
            "days": 0,
            "first": null,
            "last": null
          }
        },
        "minPriorDecisiveBouts": 3,
        "minRecentStatBouts": 2,
        "validated": false,
        "deploymentApproved": false,
        "includeAge": true,
        "ageFeatures": [
          "age",
          "age_sq",
          "over_35"
        ],
        "reason": "Too few eligible bouts/classes in one or more chronological partitions."
      }
    },
    "candidateModels": {
      "FightMatrix": {
        "enabled": false,
        "researchGatePassed": false,
        "checkedAt": "2026-11-11",
        "reason": "Not enabled: the published-model refit did not beat tuned Elo with sufficient confidence on its 1,070-bout holdout. Existing experimental UFC estimates remain available.",
        "holdoutBouts": 1070,
        "eventDays": 159,
        "modelLogLoss": 0.6586688812261089,
        "tunedEloLogLoss": 0.6609557428086501,
        "logLossDifference95CI": [
          -0.019702954975962313,
          0.01613134441089912
        ],
        "prospectivelyValidated": false
      }
    }
  }
}
