{
 "book_line_hash": "sha256(json.dumps(line without \"link\", sort_keys=True, ensure_ascii=False).encode(\"utf-8\"))",
 "conformance_versions": [
  {
   "commit": "749edb0",
   "file": "tools/archive/conformance-e1f929a9.py",
   "published": "2026-10-21",
   "sha256": "e1f929a9fea7a831a4ed9991d72b93487af6e6c5351140b193f299181663db2e",
   "version": "1"
  },
  {
   "commit": "e87f4df",
   "file": "tools/archive/conformance-b2f415b9.py",
   "published": "2026-10-21",
   "sha256": "b2f415b9083d7bfdac6be312523f7ac1f3d1c40b428cd772840bdf42ab981b18",
   "version": "2"
  },
  {
   "commit": null,
   "current": true,
   "file": "tools/conformance.py",
   "published": "2026-10-22",
   "sha256": "d20cdb7507c666ea76bca7aca4d0955bb686273237460e9661d0b722967fc92d",
   "version": "3"
  }
 ],
 "dependencies": "standard library only",
 "exit_code_note": "exit 1 can come with a holding chain when a roster line reports a seat not asked (closed-book run, line 37): a note about the data",
 "last_run": {
  "replay_brier": "replay_brier.py on the files of this build: 10184 values checked, 10184 exact, 0 within rounding, 0 different (296 counted rows, 11 seats)",
  "replay_brier_result": {
   "checked": 10184,
   "checked_at": "2026-10-22T15:39:55Z",
   "different": 0,
   "exact": 10184,
   "rows_counted": 296,
   "seats": 11,
   "within_rounding": 0
  }
 },
 "license": "CC BY 4.0",
 "network": "verify_all.py: none (local files only). verify_chain.py and replay_brier.py read an http(s) address when given one; with local paths they use no network",
 "python": ">=3.9",
 "run": "python3 -I",
 "run_seals": "python3 -I -c \"import sys; sys.path.insert(0, 'tools'); import seals, seals_asks; seals.ISSUES_DIR = '<DIR>'; sys.exit(seals_asks.main(['verify']))\"",
 "scoring_code": "arena-code.json",
 "seals_modules": [
  {
   "file": "tools/seals.py",
   "note": "comments stripped; logic identical to engine seals.py at 1063527",
   "sha256": "93e7cde66d96b7eb714acc2ea1c274f662c7557e4586b6c778b04c542349423f"
  },
  {
   "file": "tools/seals_asks.py",
   "note": "comments stripped; logic identical to engine seals_asks.py at b8fa0c8",
   "sha256": "7ed3b075c308d3c827461956a24b0a735160ea0508302c9e027fc009044d7240"
  },
  {
   "file": "tools/seals_open.py",
   "note": "comments stripped; logic identical to engine seals_open.py at 744f0bc",
   "sha256": "7a68f5cb45b3c3c49b182d145aa769b453e6f82a58265ad78916d571e372fd06"
  },
  {
   "file": "tools/seals_part2.py",
   "note": "comments stripped; logic identical to engine seals_part2.py at 4fc76ab",
   "sha256": "dc673c092f4097f0933c1180853dff869b9ca9c157d7d4a80358487b0be57649"
  },
  {
   "file": "tools/seals_rekor.py",
   "note": "comments stripped; logic identical to engine seals_rekor.py at e97818f",
   "sha256": "f94f8c9cf017287f47699939720e9f33a6d4586c03454babca41800337d79f9e"
  },
  {
   "file": "tools/seals_tsa.py",
   "note": "comments stripped; logic identical to engine seals_tsa.py at c050cba",
   "sha256": "c08a02396762136600960593d82432e81d9dcec0185560acc02dc12565dd409f"
  },
  {
   "file": "tools/forecasts.py",
   "note": "comments stripped; logic identical to engine forecasts.py at 8e878da",
   "sha256": "28b95ab34d5a50bcf0102d99c6e14a42a40c5493d7fc8c0edd08eec161762e94"
  },
  {
   "file": "tools/conductor.py",
   "note": "reduced helper module, not a copy of the engine's conductor.py",
   "sha256": "225535e626a728e225122ce44105449794655173f7bc7a5ee01dadb5a58a5a28"
  }
 ],
 "tools": [
  {
   "checks": "the hash chain of council-book.jsonl or asks.jsonl: every line's link, seal, number and prev",
   "file": "tools/verify_chain.py",
   "sha256": "421508e8657d93fa34fa666bd9a9d21d283f291332cc5ff65a6faa07ebe5650b"
  },
  {
   "checks": "one command for the whole release: sha256 of every file by release-manifest.json, both chains, the recount, the conformance, the asks-book seals",
   "file": "tools/verify_all.py",
   "sha256": "136383dd85a3092110fd4334b175ca7514f1c569846f5dce80ddfaf922fd1e74"
  },
  {
   "checks": "recounts the seats' Brier, the consensus, the draw flag and the event ids from council-forecasts.csv and council-book.jsonl",
   "file": "tools/replay_brier.py",
   "sha256": "a2e71939fb6648ae5c91fa112669447e851b398bea9c0063769efa8cd5fccbae"
  },
  {
   "checks": "checks every row of a league CSV against event-contract.schema.json",
   "file": "tools/conformance.py",
   "sha256": "d20cdb7507c666ea76bca7aca4d0955bb686273237460e9661d0b722967fc92d"
  },
  {
   "checks": "the chain of the asks book (every question sent and answer received) and its rosters; needs tools/seals.py beside it",
   "file": "tools/seals_asks.py",
   "sha256": "7ed3b075c308d3c827461956a24b0a735160ea0508302c9e027fc009044d7240"
  },
  {
   "checks": "the chain of the short-question book and every stamped list against its OpenTimestamps file; the same modules as the engine",
   "file": "tools/seals.py",
   "sha256": "93e7cde66d96b7eb714acc2ea1c274f662c7557e4586b6c778b04c542349423f"
  }
 ],
 "tsa_signature": "checking a TSA signature needs the system openssl and CA files (not in tools/); without them that step is \"not checked\""
}
