BV132 — verify number of votes cast (Bloc STAR, 2 seats)¶
Generated from bv132_verify_votes_bloc.yaml — do not edit by hand. Regenerate: python STARVote_LH_tabulation_engine/tools_adam/scripts/build_yaml_pages.py.
Method: Bloc STAR (multi-winner, majoritarian) · 2 seats · Expected winners: C, B
▶ Live on BetterVoting: vote · results ↗ (election verify).
Scenario¶
Bloc STAR, 3 candidates, 2 seats, 4 ballots — two of them "flat" (every candidate scored the same: 1,1,1 and 5,5,5). This is the LH reference for BetterVoting test BV132 / issue #1073 ("verify number of votes cast").
LH counts ALL 4 ballots: totals C=12, B=10, A=8. - Seat 1: C and B advance; in the runoff C is preferred (C 2, B 0, Equal 2), so C takes seat 1. - Seat 2: remove C; B beats A in the runoff (B 2, A 0, Equal 2), so B takes seat 2. Winners: C, B.
The BV bug (#1073): BetterVoting reports only "2 voters" with totals A=2, B=4, C=6 — which is exactly the two non-flat ballots (1,2,3 and 1,2,3). It has DROPPED the two flat ballots, the same "flat ballot treated as an abstention" family as #1407 / #1035. Note the winners (C, B) are UNAFFECTED — a flat ballot adds equally to every candidate and is Equal in every head-to-head, so it can never change a STAR/Bloc result. The defect is the vote-count / turnout display, not the winner.
Confirmed from the frozen BV export (election 3494cb, bv132_..._bv_export.json): all 4 ballots ARE stored in the export's Ballots array — so ingestion is fine. The drop happens in TABULATION: summaryData reports nAbstentions=2, nTallyVotes=2, i.e. BV classifies the two flat ballots as abstentions and tallies only the two 1,2,3 ballots (A=2, B=4, C=6). Same root cause as #1407 (flat ballot mis-filed as abstention). The export also labels votingMethod "STAR" rather than "Bloc STAR" — cf. #904.
Ballots¶
Row 1 = candidate names; each later row is one voter's 0–5 scores (a N × prefix = N identical ballots).
A,B,C
1,1,1
5,5,5
1,2,3
1,2,3
What the engine says¶
The count, step by step — the rounds and how the winner is reached:
[Divergence from STAR]
STAR = C
Choose-One (Plurality) = A (differs from STAR)
RCV-IRV = A (differs from STAR)
Note: 2 of 4 ballots (50%) had equal non-zero scores, so their ranks were
decided by candidate priority order. The RCV-IRV result may be an
artifact of score-to-rank tie-breaking rather than a deep
difference.
Note: Ranked Robin (RCV-RR) agrees with STAR, so RCV-IRV is the lone
outlier — the classic center-squeeze signature.
Full round-by-round reports (generated for review):
RCV-IRV rounds: cases_tabulated/bv132_verify_votes_bloc_RCV-IRV_tabulated.txt
--- Bloc STAR Voting Method (2 winners) ---
[Bloc STAR]
Tabulating 4 ballots to fill 2 seats.
Count × A,B,C
2 × 1,2,3
1 × 1,1,1
1 × 5,5,5
[Bloc STAR: Round 1: Scoring Round]
The two highest-scoring candidates advance to the next round.
C -- 12 -- First place
B -- 10 -- Second place
A -- 8
C and B advance.
[Bloc STAR: Round 1: Automatic Runoff Round]
The candidate preferred in the most head-to-head matchups wins.
C -- 2 -- First place
B -- 0
Equal Support -- 2
C wins.
Runoff math:
4 ballots cast
− 2 Equal Support (no preference between the two finalists)
─
2 voters with a preference (majority = 2)
C 2 (100%) · B 0 (0%)
──────────────────────────────────────────────────
[Bloc STAR: Round 2: Scoring Round]
The two highest-scoring candidates advance to the next round.
B -- 10 -- First place
A -- 8 -- Second place
B and A advance.
[Bloc STAR: Round 2: Automatic Runoff Round]
The candidate preferred in the most head-to-head matchups wins.
B -- 2 -- First place
A -- 0
Equal Support -- 2
B wins.
Runoff math:
4 ballots cast
− 2 Equal Support (no preference between the two finalists)
─
2 voters with a preference (majority = 2)
B 2 (100%) · A 0 (0%)
[Bloc STAR: Winners — Bloc STAR Voting Method (2 winners)]
C
B
Full audit — preference matrix, Condorcet, and score distribution¶
--- Preference Matrix ---
Head-to-head / pairwise comparison
Legend: For - Equal Support - Against
Informational only — not part of the 2-winner count below,
so no Top-2 finalists are marked.
| A | B | C |
-----------------------------------------------------
A > | --- |0 - 2 - 2 |0 - 2 - 2 |
B > | 2 - 2 - 0 | --- |0 - 2 - 2 |
C > | 2 - 2 - 0 |2 - 2 - 0 | --- |
[Condorcet Winner]
Condorcet Winner: C — matches the STAR winner
[Condorcet Loser]
Condorcet Loser: A — loses every head-to-head matchup — elected by Choose-One (Plurality)!
[Score Distribution] (how many ballots gave each star rating)
Score
Candidate 5 4 3 2 1 0 | Total Avg
A 1 0 0 0 3 0 | 8 2.0
B 1 0 0 2 1 0 | 10 2.5
C 1 0 2 0 1 0 | 12 3.0
Everything in one file: the _tabulated mirror (regenerated on every run; every analysis forced on).
Run it yourself:
python STARVote_LH_tabulation_engine/starvote_larry_hastings.py 02_STAR_Bloc/02_Examples/cases/bv132_verify_votes_bloc.yaml
See also¶
More cases in this set: 00_c3_b3_bloc-baseline-2-seats · 01_c4_b2_bloc-star-2-seats · b484mbm_tie_every_rung · bloc_lot_path_dependence_a_c3_b5 · bloc_lot_path_dependence_b_c3_b5 · bv129_score_tiebreak_bloc · bv130_bloc_pagination_731 · bv130r2_dead_rung_bloc · bv131_guido_bloc · bv1525_condorcet_loser_bloc · bv1815_bloc_3c2s_basic · bv1835_8h3yrx_score_leader_no_seat · bv2105_r4dqvd_ice_cream_bloc · bv2105r2_w3vvff_ice_cream_recheck · bv2269_t488h9_race_nobody_can_lose · bv750_tie_breaking_bloc · lackner_skowron_shadow_bloc_star_c7_b12 · race_nobody_can_lose_two_seat_control