Skip to content

BV2130 — Presidential Board Election (Proportional STAR = Allocated Score)

Method: Allocated Score (proportional STAR) · 7 seats · Expected winners: Bernie Sanders (Democrat), Al Gore (Democrat), Barack Obama (Democrat), Cornel West (Independent), Chase Oliver (Libertarian), Kamala Harris (Democrat), Karina Garcia (Socialism and Liberation) · full count →

A real 7-seat Proportional STAR election on BetterVoting (bvhchj): 51 candidates, 102 sparse ballots. LH's allocated engine reproduces BetterVoting's first six seats exactly; the seventh diverges (LH → Claudia De La Cruz, BV → Karina Garcia — both Socialism & Liberation). Resolved 2026-08-06: the engines agree — BV counted 100 ballots to LH's 102, giving a different Hare quota. The two missing ballots are #1478.

Reference files: bv2130_presidential_board_star_pr.yaml (voting_method: allocated, 7 winners) · frozen export bv2130_presidential_board_star_pr_bv_export.json (BV bvhchj). Backs sheet row BV2130. The election also has a second race (party-alignment Plurality) that elects Democrat.

Method mapping — BV STAR_PR = Allocated Score

BetterVoting's proportional method is exported as STAR_PR, which LH does not recognize by that name — it is the Allocated Score method (voting_method: allocated; LH's other proportional variants are sss and rrv, which give different results). So this is the proportional analog of the #904/#1086 naming point: STAR_PR needs mapping to a concrete rule before any engine can reproduce it.

Result — 6 of 7 seats match, seat 7 diverges

Seat LH (allocated) BetterVoting (STAR_PR)
1–6 Bernie Sanders, Al Gore, Barack Obama, Cornel West, Chase Oliver, Kamala Harris same
7 Claudia De La Cruz (Soc. & Lib.) Karina Garcia (Soc. & Lib.)

The two methods agree that the last seat goes to a Socialism & Liberation candidate — proportionality is working — but disagree on which one. In LH's exact Allocated Score math Claudia is clearly ahead at the final allocation:

The highest-scoring candidate wins a seat.
  Claudia De La Cruz (Socialism and Liberation) -- 34 + 5745/21952 -- First place   (≈ 34.262)
  Karina Garcia      (Socialism and Liberation) -- 33 + 21901/21952                 (≈ 33.998)
 Claudia De La Cruz wins a seat.

Full audit copy: _main_tabulated/bv2130_presidential_board_star_pr_tabulated.txt.

The finding — resolved 2026-08-06: it is the ballot count, not the method

BetterVoting's result carries tieBreakType: "random" and elected Karina over Claudia, while in LH's computation this is not a tie (Claudia leads by ~0.26 of a reweighted point). That framing invited two hypotheses — an implementation difference in surplus/reweighting/rounding, or a near-tie BV broke at random. Both are wrong. The engines compute the same thing; they were handed different elections.

The algorithms agree. BetterVoting's own unit tests for this method — packages/backend/src/Tabulators/AllocatedScore.test.ts — reproduce exactly in LH's allocated: "Basic Example" → Allison, Doug; "Single vote fractional surplus" → Allison, Doug; "Voters < Winners" → Allison, Bill, Carmen. Their fixtures are our fixtures.

Precision is not the cause either. AllocatedScore.ts uses fraction.js, i.e. exact rational arithmetic — the same exactness LH uses. A gap of 0.26 was never floating-point drift.

The inputs differ. The frozen export reports nTallyVotes: 100, nAbstentions: 2 for this race. The YAML holds 102 ballots. Both engines then compute the same Hare quota V / seats from different V:

ballots counted Hare quota (7 seats)
BetterVoting 100 14.2857
LH 102 14.5714

A different quota changes how much ballot weight each winner consumes, in every round. The effect compounds across six seats and finally flips the seventh.

And the two missing ballots have a name. BV drops a partial ballot whose marks are all equal, counting it as an abstention — #1478. With 51 candidates and sparse ballots, this election is precisely the shape that triggers it.

That makes this case a significant escalation of #1478 rather than a proportional-method defect. Filed as a count-level defect on a 4-ballot election where the winners happened to survive, the bug looked cosmetic. Here the two dropped ballots change who holds a seat. The seat-7 disagreement is the visible symptom; the discarded ballots are the disease.

(What still deserves a maintainer's eye is narrower than it first appeared: BV labels the race tieBreakType: "random" on a seat that, on its own numbers, may not have been tied at all.)