Problem
The open issue backlog is 62 items with a median age of 3,688 days — 10.1 years. Forty-six (74%) are older than five years, and the age distribution is bimodal (nothing between 1 and 2 years old): a small live set from the last year, and a 46-issue archaeological layer that predates the current maintainer team.
Not all of it is worthless. #47 — "Refactor matrix equations", open twelve years — is still referenced by a live TODO in _matrix_eqn.py:8. These are unowned rather than invalid, and the distinction matters for how they are closed.
Proposed approach
Work the 46 pre-2021 issues in one campaign, each landing in exactly one of four outcomes: close as wontfix with a one-sentence reason; close as duplicate linking the survivor; adopt with a Type label and a current-state comment; or move to a Someday milestone if it is a genuinely good idea nobody will start soon (what the wishlist label has been standing in for).
Resist mass-closing with a bot comment: 46 issues at a couple of minutes each is a bounded afternoon, and several encode institutional knowledge about the quadrature and matrix-equation code that is written down nowhere else.
Two long-lived open PRs belong in the same pass: #576 (5+ years, type annotations — see the type-hint policy discussion in this milestone) and #702 (3+ years, vectorise lorenz_curve/gini).
Acceptance criteria
From the July 2026 technical-debt audit (AI-assisted; claims verified against 28d4b3b on 2026-07-25).
Problem
The open issue backlog is 62 items with a median age of 3,688 days — 10.1 years. Forty-six (74%) are older than five years, and the age distribution is bimodal (nothing between 1 and 2 years old): a small live set from the last year, and a 46-issue archaeological layer that predates the current maintainer team.
Not all of it is worthless. #47 — "Refactor matrix equations", open twelve years — is still referenced by a live TODO in
_matrix_eqn.py:8. These are unowned rather than invalid, and the distinction matters for how they are closed.Proposed approach
Work the 46 pre-2021 issues in one campaign, each landing in exactly one of four outcomes: close as
wontfixwith a one-sentence reason; close asduplicatelinking the survivor; adopt with a Type label and a current-state comment; or move to aSomedaymilestone if it is a genuinely good idea nobody will start soon (what thewishlistlabel has been standing in for).Resist mass-closing with a bot comment: 46 issues at a couple of minutes each is a bounded afternoon, and several encode institutional knowledge about the quadrature and matrix-equation code that is written down nowhere else.
Two long-lived open PRs belong in the same pass: #576 (5+ years, type annotations — see the type-hint policy discussion in this milestone) and #702 (3+ years, vectorise
lorenz_curve/gini).Acceptance criteria
wontfixorduplicatelabelFrom the July 2026 technical-debt audit (AI-assisted; claims verified against
28d4b3bon 2026-07-25).