Scorecard › Methodology

Scorecard Methodology

How We Score Ohio’s Legislators

Every Ohio legislator gets a weighted 0–100 score on LGBTQ+ equality. The score is built from four inputs, multiplied by event-stage weights, and resolved directly from the Supabase roll-call database so every number is traceable to a specific row of data.

Score Weights (v2.1 — SQL-backed intersectional)

Every legislator is scored across four dimensions. Floor votes carry the most weight because a recorded vote is the clearest measure of how a legislator behaves when the moment of decision arrives. Sponsorship is weighted up in v2 to reward members who drive the bills that protect our community, not just those who vote on them when someone else puts the question. Committee votes are tracked separately so members who stop bad bills in committee, or advance good bills out of committee, get credit.

As of v2.1, all four inputs are resolved from the Supabase bills / roll_calls / legislator_vote_exceptions tables rather than a hand-maintained spreadsheet.

40%
Floor Votes
Recorded roll calls on chamber passage, concurrence, and veto overrides — resolved from the roll_calls table.
10%
Committee Votes
Votes to report a bill out of, or hold a bill in, committee. Weighted at 0.75× inside the event ladder.
30%
Sponsorship
Primary (±3) and co-sponsorship (±2) of pro- or anti-equality bills in the bills catalog.
20%
News & Statements
Public statements, press coverage, and floor speeches for or against LGBTQ+ Ohioans.

Event Weights

Inside each category, not every vote counts the same. Higher-stakes events are weighted up; procedural or amendment-only votes are weighted down. These multipliers live in EVENT_WEIGHTS in /js/voting-records.js and in the roll_calls.stage column comment in Migration 4.

Data Pipeline (what the SQL database does)

As of April 22, 2026 the scorecard is backed by Migration 4 (supabase/migrations/20260424000000_scorecard.sql), which persists three tables the public scorecard reads over the anon role:

The final per-member impact is the product of three values: stance direction (from bills.stance), resolved vote (exception row if one exists, otherwise the party-line default), and event weight (from the stage multiplier above). Legislators who were not seated at a roll call’s vote date resolve to - and are filtered out so only votes that actually mattered to that member count against them. The dataset covers both the 135th GA (HB 68, HB 8, SB 104, SB 1 135th, HB 602 135th) and the 136th GA (HB 249, SB 1, SB 34).

Resolution order

  1. If an explicit legislator_vote_exceptions row exists for this member and roll call, that row wins.
  2. If the member was not seated on the vote date, the roll call resolves to - (ineligible; not scored).
  3. Otherwise, the party-line default applies (R→Y on anti bills, D→N on anti bills; signs flip on pro bills).
  4. Independents and mixed-stance bills resolve to NV and are flagged for manual review.

Verification Status

Every roll_calls row carries a verificationStatus flag. Migration 5 (daily verification) extends this into the database schema itself; until then the flag lives in the JS editorial layer.

Intersectional Framing

LGBTQ+ equality cannot be separated from racial justice, reproductive freedom, voting rights, disability justice, and economic dignity. The same legislators who attack our community almost always attack the communities we belong to. Every legislator is evaluated across ten issue families that intersect with LGBTQ+ lives:

Cross-issue inconsistency flag: when a legislator’s subscore dispersion across these ten families exceeds 35 points, the member is strong on one side of the equality map and weak on an intersecting one. We surface that gap on the card instead of letting it hide inside a composite score.

Source Hierarchy

When sources conflict, the higher-authority source wins. Provisional roll_calls rows are reconciled against the chamber journal of record before being promoted to verified. Hand-recorded crossovers in legislator_vote_exceptions always override the party-line default.

  1. Chamber journal of record (roll call)
  2. Legislative Service Commission bill analysis
  3. Committee minutes and clerk reports
  4. Primary-source news (hearing coverage, press events)
  5. Sponsor-authored statements and press releases
  6. Advocacy or opposition statements

Grade Scale

The per-member weighted total from the four inputs above is normalized to a 0–100 scale with max(0, min(100, 50 + raw * 5)), then the grade is applied from the table.

GradeLabelScore Range
A+Champion90 – 100
AStrong Ally73 – 89
BSupportive55 – 72
CMixed Record40 – 54
DUnfriendly20 – 39
FHostile0 – 19

Data Sources

Back to the scorecard
Donate