Age, county, district, party on file, elections voted
Picks and balances the sample, tells each AI voter who they are, and describes each area.
Eight steps from voter sample to prediction. Civly combines what our AI voters say with everything else known about the race: public polls, past results, race ratings, prediction markets and money. Past races decide how much each input counts.
Past races go through steps 5 and 6 to find each feature's weight. This year's data then runs through the model once, with those weights, in step 7. Switch the view to follow each path, and select any step to jump to it.
This year's race: the sample and the AI voters feed the model, and the model runs once in step 7 with weights already learned from past races.
A piece of a race's territory with its own reported results: a county in a statewide race, or a group of neighboring precincts in a district or local race. Each area has at least 100 sampled voters.
The lead between the two major candidates, in points. R+8 means the Republican is ahead by 8. D+2 means the Democrat is ahead by 2.
One input to the model, prepared as a number: the poll average, the AI voters' margin, the incumbent's edge.
Running the model on past races where the real result is known, to measure how far off it is.
A 2026 governor's race between Brooks, the sitting Republican governor, Alvarez, the Democrat, and Chen, the Libertarian. Every number in it is invented, and each one follows from the step before. The teal panels on this page follow it.
Every input goes to one or more places: picking and weighting the sample, the AI voters' profiles, the rules that prepare the features, or the full model itself. Filter by where each one goes.
Picks and balances the sample, tells each AI voter who they are, and describes each area.
Tells each AI voter who they are.
Decides who is in the sample.
Gives a party lean to voters with none on file.
Tells each AI voter what is happening this year and where each candidate stands.
Our own forecast of the race.
Outside forecasts of the race.
Corrects each poll for its pollster's usual lean.
Where each area usually votes.
Shifts past results by how far the state's polls have moved since the last election.
The national swing this year.
Sitting officeholders start ahead.
Money raised by each side.
Ads bought by each side.
Expert calls on the race.
What bettors expect.
Polls tend to overstate third-party candidates.
The Turnout Score gives each voter a chance of voting, from 0% to 100%. It is a machine-learning model (gradient-boosted decision trees), so it picks up combinations, such as young voters who voted in 2024 but skipped 2022.
It reads, for each voter: whether they voted in each of the last four general elections, the last three odd-year elections and this year's primary; how long since their first and last vote; age; party; gender; how long they have been registered; county; whether they last voted in person or by mail; and registration status.
It learns from past elections where we know who voted, using only records from before each one. Its percentages are checked so that 70% means seven in ten such voters actually vote. It is graded on the 2022 midterm, with a copy trained without 2022, and must call more voters right than the simple rule of "voted before" and rank them better.
Those figures are from the 2024 general election in nine states (full analysis). The score is approved in 11 states. Any other state needs it trained and its grades approved first. In past-race tests it uses only records from before that race.
Our own model of a voter's chance of being a Democrat or a Republican, for voters with no party on file. It is the same kind of model as the Turnout Score.
It reads, for each voter: age; gender; how long they have been registered; which elections and primaries they voted in, and whether by mail; political giving, by the party of the committees they gave to; their ZIP code's income, college share, median age, home ownership and population; and the 2024 result in their precinct, their part of the district and their county.
It learns from states where voters register by party, and is graded on a state it never saw. A voter between 40% and 60% likely to be a Democrat gets no lean. The result goes into the AI voter's profile as an estimate ("probably leans Republican"), and it stays in the profile only if it improves accuracy on past races. It is approved in five states. Before wider use it is also graded on North Carolina voters who register with a party but never vote in primaries, the voters most like those who need it.
Ballots are secret, so no one learns how a single voter voted. Results are reported for areas: counties and precincts. So the full model works with voters added up by area.
Voter details enter it as each area's makeup: the share of voters over 65, the share of new voters, the share with no party on file, and how each changed since the last election. They are tested like every other feature. The same details also reach the model through the AI voters, who answer as those people.
Polls tend to overstate third-party candidates. Some people who name one in a poll switch to a major candidate or stay home. Pew Research found that third-party presidential candidates from 1968 to 2016 usually finished below their early poll numbers.
How large the drop is in state and local races is less studied, so we measure it on past races by comparing third-party poll figures with results. The keep rate we test runs from 30% of the poll figure to all of it. If past races show no drop, the rate comes out near 100% and nothing is cut.
| Input | Example race |
|---|---|
| Voter records | 2.1 million registered voters. Age, county, district, party on file (72%), voting history back to 2012. No gender or race. |
| Data partner lookup | Gender and household income, for the voters it can match |
| Civly Turnout Score | Each voter's chance of voting, from our model |
| Estimated party | A party lean for voters with no party on file, from our model |
| Race information sheet | The year's events, the race's main issues and where Brooks, Alvarez and Chen stand, each fact with its source and date |
| Public polls | Poll A R+4, Poll B R+10 (paid for by the Brooks campaign), Poll C R+6. Chen (L) polls at 6%. |
| Pollster records | Poll A's pollster: 12 past polls in the state, 1.8 points too Democratic on average. Polls B and C: no past record in the state. |
| Past results | 2018 Governor R+14, 2020 President R+16, 2022 Governor R+18, 2024 President R+15 |
| State poll change | Polls of the state's other races are 4.2 points more Democratic than its 2024 result |
| National mood | The nation is 2 points more Democratic than in 2024 |
| Incumbency | Brooks (R) is the sitting governor |
| Fundraising | Brooks is 10 points ahead in share of money raised |
| Ad spending | Brooks is 5 points ahead in share of ad spending |
| Race rating | Likely Republican |
| Prediction markets | Brooks has an 80% chance to win |
| Third-party history | In past races, third-party candidates finished at about 60% of their poll figure |
| Past races to learn from | Every past midterm and presidential race we have data for, in every state |
We draw 5,000 likely voters from the state's voter records, with at least 100 in every area, add the details we can find for each one, and weight them to match the state.
Likely voters are picked with the Civly Turnout Score from step 1. Every area gets at least 100 sampled voters, because the full model learns from areas. For a statewide race the areas are counties, with small neighboring counties grouped. For a district or local race they are groups of precincts.
From the state's records: age, county, district, party on file (the party on the voter's record) and how many of the last four general elections each person voted in.
From a data partner: gender and household income. Gender comes first from first names, using Social Security name lists. Race is held out until our own estimate passes a test against North Carolina's records, where voters state their race.
The sample is weighted so each county has its right share. Then the mix of party and age is matched to the full list of likely voters it was drawn from.
Small areas get extra voters, and weighting puts each area back at its true size, so the overall numbers stay the same.
The sample is weighted so counties, party and age match the 1.3 million likely voters.
Each sampled voter becomes an AI voter with a short profile built from their details. Every AI voter in a race reads the same race information sheet, and three AI models from three different companies answer for all of them.
Without a sheet, an AI voter knows only their profile and the names on the ballot, so they answer from the state's usual lean and miss what is different about the year. The sheet is one short page of facts per race, 120 to 340 words, placed between the profile and the question.
Every fact has a source link and a date, from a page we opened. A fact seen only in a search summary is dropped. Every fact is dated before the poll. For a past race it is dated before that election, and pages that report how the race ended are excluded.
A check reads each sheet before any AI voter sees it. The run does not start if a sheet mentions a banned topic, leaves out a candidate, uses a pronoun for a candidate, or falls outside 120 to 340 words.
Every AI voter is asked by three AI models from three different companies, and their answers are combined. Using three keeps one model's habits from driving the result.
Each candidate is rated from 0 to 10, and the voter can say they are undecided.
Voter records show whether each person voted, and ballots are secret, so who they voted for is unknown. We ask the AI voters about both races and compare their totals with the real results. That shows how far off these exact voters are. In a midterm year the midterm is the closer test.
Separate samples are drawn as of each past election and given the same details as this year's poll, including a sheet for that year when this year's poll has one.
| Question | AI voters | Real result | Miss |
|---|---|---|---|
| 2026 Governor (this year) | R+24, 0.9% undecided | Not known yet | |
| 2024 President (same voters) | R+27 | R+15 | 12 too Republican |
| 2022 Governor (same voters) | R+32 | R+18 | 14 too Republican |
| 2022 Governor (past sample) | R+33 | R+18 | 15 too Republican |
| 2020 President (past sample) | R+27 | R+16 | 11 too Republican |
| 2018 Governor (past sample) | R+27 | R+14 | 13 too Republican |
Comparing their answers with real results shows how far off they usually are. These AI voters came out 13 and 15 points too Republican in the two past midterms, so step 4 takes 14 points off this year's R+24.
A 0 to 10 rating has to become a vote. It can be split by the ratings, given entirely to the top choice, or something in between. Step 6 tests which works best on past races. Splitting gave third-party candidates 18% to 41% in tests, against real results of 2% to 3%. Try it with one voter.
With the ratings split, a voter who prefers Brooks still hands Chen a third of a vote. Added up over thousands of voters, that inflates third-party candidates.
We measure it two ways. Each AI voter is asked directly. And since voters rate the candidates on a 0 to 10 scale, voters near the middle can count as undecided. AI voters choose "undecided" far less often than people in real polls, so the middle of the scale may measure it better. Which band counts as the middle is chosen by comparing with the undecided share in past polls. Election results have no undecided, so polls are the only comparison.
One model for everything. The full model is a regression, a standard statistical method that learns from past races how much each feature should count. Every new data source is added as another feature, and client polls and Command Center polls use the same model.
Each row is one area of one past race. Ballots are secret, so we never learn how a single voter voted, but results are reported for every county and precinct. Splitting races into areas turns a few hundred past races into thousands of rows. A race's prediction is its areas added up by number of voters.
| Past race | Area | AI voters | Past results | Polls | Rating | Incumbent | Over 65 | … | Real result |
|---|---|---|---|---|---|---|---|---|---|
| 2022 Governor | County 1 | R+30 | R+26 | R+16 | R+8 | Yes | 24% | … | R+28 |
| 2022 Governor | County 2 | R+3 | R+2 | R+16 | R+8 | Yes | 18% | … | D+1 |
| 2022 Governor | County 3 | R+14 | R+12 | R+16 | R+8 | Yes | 21% | … | R+15 |
| … | |||||||||
| 2018 Governor | County 1 | R+25 | R+23 | R+10 | R+5 | No | 23% | … | R+24 |
Made-up numbers. Polls, rating and markets cover the whole state, so every county in a race gets the same value. AI voters, past results and area makeup differ by county.
| Past race | Area | AI voters | Past results | Polls | Rating | Incumbent | Over 65 | … | Real result |
|---|---|---|---|---|---|---|---|---|---|
| 2022 State House 12 | Precincts 1 to 6 | D+2 | D+5 | None | None | No | 19% | … | D+4 |
| 2022 State House 12 | Precincts 7 to 11 | R+9 | R+11 | None | None | No | 27% | … | R+10 |
| … | |||||||||
Made-up numbers. Down-ballot races rarely have polls, ratings or markets. Their model learns from past races that also lacked them.
Each kind of race has its own model, because each has different features available. A state legislative race rarely has a poll, so its model learns its weights from past races that also had none. Each kind also has a midterm and a presidential version.
Each one, on its own, already predicts the margin: the polls might say R+6 and the AI voters R+10. The model takes a weighted average of the five, and the weights add to 100%.
Each pushes the margin by some points: being the incumbent might be worth 1 point. How many points each one is worth is learned from past races too.
These rules turn raw figures into feature values. The size of each one is learned from past races in step 6, within the range listed there.
The polls go through four rules: the pollster's usual lean, the lean of paid polls, the poll's age and its size. Move a rule to see the poll average change. The same settings feed the prediction in step 7.
| Poll | Result | Pollster's usual lean | Paid-poll lean | Adjusted | Weeks old | People asked | Weight |
|---|---|---|---|---|---|---|---|
| A | R+4 | Understates R by 1.0 | None | R+5.0 | 1 | 600 | 39% |
| B | R+10 | No record | Brooks campaign: 3 | R+7.0 | 2 | 800 | 41% |
| C | R+6 | No record | None | R+6.0 | 6 | 1,000 | 20% |
| Average | R+6.0 | 100% |
| Feature | Starting figure | Rule applied | Feature value |
|---|---|---|---|
| AI voters | R+24 | Minus the midterm miss: (13 + 15) / 2 = 14 | R+10 |
| Public polls | R+4, R+10, R+6 | The poll rules above | R+6.0 |
| Past results | R+16.2 | Moved 4.2 points toward Democrats, the state's poll change since 2024 | R+12 |
| Race rating | Likely Republican | Fixed scale: likely = 8 points | R+8 |
| Prediction markets | 80% to win | Win chance converted to points | R+9 |
| Incumbency | Brooks is the incumbent | Yes or no | Yes |
| National mood | Nation 2 points toward Democrats | As measured | D+2 |
| Fundraising | Brooks 10 points ahead | As measured | +10 |
| Ad spending | Brooks 5 points ahead | As measured | +5 |
| Area makeup | County 1: 24% over 65, 3% new voters | Change since 2022, per county | Varies by county |
Most features need one step before they go into the model. The AI voters said R+24, but they usually come out 14 points too Republican in midterms, so 14 points are taken off and they go in as R+10.
Backtesting runs the model on past races where we know the real result. It shows how much each feature should count and how accurate the model is.
Each kind of race has a midterm version, which learns from the last two midterms, and a presidential version, which learns from the last two presidential elections. Midterm voters are mostly older and more regular, and the president's party usually loses ground.
A race learns from the past races most like it. A state house race in New York learns from races like it, and a rural Texas race from races like that one. Similar means, in order:
How many similar races to use (100, 300 or 1,000) is a setting in step 6. Too few and the weights are noisy. Too many and they come from places that behave differently.
A backtest only means something if the past races are run the way this year's race will be. Seven rules keep it fair.
| Past race | Model predicted | Real result | Miss |
|---|---|---|---|
| This state, 2022 Governor | R+16.4 | R+18.0 | 1.6 |
| State B, 2022 Senate | D+2.0 | D+5.1 | 3.1 |
| State C, 2018 Governor | R+3.5 | D+1.2 | 4.7 |
| State D, 2018 Senate | R+9.0 | R+4.0 | 5.0 |
| … every other past midterm race | |||
| Average miss | 4.5 points | ||
The same model with the same features. Each past race is split into its counties, and each county is one row with that race's own figures. The model learns from the 300 past races most like this one, each graded with weights learned from the other races. Its average miss is 4.5 points.
Two layers work together. The search picks a set of settings to try. The regression finds the best weight for each feature given those settings. The model then predicts every past race, and its average miss is the score. The try with the smallest miss wins.
Each weight has a range. The ranges are limits: the regression looks for each weight only inside its range, so no feature can take an absurd weight. The teal marks show what the search chose for the example race.
The settings are the choices the regression can't make itself. Each try re-scores answers we already have. Profile details and the race information sheet are the exceptions, because each needs its own run of the past races first.
| Setting | Range tested | Why | Example pick |
|---|---|---|---|
| How many similar past races each model learns from | 100, 300 or 1,000, same state first | Too few is noisy, too many brings in places that behave differently | 300 |
| How much each past election counts | Last four general elections, 0% to 100% each, adding to 100% | Tests whether recent or same-type elections predict better | – |
| How fast a poll loses weight | Half its weight after 1 to 12 weeks | From "only last week counts" to "the whole fall counts" | 3 weeks |
| When a pollster's own record counts half | After 5 to 30 past polls | A short record can be luck | 10 polls |
| Lean of polls paid for by a party or campaign | 0 to 8 points toward the sponsor | Covers no lean up to a large one | 3 points |
| Adjust an old poll by its pollster's later polls first | Yes or no | An old poll misses what has changed since | – |
| Third-party candidates keep | 30% to 100% of their poll figure | They usually finish below their polls | 60% |
| Ratings into votes | Split by rating, top choice only, or in between | Splitting gave third parties 18% to 41% against real results of 2% to 3% | – |
| Undecided band on the 0 to 10 scale | Only 5, 4 to 6, or 3 to 7 | Compared with past polls' undecided | – |
| Unrealistic crossover | Lowers the AI voters' weight in that race, or not | AI voters sometimes stick to their party more than real voters do | – |
| Profile details | With or without gender, income, elections voted, estimated party | Each needs its own run of the past races first | – |
| Race information sheet | With or without | Needs one run of the past races, each with a sheet for its own year | – |
| Lining up the cross tabs | Outside figure counts 0% to 100% | Half and half until tested | – |
| Try | Poll loses half its weight after | Paid-poll lean | Third parties keep | Average miss on past races |
|---|---|---|---|---|
| 1 | 8 weeks | 0 points | 100% | 5.6 |
| 2 | 2 weeks | 6 points | 40% | 4.9 |
| 3 | 4 weeks | 3 points | 70% | 4.6 |
| … | ||||
| 40 (best) | 3 weeks | 3 points | 60% | 4.5 |
This is still backtesting. For every try, the regression finds the best weights for those settings, then the model predicts every past race. The try with the smallest average miss wins. Here that was try 40.
After the weights and settings are chosen, each one is moved across its range while the rest stay put, and the prediction is recomputed. The method section of the report shows how far the predicted margin moves with each.
Each bar runs from the prediction at one end of the setting's range to the other. The teal line is the prediction at the current settings, which you can change in step 7.
With the weights and settings chosen, the model runs once on this year's feature values: this year's AI voter answers, the current polls and the rest of the race data. 2026 is a midterm, so it uses the midterm model.
The prediction starts at the settings the search chose. The sliders cover the ranges tested in step 6, and the other forecast weights keep their proportions when the AI voters' weight moves.
| Forecast | This year | Weight | Adds |
|---|---|---|---|
| AI voters | R+10.0 | 30% | 3.0 |
| Public polls | R+6.0 | 45% | 2.7 |
| Past results | R+12.0 | 15% | 1.8 |
| Race rating | R+8.0 | 5% | 0.4 |
| Prediction markets | R+9.0 | 5% | 0.5 |
| Blend | 100% | R+8.4 |
| Adjustment | This year | Size | Points |
|---|---|---|---|
| Incumbency | Republican incumbent | 1 point | +1.0 |
| National mood | Nation 2 points toward Democrats | 0.4 times | −0.8 |
| Fundraising | Republican 10 points ahead | 0.2 per 10 points | +0.2 |
| Ad spending | Republican 5 points ahead | 0.2 per 10 points | +0.1 |
| Total | +0.5 |
Chen's share is the 6% poll figure times the keep rate. The undecided share is the AI voters' answer. The rest is split so Brooks leads by the predicted margin.
Each candidate's share, the margin and a likely range. The range comes from how far the model missed on past races it never saw during the search: in the example, the 4.5-point average miss from step 5. The run also produces how many points each feature added or took away, which the report prints as "What moved the prediction."
The run is saved with its feature values, weights and settings, so it can be repeated exactly.
The report opens on the prediction and what moved it. A checklist runs before anything is shared.
Three short sentences and a quick method note.
In large type, with a "What moved the prediction" table.
By age, district, voting history, gender and income. Each group shows our number beside an outside figure when one exists: the poll's own group result, the last House result by district, or AP VoteCast. Groups under 50 voters are left out.
Every source and feature cited, each poll linked, and past accuracy.
| Candidate | Prediction | How we got it |
|---|---|---|
| Brooks (R) | 52.2% | Five forecasts plus four adjustments: R+8.9 |
| Alvarez (D) | 43.3% | Same |
| Chen (L) | 3.6% | Keeps 60% of the 6% poll figure |
| Undecided | 0.9% | AI voters' answer. The polls had 7% |
| Forecast | Points |
|---|---|
| AI voters | R+3.0 |
| Public polls | R+2.7 |
| Past results | R+1.8 |
| Race rating | R+0.4 |
| Prediction markets | R+0.5 |
| Adjustment | Points |
|---|---|
| Incumbency | R+1.0 |
| National mood | D+0.8 |
| Fundraising | R+0.2 |
| Ad spending | R+0.1 |
| Total | R+8.9 |
The cross tabs put our number beside the poll's for each group, for example ages 18 to 29 at D+6 against the poll's D+4.
These are added to the quality check every client PDF already goes through.
One command runs the whole poll: the sample, the data lookup, a plan for approval, the AI voters and the report. Each run saves the answers, coverage, checklist results, code version and the settings the search picked, so any prediction can be rebuilt exactly.
The public data behind each step.
Civly samples 5,000 likely voters from the state's voter records, turns each one into an AI voter, and asks three AI models from three companies how each would vote. A regression then blends the AI voters' result with public polls, past results, race ratings and prediction markets, and adjusts for incumbency, the national mood, fundraising and ad spending. How much each input counts is learned from past races.
One short page of facts per race, 120 to 340 words, that every AI voter reads before answering: the year's events, the race's main issues, and where each candidate stands. It leaves out polls, ratings, money, endorsements and past results, which the model already counts as features. Every fact has a source and a date before the poll.
By backtesting on past races with known results, starting with the most similar races in the same state. A search tries sets of settings, a regression finds the best weights for each set, and the set with the smallest average miss on past races wins. Each weight can move only inside a fixed range.
From how far the model missed on past races it never saw during the search. In the example race on this page, an average miss of 4.5 points turns a prediction of R+8.9 into a likely range of R+4 to R+13.
Yes. District and local races, from U.S. House and state legislature to county, city and judicial offices, have their own models built on groups of precincts. Each learns from past races that also lacked polls, ratings and markets.
Civly runs the whole poll, from sample to report, for statewide, district and local races.