Skip to content

chore(python): relax the floor to >=3.11, measured, with a CI leg to keep it true - #301

Merged
eaitbrahim merged 2 commits into
mainfrom
chore/python-floor
Aug 16, 2026
Merged

chore(python): relax the floor to >=3.11, measured, with a CI leg to keep it true#301
eaitbrahim merged 2 commits into
mainfrom
chore/python-floor

Conversation

@eaitbrahim

Copy link
Copy Markdown
Contributor

Closes #283

requires-python = ">=3.14.4" said "the interpreter I develop on", not "the interpreter the
code needs" — and 3.14 is new enough that contributors who lack it fail to build and leave
without opening an issue.

The measurement (the decision's evidence, per the issue):

Python full suite
3.13 2,788 passed / 1 skipped — identical to 3.14
3.12 2,788 passed / 1 skipped
3.11 2,788 passed / 1 skipped
3.10 fails collection: ImportError: cannot import name 'assert_never' from 'typing'

Decision: nothing requires 3.14. The floor is set to >=3.11 — the lowest version the
suite passes on — with typing.assert_never (3.11+) as the one concrete binding constraint.
Development stays pinned to 3.14.4 via .python-version.

What changes

  • requires-python = ">=3.11" in all six distributions; uv.lock re-resolved.
  • ci.yml's test job becomes a 3.11 + 3.14 matrix, so the floor stays a measured claim.
    Both legs stay inside the test job on purpose: the matrix fans out the required status
    context rather than renaming it, so every leg gates the merge — the same lesson the job's
    own comments record for mypy (ci: gate on mypy, so #266's ungating cannot quietly come undone #268).
  • mypy python_version = "3.11" — check against the floor, not the dev pin.
  • README quickstart and CONTRIBUTING state 3.11 and the reason ("a contributor hitting the
    floor gets a clear message rather than a confusing resolver error" — low floor, stated
    plainly).
  • tests/test_python_floor.py (red first) pins the decision's four halves: one floor in every
    distribution, the binding feature still imported (if assert_never ever disappears, the
    floor can drop — re-measure), the CI leg present, and the docs stating it.

Gates: pytest 2,798 passed / 1 skipped on both 3.14 and 3.11; ruff and mypy clean.

…keep it true

requires-python was >=3.14.4 — the interpreter the author develops on,
not one the code needs, and new enough to silently bar contributors
(#283). Measured by running the full suite down the versions: 3.13,
3.12, 3.11 pass identically (2,788/1); 3.10 fails collection on
typing.assert_never (3.11+), the one concrete binding constraint. Floor
set to >=3.11, dev pin stays 3.14.4, ci.yml's test job becomes a
3.11+3.14 matrix (same status context, so both legs gate the merge),
mypy targets the floor, and tests/test_python_floor.py pins the
decision: one floor everywhere, the binding feature still imported, the
CI leg present, the docs stating it.
@eaitbrahim
eaitbrahim merged commit fe61248 into main Aug 16, 2026
2 checks passed
@eaitbrahim
eaitbrahim deleted the chore/python-floor branch August 16, 2026 23:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Decide the Python floor: justify >=3.14.4 or relax it

1 participant