Widen distribution matrix to Python 3.10-3.14t across all three OSes - #21
Merged
Conversation
requires-python drops to >=3.10 — verified end-to-end, not assumed: the FULL suite (206 passed + 16 skipped) runs green locally on real CPython 3.10.20, on 3.14.3, and on the free-threaded 3.14.3t build (Py_GIL_DISABLED confirmed at runtime); zero code changes were needed. The dependency tree installs clean on 3.14t, and the two compiled deps (pydantic-core, rpds-py) ship cp314t wheels for manylinux/macOS/Windows (checked against PyPI), so the 3.14t CI legs are strict — no continue-on-error escape hatch needed. Classifiers: per-version 3.10-3.14 plus 'Programming Language :: Python :: Free Threading' — every string validated against the official trove-classifiers list (895 entries); the Free Threading classifier is claimed only because the suite actually passes on a GIL-disabled build and CI now runs that leg. ci.yml: full 3-OS x 6-version matrix (3.10, 3.11, 3.12, 3.13, 3.14, 3.14t), replacing the single-version-plus-floor-include shape. The sync/run --python pinning lesson is preserved on both steps. publish.yml: additive verify-floor job — the publish gate now also proves the exact 3.10 floor claim (full suite + clean-venv wheel install + tool-surface assert, all pinned to 3.10; simulated locally end-to-end before committing). pypi needs both verify jobs; the existing verify flow is untouched. README: the v1.2.0 status entry gains the one supported-range phrase. uv.lock: re-resolved for the widened floor (adds <3.11 resolution markers and floor-only backports). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Folds the full distribution-matrix expansion into v1.2.0 before its tag:
requires-python >= 3.10, per-version trove classifiers up to 3.14 plus theofficial Free Threading classifier, a 3-OS x 6-version CI matrix
(3.10 / 3.11 / 3.12 / 3.13 / 3.14 / 3.14t), and a publish-gate job proving
the exact 3.10 floor claim. Version stays 1.2.0 — this rides into the
existing pre-release, no bump.
Local verification (both ends, full suite — not compileall)
Py_GIL_DISABLEDconfirmed True at runtime)Zero code changes were needed for 3.10 — no stray 3.11-isms surfaced under
the real interpreter. Middle versions (3.11/3.12/3.13) ride on CI as
scheduled.
3.14t risk leg resolved clean: the whole dependency tree installs on the
free-threaded build, and the only compiled deps in the tree (pydantic-core,
rpds-py) ship cp314t wheels for manylinux, macOS, AND Windows — checked
against PyPI release files before widening the matrix. The 3.14t CI legs are
therefore strict (no
continue-on-errorescape hatch): there is noblocking dependency to document.
Classifiers (validated, not guessed)
Every string was checked against the official
trove-classifierspackage(895 entries) and the final pyproject re-validated programmatically — zero
invalid entries;
uv buildmetadata passes. Settled list (additions):Programming Language :: Python :: 3.10...:: 3.14(all five exist)Programming Language :: Python :: Free Threading— the officialfree-threading classifier family EXISTS (base + staged
1 - Unstable/2 - Beta/3 - Stable/4 - Resilientvariants). Claimedthe base classifier only, and only because the suite genuinely passes on a
GIL-disabled build and CI now runs that leg on every push — no maturity
stage is claimed.
CI matrix (
ci.yml)os: [ubuntu-latest, macos-latest, windows-latest]xpython: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],fail-fast: false. The repo's hard-won pinning lesson is preserved verbatim:uv runpins the SAME
--python/--extraas the sync on every step.uvacceptingthe
3.14tkey was verified locally (uv sync --python 3.14tresolves tocpython-3.14.3+freethreaded), not assumed.Publish gate (
publish.yml) — additive onlyNew
verify-floorjob: full suite +uv build+ clean 3.10 venv wheelinstall + scripts check + tool-surface assert, every step pinned to 3.10 —
because
requires-python >= 3.10is the claim the package makes to theworld, the gate now proves it on the exact floor. The existing
verifyjobis byte-untouched;
pypi.needsgains the second gate. The whole verify-floorflow was simulated locally end-to-end before committing (wheel installed into
a clean 3.10 venv; tool surface asserted: 7 tools exact).
Scope discipline
("Python 3.10–3.14 including free-threaded 3.14t, Linux/macOS/Windows
CI-verified"). Nothing else touched.
uv.lock: re-resolved for the widened floor (adds< 3.11resolutionmarkers + floor-only backports) — the lock is committed by repo policy.
flagged explicitly: the pre-release-reviewed source is byte-identical).
🤖 Generated with Claude Code