# Sealed 2026 state legislative forecasts No state legislative model has passed its gate (`stateleg_swing05_result.md` and earlier), so the 2026 forecasts were sealed, not published. **From 2026-10-15 the forecast is published** as an initial version (owner's decision; model 0.7, https://futureballot.com/state-legislatures) and each day's published forecast is sealed as before, so the scored seal is of the published version. Each forecast's SHA-256 is timestamped with the public OpenTimestamps calendars (`SHA256SUMS.txt.ots` beside it on FutureBallot's server, `data/stateleg/sealed//`), and the hash is recorded here. The contents are released after election day so anyone can check them against these hashes and the timestamps. **Which one is scored:** the last seal made before 2026-11-03 00:00 Pacific. Earlier seals stay listed; they are not withdrawn. | Sealed (UTC) | Model | forecast.json SHA-256 | |---|---|---| | 2026-10-13T16:56:54Z | stateleg_swing/0.5 | `1e0728fa76f87451a996b65fe648aa2d494c647a3a7c34b3eb4e0d093b00fb7a` | Coverage of the first seal: chambers whose districts are multi-member, nonpartisan or ranked-choice, or whose 2026 candidate field is not yet known, are given as a range of control probabilities with those seats assigned to each party in turn. **From the evening of 2026-10-14, every contest is forecast.** The sealed bundle adds, beside 0.5's single-member districts: multi-member districts (`stateleg_multimember_check.json`), redrawn districts from a rebuilt previous result, and Nebraska and Alaska contests with an independent contender from the 2026 primary (`stateleg_primary_check.json`); see the reviewers' overview, section 3a. Each district's `status` in `forecast.json` says which: `modelled`, `modelled (multi-member)`, `modelled (primary)`, `decided by the ballot`, `not up (holdover)` or `unresolved: `; a redrawn district carries `rebuilt_start`. **From 2026-10-14, a new seal every day** (scheduler job `stateleg-seal`): the official lists are re-read, the race monitor runs, and the forecast is sealed again. Each daily seal's hash is appended to `data/stateleg/sealed/ledger.jsonl` and timestamped like the first; the scored one (the last before election day) will be copied into the table above. A district whose candidate has died, withdrawn, been removed or replaced -- confirmed by two outlets or an official list, and verified -- is unresolved in the seals that follow, with the reason. ## How to check a seal Every seal's `SHA256SUMS.txt` and its proof `SHA256SUMS.txt.ots` are published at https://futureballot.com/review/state-legislatures/seals// as soon as the site is next published (within hours of the seal), together with the ledger of every seal (`seals/ledger.jsonl.txt`). A seal, once published, cannot be withdrawn unnoticed: anyone who has read the list holds it. 1. Download both files for a seal into one folder. 2. `ots upgrade SHA256SUMS.txt.ots` then `ots verify SHA256SUMS.txt.ots` (the OpenTimestamps client, https://opentimestamps.org). This shows that `SHA256SUMS.txt` existed at the time the Bitcoin block records. Proofs are pending for a few hours after a seal, until a calendar's commitment is in a block. 3. `SHA256SUMS.txt` holds one line, the SHA-256 of `forecast.json`. After the election, when `forecast.json` is released, `sha256sum forecast.json` must give the same value. ## Every seal (data/stateleg/sealed/ledger.jsonl) {"made": "20261013T232714Z", "sha256": "424ec1c2d532c305add7878be45ce25406539290ca8a32e6a1603f26ca121ed3", "unresolved_by_monitor": 0} {"made": "20261013T233847Z", "sha256": "832d0ba5c26a4d4afb16d4ed2c717188fbdeb4a57d17d4ae20296b5e1e5a00e6", "unresolved_by_monitor": 0} {"made": "20261014T061601Z", "sha256": "d02065e8de08065e2c323c6dda2be9ecf4ebd8471edb5d6a9e02582991fff288", "unresolved_by_monitor": 0} {"made": "20261014T065249Z", "sha256": "889b477e51b5acabcac678470cd49e9ebbe82a3bdd9b1c7cb04471029f3f5c29", "unresolved_by_monitor": 0} {"made": "20261014T074355Z", "sha256": "f688cc57cb128813f3db4975edd57d45a37df168c1690e1c02b8eb28688744b9", "unresolved_by_monitor": 0} {"made": "20261014T075302Z", "sha256": "2bf1218bd07bde204100224ed3dbf99f5d3519381b6dfcb36fbe0317c0905a43", "unresolved_by_monitor": 0} {"made": "20261014T083534Z", "sha256": "088d5b7e2f0c2e213452467807c835e38ee8d3225d61fd691bdaad214825753c", "unresolved_by_monitor": 0} {"made": "20261014T093135Z", "sha256": "fd056e2f2696c9bcceb3a535c24d90ce8bd21b42933b973c94b8fa562abffe14", "unresolved_by_monitor": 0} {"made": "20261014T103105Z", "sha256": "ac1ca0ff07f617551bee5e302afd054d6f6859aafca86606755ab4b525271b12", "unresolved_by_monitor": 0} {"made": "20261014T112040Z", "sha256": "64392a9c8e90bd7b4200846877457bf413e815cd718e63606044673c0a3d9356", "unresolved_by_monitor": 0} {"made": "20261014T231200Z", "sha256": "8460233888c44780aac0aa4e8ae7c1f08796626b128babec1f8fae7d3437cefa", "unresolved_by_monitor": 0} {"made": "20261015T001332Z", "sha256": "ae2a895d30e69d43a8c013e4002f11a130b18a8893c8c705244bc4fa7b9c50cd", "unresolved_by_monitor": 0} {"made": "20261015T002724Z", "sha256": "be5fe5346160387a9ba105def3aad49cf9d6a81e89c92e13b1720e7112233eee", "unresolved_by_monitor": 0} {"made": "20261015T042413Z", "sha256": "fa7d51270c7d13ba5698d58faad7a0c9c24f6b465b0d878188c54fb4c1ce63ff", "unresolved_by_monitor": 0} {"made": "20261015T130701Z", "sha256": "b0f5bd34c6ab0a223c5048c210b49ec7cebd3f3261c80a935cc4fb9f5421468b", "unresolved_by_monitor": 0} {"made": "20261015T131137Z", "sha256": "145cd6936c86eb82defece815d9e6ee9e34be0159db238a2b5c26ac2a8939546", "unresolved_by_monitor": 0} {"made": "20261015T200708Z", "sha256": "5382dabd42bfd736a62398bcc06566d6bc49b4836d156aae35fea00a46ca5518", "unresolved_by_monitor": 0} {"made": "20261016T002320Z", "sha256": "84dab261d4df71bcc98b46cf80ddf298586b5645362ad52bcf0042bebce99d3d", "unresolved_by_monitor": 0} {"made": "20261017T021213Z", "sha256": "47c0b43da75568a18edd159ad6f496284fa457d6e6df76def80eafd47b6c4b13", "unresolved_by_monitor": 0} {"made": "20261018T020325Z", "sha256": "1ec34364f7e07d2b9fbfecb18318ccf97f4cd1b4985a5e8b6ae3adb5174ef133", "unresolved_by_monitor": 0, "stamped": "ok", "published": true} {"made": "20261019T040531Z", "sha256": "8735adb6e3555dbf4d3cc6e88eccbadcffc3bb4fa3b49adb4fcb111812f56d47", "unresolved_by_monitor": 0, "stamped": "ok", "published": true} {"made": "20261020T064209Z", "sha256": "21206587cfaa77655b34e9ff5a3ffa406b554590b1d5c7cf0462e1fcc7267b02", "unresolved_by_monitor": 0, "stamped": "ok", "published": true} {"made": "20261020T074939Z", "sha256": "d872304ce199974954e2f1a15ca5037c23773dc37f99c5f18564c7985c1b05ee", "unresolved_by_monitor": 0, "stamped": "ok", "published": true} {"made": "20261021T072553Z", "sha256": "2f53bf3902dbcd572be7a4089b432f408f05c47c3936140f841a4ded3b28e85d", "unresolved_by_monitor": 0, "stamped": "ok", "published": true} {"made": "20261022T092858Z", "sha256": "f432764896e1faa9d2718415c7cc251027a3ff28d01dcae5d65cee40b203e120", "unresolved_by_monitor": 0, "stamped": "ok", "published": true} ## Coverage of the latest seal (20261022T092858Z), districts by status - modelled: 3585 - decided by the ballot: 1814 - not up (holdover): 620 - modelled (multi-member): 261 - modelled (primary): 27 - decided by the ballot (neither major party): 3 - not elected (non-voting tribal representative): 2 - unresolved: no candidate on the ballot (write-ins only): 1