Skip to content

BV15 — Plurality + abstentions: the turnout undercount

Method: plurality · 1 seat · Expected winner: Andre · full count →

BetterVoting test BV15 (4h89vj, "Basic – 2 candidates – Plurality – Abstain"). The Plurality instance of bettervoting#740 — a reporting gap, not a tabulation bug. BetterVoting elects the right winner (Andre) but its results widget reports only the meaningful ballots as "voters," dropping the fully-abstained ones from the headline turnout. The count is short by exactly the number of abstentions.

▶ Live on BetterVoting: vote · results ↗ (election 4h89vj).

Reference file: bv15_4h89vj_plurality_abstain.yaml (expected_winners: [Andre]). Frozen export: bv15_4h89vj_plurality_abstain_bv_export.json. Backs sheet row BV15. Issue: bettervoting#740 ("Add 'stats for nerds' widget including abstentions").

The finding (label it right)

The sheet/tracker calls this "star-server#740", but the repo moved from star-server to bettervoting — the number stayed, so it is bettervoting#740. And #740 is not a tabulation error: its title is "Add 'stats for nerds' widget including abstentions," and the body (Adam's own report) says "We are missing abstentions in the vote count… As-is: 2 voters. Should be: 5 voters (3 abstentions and 2 meaningful)." The winner is computed correctly; the displayed turnout is what's wrong.

Crucially, BetterVoting's backend already has the numbers. The frozen export's summaryData reads nTallyVotes: 7, nAbstentions: 5 (7 + 5 = 12 cast) — correct. So #740 is purely that the results UI never surfaces the 5 abstentions or the 12-ballot total; it shows the 7 as if that were the whole turnout.

The election

Plurality, 2 candidates, 12 ballots — five for Andre, two for Blake, five blank:

Count × Andre,Blake
    5 × 1,0   Andre  (a choose-one vote for Andre)
    2 × 0,1   Blake  (a choose-one vote for Blake)
    5 × -,-   blank  — true abstentions (no vote for anyone)

Andre 5, Blake 2 → Andre wins (BV tieBreakType: none; no tie).

Method: Plurality (matches BV)

This file uses voting_method: Plurality — the method BV actually ran. Single-winner Plurality tabulates through the STAR path (equivalent for single-mark 0/1 ballots), so LH still prints the score distribution and the self-reconciling runoff turnout line that #740 is about. (An earlier version modelled this as a STAR 5/0 ballot on the mistaken belief that LH had no Plurality method — it does: single-winner via the STAR path, multi-winner as SNTV.)

The LH report (the accounting #740 wants)

--- Choose-One / Plurality Voting Method (single winner) ---
 Tabulating 12 ballots.

                   Andre  Blake 
                     X      -   
                     X      -   
                     X      -   
                     X      -   
                     X      -   
                     -      X   
                     -      X   
                     -      -   
                     -      -   
                     -      -   
                     -      -   
                     -      -   

  Count the marks:  Andre 5 · Blake 2
  (5 ballot(s) marked nobody.)

Winner — Choose-One / Plurality Voting Method (single winner)
 Andre   (5 of 12 marks)

The Abs column (5 for each candidate = the 5 blank ballots) and the runoff line 7 of 12 (5 Equal Support) are precisely the "stats for nerds" turnout breakdown #740 asks BetterVoting to add — LH reconciles 12 = 7 + 5 on the page. Full audit copy: _tabulated mirror.

LH ↔ BetterVoting

Quantity BetterVoting summaryData LH engine Agree?
Winner Andre Andre
Meaningful ballots nTallyVotes 7 7 (voters with a preference)
Abstentions nAbstentions 5 5 (blank ballots)
Ballots cast (7 + 5 =) 12 12

Both engines agree on every number. The only gap is display: LH puts 12 = 7 + 5 on the results page; BetterVoting's widget currently shows the 7 alone. This case pins the correct turnout accounting as the reference for #740 — and shows LH's runoff-reconciliation line as a ready model for the fix.

See also