Context
Current CI matrix in `python-package.yml`:
```yaml
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
```
Minimum in `pyproject.toml`: `python = ">=3.10"`. `tool.ruff.target-version` is currently `"py310"`.
Why drop 3.10
Python 3.10 reaches end-of-life in October 2026 — roughly five months out from now (2026-05-14). After that date 3.10 stops getting security fixes upstream, so most maintained libraries either drop or stop testing it.
Dropping it now also unlocks:
- Cleaner CI — 4 matrix jobs instead of 5 (one less to wait on per PR).
- Bumping `ruff.target-version` to `"py311"`, which enables modern rewrites (e.g. `X | Y` union syntax) that `py310` already allows but newer rules continue to expand.
Why this should be one consistent change
If we drop 3.10 only from CI but leave `python = ">=3.10"` in pyproject.toml, the package would still claim to support a version we no longer test against — and a regression that breaks on 3.10 would land silently. Either drop both, or drop neither.
Suggested sub-tasks
Conservative alternative
If a 5-month-early drop feels too aggressive, just drop `"3.10"` from the CI matrix and keep the pyproject floor — but add a comment to that effect so the asymmetry is intentional rather than a future trap.
Surfaced during the docstring audit / pdoc PR (#237).
Context
Current CI matrix in `python-package.yml`:
```yaml
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
```
Minimum in `pyproject.toml`: `python = ">=3.10"`. `tool.ruff.target-version` is currently `"py310"`.
Why drop 3.10
Python 3.10 reaches end-of-life in October 2026 — roughly five months out from now (2026-05-14). After that date 3.10 stops getting security fixes upstream, so most maintained libraries either drop or stop testing it.
Dropping it now also unlocks:
Why this should be one consistent change
If we drop 3.10 only from CI but leave `python = ">=3.10"` in pyproject.toml, the package would still claim to support a version we no longer test against — and a regression that breaks on 3.10 would land silently. Either drop both, or drop neither.
Suggested sub-tasks
Conservative alternative
If a 5-month-early drop feels too aggressive, just drop `"3.10"` from the CI matrix and keep the pyproject floor — but add a comment to that effect so the asymmetry is intentional rather than a future trap.
Surfaced during the docstring audit / pdoc PR (#237).