{
  "buildVersion": "1.00",
  "generatedAt": "2026-07-12T17:04:08+08:00",
  "plan": {
    "storage": "data/snapshots/YYYY-MM-DDTHHMMSS+0800/",
    "immutability": "write-once; never overwrite a prior cutoff",
    "hashes": "SHA-256 manifest per snapshot",
    "cutoffSafety": "reject source publication/fetch timestamps after the forecast cutoff",
    "missingData": "remain null; no interpolation in historical snapshots",
    "lifecycleFreeze": "stop forecast cron at poll close; results mode is separate"
  },
  "blindValidation": {
    "cutoffs": [
      "multiple pre-election dates",
      "pre-nomination",
      "nomination-confirmed",
      "campaign",
      "election-day pre-close"
    ],
    "baselines": [
      "previous winner unchanged",
      "uniform swing",
      "incumbent-party baseline",
      "historical-only",
      "without news",
      "without candidate effects",
      "without transfer effects",
      "full model"
    ],
    "metrics": [
      "winner accuracy",
      "seat-total error",
      "Brier score",
      "log loss",
      "calibration bands",
      "seat flips by evidence layer",
      "news incremental value",
      "random-seed sensitivity"
    ],
    "publicationRule": "Downgrade or block a model that does not outperform mandatory simple baselines."
  }
}
