# State legislative forecasts for 2026: overview for reviewers **Status:** published from 2026-10-15 as an **initial version** at https://futureballot.com/state-legislatures. Ten model versions have each failed their pre-registered test; the published one is 0.10 (with the components in section 3a; it replaced 0.7 on 2026-10-15), which failed one of five conditions: 2024's ranges were too wide (section 4). The owner chose to publish it, labelled as such on every page, rather than wait for a pass. Each day's forecast is also sealed: its SHA-256 fingerprint is timestamped with the public OpenTimestamps calendars. Seals up to 2026-10-14 were of 0.5; on 2026-10-15 of 0.7, and from then on of 0.10, the published version. The last seal made before 2026-11-03 00:00 Pacific is the one that will be scored. Everything below can be checked against the files in this folder. Where this overview and a pre-registration or result file disagree, the file is the record. ## 1. What is being forecast The registry holds all 99 state legislative chambers: 7,388 seats in 6,851 districts (Open States' metadata, MIT licence). Louisiana, Mississippi, New Jersey and Virginia hold no regular legislative election in 2026; their 538 districts are left out, which leaves the **6,313 districts** counted in `seals.txt`. Of those, in the latest seal, only about a third are actually modelled; the rest are decided by the ballot, not up, or unresolved (table at the end of `seals.txt`). The monitor watches 6,242 of them: the other 71 have neither a known 2026 candidate nor a known sitting member. For each district up in 2026 the model gives a probability that the Democratic candidate wins. For each chamber it gives a distribution of Democratic seats and a probability of a Democratic majority. Since 2026-10-14 every kind of contest is forecast (section 3a): multi-member districts, Nebraska's nonpartisan legislature, Alaska's ranked-choice races, and districts redrawn since their last election. A district is left **unresolved** only when nothing can be forecast: in the latest seal, one (Tennessee House 93, where no name is on the ballot and the seat goes to a write-in), plus any district whose candidate the race monitor finds has died, withdrawn, been removed from the ballot or been replaced (section 7). A chamber with unresolved seats gets a **range** of majority probabilities: one end gives every unresolved seat to the Republicans, the other to the Democrats. ## 2. Data | Source | Use | Licence | |---|---|---| | Klarner, *State Legislative Election Returns 1967-2016* (Harvard Dataverse) | training pairs 1972-2016 | CC0 | | MIT Election Data and Science Lab precinct returns 2016, 2018, 2020, 2022, 2024 | training pairs 2018-2024, same-lines checks | CC0 (2016 via an MIT-licensed conversion) | | Open States people and metadata | districts, seats, sitting legislators and their term dates | CC0 / MIT | | National House popular vote 1946-2024 | national swing | public record | | N3 (FutureBallot's own national House environment, no rater input) | forecast national swing and its error | ours | | Official state candidate lists (24 states, Alaska's since 2026-10-14) | 2026 candidate fields | public records | | Wikipedia election articles (article pages only; robots.txt keeps bots off `/w/`) | candidate fields elsewhere; Nebraska registrations; Nebraska and Alaska primary and general results 2022-2026 | CC BY-SA | | The Ballot Brief | candidate fields no other source gives (section 8, item 4) | public pages, robots.txt allows | | Census Bureau TIGER/Line (2020 blocks, 2024 House and 2025 Senate districts) | rebuilding redrawn districts' previous results | public domain | | Census Bureau TIGER/Line 2025 legislative districts; ACS 2019-2023 5-year | each district page's neighbourhood map and Census profile | public domain | Excluded on licence grounds: Ballotpedia and the Redistricting Data Hub. The 2020 MEDSL file sits behind a Harvard Dataverse guestbook, which was answered with FutureBallot's own name and contact details. **Same lines.** A district's previous result is used only when its lines did not change in between. This is checked by precinct overlap (at least 100 shared precincts, at least 95% of each district's precincts in common) or, where the two files' precinct keys differ, by county composition (at least 0.95 similarity overall, and no more than 10% of districts below 0.9). Cycles that straddle redistricting (2012, 2022) are not used as targets. **Incumbency.** Open States' dated roles; otherwise the previous winner; otherwise Klarner's own incumbency marks. ## 3. The model (`stateleg_swing/0.5`, the version that is sealed) Each district is anchored on its own previous result, which already carries the state's legislative brand. That result is then moved by the change in the national environment and by incumbency. A (previous election contested): y = a*y_prev + b*S + c*inc + d*inc_prev + k + u + e B (previous election uncontested): y = k_B + w*W_prev + b_B*S + c_B*inc + u + e_B - `y`, `y_prev`: the Democratic two-party margin in points. - `S`: national swing. In training this is the realised change in the national House margin. In a forecast it is N3 for the target year minus the realised margin of the previous election, with N3's historical error drawn on top. - `inc`, `inc_prev`: +1 for a Democratic incumbent running, -1 for a Republican, 0 for an open seat. - `W_prev`: +1 or -1 for the party of the previous winner when that race was uncontested. - `u`: an error shared by every district in a state in the same cycle (normal). - `e`: a district error (Student-t, degrees of freedom fitted). **Fitting.** Weighted least squares with recency weights 0.5^(age/h). The half-life h is chosen from {4, 6, 8, 12, 16, 24, 1000} by predicting each of the six newest training years from the years before it. In 0.5, the error widths (t degrees of freedom and scales, and the state-cycle variance) come from the two newest training cycles. Probabilities come from 20,000 joint simulations. A seat is decided by the ballot when only one major party has a candidate. A district counts as "not up" only on evidence that it is not (a four-year seat whose last election was 2024). ## 3a. Contests the swing model does not take (added 2026-10-14) Each is a separate component with its own test on past elections, disclosed rather than pre-registered, and each draws its errors inside the same joint simulation where it can. - **Multi-member districts** (`code/src/elab/stateleg/multimember.py.txt`): the district enters the swing model with its *party-average* margin (average Democrat against average Republican among each party's top k); each candidate is then drawn around their party's share with a spread measured in past multi-member contests, and the k largest win. Tested on Klarner's 4,387 multi-member contests in 158 chamber-cycles, 1972-2016 (each forecast from the district's previous election under the same districting regime, national swing given): Brier on "Democrats win at least half the seats" 0.096 against persistence's 0.145; expected-seat error 0.38 per district; the actual chamber count inside the 90% interval in 94% of chamber-cycles (`results/stateleg_multimember_check.json.txt`). Washington's House is two single-seat positions per district; its fields do not always say which, so it is treated as a two-seat block. - **Redrawn districts** (`code/src/elab/stateleg/rebuilt.py.txt`, `code/scripts/stateleg/redraw_crosswalk.py.txt`): a Senate district redrawn since its last election gets a previous result rebuilt from the 2024 presidential vote of the House districts it overlaps (2020 census blocks placed in each; Wisconsin, Ohio, Montana, Washington and North Dakota nest exactly, Michigan's 2026 Senate remedy does not), translated to a legislative margin by the state's 2024 relationship between the two. The translation's error is added as an independent district error. Checked on each state's contested 2024 Senate districts: root-mean-square error 2.5 points (Wisconsin), 4.4 (Ohio), 7.1 (Montana), larger in Washington, whose top-two contests fit loosely (13.4, carried as such). - **Nebraska and Alaska.** A contest between a Democrat and a Republican (by registration, on Nebraska's nonpartisan ballot) is forecast by the swing model like any other. One with an independent or nonpartisan contender is forecast from the 2026 all-candidate primary (`code/src/elab/stateleg/primaries.py.txt`): each candidate's chance is their primary share raised to a power beta, normalised, with beta fitted on 2022 and 2024. Held-out test (each year forecast with beta from the other): Brier 0.18 (2022) and 0.34 (2024), against 0.33 and 0.38 for the primary share used as the probability, and 0.25 and 0.42 for "the primary leader wins" (`results/stateleg_primary_check.json.txt`). These draws are independent of the national environment, a stated simplification. ## 4. How versions were tested Every version was pre-registered, its test written down and committed to version control before the test was run (`preregistrations/`). Each pre-registration also lists what the author already knew about the test years. The benchmark throughout is persistence: "the party that won the seat last time wins it again". The gate conditions, which are the same in substance for every version: 1. Brier score lower than persistence's. 2. 80% intervals of the margin cover 75-85% of outcomes, and 50% intervals cover 43-57%. 3. Reliability: in the probability bins [0.1,0.3), [0.3,0.7) and [0.7,0.9), the observed Democratic win share is within 0.10 of the predicted one. 4. Chambers: the mean absolute error of Democratic seats is below 3, and the actual count falls inside the 90% interval for 80-98% of chamber-years. 5. No single year with 80% coverage below 60%. | Version | Change | Test | Outcome | |---|---|---|---| | 0.1 baseline | presidential lean + national environment + incumbency | fit 2018, test 2024 | failed all four conditions (Brier 0.062 vs persistence 0.041) | | 0.2 swing | anchored on the previous result; Klarner pairs from 1972 | 2004-2016 | beat persistence (0.086 vs 0.118); intervals too wide (87.6% / 60.3%); toss-ups leaned Democratic | | 0.3 | recency weighting; Student-t errors | 1994-2000 (never scored before) | passed conditions 1-5; failed a sixth condition (no worse than 0.2 on 2004-2016: 0.0865 vs 0.0859) | | 0.4 | training adds the MEDSL era; half-life chosen over 6 years | 2020 (never scored before) | beat persistence (0.063 vs 0.083), chamber error 2.53; failed coverage (87.4%) and the middle reliability bin (0.52 predicted, 0.63 observed) | | 0.5 | error width from the two newest cycles | every cycle 1994-2024, disclosed | beat persistence (0.080 vs 0.108), calibrated pooled; failed 2024 coverage (91.4%, limit 88%) and chamber error (3.18, limit 3) | | 0.6 | Minnesota/North Dakota party fix; previous-winner incumbency in MEDSL rows; error width moved along its decades-long downward trend | every cycle 1994-2024, disclosed; pre-registration timestamped before the run | beat persistence (0.079 vs 0.108); failed 2024 coverage (90.2%) and chamber error (3.13); reliability shows a consistent Democratic lean (0.50 predicted, 0.44 observed) | | 0.7 | 0.6 plus state momentum (a learned share, 0.3-0.4, of each state's last mean error carried forward) | as 0.6; stamped before the run | best yet: Brier 0.0787 vs 0.1077, chamber error 3.03 (2.4 without 2010); failed 2024 coverage (90.3%) and chamber error (limit 3) | | 0.8 | 0.7 plus a year shift, a shared year error and a width factor, each from earlier test years' out-of-sample record | as 0.7; stamped before the run | passed all five with the registered seed, but an independent review re-ran it with eight other seeds and 7 failed condition 2 (2024 coverage 0.880-0.883, limit 0.88): counted as a fail. Chamber error 2.89, robust to the seed (`results/stateleg_swing08_result.txt`) | | 0.9 | 0.8's shift and year error; a width factor per kind of district instead of one; 20,000-draw quantiles, five seeds averaged | as 0.8; stamped before the run | failed condition 2 under every seed: 2024 coverage 90.5% (2024 was far calmer than the years before it); chamber error 2.89, Brier 0.0783 (`results/stateleg_swing09_result.txt`) | | 0.10 | 0.7 plus 0.8's year shift and shared year error, no width factor | as 0.9 (five seeds, 20,000 draws) | failed condition 2 under every seed (2024 coverage 90.4%); Brier 0.0782, chamber error 2.91: met the owner's conditions to replace 0.7 as the **published initial version** (`results/stateleg_swing010_result.txt`) | After 0.4 there were no clean test years left. The owner set a rule for that situation: a version may be published if it passes a test on every available cycle, disclosed as such, **and** an independent adversarial review. 0.5 failed the test, so the review step was never reached and nothing was published. **Versions after 0.5.** On 2026-10-13 we said no sixth version would be tried before the election, because every past year has been seen. The owner overruled that: a failed test stops publication, not improvement. Each new version fixes something found wrong, is pre-registered and timestamped before its run, and reports how many versions came before it. Its pass would still count for less than a first-try pass on unseen data; the 2026 election remains the clean test, and the sealed 0.5 forecast is scored against it whatever later versions do. 0.6 and 0.7 (above) are such versions (`results/stateleg_swing06_result.txt`, `results/stateleg_swing07_result.txt`); the diagnostics that led to them, and one that ruled out a link to the federal forecasts' district signal, are under `results/` (`stateleg_dlean_diagnostic`, `stateleg_drift_diagnostic`, `stateleg_federal_link_diagnostic`). **Corrections to the sealed forecast's inputs (2026-10-14).** Two errors in the data 0.5's daily seal starts from were fixed; the model is unchanged. (1) MEDSL's 2020 and 2022 Minnesota and North Dakota files code the Democratic-Farmer-Labor and Democratic-NPL candidates as `OTHER`, so those races read as having no Democrat; 57 Minnesota Senate districts are now forecast from their 2022 margins. (2) The forecast did not check whether a district had been redrawn since its last election; 73 districts (Montana, Wisconsin, Ohio, Michigan, Washington and North Dakota Senate seats last elected in 2022 or redrawn for 2026) are now unresolved, with the redraw named (`code/src/elab/stateleg/redistricting.py.txt`). **Corrections to the inputs (2026-10-14, later the same day).** Found while closing the gaps above: - MEDSL's 2024 Maine, Vermont and Oregon files carry a "TOTAL BALLOTS CAST" or "TOTAL VOTES CAST" row in each contest. Read as a candidate, it was the largest "vote" and so the winner: every 2024 Maine (186) and Vermont (125) district's winner was wrong, and 13 Maine districts' presidential votes were misplaced. Such rows (totals, over- and under-votes, blanks, voids, ballot types) are now dropped by whole phrase, which leaves real names such as Blank alone. - One candidate, one line: a candidate's rows with no party (Arizona 2024's Pinal County) or on a minor line (New York's and Connecticut's cross-endorsements) were counted apart from their major party; they are now joined to it, as the federal reduction already did, which moves 2016-2024 margins in Connecticut, New York, Arizona, Kentucky and Georgia. Vermont's fusion lines ("DEMOCRAT/REPUBLICAN") are read by their first party. A name under both major parties is left alone (two people of one surname, or a candidate on both lines). - Schedules: New Mexico's Senate is not up in 2026, Oklahoma's and Florida's odd-numbered Senate seats are not, and Hawaii's Senate has 13 regular seats and two vacancies up (`code/src/elab/stateleg/hand_checked.py.txt`, every entry with its source). - Held-over seats are counted by each member's party; Maine's tribal representatives, who are not elected at the general election and do not vote, are left out of the chamber. These change the training data of every version. The 0.7 test, re-run on the corrected data with its code unchanged, gives the same result: Brier 0.0789 against persistence's 0.1079, 2024 coverage 90.4%, chamber error 3.03, failing conditions 2 and 4 as before (`results/stateleg_swing07_corrected_data.txt`). ## 4a. What else was checked (2026-10-15) Diagnostics only; none changed the published model. Files under `results/`. - **Why 2024's intervals were too wide** (`stateleg_stability_diagnostic`, `stateleg_sameness_diagnostic`, `stateleg_uniform_swing_diagnostic`, `stateleg_calm_sensitivity`). 2024 was calm everywhere: every kind of contested district, both chambers; reweighting to earlier years' mix of districts leaves it as calm. The same calm appears in two independent records: county presidential swings were the most uneven on record in 2016 (spread 10.2 points) and the most uniform in 2020 (4.3) and 2024 (2.8); U.S. House district swings fell from 11-16 points in the 1980s to 4.4 in 2024. Over 20 legislative cycles, how much the national vote moved does not explain calm years once 2024 is set aside (1990 is a counter-example); a change of party in the White House does (correlation +0.5, rougher after a change). 2018, the one Trump-era midterm, was not calm in any record. With 2020-level calm the 2026 favourites' chances would firm by 2-5 points; no favourite changes. - **Events and state-specific penalties** (`stateleg_year_governor_diagnostic`, `stateleg_gas_diagnostic`, `stateleg_exposure_diagnostic`). Governors' results against their states' lean do not foretell legislative errors (correlation -0.008, 171 state-cycles). States whose gasoline prices rose more than the nation's (EIA, 1976-2024), tariff-exposed states in 2018 and 2020, and immigrant-heavy states in enforcement years (2010-2020) show no penalty for the president's party beyond the national swing, in state legislatures or the U.S. House. Events act through the national environment, which the forecast takes from N3 with its uncertainty. - **Special elections** (`stateleg_specials_diagnostic`; data from The Downballot, https://www.the-downballot.com/p/data, used under its terms and not republished). The 104 state legislative specials of 2025-26 ran 12.3 points more Democratic than the 2024 presidential vote, the largest of the five cycles since 2017. In the two midterm cycles (2018, 2022), the specials' average ran about three points more Democratic than November; on that record they imply a House margin near D+8, against N3's D+6.7 (standard deviation 2.9): consistent. Their spread (11.5 points) is the smallest of the five cycles; how well that foretells November's evenness cannot be judged from three comparable cycles. The Daily Kos Elections index, 1990-2022, correlates 0.41 with the November House swing. ## 5. The sealed forecast The scheduler job `stateleg-seal` runs every day. It re-reads the official candidate lists, runs the race monitor, refits 0.5 on everything up to 2024 and writes the forecast. It then timestamps the forecast's SHA-256 with OpenTimestamps. Every seal's `SHA256SUMS.txt`, its `.ots` proof and the ledger of all seals are published under `seals/` when the site is next published, so a seal cannot quietly be dropped after it is made. `seals.txt` says how to verify one. The forecast's contents are not released before the election. Afterwards, the file will be published so anyone can confirm that its hash matches the timestamped one. **Dating the pre-registrations.** `provenance.txt` gives each document's first commit and time. The repository is private, so these are FutureBallot's own records. They are not independently timestamped the way the seals are: a reviewer has to take the ordering on trust, or judge it from the documents themselves (each result cites its pre-registration, and the pre-registrations describe what was known before each test). The five pre-registrations before 0.6 were timestamped on 2026-10-13, after their tests, so their proofs only show they have not changed since. Every new pre-registration is timestamped before its test (`code/scripts/stateleg/stamp_preregistration.py.txt`); the proofs are under `stamps/`. A stamped file is published as `.md.txt`: its proof covers the `.md` bytes, which are identical. ## 6. Coverage of the current seal See the table at the end of `seals.txt`: for the latest seal, how many districts are modelled, decided by the ballot, not up, or unresolved, and why. ## 7. The race monitor The monitor runs every two hours (`code/scripts/stateleg/monitor.py.txt`): - **Who is watched:** every 2026 legislative candidate on an official list or a verified Wikipedia list, plus every sitting legislator whose seat may be up. A district whose field is unknown is still watched through its sitting member. - **What is read:** FutureBallot's store of outlets' own RSS feeds: national political outlets and two to four outlets per state. These are listed and checked for robots.txt and terms of use before they are read. Every headline is matched against every legislative name in its state at once. National outlets are matched only when the text names the state. - **Districts with a match** go through the same detection pass as the federal monitor: - a local language model labels each headline (withdrawal, death, removal from the ballot, replacement, party switch, criminal charge, conviction, misconduct allegation, incapacity, damaging revelation, or none); - GDELT's news index is searched for further outlets (when it answers: GDELT allows one request every five seconds and is shared with the federal monitor, so it often throttles a pass, which then continues on the feeds alone; `monitor-status.txt` shows how many requests succeeded); - an event counts as confirmed only when two distinct outlets report it; - an event already reported in the previous 30 days is marked as continuing coverage. - **Alerts:** a death, withdrawal or removal goes to the operator's phone at once, even from one outlet (marked unconfirmed). Charges and scandals are also alerted. - **Effect on the forecast:** a confirmed death, withdrawal, removal or replacement of a 2026 candidate, which a second, narrower question to the model also confirms, makes the district unresolved, with the reason given. The seat is **not** handed to the remaining candidate, because a name often stays on the printed ballot and a party may name a replacement. Charges and scandals change no number. FutureBallot's federal tests of a scandal rule, both a shift and a widening, failed, and the federal forecasts take a scandal's effect from polls taken after it. - **Official lists** are re-read daily. Several mark withdrawn, removed or deceased candidates, who then leave the field. Texas's list is read but holds no legislative rows; it is reported as not covering the legislature. `monitor-events.txt` lists the confirmed developments the monitor has found. Following the site's editorial rule, it includes structural and legal events, and anything else only when two independent outlets carry it. Inclusion means an outlet reported it, not that FutureBallot has verified it. ## 8. Known weaknesses (our own list; find more) 1. **Every past year has been seen.** The disclosed all-cycle test in 0.5 cannot show that its change is right on unseen data. 2. **Intervals are too wide in recent cycles.** 2024 coverage was 91.4% (0.5) and 90.2% (0.6). The forecast is probably under-confident at district level. 3. **Chamber errors and a Democratic lean.** The mean absolute error is 3.18 seats over 329 chamber-years (0.5; 3.13 in 0.6). In every reliability bin Democrats won less often than predicted (0.6: 0.50 predicted, 0.44 observed given the swing; 0.40 in the forecast condition). Correlation between districts beyond the state-cycle term (regions, local waves) is not modelled. 4. **Candidate fields.** Each district's `field_source` names where its candidates came from: `official` (24 state sources), `official (archive copy)` (Utah's Lieutenant Governor's filings; New York's State Board certification is also read from its Internet Archive copy because the Board's site refuses scripted requests), `news guide` (Montana Free Press; Honolulu Civil Beat; Arkansas Advocate; Oklahoma Voice, combined with Oklahoma's official filing book for single-party districts), `civic guide` (Citizens Count, New Hampshire), `wikipedia primary results` (Illinois, from the official returns the article cites), `aggregator (The Ballot Brief)` and `wikipedia`. The Ballot Brief fills only districts no other source covers; it was checked against West Virginia's official sample ballots, district by district, and matched the Democratic and Republican fields in 102 of 104 (the two others were unexpired-term specials it folds into the regular race), and against Iowa's official list, where it matched all 125 districts, including all 39 it shows with one major party (none of which has a second party on the official list). The West Virginia check also found two bugs in our own reader (names opening with a quote, a party code touching the name), now fixed and tested. Since the evening of 2026-10-14 every district up has a known field; five came from hand checks (Hawaii's official primary report; a Nashville TV station's guide), each with its source in `code/src/elab/stateleg/hand_checked.py.txt`. For Georgia, Idaho, Kansas, Massachusetts and Illinois, nominees come from primary results, so an independent or later replacement can be missing. 5. **The added components' tests are confirmatory, not clean.** On 2026-10-15 each was re-run against pass marks registered and timestamped in advance, with the published model and five seeds, and all six marks passed (`results/stateleg_components_result.txt`). But the marks were set after earlier runs on the same data, and the coefficients (beta, the candidate spread, the translations) were fitted with the test years in view. Washington's House is treated as a two-seat block. 6. **The national term.** N3 overstated Democrats by 2.7 points in 2020. The national error is drawn from N3's own record (2004-2024), which is short. 7. **Monitor reach.** Coverage is limited to the listed outlets and GDELT. A legislator covered only by a small paper without a feed can be missed, and name matching needs a full name in the headline or summary. 8. **Incumbency in the MEDSL test years (2018-2024) comes from one current Open States snapshot.** Roles are dated, so who held a seat on a past election day is read by date. But a member's party is their latest one, and a past member missing from the snapshot looks like a vacancy, and then falls back to the previous winner or Klarner's marks. Members who stayed in office are therefore recorded more completely than those who left. This could make incumbency look more predictive in the test years than it will be in 2026. **Measured** the same day (`results/stateleg_incumbency_sensitivity.txt`): with incumbency from the previous winner only, the test scores barely change (Brier within 0.002, coverage within a point, no gate condition changes outcome). But the fitted incumbency effect is smaller, most of all for districts whose previous race was uncontested (4.9 against 7.75 points in the 2024 fit). (Found by an outside review, 2026-10-13.) 9. **The national term's track record.** N3's 2004-2024 values (`data/national_backtest.json.txt`) are walk-forward: each year is fitted only on earlier years (`code/scripts/backtest_national.py.txt`, `results/national_environment.txt`). But N3's method was chosen in 2026 with all those years in view, and it reads the generic ballot at the end of each campaign. Its errors, which set the forecast condition's national uncertainty, may therefore flatter it. The 2026 forecast adds movement still to come between the forecast date and election eve. ## 9. Questions we would most like answered - Is persistence the right benchmark, and is beating it by this much meaningful? - Is the coverage condition (75-85%) too strict for a model whose errors are heavy-tailed? - Are the multi-member, rebuilt-start and primary components (section 3a) sound, and are their tests enough to stand beside the swing model's? - Is there leakage anywhere in the training/test split (`code/scripts/stateleg/gate_swing05.py.txt`, `code/src/elab/stateleg/medsl_pairs.py.txt`)? - Is the "unresolved, not handed over" rule for a dead or withdrawn candidate right?