FA-12751 / Voting rule computation / Open access
Exhausted ballots prevent a continuing-ballot majority · case 01
Exhausted ballots prevent a continuing-ballot majority.
ROOT CAUSE
The denominator includes exhausted ballots.
VERIFIED REPAIR
Require strictly more than half of continuing ballots.
Unsuccessful approach: Changing the denominator but accepting equality declares a tied count a majority.
Case contract
Given nonnegative candidate count, continuing count and total count with candidate<=continuing<=total, return whether candidate has a strict majority of continuing ballots. Zero continuing ballots have no majority.
Why this case matters
A deterministic toy ballot model makes the stated counting convention executable.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(votes, continuing, total):
return votes*2 > total
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('exhaustion changes denominator', solve(N+1,2*N+1,4*N+4), True)
check('half is insufficient', solve(N,2*N,3*N), False)
check('empty electorate', solve(0,0,0), False)
check('unanimous continuing', solve(N,N,5*N), True)
check('minority', solve(N,2*N+1,2*N+1), False)
check('one continuing', solve(1,1,2), True)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| exhaustion changes denominator | False | True | Failed |
| half is insufficient | False | False | Passed |
| empty electorate | False | False | Passed |
| unanimous continuing | False | True | Failed |
| minority | False | False | Passed |
| one continuing | False | True | Failed |
SHA-256 / a48703c0fb0b7387f42a64b1c4704cb971bff1be82d1b6d26a5f1f94046f1c3f
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(votes, continuing, total):
return votes*2 >= continuing
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('exhaustion changes denominator', solve(N+1,2*N+1,4*N+4), True)
check('half is insufficient', solve(N,2*N,3*N), False)
check('empty electorate', solve(0,0,0), False)
check('unanimous continuing', solve(N,N,5*N), True)
check('minority', solve(N,2*N+1,2*N+1), False)
check('one continuing', solve(1,1,2), True)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| exhaustion changes denominator | True | True | Passed |
| half is insufficient | True | False | Failed |
| empty electorate | True | False | Failed |
| unanimous continuing | True | True | Passed |
| minority | False | False | Passed |
| one continuing | True | True | Passed |
SHA-256 / f8995e7232ca3a543145945cd772163d883160eb9d8707615235b0a4f8a1b7b9
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(votes, continuing, total):
return votes*2 > continuing
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('exhaustion changes denominator', solve(N+1,2*N+1,4*N+4), True)
check('half is insufficient', solve(N,2*N,3*N), False)
check('empty electorate', solve(0,0,0), False)
check('unanimous continuing', solve(N,N,5*N), True)
check('minority', solve(N,2*N+1,2*N+1), False)
check('one continuing', solve(1,1,2), True)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| exhaustion changes denominator | True | True | Passed |
| half is insufficient | False | False | Passed |
| empty electorate | False | False | Passed |
| unanimous continuing | True | True | Passed |
| minority | False | False | Passed |
| one continuing | True | True | Passed |
SHA-256 / 6c8e04c867c2281b350da18892cc11f6addb211b0c19e3ce508f79753cc8d813
Verification & scope
Abstract counting rules only; excludes jurisdictional law, ballot authentication and election operations. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:38:59.839907+00:00.
Case digest / dd0639556e0b5f27d368309d8f0edbefa0df3344f38f967ef2ba99cf88a14ff4