How the 119th Congress voting-dashboard metrics are computed, and what they do and don't measure.
https://clerk.house.gov/evs/<year>/roll<NNN>.xml). User-facing index:
https://clerk.house.gov/Voteshttps://www.senate.gov/legislative/LIS/roll_call_votes/...). User-facing
index: https://www.senate.gov/legislative/votes_new.htm/member/congress/119) supplements vote-derived rosters so members who
served but never cast a recorded vote are still represented.Coverage for the 119th Congress as of the most recent build: 553 House + 789 Senate roll-call votes; 552 distinct members (449 House + 103 Senate).
Each member's recorded vote on a roll call is one of Yea, Nay, Aye,
No, Present, Not Voting. For analysis, Aye/Yea are merged into
Yea and No/Nay are merged into Nay — the procedural/substantive
distinction is preserved only in the per-vote table column.
For every vote, each party's majority position is computed:
party_position = Yea if yea > nay
= Nay if nay > yea
= Split otherwise (tie or zero)
Per vote, the member's normalized Yea/Nay is compared to each party's
majority position:
| Condition | Label |
|---|---|
| Member matches BOTH party majorities | Helped Both |
| Member matches only Republican majority | Helped Republicans |
| Member matches only Democratic majority | Helped Democrats |
| Member matches NEITHER party majority | Helped Neither |
| Member did not cast a Yea/Nay | N/A: <state> |
A blocking win is recorded when ALL of the following hold:
Nay.result matches fail, reject, not agreed,
not passed, not invoked).blocked = "Democrat" — Democratic majority was Yea, Republican majority
was not Yea, member voted Nay → counted as helping sink a Democrat-backed
measure.blocked = "Republican" — symmetric.This is a per-share count, not a marginal causal estimate: the metric credits the member individually for a defeat that may have involved hundreds of other Nay votes.
Across votes where each party had a definite majority (not Split), the
member's normalized vote is counted as matching (with) or differing
(against) that party's majority. Reported as KPI tiles and as a
stacked bar chart of raw counts and percentages.
A vote counts as a lone-wolf defection when:
Identifies stubborn outliers — members who repeatedly break with their own caucus when very few others do.
Each vote's date is bucketed by YYYY-MM. The four primary alignment
classes (Helped Republicans / Helped Democrats / Helped Both /
Helped Neither) are summed per month and rendered as a multi-series
line chart.
The Rankings page sorts the chosen chamber by any of:
Percentage metrics exclude members with zero votes cast (denominator undefined).
The comparison view overlays up to six members on five charts: alignment
over time, "voted against own party" rate over time (using
Helped Neither as a proxy — see Limitations §10), grouped KPI bar,
defection scatter (% against GOP vs % against Dem), and vote distribution.
Helped Neither per month as an approximation; the
pipeline does not currently emit a true monthly own-party-defection
series.served_partial banner for members who cast zero recorded
votes. A low participation count may reflect resignation, illness, or
campaigning for higher office — check the underlying date pattern in
the votes table.Each per-member JSON includes a _meta block with schema_version,
pipeline_version, classifier_hash (SHA-256 of analyze.py),
data_snapshot_date, and per-chamber source_xml_count. The classifier
hash changes if and only if the classification logic changes.