Skip to main content

Politicians make promises on their stump — we watch and hold them accountable.

Help keep the record honest →Create an account
Methodology

How we source, rate, and make every step auditable.

Politicians make promises on their stump, and StumpWatch holds them to account. Every record on StumpWatch is sourced, structured, and open to inspection. This page documents what we track, where data comes from, and exactly how a rating is calculated. The identical published method applies to every politician regardless of party — StumpWatch is nonpartisan by construction, not by promise.

4
layers of truth
Facts, claims, assessments, opinions — kept separate.
9
outcome ratings
One fixed, symmetric scale for every politician.
−100…+100
integrity score
A transparent breakdown, never one opaque number.
0
silent edits
Every change is hash-chained and append-only.
What we track

Three kinds of record, every one tied to a source.

We capture facts from the public record, the promises politicians make, and the positions they stake out — and we attach a checkable source to each before it can count toward anything.

  • Official records

    Election results, roll-call votes, and floor statements from government sources — Congress.gov, GovTrack, official legislative records, and state election boards.

  • Campaign promises

    Sourced from candidate websites, public debate transcripts, press releases, and contemporaneous news coverage — each captured with an archived URL.

  • Positions & issue stances

    Drawn from official statements, questionnaire responses, voting records, and documented public statements — never from rumor or inference.

The four-layer model

Crowd opinion is never dressed up as a sourced fact.

Every piece of information is filed at the right layer. Each layer has its own write path, and a lower layer can never borrow the authority of a higher one.

  1. 01

    Verified facts

    Immutable records from official government sources.

  2. 02

    Structured claims

    Sourced promises and stated positions, versioned in an append-only revision log.

  3. 03

    Assessments

    Auditable, disputable ratings produced by fact-checkers or community aggregation.

  4. 04

    Opinions

    Clearly labeled community sentiment, structurally separate from the factual record.

The rating scale

Nine outcomes, symmetric around zero.

Reviewers assign each promise one of nine outcome ratings on a fixed, symmetric scale in 0.25 steps. The ratings are published here and cannot change without updating this page. The chart draws each rung straight from the platform’s rating code, so what you see is exactly what the score uses.

The colors here are a neutral teal-to-amber sequence — never red or blue. Party color appears on StumpWatch only next to a real person’s identity, never on an abstract scale.

Worked againstKept on balance0Fully KeptFULL+1.0ChampionedCHAMPIONED+0.75PartialPARTIAL+0.5AttemptedATTEMPTED+0.25No opportunityNO_OPPORTUNITY0IgnoredIGNORED−0.25AbstainedABSTAINED−0.5MisalignedMISALIGNED−0.75HostileHOSTILE−1.0
RatingCreditDefinition
Fully Kept+1.0Kept 100% of the commitment as stated.
Championed+0.75Actively led or sponsored the effort to fulfill the promise — drove it, beyond a single supporting vote.
Partial+0.5Kept some of the commitment, but not all.
Attempted+0.25Voted for or advanced legislation toward it, but it did not pass or take effect.
No opportunity0Has not yet had a genuine opportunity to act — not penalized. A scored neutral data point, distinct from an unrated promise.
Ignored−0.25Had the opportunity but never engaged — neither supported nor opposed.
Abstained−0.5Actively avoided voting or taking a position on a matter that would have fulfilled or prevented the promise.
Misaligned−0.75Voted for, or took measures that work against alignment with the promise.
Hostile−1.0Actively worked against fulfilling the promise.

Separate from outcomes: the lifecycle states

Three lifecycle statuses are never scored — a politician is not penalized for a promise still in flight. They are distinct from No opportunity, which is a scored, neutral (0) outcome.

Draft
Captured but not yet sourced or published — never reaches a rating.
Not yet rated
Published and sourced, but no reviewer has scored it yet.
In progress
Action is underway; an outcome can't be honestly assigned yet.
The formula

The weighted Promise Integrity Score.

StumpWatch reports a Promise Integrity Score on a signed scale from −100 to +100. Positive means a politician kept their promises on balance; zero means no net effort; negative means they actively worked against them. The score is a breakdown, never a single opaque number — you can always see the full nine-way count.

Score=Σ ( credit × weight )Σ weight×100
weight=significance(1–5)×confidence(0–1)
−100Worked against0No net effort+100Kept on balance
  • 01Only the nine outcome ratings count toward the score. Draft, Not yet rated, and In progress are never scored. No opportunity is the one neutral (0) outcome that is scored, so a politician who genuinely hasn’t had a chance to act is neither rewarded nor penalized.
  • 02Each rated promise is weighted by significance (1–5) × evidence confidence (0–1), so bigger, better-evidenced promises move the score more.
  • 03Score = (weighted sum of credits ÷ total weight) × 100, rounded to the nearest integer.
  • 04When no promises have been rated yet, the score is shown as Not yet rated, never as a number. Promise-keeping is reported separately from popularity — they are different questions.

Reference implementation: src/lib/ratings.tsweightedIntegrityScore / computeScorecard (significance × confidence weighted), used on every surface that shows a score.

A second, separate axis

The Disclosure score.

Promise-keeping answers did they do what they said? The Disclosure axis answers a different question: is an official acting on or championing an issue that already existed when they ran but which they never disclosed as a priority in their campaign — acting without a mandate they sought? It is shown on a politician’s page alongside the Integrity Score and is never folded into it: a confirmed undisclosed priority does not change the promise-keeping number, and vice-versa. They are two separate measures, by design.

  • 01A high evidence bar. Every record cites three independent sources: the action the official took, evidence the issue already existed when they ran, and the campaign record where the issue is absent. No record exists without all three.
  • 02Only confirmed items count. A record is held as a draft until a reviewer confirms it; drafts, rebutted, and rejected records never affect the score. Each confirmed item is weighted by materiality (1–5) × evidence confidence (0–1).
  • 03The score, 0–100, where 100 is fully transparent. It starts at 100 and each confirmed item multiplies it down by (1 − 0.6 × weight), where weight = (materiality ÷ 5) × confidence. More confirmed items only ever lower the score, and it is bounded to 0–100.
  • 04No clean-audit claim. An official with no confirmed records shows “No undisclosed priorities on record” — not a perfect 100 — because we never claim to have audited everything they have ever done.
  • 05Right of reply. An official may respond to any record; their response is shown alongside it and is never erased.

Nonpartisan by construction.

The identical three-source standard and the identical formula apply to every official regardless of party. The Disclosure gauge uses a neutral teal-to-amber palette — never red or blue.

Reference implementation: src/lib/disclosure.tsdisclosureScore (materiality × confidence weighted, confirmed items only).

Sourcing rules

No source, no rating. No exceptions.

These rules are enforced in the data model, not just in policy — they are what makes the record checkable and tamper-evident.

  • 01Every source carries a content hash, so stealth edits and link-rot are detectable.
  • 02Unsourced records stay in DRAFT and never reach a rating or public display.
  • 03Promises and positions are versioned in an append-only revision log — the original is never overwritten.
  • 04A lower layer (an opinion) is never presented with the authority of a higher one (a sourced fact).
Maps & election data

What is measured, and what is computed.

The front-page map and the state/county detail maps draw on a few outside datasets plus some values StumpWatch computes itself. We label which is which so nothing implies data we don’t actually have.

From outside sources

Map boundaries
US Census Bureau cartographic boundary files (public domain) for states, and a US Atlas county topology for the county view.
Presidential results (2020 & 2024), by county
The tonmcg county-level returns, compiled from Associated Press, Fox News, and other decision-desk reporting. We aggregate those county returns up to state totals for the front-page state map.
Presidential results, by congressional district
The Downballot (formerly Daily Kos Elections). Presidential results are not reported by congressional district by any official body, so these are The Downballot’s calculation, apportioning official precinct returns into districts. We show both 2020 and 2024 on the same 2024 district lines, so the shift between them is directly comparable. Used with attribution.
Voter turnout
State-level turnout of the voting-eligible population (VEP) from the University of Florida Election Lab / US Elections Project (Michael McDonald). This is state-level only — there is no official county VEP figure, so the county map shows no official turnout rate.
County population
Citizen Voting-Age Population (CVAP) from the US Census Bureau ACS 2020–2024 five-year estimate.

Computed by StumpWatch

Margin
The signed two-party presidential margin (D−R, in percentage points) taken directly from the returns above.
Swing
The change in that margin from 2020 to 2024, computed from the two sets of returns.
Partisan lean
The average of the 2020 and 2024 two-party Democratic share measured against the national two-party average. This is our own calculation in a Cook-PVI-style spirit; it is not Cook PVI and is not affiliated with the Cook Political Report.
Competitiveness
Derived from the absolute 2024 margin: the closer the result, the more competitive.
County “estimated turnout”
A proxy, not an official rate: total 2024 ballots divided by the county’s ACS 2020–2024 citizen voting-age population. Because CVAP is an estimate and the time windows don’t line up exactly, this figure can exceed 100% in small counties and should be read as an approximation only.

Honest limitations

  • The Issue / topic map has no honest external dataset behind it — no source meaningfully maps a state’s overall stance on an issue. It therefore shows only positions StumpWatch actually tracks; states with no tracked position stay grey. We will not invent a national issue map.
  • Alaska reports results by legislative district rather than by borough, so it is excluded from the county map (its district codes collide with borough codes) even though it is fully present in the state map.
  • Connecticut switched to planning regions, whose codes don’t join the older county shapes used here, so its counties show as grey rather than guessing. Washington, DC’s wards are combined into a single DC entry.
  • The Promise-kept choropleth (red–amber–green) is entirely separate from the red–blue election maps. One measures promise-keeping by officials we track; the others report election results. They are never mixed.
The audit model

Why nothing is silently deleted.

Credibility depends on a record that can’t be quietly rewritten. Every edit to a tracked record writes a hash-chained revision to an append-only log, and “deletions” set a hidden flag rather than removing data — the original stays in the audit history. The chain can be independently verified for tampering, so a stealth edit is detectable. This is a feature, not a limitation: it is what lets anyone check that we didn’t move the goalposts.

Revision 1hash · prevHashRevision 2hash · prevHashRevision 3hash · prevHash

Each revision stores the hash of the one before it; altering any earlier record breaks every link after it.

FAQ

Frequently asked questions

Short answers to what people ask most about how StumpWatch sources, rates, and audits the record — every one grounded in the method documented above.

What is StumpWatch?
StumpWatch is an evidence-first accountability platform that tracks the promises politicians make on the campaign stump and whether they keep them. Every record is sourced, structured into four separate layers — verified facts, sourced claims, auditable assessments, and clearly labeled opinions — and open to inspection.
Is StumpWatch nonpartisan?
Yes. The identical published method applies to every politician regardless of party — StumpWatch is nonpartisan by construction, not by promise. The rating scale and the integrity formula use a neutral teal-to-amber palette, never red or blue; party color appears only next to a real person's identity, never on an abstract scale.
How are campaign promises rated?
Reviewers assign each promise one of nine outcome ratings on a fixed scale that is symmetric around zero, in 0.25 steps. The scale is published on this page and cannot change without updating it. Three lifecycle statuses — Draft, Not yet rated, and In progress — are never scored, so a politician is not penalized for a promise still in flight. No opportunity is the one neutral (0) outcome that is scored.
How is the Integrity Score calculated?
StumpWatch reports a Promise Integrity Score on a signed scale from −100 to +100: positive means a politician kept their promises on balance, zero means no net effort, and negative means they actively worked against them. Each rated promise is weighted by significance (1–5) × evidence confidence (0–1), and the score is the weighted sum of credits divided by total weight, times 100, rounded to the nearest integer. It is a transparent breakdown showing the full nine-way count, never a single opaque number.
Can the record be edited or deleted?
Nothing is silently deleted. Every edit to a tracked record writes a hash-chained revision to an append-only log, and "deletions" set a hidden flag rather than removing data, so the original stays in the audit history and the chain can be independently verified for tampering. Candidates get a right of reply, not a right to erase: a claimed-candidate account may add official responses and propose corrections, but may never delete promises, change assessment outcomes, or edit the original text or audit history.
Where does the data come from?
Facts come from official government sources such as Congress.gov, GovTrack, official legislative records, and state election boards. Promises and positions are sourced from candidate websites, debate transcripts, press releases, and contemporaneous news coverage, each captured with an archived URL. Every source carries a content hash so stealth edits and link-rot are detectable, and an unsourced record stays in Draft and never counts toward a rating.
Is StumpWatch a nonprofit — are donations tax-deductible?
Not yet. StumpWatch intends to establish itself as a nonprofit organization, but it is not currently a recognized nonprofit, so donations are not tax-deductible. We still gratefully accept donations to fund the work.
How can I contribute or correct the record?
Anyone can challenge the record in the open. Any verified contributor can propose a sourced correction on any record; new contributors' corrections are held for two-reviewer approval, while Established and higher contributors' corrections apply immediately, subject to challenge. Candidates may submit official responses shown alongside the original record, and every accepted correction is published.
Corrections pipeline

Anyone can challenge the record — in the open.

Any verified contributor can propose a correction on any record. New contributors’ corrections are held for two-reviewer approval; Established+ contributors’ corrections apply immediately, subject to challenge. Candidates may submit official responses visible alongside the original record. Every accepted correction is published.

StumpWatch is live, and the record is still growing. Many promises and positions aren’t tracked yet, and some features are still in beta. Add a sourced promise and help keep the record honest.

Help keep the record honest →