Skip to content

BV2105-r2 — Favorite ice cream (Bloc STAR, 2 seats): the partial ballot, re-counted a year later

Generated from bv2105r2_w3vvff_ice_cream_recheck.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: Chocolate, Strawberry

▶ Live on BetterVoting: vote · results ↗ (election w3vvff · test BV2105-r2).

Scenario

The LH reference for BetterVoting test BV2105-r2 (election w3vvff), a deliberate RE-RUN of BV2105 (r4dqvd) on exactly the same four ballots — cast again so they are counted by today's tabulator rather than by the one that ran in 2025. Live results: https://bettervoting.com/w3vvff/results Frozen raw export: bv2105r2_w3vvff_ice_cream_recheck_bv_export.json.

The four ballots — one of each KIND of ballot:

Vanilla,Chocolate,Strawberry 5,5,5 an all-5s ballot (loves everything) -,-,- fully blank — a TRUE abstention 1,-,- Vanilla=1, the rest blank — a REAL (partial) vote 2,5,4 a full ballot

Winners: Chocolate, Strawberry — unchanged, and never in question. Chocolate takes seat 1; seat 2 is a Vanilla/Strawberry runoff tie broken by score, Strawberry 9 > Vanilla 8.

WHY THIS ELECTION EXISTS. BV2105 reported nTallyVotes = 2 and nAbstentions = 2: it filed the partial "1,-,-" ballot as an abstention alongside the genuinely blank one.

CITATION CORRECTION (2026-08-04). The library used to attribute that miscount to bettervoting#1056. Wrong: #1056 is a DIFFERENT defect on the same demo election — a 401 blocking JSON/CSV download and Race Details, introduced by the Editable Ballots work (#979) and correctly closed via #1058. They share only the BV2105 test-document name. The counting defect is a separate bug, filed 2026-08-04 as bettervoting#1478.

THE RESULT: THE MISCOUNT STILL REPRODUCES. Ballots cast through the live API on 2026-08-04 come back nTallyVotes 2 / nAbstentions 2 — identical counts to the 2025 run, with Vanilla's score again averaged over 2 ballots instead of 3. This file is the pinned correct count.

IS IT A BUG OR THE POLICY? Stated fairly: bettervoting#884 made an ALL-EQUAL ballot an abstention, and a ballot bearing a SINGLE mark is trivially all-equal, so this may be that policy working as written. The counter-argument is that BV's own tally treats a blank as 0 — so "Vanilla 1, blank, blank" is really "Vanilla 1, Chocolate 0, Strawberry 0", which is NOT all-equal and strictly prefers Vanilla. Scope: partial ballots whose non-blank marks are all equal. Partial ballots with two or more distinct marks count correctly.

WHY A NEW ELECTION WAS NEEDED (rather than re-fetching r4dqvd). Re-fetching the 2025 election also returns 2/2, but r4dqvd is closed and its stored ElectionResult may simply be the tally computed back in 2025 — a re-fetch cannot tell "the bug is live" from "we are reading an old result." Only ballots cast through today's tabulator can, which is what w3vvff is.

WHY NO OTHER CASE IN THE LIBRARY ANSWERS IT. The discriminating shape is a ballot whose non-blank marks are ALL EQUAL — here a single "1" — because that is what bettervoting#884's all-equal rule treats as an abstention. The only other 2026-minted export carrying a partial ballot is BV215 (26khr3), whose partial is "Ada 5, Bruno 1, blank": two DISTINCT marks, so it is counted either way and settles nothing.

LH counts it correctly: 4 ballots, 1 abstention (only the fully-blank row), Vanilla total 8 (5 + 1 + 2). The dropped ballot only helped Vanilla, the seat-2 loser, so the winners survive — this is a REPORTING/counting defect, not a wrong result. But a discarded cast ballot can flip a closer election.

Ballots

Row 1 = candidate names; each later row is one voter's 0–5 scores (a N × prefix = N identical ballots).

Markers on these ballots: - blank · ~ race abstention · & candidate abstention · ? spoiled · % spoiled+reissued — all tabulate as 0 (reported honestly).

Vanilla,Chocolate,Strawberry
5,5,5
-,-,-
1,-,-
2,5,4

What the engine says

The count, step by step — the rounds and how the winner is reached:

[Divergence from STAR]
  STAR                   = Chocolate
  Choose-One (Plurality) = Vanilla   (differs from STAR)
  RCV-IRV                = Vanilla   (differs from STAR)
  Note: 1 of 4 ballots (25%) 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/bv2105r2_w3vvff_ice_cream_recheck_RCV-IRV_tabulated.txt

--- Bloc STAR Voting Method (2 winners) ---

[Bloc STAR]
 Tabulating 4 ballots to fill 2 seats. Note: 1 of 4 ballots is marked as an abstention.
Vanilla,Chocolate,Strawberry
      5,        5,         5
      -,        -,         -
      1,        -,         -
      2,        5,         4
  ('-' = left blank / abstained; '0' = scored zero — both count as 0 stars.)

[Bloc STAR: Round 1: Scoring Round]
 The two highest-scoring candidates advance to the next round.
   Chocolate     -- 10 -- First place
   Strawberry    --  9 -- Second place
   Vanilla       --  8
 Chocolate and Strawberry advance.

[Bloc STAR: Round 1: Automatic Runoff Round]
 The candidate preferred in the most head-to-head matchups wins.
   Chocolate     -- 1 -- First place
   Strawberry    -- 0
   Equal Support -- 3
 Chocolate wins.
   Runoff math:
     4  ballots cast
   − 3  Equal Support (no preference between the two finalists)
     ─
     1  voters with a preference  (majority = 1)
           Chocolate 1 (100%)  ·  Strawberry 0 (0%)

──────────────────────────────────────────────────

[Bloc STAR: Round 2: Scoring Round]
 The two highest-scoring candidates advance to the next round.
   Strawberry    -- 9 -- First place
   Vanilla       -- 8 -- Second place
 Strawberry and Vanilla advance.

[Bloc STAR: Round 2: Automatic Runoff Round]
 The candidate preferred in the most head-to-head matchups wins.
   Strawberry    -- 1 -- Tied for first place
   Vanilla       -- 1 -- Tied for first place
   Equal Support -- 2
 There's a two-way tie for first.

[Bloc STAR: Round 2: Automatic Runoff Round: First tiebreaker]
 The highest-scoring candidate wins.
   Strawberry    -- 9 -- First place
   Vanilla       -- 8
 Strawberry wins.

[Bloc STAR: Winners — Bloc STAR Voting Method (2 winners)]
 Chocolate
 Strawberry

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.
                   |     Vanilla    |   Chocolate   |   Strawberry  |
---------------------------------------------------------------------
         Vanilla > |      ---       |  1 - 2 - 1    |  1 - 2 - 1    |
       Chocolate > |   1 - 2 - 1    |     ---       |  1 - 3 - 0    |
      Strawberry > |   1 - 2 - 1    |  0 - 3 - 1    |     ---       |

[Condorcet Winner]
  No strict Condorcet winner; unbeaten candidates: Vanilla, Chocolate (pairwise ties)

[Condorcet Loser]
  No strict Condorcet loser; jointly weak Condorcet losers: Vanilla, Strawberry (winless — pairwise ties) — Vanilla elected by Choose-One (Plurality)!

[Score Distribution] (how many ballots gave each star rating)
                 Score
Candidate   5  4  3  2  1  0  Abs  | Total  Avg all  Avg rated
Vanilla     1  0  0  1  1  0    1  |     8      2.0        2.7
Chocolate   2  0  0  0  0  0    2  |    10      2.5        5.0
Strawberry  1  1  0  0  0  0    2  |     9      2.3        4.5
  Avg all   = Total / all ballots — a blank counts as 0, so this is the Total the Scoring Round ranks on, per ballot.
  Avg rated = Total / the ballots that scored this candidate (Abs excluded) — support among voters who had an opinion.

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/bv2105r2_w3vvff_ice_cream_recheck.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 · bv132_verify_votes_bloc · bv1525_condorcet_loser_bloc · bv1815_bloc_3c2s_basic · bv1835_8h3yrx_score_leader_no_seat · bv2105_r4dqvd_ice_cream_bloc · bv2269_t488h9_race_nobody_can_lose · bv750_tie_breaking_bloc · lackner_skowron_shadow_bloc_star_c7_b12 · race_nobody_can_lose_two_seat_control