Skip to content

Backlog triage — 386 open issues, 2026-08-15

A full pass over every open issue on Equal-Vote/bettervoting, asking one question: can this be closed today? Five parallel readers took ~78 issues each; every closure recommendation was then re-verified by hand against origin/main before anything was posted upstream.

Result: 24 recommended for closure, 23 blocked on an open PR, ~20 unclear, the rest still valid. Comments carrying the evidence were posted on the 24.

The closeable set

Done, but the issue never got closed

Issue Evidence
#1405 Remove WizardExtra WizardExtra.tsx gone from main (3ea8063b). PR #1438's title said "(#1405)" — a bare reference, not a closing keyword
#216 Candidate photos PR #1216 merged with a closing keyword; maintainer's last comment is "I'll resolve this"
#1353 Public audit log Shipped as PR #1365 — controller, view, formatter and tests all on main
#1182 Clear voter roll API clearElectionRollController.ts + DELETE /Election/:id/rolls/ + tests
#1099 Ballot timing deanonymisation Scrub + secureShuffle; the code comment names this threat model
#808 CSV comma escaping RFC-4180 csvField() at BallotDataExport.tsx:34
#655 Show commit sha About.tsx:73-82, wired through the Docker build
#879 Method name on results results.method_context under the winner line
#869 swagger.json committed Not in the tree; gitignored and generated
#625 Blank pasted voter rows filter(row => row.trim()), commit 3e636f84
#603 pairwiseMatrix Removed in the 2025 refactor, replaced by winsAgainst
#1437 Download needs many clicks PR #1428 keeps one menu mounted through loading
#666 Numbered runoff step String gone since 2f9560d2
#360 NaN in bloc Re-ran the issue's exact ballots through today's tabulator: no NaN
#470 Tabs on admin ballot view The view was deleted as orphaned code
#1013 Ballot download restriction Guard shipped via #995

Closed by the reporter's or maintainer's own words

#1188 ("works now — user error"), #1379 ("can be closed as WAI"), #495, #638 ("probably over engineering"), #741, #1078, #906.

Duplicates and consolidations

#1444 → #1471 · #1062 → #1036 · #1114 ↔ #806 · #1175 → #1174 · #1065 → #1052 · #1073 → #884/#1086.

Three traps this pass hit — worth knowing before running it again

1. Dependabot changelogs poison a "merged PR references issue #N" query. 44 open issues looked like they were referenced by a merged PR; 40 were false positives — the PR bodies are dependency changelogs quoting the upstream package's issue numbers. Filter to non-dependabot authors first, or the signal is buried 10:1.

2. A merged PR with a closing keyword does not guarantee the issue closed. #216 and #1170 both had one and both stayed open. Conversely #1405 was done and open only because the reference was in the PR title as "(#1405)" instead of "Closes #1405". Neither direction can be trusted; check the issue state itself.

3. Title similarity finds template families, not duplicates. "Onboarding Issue: Developer: X" and "Add @X to the contributor list" score as near-duplicates of each other while being deliberately separate per-person trackers. Every genuine duplicate found here needed the body read.

Also found: PRs that will not close what they fix

Seven open PRs reference an issue with no closing keyword, so merging them closes nothing: #1441→#1440 (worst case — the PR body has no issue reference at all, the link exists only in a comment), #1504→#820, #1476→#762, #1466→#1350, #1475→#904/#912, #1492→#1420/#1432, #1524→#1059.

Scale of what remains

  • 114 open issues have zero comments — never discussed by anyone. 27 of those predate 2025.
  • The nine tiny doc edits on the PR-guide page (#1172–#1181) are all still unapplied — verified string by string. They are the repo's only stock of genuine first-timer tasks and were deliberately left alone.
  • 1160's thread claims a dual CSV export was implemented in #1419. PR #1419 was closed unmerged — only its escaping fixes survived, via #1428. That stale claim will mislead the next triager.