====================================================================== SOURCE FILE: csv_ambiguity_ex1_c4_b8.yaml TABULATED FILE: csv_ambiguity_ex1_c4_b8_tabulated.txt ====================================================================== election_title: "The eight ambiguous CSV lines, disambiguated (BV issue #778 ex1)" scenario_description: |- The eight-line CSV posted in BetterVoting issue #778 ("YAML File standard"), rewritten in this library's schema so every line states what it means. The bare CSV could not say whether a zero was a real low score, a blank, a deliberate abstention, or a spoiled ballot — and it never said which method to count it by. Here the method, the seat count, the candidate names and the intent behind every zero are all in the one file, and the engine can run it. Note line 7: four real zeros, cast on purpose. The engine reports 2 of 8 ballots as abstentions - the race abstention and the spoiled ballot - and leaves the all-zero ballot in the count, where it belongs. voting_method: STAR num_winners: 1 ballots: |- A,B,C,D 0,1,0,0 # line 1 - four real scores, nothing ambiguous ~,~,~,~ # line 2 - race abstention: skipped the whole race 0,1,0,& # line 3 - candidate-level abstention on D 0,0,1,1 # line 4 - four real scores ?,?,?,? # line 5 - spoiled ballot 0,1,0,- # line 6 - D left blank 0,0,0,0 # line 7 - all zeros ON PURPOSE - this is NOT an abstention 0,-,0,- # line 8 - B and D left blank lot_numbers: [A, B, C, D] expected_winners: - B # file: csv_ambiguity_ex1_c4_b8.yaml ====================================================================== TABULATION RESULTS ====================================================================== === The eight ambiguous CSV lines, disambiguated (BV issue #778 ex1) === The eight-line CSV posted in BetterVoting issue #778 ("YAML File standard"), rewritten in this library's schema so every line states what it means. The bare CSV could not say whether a zero was a real low score, a blank, a deliberate abstention, or a spoiled ballot — and it never said which method to count it by. Here the method, the seat count, the candidate names and the intent behind every zero are all in the one file, and the engine can run it. Note line 7: four real zeros, cast on purpose. The engine reports 2 of 8 ballots as abstentions - the race abstention and the spoiled ballot - and leaves the all-zero ballot in the count, where it belongs. --- Runoff (Preference) Matrix --- Head-to-head / pairwise comparison Legend: For - Equal Support - Against * indicates Top 2 Finalist Note: C and D tied at 1 in the Scoring Round, and the lot rung (the ballots could not separate them) advanced C. The * marks who advanced, not who scored highest. | A | * B | * C | D | ----------------------------------------------------------------- A > | --- |0 - 5 - 3 |0 - 7 - 1 |0 - 7 - 1 | * B > | 3 - 5 - 0 | --- |3 - 4 - 1 |3 - 4 - 1 | * C > | 1 - 7 - 0 |1 - 4 - 3 | --- |0 - 8 - 0 | D > | 1 - 7 - 0 |1 - 4 - 3 |0 - 8 - 0 | --- | [Condorcet Winner] Condorcet Winner: B — matches the STAR winner [Condorcet Loser] Condorcet Loser: A — loses every head-to-head matchup — elected by Approval! [Divergence from STAR] STAR = B Approval = A (differs from STAR) --- STAR Voting Method (single winner) --- [STAR Voting] Tabulating 8 ballots. Note: 2 of 8 ballots are marked as abstentions. A,B,C,D 0,1,0,0 ~,~,~,~ 0,1,0,& 0,0,1,1 ?,?,?,? 0,1,0,- 0,0,0,0 0,-,0,- ('-' = left blank / abstained; '0' = scored zero — both count as 0 stars.) [Score Distribution] (how many ballots gave each star rating) Score Candidate 5 4 3 2 1 0 Abs | Total Avg all Avg rated A 0 0 0 0 0 6 2 | 0 0.0 0.0 B 0 0 0 0 3 2 3 | 3 0.4 0.6 C 0 0 0 0 1 5 2 | 1 0.1 0.2 D 0 0 0 0 1 2 5 | 1 0.1 0.3 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. [STAR Voting: Scoring Round] The two highest-scoring candidates advance to the next round. B -- 3 -- First place C -- 1 -- Tied for second place D -- 1 -- Tied for second place A -- 0 B advances, but there's a two-way tie for second. [STAR Voting: Scoring Round: First tiebreaker] The candidate preferred in the most head-to-head matchups advances. C -- 0 -- Tied for second place D -- 0 -- Tied for second place Equal Support -- 8 There's still a two-way tie for second. [STAR Voting: Scoring Round: Second tiebreaker] The candidate with the most votes of score 5 advances. C -- 0 -- Tied for second place D -- 0 -- Tied for second place There's still a two-way tie for second. *(Ties are resolved by choosing the tied candidate with the highest-priority official lot number.)* Lot-number priority order: ['A', 'B', 'C', 'D'] [Tiebreaker: Lot Number Priority] Tie among: ['C', 'D'] Resolved: ['C'] (selected by lot-number priority). [Lot-decided tie — rare] ⚠ The ballots did not break this tie: the deterministic rungs (pairwise / score, then five-star) all came back equal, so the pre-published LOT order chose among the tied candidates — the result here was set by lot, not by the votes. Usually the "dead rung": no tied candidate held a score-5 vote (five-star counts fives, not fours). Verify the tied candidates' 5-counts. [STAR Voting: Automatic Runoff Round] The candidate preferred in the most head-to-head matchups wins. B -- 3 -- First place C -- 1 Equal Support -- 4 B wins. Runoff math: 8 ballots cast − 4 Equal Support (no preference between the two finalists) ─ 4 voters with a preference (majority = 3) B 3 (75%) · C 1 (25%) [STAR Voting: Winner — STAR Voting Method (single winner)] B