About
How PA Elected Officials Watch works
Every number on this dashboard comes from a public source we cite. This page explains where the data comes from, how votes are scored against the WTPPPA platform, and why Pennsylvania's full-time legislature produces more trackable activity than most states.
What this dashboard tracks
We track all 251 current PA state legislators — 50 senators (4-year terms) and 201 representatives (2-year terms), all elected in even years — across two data dimensions:
- Sponsorship. Every bill a legislator introduces as primary sponsor or signs onto as cosponsor is catalogued and matched against the WTPPPA platform. Sponsorship is the stronger signal of priorities — a legislator chooses which bills to put their name on.
- Floor votes. Roll-call votes on bills that touch a WTPPPA platform position are scored. A "yea" on an aligned bill (or "nay" on an opposed bill) counts as voting with the platform; the inverse counts as against. Abstentions, absences, and votes on bills with no clear platform alignment are excluded from the headline rate.
Data last updated April 29, 2026, refreshed monthly from OpenStates. See Data sources below.
Pennsylvania's full-time legislature
The National Conference of State Legislatures (NCSL) classifies state legislatures into three tiers based on how much time legislators spend on their duties, how much they're paid, and the size of their professional staff. Pennsylvania sits in the top tier — full-time — alongside California, New York, Ohio, Michigan, and a handful of others. About 10 states nationwide reach this tier.
What that means in practice:
- — PA legislators work year-round with no constitutional session-day limit. They can introduce and advance legislation any time, not just during a fixed window.
- — Base salary of $106,422/year (2024) makes this their primary job, not a side income. Contrast with Wyoming's ~$150/session day.
- — Large professional staff — researchers, attorneys, fiscal analysts — allows for longer, more complex legislation and deeper committee review.
- — The result: PA typically introduces 3,000–5,000 bills per two-year session. A part-time state like Wyoming sees roughly 350.
This context matters for reading the dashboard. A PA legislator who has introduced 40 bills isn't unusually prolific — the full-time schedule, staff support, and year-round calendar make that volume normal here. In a part-time legislature the same 40 bills would be extraordinary.
| State | NCSL type | Annual pay | Session | Members |
|---|---|---|---|---|
| California | Full-time | $128,341 | Year-round | 120 |
| New York | Full-time | $142,000 | Year-round | 213 |
| Pennsylvania | Full-time | $106,422 | Year-round | 253 |
| New Jersey | Full-time | $49,000 | Year-round | 120 |
| Ohio | Full-time | $73,146 | Year-round | 132 |
| Texas | Part-time | $7,200/yr | 140 days/2 yrs | 181 |
| Wyoming | Part-time | ~$150/day | ~40 days/yr | 90 |
Source: NCSL Full- and Part-Time Legislatures · NCSL Legislator Compensation, 2024. Salaries are base pay; some states add per diem, mileage, or leadership stipends. TX legislators meet for 140 days every two years (biennial session) and are compensated primarily via per diem.
Bills enacted per million residents
Raw bill counts mislead. Wyoming's legislature enacts far more bills per resident than Pennsylvania's — not because it's more effective, but because Wyoming has 580,000 people and correspondingly simpler governance needs. Pennsylvania has 13 million residents, a $50B budget, 500 school districts, and policy complexity that requires longer, more contested legislation. Per-capita normalizes for state size so comparisons are fairer.
PA's current session (platform-tracked bills only): 4,051 introduced · 72 enacted (2% of tracked bills). Note: this dashboard tracks platform-relevant bills, not all PA legislation — the comparison table uses full-legislature estimates.
| State | Type | Enacted (2-yr) | Population | Per million |
|---|---|---|---|---|
| California | Full-time | 1,200 | 39.0M | 31 |
| New York | Full-time | 900 | 19.7M | 46 |
| Pennsylvania← PA | Full-time | 250 | 13.0M | 19 |
| New Jersey | Full-time | 500 | 9.3M | 54 |
| Ohio | Full-time | 280 | 11.8M | 24 |
| Texas | Part-time | 1,400 | 30.0M | 47 |
| Wyoming | Part-time | 300 | 0.6M | 517 |
All figures are approximate 2-year session estimates; sourced from NCSL "Bills Introduced and Enacted" reports and state legislature websites, 2023–2024 sessions. PA (~250) is a conservative estimate for a full session — PA enacts fewer bills than many states due to divided-government dynamics. Population: 2023 US Census estimates. "Enacted" = bills signed into law by the governor.
The small-state per-capita advantage is structural, not a sign of greater effectiveness — Wyoming's 40-day session can move faster partly because its policy space is narrower. The more meaningful question is whether a legislature has the institutional capacity to handle complex, contested policy. That's what the Squire Index below measures.
Legislative professionalism: the Squire Index
Political scientist Peverill Squire developed an index that measures how professionalized each state legislature is relative to the US Congress (which scores 1.0). It combines three factors: compensation (salary relative to median household income), staff (per-member professional staff), and session length (days in session). A higher score means legislators can work more like full-time professionals — deeper expertise, better-staffed offices, more time on complex policy.
Pennsylvania scores ~0.28 — roughly 28% as professionalized as Congress, and among the top 8–10 states nationally. That's what the $106k salary, year-round schedule, and large legislative staff buy you.
| State | NCSL type | Squire score | Relative to Congress |
|---|---|---|---|
| California | Full-time | 0.63 | 63% of Congress |
| New York | Full-time | 0.52 | 52% of Congress |
| Pennsylvania | Full-time | 0.28 | 28% of Congress |
| New Jersey | Full-time | 0.24 | 24% of Congress |
| Ohio | Full-time | 0.19 | 19% of Congress |
| Texas | Part-time | 0.09 | 9% of Congress |
| Wyoming | Part-time | 0.06 | 6% of Congress |
Source: Squire, Peverill. "A Squire Index Update." State Politics & Policy Quarterly 17(4):361–371, 2017. Scores are approximate and rounded; the index has been updated periodically since its original 2007 publication. Congress = 1.0 benchmark.
High Squire scores correlate with more complex legislation, larger staff capacity, and longer bill-drafting cycles — not necessarily more bills enacted per year. CA and NY both score high and enact relatively few bills per capita because their legislatures are doing harder work on larger policy problems.
How votes are scored
- What counts as "scorable"
- A vote is scorable when (a) the bill has been reviewed by WTPPPA editors and assigned a clear "aligned" or "opposed" designation against a platform position, and (b) the legislator cast a yea or nay vote on the floor. Abstentions and absences are excluded — they don't tell us where someone stands. Mixed-alignment bills (one plank aligned, another opposed) are flagged but excluded from the headline alignment rate.
- With vs. against the platform
- Voting yea on an aligned bill = with the platform. Voting nay on an opposed bill = also with the platform. The inverse in each case = against. This is symmetric: a legislator who consistently votes against bad bills scores just as well as one who consistently votes for good ones.
- The "topic-only" category
- Some bills match a platform topic (e.g., they're about education funding) but haven't been reviewed for clear alignment. These show up in the vote history as "Touches platform" and contribute to the total vote count but not the scored alignment rate. As Legislation Watch accumulates more editorial reviews, more votes will resolve into scored calls.
- Sponsorship vs. voting
- We treat sponsorship as the stronger priority signal. A legislator can be whipped into a party-line floor vote against their preference; choosing to introduce or co-sponsor a bill is a voluntary act. The headline stats on each official card lead with sponsorship for this reason.
Data sources and update schedule
- Officials and voting records
- Fetched from the OpenStates API (PA state legislature feed) by a GitHub Actions cron job that runs on the 1st of each month. OpenStates aggregates roll-call data directly from the PA General Assembly's official records. Last pipeline run: April 29, 2026.
- Bill data and platform matching
- Sourced from the same OpenStates feed that powers Legislation Watch. Bills are matched to platform positions using a two-pass keyword + TF-IDF matcher — no AI in the matching loop. Editorial alignment calls (aligned / opposed / mixed) come from WTPPPA officers reviewing matched bills and recording decisions in a version-controlled JSON file.
- Geographic lookup (ZIP / address / county)
- ZIP-to-district lookups use a pre-built static map derived from PA legislative district shapefiles. Address lookups use the US Census Geocoder (free, no API key, no quota). County-area sampling uses the same Census endpoint across a grid of points to catch all overlapping districts. No data leaves your browser for these lookups beyond what the Census API receives.
Limitations and caveats
- — Vote lag. OpenStates publishes roll-call data after the GA records it, which can take days to weeks for votes cast near the end of a session or on procedural matters. The monthly refresh catches most of this, but recent floor votes may not appear until the next cron run.
- — Alignment coverage. Only bills that WTPPPA editors have reviewed and scored contribute to the headline alignment rate. Bills that touch a platform topic but haven't been reviewed yet show as "Touches platform" and don't move the rate. The more editorial reviews accumulate in Legislation Watch, the more informative this number becomes.
- — Bill count vs. impact. A high bill-introduction count isn't the same as legislative impact. Many bills die in committee without a hearing. The individual official pages show bill status so you can distinguish "introduced 40 bills" from "had 40 bills advance past committee."
- — ZIP and county coverage. The static ZIP-to-district map covers most PA ZIPs but not all. Gaps fall back to the Census geocoder, which is accurate for addresses but returns only the district at the geographic center of a county — not necessarily your district if you're in a multi-district county.
- — State comparison data. NCSL legislature classifications and salary figures are updated annually; the table on this page reflects 2024 data and will be refreshed each year. Some states add per diem, leadership stipends, or session allowances that are not reflected in the base salary column.
A note on AI
We used Claude, an AI assistant from Anthropic, to help write code and draft copy for this dashboard. The data is not AI-generated — every number comes from a public PA or federal source we cite. Bill-to-platform matching uses a keyword and TF-IDF algorithm, not an AI model. Alignment calls are made by WTPPPA editors and stored in version-controlled JSON.