Food-Truck Row — two spots, five counts: vote-splitting, sweeps, and shares¶
One 100-voter electorate elects two food-truck spots five different ways — and gets three different parliaments: the majority with zero seats, the majority with both seats, and one seat per side. Nothing about the voters changes. Only the counting rule does.
▶ Live on BetterVoting: vote · results ↗ (election fvg8y8, Test ID BV2210 — all five races, all agreeing with the LH engine).
The electorate¶
The savory side is an outright 57-voter majority that runs three trucks; the sweet side is a disciplined 43-voter minority on two. Within each side, voters score/rank their own trucks (5/4/3 by taste) and skip the other side's entirely.
| Count | first choice | score ballot | ranked ballot |
|---|---|---|---|
| 20 | Arepa | Arepa 5, Bao 4, Churro 3 | Arepa > Bao > Churro |
| 19 | Bao | Bao 5, Arepa 4, Churro 3 | Bao > Arepa > Churro |
| 18 | Churro | Churro 5, Arepa 4, Bao 3 | Churro > Arepa > Bao |
| 22 | Donut | Donut 5, Eclair 4 | Donut > Eclair |
| 21 | Eclair | Eclair 5, Donut 4 | Eclair > Donut |
The same-opinion line-up¶
Rows are candidates, columns are counts — one electorate, read five ways:
| first choices | SNTV (top-2) | Bloc STAR | Bloc Ranked Robin | STAR-PR | STV | |
|---|---|---|---|---|---|---|
| Arepa (savory) | 20 | — | seat | seat (4–0) | seat | seat |
| Bao (savory) | 19 | — | seat | seat (3–1) | — | — |
| Churro (savory) | 18 | — | — | — | — | — |
| Donut (sweet) | 22 | seat | — | — | seat | seat |
| Eclair (sweet) | 21 | seat | — | — | — | — |
| savory : sweet (57 : 43) | 0 : 2 | 2 : 0 | 2 : 0 | 1 : 1 | 1 : 1 |
Count 1 — SNTV: the majority splits and loses everything¶
Each voter marks one truck; the top two counts win:
First-choice votes (most votes fill the seats):
Donut 22 <- Elected
Eclair 21 <- Elected
Arepa 20
Bao 19
Churro 18
Winners — SNTV (single non-transferable vote), 2 seats: Donut, Eclair
Fifty-seven percent of the room is first-choice savory — and holds zero seats, because one non-transferable vote split three ways tops out at 20. This is the classic SNTV failure: it punishes a side for offering more choice, and it's why SNTV jurisdictions develop machine-politics candidate-rationing. The engine's [Vote-splitting check] names it on the Bloc STAR file:
[Vote-splitting check]
Choose-One first choices: Donut 22, Eclair 21, Arepa 20, Bao 19, Churro 18
Plurality winner: Donut (22, 22.0%)
Bloc 'Savory' = Arepa, Bao, Churro: combined 57 (57.0%); winner Donut is OUTSIDE it.
=> VOTE SPLITTING: the 'Savory' bloc is an outright majority (57 vs
Donut's 22) but split across 3 candidates, so Donut won Choose-One.
STAR elected Arepa.
Counts 2 & 3 — Bloc STAR and Bloc Ranked Robin: the majority sweeps¶
Better ballots cure the split — savory support pools across all three trucks on score and ranked ballots alike. But a bloc (majoritarian) count then hands the pooled majority both seats:
- Bloc STAR: Arepa (top scores + runoff) takes seat 1, Bao seat 2 — the sweet side's 43 voters scored both winners 0.
- Bloc Ranked Robin: every savory truck beats every sweet truck 57–43 head-to-head; the record's top two are Arepa (4–0) and Bao (3–1).
Note what this shows: ranked ballots do not create proportionality. Sweeps and shares are decided by the count (quotas and transfers), not the ballot shape. Majoritarian multi-winner is the right tool when the body should speak for the majority (a city's two at-large delegates voting as one voice) — and the wrong one when the body should mirror the room.
Counts 4 & 5 — STAR-PR and STV: one seat per side¶
- STAR-PR / Allocated Score: Arepa wins seat 1; the quota of ballots that elected him is spent; the remaining live weight is majority-sweet, and Donut takes seat 2.
- STV: Droop quota 33⅓ exactly, 34 by hand count — either form seats the same two. Churro's elimination pools the savory vote → Arepa elected; Eclair's elimination pools the sweet vote → Donut elected. (The count deliberately ends with a hopeful still standing — clear of the BV sole-survivor STV crash.)
A 57:43 room, a 1:1 delegation — one seat per ~quota of voters, the proportional representation promise kept by both the score-ballot and ranked-ballot routes.
BV verification notes¶
All five live races agree with the LH engine, with no genuine tie anywhere (every rung 22/21/20/19/18 distinct by design). One display quirk for the record: BetterVoting banners the STAR_PR race "Tied!" with tieBreakType: random despite no tie existing — the same STAR_PR serializer quirk first seen on 89wwvr (exercise 12) and jwxr3j; this election is the third confirming instance. The elected pair itself is correct.
Run it yourself¶
python STARVote_LH_tabulation_engine/starvote_larry_hastings.py method_comparisons/food_truck_row/cases/bv2210_fvg8y8_sntv_split.yaml
python STARVote_LH_tabulation_engine/starvote_larry_hastings.py method_comparisons/food_truck_row/cases/bv2210_fvg8y8_bloc_star_sweep.yaml
python STARVote_LH_tabulation_engine/starvote_larry_hastings.py method_comparisons/food_truck_row/cases/bv2210_fvg8y8_bloc_rr_sweep.yaml
python STARVote_LH_tabulation_engine/starvote_larry_hastings.py method_comparisons/food_truck_row/cases/bv2210_fvg8y8_star_pr_share.yaml
python STARVote_LH_tabulation_engine/starvote_larry_hastings.py method_comparisons/food_truck_row/cases/bv2210_fvg8y8_stv_share.yaml
Full mirrors: Bloc STAR sweep · Bloc RR sweep · SNTV split · STAR-PR share · STV share.
Where this comes from. Ballots and cast are this repo's own. Siblings: sntv_village_council (the gentle SNTV intro this case escalates), multi_member_plurality (block & limited voting), pets_governance (six methods, one electorate), exercise 12 (Bloc-vs-PR at whiteboard scale), and the seat-family map at electing more than one.