Cover CPython 3.14 and the sub-interpreter backend in CI - #296
Merged
seanwevans merged 1 commit intoSep 17, 2026
Conversation
The sub-interpreter backend needs 3.14+, and nothing in the matrix ran it: unit tests stopped at 3.13 and the only free-threaded job was 3.13t, which cannot create a cell at all. Add 3.14 to the unit matrix, and a `sub-interpreter cells / py3.14t` job that runs the backend suite on a free-threaded build. That job asserts up front that the interpreter really is a free-threaded 3.14 before running any tests. Every sub-interpreter test skips itself when the build cannot run it -- which is correct for the 3.11-3.13 matrix, but it means a runner that silently resolved to an older Python would skip everything and report the job green having tested nothing. Failing loudly is the difference between a job that covers the backend and a job that looks like it does. Dependency installation follows the existing 3.13t job: install without the runtime deps that may not have free-threaded wheels, then re-add the pure-Python ones the import path needs. Nothing in this job's scope needs real crypto, and the suite's stub covers it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fs1hTtmF4Hm9h617AG9Gse
seanwevans
merged commit Sep 17, 2026
b43fce7
into
claude/festive-johnson-fd03cl-subinterpreter-backend
10 of 22 checks passed
seanwevans
deleted the
claude/festive-johnson-fd03cl-ci-freethreaded
branch
September 17, 2026 01:19
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.
Fifth and last of the series. Stacked on #295 (base is that branch, so the diff here is only the CI change); merge that one first.
The gap
The sub-interpreter backend needs CPython 3.14+, and nothing in the matrix ran it:
tests-unitstops at 3.13;3.13t, which cannot create a cell at all.So the whole backend from #295 would land with its tests skipping everywhere in CI.
What this adds
3.14in the unit matrix (both runners).sub-interpreter cells / py3.14tjob running the backend suite plustest_supervisor.pyandtest_nogil.pyon a free-threaded build.pyproject.toml.The guard step is the point
Every sub-interpreter test skips itself when the build cannot run it. That is right for the 3.11–3.13 matrix, but it means a runner that silently resolved to an older Python would skip everything and report this job green having tested nothing. Failing loudly is the difference between a job that covers the backend and a job that looks like it does.
Dependency installation follows the existing
3.13tjob: install without the runtime deps that may not have free-threaded wheels, then re-add the pure-Python ones the import path needs. Nothing in this job's scope needs real crypto, andtests/conftest.py's stub covers it.Testing
I ran every step of the new job locally against a free-threaded 3.14 build with only
pytest pyyaml platformdirsinstalled — i.e. the exact dependency shape the job creates:ok: 3.14.0rc2 free-threading buildAssertionError: no concurrent.interpreters on 3.13.12tests/test_subinterpreter_backend.py+tests/test_supervisor.py: 77 passed, 2 skippedtests/test_nogil.py: 16 passedThe workflow YAML is parsed and the job structure asserted, so the heredoc quoting is not taken on trust.
3.13 full suite: 544 passed, 43 skipped, plus the usual environmental
test_apply_confinement_installs_seccomp_and_allows_normal_syscallsfailure that reproduces on unmodifiedmain.pre-commit run --all-filespasses.Caveat
I cannot verify from here that
actions/setup-pythonoffers3.14tonubuntu-24.04. If it does not, the guard step fails loudly rather than skipping quietly, which is the intended failure mode — but it may need asetup-pythonversion bump orastral-sh/setup-uvon the first run.🤖 Generated with Claude Code
https://claude.ai/code/session_01Fs1hTtmF4Hm9h617AG9Gse
Generated by Claude Code