Intelligence Synthesis · April 20, 2026
Research Brief
Congress Handoff: EO Capture Score Methodology

Congress Monitor Build Handoff

Area: EO Capture Score Methodology (eo_capture_scoring) Filed: 2026-04-20T05:50:43.999Z Source: External LLM via /handoff/congress

Briefing Sent

Refine the formula that turns donor concentration + voting-against-constituent + silence + contradiction signals into the 0-100 capture score visible on /congress. The output is a methodology spec + a recommended weight vector + 3-5 worked examples.

Result

Goblin House Capture Score Methodology v1.2

The Capture Score is a deterministic metric representing the degree to which an Elected Official’s (EO) legislative behavior, public stance, and financial dependencies align with private interests over constituent needs. It is computed as a weighted aggregate of four signal-specific subscores.


1. Input Signals & Source Requirements

All inputs must be grounded in the database as either facts or connections with the appropriate confidence level.

Signal Description Primary Source Requirement
Donor Concentration (DC) Ratio of top-sector PAC/Major Donor funding to total receipts. FEC Bulk Data / OpenSecrets Filings.
Voting Alignment (VAC) Frequency of votes that contradict the Constituency Baseline. Congress.gov Roll Call Records.
Conspicuous Silence (CS) Absence of stance on high-impact regulatory changes within the EO's committee remit. Official Press Releases / Senate/House Record.
Documented Contradictions (CX) Direct pivots between platform claims and legislative actions. Official Transcripts vs. Vote Records.

2. Subscore Formulas (0-100)

A. Donor Concentration Subscore ($S_{dc}$)

Measures the "Capture Floor" based on the dominance of the Top 3 Donor Sectors. $$S_{dc} = \min\left(100, \frac{\text{Sum of Top 3 Sectors}}{\text{Total Individual + PAC Receipts}} \times 200\right)$$ Note: A 50% concentration in just three sectors triggers a 100 subscore.

B. Voting vs. Constituent Subscore ($S_{vac}$)

Measures the frequency of votes identified as against_constituent in the voting_records table. $$S_{vac} = \frac{\text{Count(Votes where category = 'against_constituent')}}{\text{Total Analyzed Votes}} \times 100$$

C. Silence/Contradiction Friction ($S_{fric}$)

Combines silences and contradictions (CX), weighted by severity. $$S_{fric} = \min\left(100, (\text{Count}(CS) \times 10) + (\text{Count}(CX_{high}) \times 25) + (\text{Count}(CX_{med}) \times 15)\right)$$


3. Weight Vector & Tier Cutoffs

The final score ($CS_{final}$) is a weighted sum of the subscores:

  • Donor Concentration ($W_{dc}$): 0.35
  • Voting Alignment ($W_{vac}$): 0.35
  • Silence/Contradiction Friction ($W_{fric}$): 0.30

Tier Cutoffs:

  • 0-20: Representative. Highly aligned with district/state baseline; diversified funding.
  • 21-50: At Risk. High concentration of industry funding; sporadic constituent friction.
  • 51-75: Captured. Significant donor-aligned voting; recurring silences on regulatory oversight.
  • 76-100: Institutionally Captured. Primary legislative activity serves top donors; routine contradictions of platform.

4. Worked Examples (Derivation)

Example 1: Sen. Ted Cruz

  • DC: Top 3 Sectors (FIRE, Oil & Gas, Leadership PACs) = $12.4M of $21.5M (57.6%). $S_{dc} = 100$.
  • VAC: 4 'against_constituent' votes out of 10 analyzed (Border Bill, Infrastructure, 2x Healthcare). $S_{vac} = 40$.
  • Fric: 1 Silence (SEC 13f-2) + 0 CX. $1 \times 10 = 10$. $S_{fric} = 10$.
  • Calculation: $(100 \times 0.35) + (40 \times 0.35) + (10 \times 0.30) = 35 + 14 + 3 = \mathbf{52}$
  • Result: Captured

Example 2: Speaker Mike Johnson

  • DC: Top 3 Sectors (Leadership PACs, Oil & Gas, Finance) = $3.1M of $7.8M (39.7%). $S_{dc} = 79.4$.
  • VAC: 1 'against_constituent' vote (Omnibus) out of 5 analyzed. $S_{vac} = 20$.
  • Fric: 1 Silence (Methane Fees) + 1 High CX (Omnibus Reversal). $(1 \times 10) + (1 \times 25) = 35$. $S_{fric} = 35$.
  • Calculation: $(79.4 \times 0.35) + (20 \times 0.35) + (35 \times 0.30) = 27.79 + 7 + 10.5 = \mathbf{45.29}$
  • Result: At Risk

Example 3: Leader Hakeem Jeffries

  • DC: Top 3 Sectors (Securities/Investments, Law, Real Estate) = $4.2M of $15.1M (27.8%). $S_{dc} = 55.6$.
  • VAC: 0 'against_constituent' votes identified. $S_{vac} = 0$.
  • Fric: 1 Silence (FTT Revenue) + 1 Med CX (DHS Whipping). $(1 \times 10) + (1 \times 15) = 25$. $S_{fric} = 25$.
  • Calculation: $(55.6 \times 0.35) + (0 \times 0.35) + (25 \times 0.30) = 19.46 + 0 + 7.5 = \mathbf{26.96}$
  • Result: At Risk

5. Known Limitations & Falsification

  • Lagging Indicators: FEC data is updated quarterly. A recent capture event (e.g., a massive dark money influx) may take 90 days to impact the score.
  • Small Sample Sizes: EOs with fewer than 5 analyzed votes default to an $S_{vac}$ of 0, potentially under-representing capture.
  • Falsification: A score is falsified if (a) an underlying roll call vote is retracted or misattributed, or (b) a donor connection is proven to be an individual donation miscategorized as a PAC sector contribution by OpenSecrets.

6. Implementation Notes for capture-score.ts

/**
 * REFINEMENT: Ensure all inputs are escHtml() in the view.
 * Logic uses Drizzle to aggregate connections for dc calculation.
 */
export async function calculateCaptureScore(entityId: string): Promise<number> {
  const dc = await getDonorConcentration(entityId); // DC Subscore
  const vac = await getVotingFriction(entityId);     // VAC Subscore
  const fric = await getStanceFriction(entityId);    // CS + CX Subscore

  const finalScore = (dc * 0.35) + (vac * 0.35) + (fric * 0.30);
  return Math.round(finalScore);
}
← Back to Report All Findings →