Methodology

How CivicAlign works — and where it doesn't.

A plain account of the data sources we use, how AI summaries are generated and cited, what is imported verbatim vs. AI-written, how often each surface refreshes, and the limitations we are honest about.

Data sources

CivicAlign pulls from these primary sources only:

  • Congress.gov — bills, bill text, sponsors, and roll-call votes for the U.S. Senate and House.
  • FEC.gov — federal campaign finance: total raised, cash on hand, top contributors. Used for U.S. Senate and U.S. House candidates only.
  • Elections page, state level — the Elections page also lists state-level candidates we have found; those listings are not verified and carry no campaign finance or AI analysis.
  • GovInfo.gov — committee reports and supplementary congressional documents.
  • Member official websites and press releases — public statements used for the "said vs. voted" comparison.

We do not use Twitter/X, news aggregators, or third-party tracking sites as primary sources for factual claims.

How summaries are generated

  1. Ingest. New bills and roll-call votes from Congress.gov are pulled daily. Campaign finance is pulled nightly from the FEC bulk feed.
  2. Chunk and summarize. Long bill text is broken into sections. Each section is passed through an LLM with explicit instructions to extract operative provisions, not editorialize. Output is constrained to factual restatement plus a short impact note.
  3. Attach source. Every summary carries the Congress.gov URL it was generated from. The citation travels with the summary — a snipped or shared summary keeps its source.
  4. Publish. Summaries appear under labels like "AI summary" or "AI title" with a visible link to the underlying source.

What's imported and what's AI-written

SurfaceWhere it comes fromWritten by AI?
Bill text, vote tallies, sponsor namesCongress.gov, imported verbatimNo
Campaign finance figuresFEC, imported verbatimNo
Plain-English bill summariesA model, from the bill text aboveYes, and the surface says so
One-sentence bill titles ("AI titles")A model, from the bill text aboveYes, and the surface says so
Said-vs-voted contradiction analysesA model, from roll-call votes and public statementsYes, and the surface says so
Say vs. Do ratings on race pages (how they work)A sitting member's cited statements and roll-call votes, compared by their stance scores; a model reads those same rows only when the scores do not settle itThe stance scores are AI-assigned; the sentence, when there is one, is AI-written and says so; every "Votes differ from statement" is checked by our team first
Stance scores ("strongly for / mixed / against")Derived from vote recordsYes, and the surface says so
Candidate positions on race pagesRoll-call votes on Congress.gov, the candidate's campaign site, or a sitting member's office website (house.gov or senate.gov), linked as the sourceOnly the one-sentence summary, and it is labelled
Hero copy, navigation labels, FAQsThe CivicAlign teamNo

Where a piece of content is AI-written, the surface says so — "AI summary," "AI analysis," "AI title."

Say vs. Do ratings

On a race page, a sitting member of Congress can carry a badge on an issue: "Consistent with votes," "Mixed record" or "Votes differ from statement." It rates whether the member's own statements on that issue and their roll-call votes point the same way. Tapping the badge shows the sentence behind it and links to each statement and vote it rests on.

  • Sitting members only. A challenger has no voting record to compare, so they get no rating.
  • Sources. Statements come from the member's campaign site, their office website (house.gov or senate.gov), and named reports of what they said. Votes come from our roll-call records, imported from Congress.gov (House) and senate.gov (Senate).
  • The score rule. Each statement and each vote has a stance score on the issue's scale from −2 to +2, assigned by an AI model from that row's own words. When the average statement score and the average vote score do not lean in opposite directions and are at most 1 point apart, the rating is "Consistent with votes." That rating follows from the scores; no AI writes it.
  • Otherwise, a model reads the cited rows. When the scores do not settle it, an AI model reads only the statements and votes we give it, picks a rating and writes one or two sentences. Every sentence cites a source, and together they cite at least one statement and one vote. A reply that fails our checks (an uncited sentence, a source we did not give it, loaded language, a bill number its sources do not name) is discarded, and nothing is shown.
  • A person checks every "Votes differ from statement." That rating is shown only after someone on our team has read it against its sources and approved it.
  • When the sources change. When the member's statements or votes on that issue change, the rating is taken down until it is rated again.

Update cadence

DataRefresh interval
New bills from Congress.govDaily
Roll-call vote recordsDaily
AI-generated bill summariesGenerated on first ingest; regenerated only if the bill text changes
FEC campaign financeNightly (bulk import)
Public statements (said-vs-voted)Ad hoc, generally weekly

How the bill-passage prediction works

Every bill on CivicAlign carries a passage-probability badge. That number comes from a two-engine system designed for transparency: a rule-based heuristic anchored to historical Congressional outcomes, and an ML.NET LightGBM classifier trained on resolved bills from previous Congresses. We take whichever produces the higher probability for each bill, with the source labeled on the tooltip.

Base rates we calibrate against

Of bills introduced in a given Congress (roughly 10,000–15,000 over two years), only about 3–5% become law. That's the floor every prediction sits on. The heuristic uses these published rates (from GovTrack and CRS analyses across the 113th–118th Congresses) as the base by procedural stage:

StageBase passage rate
Introduced~4%
In committee~5%
Reported out of committee~30%
Floor debate~42%
Passed one chamber~55%
In conference~75%
Sent to the President~95%

Simple and concurrent resolutions (H.RES, S.RES, H.CON.RES, S.CON.RES) get separate, higher base rates because they don't require POTUS.

Adjustments the heuristic layers on top

  • Cosponsor momentum. 0–4 cosponsors hurts (−3 pts); 50–100 helps (+6); 200+ adds +12.
  • Bipartisan ratio. Cosponsors from the opposite party of the primary sponsor add up to +15 points — the single strongest non-procedural signal in real Congressional data.
  • Staleness penalty. Bills with no recent action for 180+ days lose 8–15 points depending on stage.

What the ML model learns

The LightGBM classifier was trained on 31,244 resolved bills from closed Congresses (1,728 enacted, 5.53% base rate — matching the published number). It learns from signals the heuristic doesn't see directly: cosponsor counts by party, withdrawal rates, committee complexity, amendment counts, related-bill counts, policy area, Congress era, sponsor party, and a 128-dimensional semantic embedding of each bill's plain-English summary (from text-embedding-3-small, a Matryoshka-trained OpenAI embedding model — we keep the leading 128 dims because they carry most of the variance). Stage is deliberately excluded from the ML features because it leaks the outcome in training data.

Held-out test-set numbers after the most recent retrain (May 25, 2026):

MetricValueWhat it means
AUC0.96Given any pair of (passed, failed) bills, the model ranks the passed one higher 96% of the time.
F10.61Harmonic mean of precision and recall on the positive class (becomes-law). Hard to push higher because positives are only ~5% of bills.
Accuracy0.95Fraction of all predictions that match the ground truth, on the held-out test set.

Adding the summary embedding lifted AUC by +5 points and F1 by +26 points over the structural-features-only baseline. The model retrains automatically on the 1st of every month so newly-resolved bills join the training set.

What the prediction will not do

  • It will not tell you which specific bills will pass — only how likely each one is.
  • It does not model lobbying, public sentiment, current-events context, or political dealmaking that isn't visible in the structured Congress.gov record.
  • It treats "rolled into omnibus" outcomes as "didn't pass" for the bill ID, even if the underlying policy made it into law.
  • Predictions above 80% on a freshly-introduced bill should be treated with skepticism — at that stage the base rate is ~4%, and most signal comes from sponsorship which can change.

Verifying the model is calibrated

We snapshot every bill's probability daily and back-test it against actual outcomes. The admin accuracy dashboard groups snapshots by predicted probability (0–9%, 10–24%, 25–49%, 50–74%, 75–100%) and reports the actual pass rate per bucket. If the model is well-calibrated, those rates roughly match the bucket labels. If they drift, that's our cue to retrain or adjust features.

Known limitations

  • Said-vs-voted requires a recorded floor vote. Statements made on bills that never reached a recorded vote can't be paired this way.
  • AI summaries are statistical paraphrase, not legal interpretation. They reflect what a bill says in plain English; they do not predict how a court will interpret it.
  • Stance scoring uses a recent window of roll-call history. A representative who recently changed position will show their current voting pattern, not their past one.
  • We do not track state legislatures. CivicAlign covers U.S. Senate and House races and the federal corpus on Congress.gov.

Found a mistake?

If a fact is wrong, a citation is broken, or an analysis misses context, file a correction at /corrections. Resolved corrections are logged publicly.

Questions about the methodology? Email info@civic-align.com.