Skip to content

Widen distribution matrix to Python 3.10-3.14t across all three OSes - #21

Merged
onlyxItachi merged 1 commit into
mainfrom
feat/v1.2-python-matrix
Jul 18, 2026
Merged

Widen distribution matrix to Python 3.10-3.14t across all three OSes#21
onlyxItachi merged 1 commit into
mainfrom
feat/v1.2-python-matrix

Conversation

@onlyxItachi

Copy link
Copy Markdown
Owner

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 the
official 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)

leg interpreter result
floor CPython 3.10.20 206 passed, 16 skipped
free-threaded CPython 3.14.3t (Py_GIL_DISABLED confirmed True at runtime) 206 passed, 16 skipped
current CPython 3.14.3 206 passed, 16 skipped

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-error escape hatch): there is no
blocking dependency to document.

Classifiers (validated, not guessed)

Every string was checked against the official trove-classifiers package
(895 entries) and the final pyproject re-validated programmatically — zero
invalid entries; uv build metadata passes. Settled list (additions):

  • Programming Language :: Python :: 3.10 ... :: 3.14 (all five exist)
  • Programming Language :: Python :: Free Threading — the official
    free-threading classifier family EXISTS (base + staged
    1 - Unstable/2 - Beta/3 - Stable/4 - Resilient variants). Claimed
    the 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] x
python: ["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 run
pins the SAME --python/--extra as the sync on every step. uv accepting
the 3.14t key was verified locally (uv sync --python 3.14t resolves to
cpython-3.14.3+freethreaded), not assumed.

Publish gate (publish.yml) — additive only

New verify-floor job: full suite + uv build + clean 3.10 venv wheel
install + scripts check + tool-surface assert, every step pinned to 3.10 —
because requires-python >= 3.10 is the claim the package makes to the
world, the gate now proves it on the exact floor. The existing verify job
is byte-untouched; pypi.needs gains the second gate. The whole verify-floor
flow was simulated locally end-to-end before committing (wheel installed into
a clean 3.10 venv; tool surface asserted: 7 tools exact).

Scope discipline

  • README: exactly ONE phrase added to the v1.2.0 status entry
    ("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.11 resolution
    markers + floor-only backports) — the lock is committed by repo policy.
  • No version bump, no CLAUDE.md edits, no code changes (none were needed —
    flagged explicitly: the pre-release-reviewed source is byte-identical).

🤖 Generated with Claude Code

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>
@onlyxItachi
onlyxItachi merged commit 2c01638 into main Jul 18, 2026
17 of 18 checks passed
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.

1 participant