How scoring works
Every number here is math you can check.
RepCheck compares your answers to a representative’s actual roll-call votes. It does not read minds, rate parties, or decide who is right. It counts votes with a fixed formula — the same inputs always produce the same score. This page lists every question, every constant, and every rule, so you can audit any number you see.
Nothing about you is stored. Your answers and zip code live only inside the link in your address bar. There is no account and no database of users.
The 12 questions
You rate 12 statements. Each one names a specific government action, not a value judgment, so agreeing and disagreeing are both legitimate positions. This is the exact wording, in the exact order, used everywhere in the app. Six further questions are optional; they are listed under the compass.
- 1The federal government should protect access to abortion nationwide.abortion
- 2The federal government should place stricter limits on who can buy firearms.guns
- 3The federal government should make it harder to enter and remain in the U.S. without legal status.immigration
- 4The federal government should raise taxes on corporations and high earners.taxes
- 5The federal government should regulate industry more strictly to reduce climate change.climate
- 6The federal government should take a larger role in providing health insurance.healthcare
- 7The federal government should raise the federal minimum wage and strengthen union protections.labor
- 8The federal government should spend more on public education and student-debt relief.education
- 9The federal government should increase military and defense spending.defense
- 10The federal government should expand Social Security, Medicare, and food assistance.safetynet
- 11The federal government should set national standards making it easier to vote.elections
- 12The federal government should increase support programs for farmers and rural communities.agriculture
How you answer
Each statement is rated on a five-point scale, or skipped:
- 1Strongly disagree
- 2Disagree
- 3No opinion / neutral
- 4Agree
- 5Agree strongly
- –Skip — leaves the topic out of your score entirely
A neutral 3 and a skip are treated the same way: the topic is left out of your score. A score is only ever built from topics you took a side on.
How a single vote is scored
Your answer becomes a stance between −1 and +1. The formula subtracts the neutral midpoint and halves the result:
A representative’s vote is +1 for Yea, −1 for Nay. Present and Not Voting are never scored — they are counted and shown separately (“Did not vote: 3”). The curated map records, for each roll call, a direction: whether a Yea vote supports the “agree” side or the “disagree” side of the statement. Direction times vote gives the representative’s position on the topic, and the vote counts as agreement when that position matches the side you picked.
Three weights, and nothing else
Not every vote counts equally. Exactly three multipliers adjust a vote’s weight. No others are permitted anywhere in the code.
1. Significance W_sig — how consequential the vote was
Set per roll call by the curator when the vote is added to the map:
| Tier | What it means | Weight |
|---|---|---|
| 3 | Final passage of major legislation, veto override, treaty ratification | 2.0 |
| 2 | Final passage of ordinary legislation; the substantive amendment that is the topic’s core question | 1.5 |
| 1 | Procedural vote that directly decides the bill’s fate (cloture on the measure, motion to table the key amendment) | 1.0 |
Purely administrative votes — quorum calls, journal approval, non-determinative motions — are never entered into the map at all.
2. Recency W_rec — how recent the vote was
Older votes count less. Weight is fixed by the Congress in which the vote happened, measured against the current 119th Congress:
| Congress | Years | Weight |
|---|---|---|
| 119th | 2025–26 | 1.0 |
| 118th | 2023–24 | 0.8 |
| 117th | 2021–22 | 0.6 |
| 116th and earlier | 2019–20 and before | Excluded — not ingested |
3. Bipartisan context W_bip — voting against your own party
A vote against the representative’s own party majority is a costly, high-information signal, so it counts for more. This is computed from the party vote totals recorded on each roll call — it is never a party-alignment score, and it never appears in your result.
Putting a single vote together
The three weights and the strength of your opinion multiply into one number:
The |s| term means a “strongly” answer (stance ±1) weighs a vote twice as heavily as a mild one (stance ±0.5). A neutral or skipped answer has s = 0, so the whole topic drops out.
From votes to a topic score
For one topic, the alignment score is the share of weight that landed on votes you agreed with:
The sum runs only over roll calls the representative actually voted Yea or Nay on. If there are fewer than 3 such votes on a topic, no score is shown — you see “Not enough votes on this topic to score.” RepCheck never guesses to fill a gap.
Every topic score is shown with its denominator (for example, “72% aligned · 18 votes scored”) and links straight to the underlying roll calls, so you can open the record behind any number.
The overall score
The overall number pools every scorable topic into the same ratio, so a topic with more or heavier votes carries proportionally more of the total:
Only topics you took a side on and that cleared the 3-vote minimum are included. If fewer than 4 topics can be scored — common for a representative seated mid-term — the number is labeled “Partial record — n topics scored” so it is never mistaken for a complete picture.
Rounding: displayed percentages are rounded half-up to a whole number. The math itself uses full-precision decimals and rounds only at the very end, never in the middle.
A worked example
Suppose you answer the firearms statement with 5 (stance s = +1). The representative has three curated votes on that topic:
| Roll call | Direction | Vote | Agree? | W_sig | W_rec | W_bip | w | agree × w |
|---|---|---|---|---|---|---|---|---|
| 117 · Senate #235 — background checks (Yea = agree) | +1 | Yea | yes | 2.0 | 0.6 | 1.5 | 1.80 | 1.80 |
| 118 · House #41 — repeal rule (Yea = disagree) | −1 | Yea | no | 1.5 | 0.8 | 1.0 | 1.20 | 0 |
| 119 · Senate #12 — cloture (Yea = agree) | +1 | Nay | no | 1.0 | 1.0 | 1.0 | 1.00 | 0 |
The Gap
A Gap is a documented public statement by a representative that contradicts the direction of their own voting record on the same topic. It is measured the same way as a topic score, but with one deliberate difference: the strength of your opinion is left out, because a Gap is about the representative’s consistency, not about you.
A Gap is a serious claim, so it is built to fail closed. The product bar is blunt:
Every Gap card must survive being screenshotted and fact-checked by the representative’s own press office.
To reach that bar, a statement must clear all five of these gates. Any one failure drops it silently:
- Official channels only. Press releases and floor statements from the representative’s own .house.gov / .senate.gov site or the official Congressional record. Tweets, campaign sites, TV transcripts, and news articles are excluded — a defensibility decision, not a technical one.
- Verbatim-quote verification. The quoted sentence must appear word-for-word in the fetched official source, checked in code. An automated reader can misjudge a stance, but it cannot invent a quote — if the words are not there, the item is dropped.
- High confidence. An automated language model (run at temperature 0, so it is deterministic) reads the statement against the exact question wording. Its confidence must reach at least 0.90, enforced in the code and again as a database constraint.
- A consistent record only. A Gap is only declared when the voting record leans one way with a strength of at least 0.6 (roughly 80/20 or stronger) across at least 3 votes. A mixed record never produces a Gap. This is the anti-gotcha guarantee.
- At most three per representative. Only the three strongest Gaps are shown — one per topic at most. Restraint is the credibility strategy. When there is no Gap, nothing is shown; the absence of a contradiction is not advertised as a badge.
Every Gap card shows the exact quote, its date, and a link to the source, next to the contradicting votes and their dates and links. The closing line is fixed and non-editorial: “These are the records. You decide.”
The compass
The 12 questions above measure one thing well: how much the federal government should do in the economy. They say almost nothing about a second, independent question — how much power the state should hold over the individual. So there are 6 optional questions that measure exactly that, and only that. Answering them places you on a second axis. Skipping them leaves that axis blank; it is never guessed.
- 13The federal government should be able to collect Americans' phone and internet records without an individual warrant in order to prevent terrorism.surveillance
- 14The federal government should be able to require online platforms to remove content it designates as dangerous misinformation.speech
- 15The federal government should end the federal ban on marijuana and leave the question to the states.drugs
- 16The federal government should reduce mandatory minimum prison sentences and expand rehabilitation programs.justice
- 17The federal government should require Congress to authorize military action before the President commits U.S. forces to sustained combat.execpower
- 18The federal government should impose stricter penalties on protests that block roads or disrupt commerce.protest
Three of the six put the authority position on “agree” and three put the liberty position there. So someone who simply agrees with everything lands in the middle of the vertical axis rather than at a pole. That is deliberate, and it is a property the original 12 do not have.
What each question contributes
Every question pulls on one or both axes by a fixed amount, set out below. A positive economic number means “agree” is the smaller-government position; a positive liberty number means “agree” is the individual-autonomy position. These are editorial judgments, they live in one file (lib/compass.ts), and they can be challenged with a pull request exactly like the bill map.
| Question | Economic | Liberty |
|---|---|---|
| abortion | — | 1.0 |
| guns | -0.5 | -0.5 |
| immigration | — | -1.0 |
| taxes | -1.0 | — |
| climate | -1.0 | — |
| healthcare | -1.0 | — |
| labor | -1.0 | — |
| education | -1.0 | — |
| defense | 0.5 | -0.5 |
| safetynet | -1.0 | — |
| elections | — | 1.0 |
| agriculture | -1.0 | — |
| surveillance | — | -1.0 |
| speech | — | -1.0 |
| drugs | — | 1.0 |
| justice | — | 1.0 |
| execpower | — | 1.0 |
| protest | — | -1.0 |
Your position on an axis is the average of your answers on it, weighted by those numbers. Your representatives are placed by the same formula, with their vote record standing in for their answers: for each question we take how consistently their curated votes back that statement (the same number the Gap engine uses), so a representative’s dot can never contradict their Gap card.
Two things the compass will not do
It will not place you vertically on the strength of the original 12. Five of them brush against state power, and they are enough to produce a number — but it would be a number inferred from questions written to ask something else. The vertical axis stays blank until at least 2 of the six are answered. Links shared before the six existed keep working, and keep their original scores exactly.
It will not place a representative we cannot place. A representative needs a scored record on at least 2 of the six. That bar is not always met, and where it is not, we say so instead of drawing a dot. Across the 117th, 118th and 119th Congresses the Senate held decisive floor votes on only two of these six subjects — surveillance and war powers. It cast none at all on speech, sentencing reform, or protest penalties. That is a fact about the Senate’s record, not a gap in ours, and the six questions still place you whether or not Congress ever voted on them.
The map is public
Deciding which roll call belongs to which topic — and its direction and significance — is an editorial act, and it is where a non-partisan tool lives or dies. RepCheck does not hide that act inside an algorithm. The entire bill-to-question map lives in the open repository as db/seed/bill-map.json, governed by three rules:
- Every entry carries a one-sentence plain summary that a reasonable person on either side would accept as accurate.
- Each topic gets its most significant, fate-deciding votes, chosen by legislative weight — never by which party they flatter.
- The whole file is public and can be challenged with a pull request.
Bias is inevitable in any selection. Hidden bias is the only fatal kind. Every scoring input here is inspectable, and every one of them is open to challenge.
What this deliberately does not do
- It scores roll-call votes only — not speeches, co-sponsorships, or committee votes.
- It never frames a score by party, and it never tells you who to support.
- It stores nothing about you: no account, no cookie, no server-side record.
- It covers Missouri’s federal representatives first, with more states to come.