BV1815 — Bloc STAR, 3 candidates, 2 seats (seat 2 by score tiebreak)¶
Method: Bloc STAR (multi-winner, majoritarian) · 2 seats · Expected winners: A, C · full count →
A real BetterVoting election (id fk38pk, marked Passed) labeled "basic / simple" — but it quietly exercises the score tiebreaker at the second seat. LH and BetterVoting agree: winners A, C.
Reference files: bv1815_bloc_3c2s_basic.yaml (expected_winners: [A, C]) · frozen export bv1815_bloc_3c2s_basic_bv_export.json (BV fk38pk). Backs sheet row BV1815.
The election¶
Bloc STAR, 3 candidates, 2 seats, 3 ballots:
A,B,C
4,1,0
3,0,2
5,0,0
Totals: A = 12, B = 1, C = 2.
The case file¶
The YAML the engine actually runs, embedded at build time — so the parameters on this page can never drift from the file:
election_title: "BV1815 — Bloc STAR, 3 candidates, 2 seats (seat 2 by score tiebreak)"
scenario_description: |-
The LH reference for BetterVoting test BV1815 (a real election, id fk38pk,
marked Passed). Labeled "basic/simple", but it quietly exercises the score
tiebreaker at the second seat.
Bloc STAR, 3 candidates, 2 seats. Totals: A=12, B=1, C=2.
- Seat 1: A (12) and C (2) advance; A wins the runoff 3-0, taking seat 1.
- Seat 2: remove A -> B and C. In the runoff B and C TIE 1-1 (one voter
prefers each; one is Equal Support). The tie falls to the SCORE rung:
C's total (2) beats B's (1), so C takes seat 2.
Winners: A, C. BetterVoting agrees (tieBreakType: "score", elected A, C) — this
case Passes; it's the Bloc analog of a runoff decided by the score tiebreaker.
(Aside: the BV export labels votingMethod "STAR" rather than "Bloc STAR" — #904.)
num_winners: 2
voting_method: Bloc STAR
ballots: |-
A,B,C
4,1,0
3,0,2
5,0,0
expected_winners:
- A
- C
# file: bv1815_bloc_3c2s_basic.yaml
What makes it interesting¶
Seat 1 is a clean win for A. Seat 2 is not clean: with A removed, B and C each total near-nothing and tie 1–1 in the runoff (one voter prefers B, one prefers C, one is Equal Support). The tie falls to the first runoff rung — highest total score — and C (2) beats B (1). BetterVoting resolves it the same way (tieBreakType: "score", elected A, C), which is why this "basic" case is a clean Pass and a useful reference that the score tiebreaker works in Bloc.
View 1 — BetterVoting¶
Result: A and C win (2 seats). nAbstentions: 0, nTallyVotes: 3 (all ballots counted), tieBreakType: "score". (Aside: the export labels votingMethod: "STAR" rather than "Bloc STAR" — #904.)
The results page paginates one card per seat. Seat 1 — A takes 12 of the 15 available points and wins the runoff 3–0, so the runoff bar reads 100% and the dashed majority threshold line falls at 50% of the same axis (with no Equal Support, both are measured against the same 3 voters):

Seat 2 — the tie. C and B each hold one preference and one ballot rates them equally, so all three bars read 33% while the majority threshold line lands at 1 vote — the exact height of both candidate bars. Two bars touching a line labelled "majority" in a runoff neither of them won:

The gap between those two readings is the denominator mismatch filed as #1471 — the labels divide by all three bars, the marker by the two finalists only. It changes nothing about the count (both engines elect A and C); it's what the picture says about it. What the three denominators are worth in a Bloc race: Over 50% — what a landslide actually buys.
View 2 — the LH report¶
The two rungs to watch: Round 2: Automatic Runoff Round shows the 1–1 tie (with one Equal Support), and First tiebreaker shows the score rung breaking it — C (2) over B (1).
The full audit, embedded from the _tabulated mirror rather than pasted, so it tracks the engine:
======================================================================
SOURCE FILE: bv1815_bloc_3c2s_basic.yaml
TABULATED FILE: bv1815_bloc_3c2s_basic_tabulated.txt
======================================================================
election_title: "BV1815 — Bloc STAR, 3 candidates, 2 seats (seat 2 by score tiebreak)"
scenario_description: |-
The LH reference for BetterVoting test BV1815 (a real election, id fk38pk,
marked Passed). Labeled "basic/simple", but it quietly exercises the score
tiebreaker at the second seat.
Bloc STAR, 3 candidates, 2 seats. Totals: A=12, B=1, C=2.
- Seat 1: A (12) and C (2) advance; A wins the runoff 3-0, taking seat 1.
- Seat 2: remove A -> B and C. In the runoff B and C TIE 1-1 (one voter
prefers each; one is Equal Support). The tie falls to the SCORE rung:
C's total (2) beats B's (1), so C takes seat 2.
Winners: A, C. BetterVoting agrees (tieBreakType: "score", elected A, C) — this
case Passes; it's the Bloc analog of a runoff decided by the score tiebreaker.
(Aside: the BV export labels votingMethod "STAR" rather than "Bloc STAR" — #904.)
num_winners: 2
voting_method: Bloc STAR
ballots: |-
A,B,C
4,1,0
3,0,2
5,0,0
expected_winners:
- A
- C
# file: bv1815_bloc_3c2s_basic.yaml
======================================================================
TABULATION RESULTS
======================================================================
=== BV1815 — Bloc STAR, 3 candidates, 2 seats (seat 2 by score tiebreak) ===
The LH reference for BetterVoting test BV1815 (a real election, id fk38pk,
marked Passed). Labeled "basic/simple", but it quietly exercises the score
tiebreaker at the second seat.
Bloc STAR, 3 candidates, 2 seats. Totals: A=12, B=1, C=2.
- Seat 1: A (12) and C (2) advance; A wins the runoff 3-0, taking seat 1.
- Seat 2: remove A -> B and C. In the runoff B and C TIE 1-1 (one voter
prefers each; one is Equal Support). The tie falls to the SCORE rung:
C's total (2) beats B's (1), so C takes seat 2.
Winners: A, C. BetterVoting agrees (tieBreakType: "score", elected A, C) — this
case Passes; it's the Bloc analog of a runoff decided by the score tiebreaker.
(Aside: the BV export labels votingMethod "STAR" rather than "Bloc STAR" — #904.)
--- 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 > | --- |3 - 0 - 0 |3 - 0 - 0 |
B > | 0 - 0 - 3 | --- |1 - 1 - 1 |
C > | 0 - 0 - 3 |1 - 1 - 1 | --- |
[Condorcet Winner]
Condorcet Winner: A — matches the STAR winner
[Condorcet Loser]
No strict Condorcet loser; jointly weak Condorcet losers: B, C (winless — pairwise ties)
--- Bloc STAR Voting Method (2 winners) ---
[Bloc STAR]
Tabulating 3 ballots to fill 2 seats.
A,B,C
4,1,0
3,0,2
5,0,0
[Score Distribution] (how many ballots gave each star rating)
Score
Candidate 5 4 3 2 1 0 | Total Avg
A 1 1 1 0 0 0 | 12 4.0
B 0 0 0 0 1 2 | 1 0.3
C 0 0 0 1 0 2 | 2 0.7
[Bloc STAR: Round 1: Scoring Round]
The two highest-scoring candidates advance to the next round.
A -- 12 -- First place
C -- 2 -- Second place
B -- 1
A and C advance.
[Bloc STAR: Round 1: Automatic Runoff Round]
The candidate preferred in the most head-to-head matchups wins.
A -- 3 -- First place
C -- 0
Equal Support -- 0
A wins.
Runoff math:
3 ballots cast
− 0 Equal Support (no preference between the two finalists)
─
3 voters with a preference (majority = 2)
A 3 (100%) · C 0 (0%)
──────────────────────────────────────────────────
[Bloc STAR: Round 2: Scoring Round]
The two highest-scoring candidates advance to the next round.
C -- 2 -- First place
B -- 1 -- Second place
C and B advance.
[Bloc STAR: Round 2: Automatic Runoff Round]
The candidate preferred in the most head-to-head matchups wins.
B -- 1 -- Tied for first place
C -- 1 -- Tied for first place
Equal Support -- 1
There's a two-way tie for first.
[Bloc STAR: Round 2: Automatic Runoff Round: First tiebreaker]
The highest-scoring candidate wins.
C -- 2 -- First place
B -- 1
C wins.
[Bloc STAR: Winners — Bloc STAR Voting Method (2 winners)]
A
C
Related¶
- The pure no-tie control:
00_c3_b3_bloc-baseline-2-seats.yaml(both seats decided by the ballots, no rung consulted). - The tie-break ladder these seats descend: STAR Tie-Breaking — The Full Chain.
- #904 — the method-name label ("STAR" vs "Bloc STAR").