Skip to content

rr_tiebreaks — how Ranked Robin breaks a tie

Ranked Robin usually just elects the Condorcet winner. This set is about the edge: what happens when Copeland scores tie, what the method's own protocol says to do about it, and how far each engine actually follows that protocol.

Start with Degrees of ties — the four-rung ladder Ranked Robin publishes, the two ways the engines departed from it, and what the departure cost. The rest of this folder is the case set behind it.

Case (page) What it shows Winner BV-backed? src
Dead heat → lot order Equal Support + ½-Copeland + the full ladder to lot Ada (by lot) No — divergent .yaml
BV2141 — all four Equal-Vote degrees a Copeland tie that survives three tiebreak degrees; only the 4th (beatpath) separates Ava (by recorded draw) Yes 3r3yf7 .yaml
BV2261 — the random tiebreak is recorded the export publishes the whole tiebreak order (perm / tieBreakOrder), stable on re-tally; two races reach the last rung by draws and by cycle Anika (both races) Yes y2fbpc draws · cycle
BV2262 — nine-way dead heat the same at 9 candidates: a nine-deep recorded order, a shuffle that really scrambles, four independent checks Boris Yes 2gvwr9 .yaml
BV2270 — the tie that showed the ladder was wrong a two-way Copeland tie broken deterministically on both sides. It elected different candidates until the engine's missing 1st Degree rung was added; now both say Alder Alder (both) Yes 8h4bvh .yaml
The 1st Degree counts the finalists only three tied finalists where margins-over-finalists and margins-over-the-field elect different candidates — the case that separates the two rungs Alma No — LH-only .yaml
A three-way cycle has a deterministic answer eleven ballots, one cycle, a 1st Degree answer of +6 — and BetterVoting draws lots for it (#1469) Frank No — LH-only .yaml
What counts as a win four ballots, two drawn matchups: scoring a draw as half a win (every engine) elects the undefeated Bella, scoring it as nothing (the spec's own sentence) elects Dana, who lost to her — an open question about the rule above the ladder Bella No — LH-only .yaml

The ladders in one table:

Tiebreak ladder
The protocol (electowiki) Copeland score → 1st Degree (margins over the other finalists) → 2nd Degree (margins over all candidates) → a lot or a re-run
LH run_ranked_robin the same three rungs, then a published lot order — since 2026-08-19
BetterVoting RankedRobin.ts Copeland score → head-to-head (2-way only) → "random" (a seeded shuffle)

Read the middle rungs and both engines' bugs are visible at once. BetterVoting's head-to-head is the 1st Degree, but only for exactly two tied candidates — three or more skip both degrees and land on the shuffle (#1469), which for a three-candidate field means every cycle. LH had the 2nd Degree and used it in the 1st's place, so it overrode the finalists' own head-to-head with margins run up against candidates outside the tie. BV2270 is where that showed: the two engines elected different candidates from the same nine ballots, and the protocol says BetterVoting had it right. The same disagreement was first caught in the wild by BV2176, the Post-it RCV example; BV2270 is the stripped-down bench version, four candidates and nine ballots. Both now agree — the full account is in degrees of ties.

What still genuinely differs is the bottom rung: when neither degree separates the finalists, LH draws a pre-published lot and BetterVoting a seeded shuffle. That is the dead-heat case, and no fix removes it — a tie that the ballots do not break has to be decided by something outside them.

And the top rung — the Copeland score every ladder above starts from — is not fully settled either. All three engines score a drawn matchup as half a win; the protocol's own one-line definition says "beats the greatest number of candidates", which counts wins alone, and its worked example scores a candidate with three wins and a draw as 3 rather than 3.5. Usually that makes no difference, because the two readings agree whenever every matchup is decided — but it decides who is even in the tie, so it can change the winner. This repo follows the half-point and records the disagreement as an open question rather than a defect: what counts as a win.

Careful with "random", though — BV's last rung is a seeded shuffle, not a coin flip. It is deterministic on re-tally and the resulting order is published in the export as perm. BV2261 was built to confirm exactly that on a live election, and BV2141 already relies on it. What you cannot do is derive the order from the ballots — it depends on the ballot count and the race id, not on how anyone voted — which is the real reason the dead-heat case stays LH-only. Full write-up + the "cycle" wording nit: Ranked Robin tie-breaks — LH vs BetterVoting.

Concept docs: Ranked Robin (the method) · cycle resolution.

file: README.md