Upstream bug reports — what we've filed, and what we're waiting on¶
This repo finds bugs. Building teaching cases means running the same election through several engines and comparing, which is a fairly good bug detector — and when the engines disagree, one of them is usually wrong. Those findings get filed upstream, and then they get forgotten, because the page that motivated the report goes on to say something else.
This is the follow-up list: every report we filed against a project we don't own, what it was, and where it stands. It is not a list of every upstream issue this repo cites — only the ones we opened and are waiting on.
Before adding a row: if the finding is a missing guard in BetterVoting (a validation that isn't there, a state that can't be reached through the UI), it goes to Arend first, privately, before it goes on any page. That rule lives in the bettervoting-qa README and it outranks the convenience of this table.
BetterVoting — Equal-Vote/bettervoting¶
| Issue | Filed | State | What it is |
|---|---|---|---|
| #1507 | 2026-08-09 | open | STAR-PR results always report tieBreakType: "random", even with no tie — the mislabel that hid the count-vs-weight divergence for a year |
| #1487 | 2026-08-06 | open | Range-of-Scores chart and the page headline use different denominators on flat ballots |
| #1485 | 2026-08-06 | open | Record the abstention policy on the race, so an export says what was allowed |
| #1484 | 2026-08-06 | open | STAR Race Details tables use the second-highest scorer instead of the tiebreak runner-up |
| #1478 | 2026-08-04 | open | A partial ballot whose marks are all equal is dropped from the tally as an abstention |
| #1417 | 2026-07-04 | closed | STAR random tie-break yielded a non-reproducible winner |
| #1407 | 2026-06-28 | open | Reconciling the pets election between the LH and BV reports |
| #1379 | 2026-05-23 | open | BV555 — STAR scoring round, three-way tie |
| #1090 | 2025-11-13 | open | Equal Opposition (0-score) mislabeled as "Abstained" in the UI and the export |
| #1086 | 2025-11-12 | open | UI says "STAR Voting" instead of "Bloc STAR", with the wrong help link |
| #1063 | 2025-11-02 | open | Implement deterministic tie-breaking using candidate lot numbers |
| #1052 | 2025-10-30 | open | "No ballots have been cast" shown when ballots exist |
| #904 | 2025-04-11 | open | Method naming — STAR / STAR Bloc / STAR PR |
| #894 | 2025-04-04 | closed | Deactivated selection in the Plurality CSV download |
| #778 | 2025-02-09 | open | YAML file standard |
starvote — larryhastings/starvote¶
Larry's engine, which this repo forks. Fork-side findings and their local fixes are written up in FORK_NOTES.md and the engine's README.
| Issue | Filed | State | What it is |
|---|---|---|---|
| #20 | 2026-08-09 | open | Allocated Score fills the quota by ballot COUNT, not weight — diverges from the reference implementation the package ships (fixed in this fork; the divergence page) |
| #19 | 2026-08-09 | open | SSS silently discards ballots that scored the winner 0, whenever any ballot exhausts in the same round |
| #18 | 2026-08-04 | open | UnbreakableTieError message never interpolated (missing f prefix in _star_round()) |
| #17 | 2026-06-17 | open | SSS returns different winners depending on verbosity — the one that changed results |
GitHub Pages¶
| Report | Filed | State | What it is |
|---|---|---|---|
| community #204454 | 2026-08-09 | open | Pages serves .yaml as text/yaml with no charset, so browsers mis-decode every non-ASCII character. Background and our workaround: website_build.md |
Refreshing this page¶
States go stale silently — nobody emails us when an issue closes. To re-check every row at once:
for r in "Equal-Vote/bettervoting 1487 1485 1484 1478 1417 1407 1379 1090 1086 1063 1052 904 894 778" "larryhastings/starvote 19 18 17"; do set -- $r; repo=$1; shift; for n in "$@"; do curl -s "https://api.github.com/repos/$repo/issues/$n" | python3 -c "import json,sys; d=json.load(sys.stdin); print(f\"{d['state']:8} $repo#{d['number']} {d['title'][:70]}\")"; done; done
The GitHub Pages one is a discussion, not an issue, so it isn't in that loop — open it and look.
When one closes: don't just flip the word. Check whether the fix changes anything this repo teaches — a page that documents the old behavior, a case whose expected winner depended on it, a workaround that can now be retired. That is the whole reason for tracking these, and it's the step that gets skipped.