Summary
The release wheel matrix should publish CPython 3.14 native (NVX) binary wheels
for both ABI variants — regular/GIL (cp314) and free-threaded/no-GIL
(cp314t, PEP 703) — across all four supported platforms (macOS arm64,
Linux x86_64, Linux aarch64, Windows amd64).
Today neither is done consistently: regular cp314 ships on three of four
platforms but is missing on Linux aarch64, where a cp314t (free-threaded)
wheel was published instead — accidentally, and on that one platform only. No
platform ships a deliberate free-threaded wheel.
This was discovered during the 26.6.1 pre-tag review. 26.6.1 ships as-is (the
affected cell falls back to an sdist build, which works); this issue tracks doing
it properly for the next release.
Current behaviour (as of 26.6.1)
The release fileset is 5 interpreters × 4 platforms = 20 NVX wheels, all GIL,
with one wrong cell:
| interp |
macOS arm64 |
Linux x86_64 |
Linux aarch64 |
Win amd64 |
| cp311 |
✅ |
✅ |
✅ |
✅ |
| cp312 |
✅ |
✅ |
✅ |
✅ |
| cp313 |
✅ |
✅ |
✅ |
✅ |
| cp314 |
✅ |
✅ |
❌ → cp314t |
✅ |
| pypy311 |
✅ |
✅ |
✅ |
✅ |
Evidence — published asset on release master-202606171850:
autobahn-26.6.1-cp314-cp314-macosx_15_0_arm64.whl
autobahn-26.6.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
autobahn-26.6.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl # <- cp314t, not cp314
autobahn-26.6.1-cp314-cp314-win_amd64.whl
Impact
Why CI did not catch it
The strict release-fileset check (.cicd/actions/check-release-fileset) requires
the target cpy314-linux-aarch64-manylinux_2_28 (.github/workflows/release.yml:856),
and matches the ABI tag by substring. Because cp314 is a substring of
cp314t, the wrong-ABI wheel satisfied the target and the manifest went green.
Likely root cause
justfile:79 maps the build token cpy314 → uv python install cpython-3.14.
On the aarch64 manylinux build container that request appears to have resolved to
the free-threaded interpreter, while x86_64 / macOS / Windows resolved to the
GIL build. To confirm, inspect the wheels-arm64 CI log for the cp314 aarch64 job
(what uv actually installed). The fix is to pin the interpreter ABI explicitly
per build target rather than relying on cpython-3.14 resolving to the GIL build.
Proposed goal
Publish, for CPython 3.14, on every platform (macOS arm64, Linux x86_64,
Linux aarch64, Windows amd64):
cp314 — regular / GIL (NVX native wheel)
cp314t — free-threaded / no-GIL (NVX native wheel)
i.e. add a deliberate, symmetric free-threaded variant rather than the current
accidental, single-platform one. (Whether to also add cp313t is an open
question — see Notes.)
Tasks / acceptance criteria
Notes / caveats
- Building a
cp314t wheel ≠ free-threading-safe. Under a free-threaded
interpreter, a C/CFFI extension that does not declare free-threading support
causes the runtime to re-enable the GIL (with a warning) at import. So a
cp314t wheel that merely compiles may not deliver real no-GIL parallelism, and
publishing one is an implicit claim of thread-safety. Before shipping cp314t:
assess NVX (CFFI) and the relevant pure-Python paths for free-threading
correctness, and declare free-threading support appropriately (verify what
CFFI exposes for this on 3.14). This may warrant its own sub-issue.
- Toolchain availability: confirm
uv / python-build-standalone provides a
free-threaded 3.14 for each target (notably Windows amd64 and the manylinux
aarch64 container) before committing to "all platforms".
- PyPy / earlier CPython: free-threading does not apply to PyPy or to
cp311–cp313 in this scope. Whether to also ship cp313t (free-threading was
experimental in 3.13) is left open.
References
This analysis was produced with AI assistance (Claude Code) and requires human review before filing. Which I did.
Checklist
Summary
The release wheel matrix should publish CPython 3.14 native (NVX) binary wheels
for both ABI variants — regular/GIL (
cp314) and free-threaded/no-GIL(
cp314t, PEP 703) — across all four supported platforms (macOS arm64,Linux x86_64, Linux aarch64, Windows amd64).
Today neither is done consistently: regular
cp314ships on three of fourplatforms but is missing on Linux aarch64, where a
cp314t(free-threaded)wheel was published instead — accidentally, and on that one platform only. No
platform ships a deliberate free-threaded wheel.
This was discovered during the 26.6.1 pre-tag review. 26.6.1 ships as-is (the
affected cell falls back to an sdist build, which works); this issue tracks doing
it properly for the next release.
Current behaviour (as of 26.6.1)
The release fileset is 5 interpreters × 4 platforms = 20 NVX wheels, all GIL,
with one wrong cell:
cp314tEvidence — published asset on release
master-202606171850:Impact
cp314twheel is tagged for the free-threaded interpreter only; it doesnot install on a regular (GIL) CPython 3.14. So
pip install autobahnon a standard CPython 3.14 / aarch64 finds no matchingwheel and falls back to building from the sdist (works since [BUG] Incorrect machine is detected while cross compiling #1834/[FEATURE] Replicate zlmdb modernization: sync .ai/.cicd + FlatBuffers v25.12.19, decouple flatc from build (fix cross-compile), restore FlatBuffers version-sync with zlmdb #1853 made
the NVX build cross-/sdist-friendly, but requires a toolchain and is slower).
the single
aarch64 + cp314 + GILcell.python3.14t) get a wheel on aarch64 but on no otherplatform — inconsistent.
Why CI did not catch it
The strict release-fileset check (
.cicd/actions/check-release-fileset) requiresthe target
cpy314-linux-aarch64-manylinux_2_28(.github/workflows/release.yml:856),and matches the ABI tag by substring. Because
cp314is a substring ofcp314t, the wrong-ABI wheel satisfied the target and the manifest went green.Likely root cause
justfile:79maps the build tokencpy314→uv python install cpython-3.14.On the aarch64 manylinux build container that request appears to have resolved to
the free-threaded interpreter, while x86_64 / macOS / Windows resolved to the
GIL build. To confirm, inspect the
wheels-arm64CI log for the cp314 aarch64 job(what
uvactually installed). The fix is to pin the interpreter ABI explicitlyper build target rather than relying on
cpython-3.14resolving to the GIL build.Proposed goal
Publish, for CPython 3.14, on every platform (macOS arm64, Linux x86_64,
Linux aarch64, Windows amd64):
cp314— regular / GIL (NVX native wheel)cp314t— free-threaded / no-GIL (NVX native wheel)i.e. add a deliberate, symmetric free-threaded variant rather than the current
accidental, single-platform one. (Whether to also add
cp313tis an openquestion — see Notes.)
Tasks / acceptance criteria
cpy314buildtargets so aarch64 again produces
cp314-cp314(notcp314t). Confirmagainst the aarch64 CI log first.
cpy314t→ an explicituv python installspec for the free-threaded 3.14) to the build matrix injustfile(ENVS/ thecpy314)mapping at justfile:79) and the wheelworkflows (
wheels-arm64.ymland the x86_64/macOS/Windows wheel jobs).cp314tNVX wheels on all four platforms; verify the resulting ABItag is
cp314ton each.release.yml(artifact outputs + downloadsteps), mirroring how [BUG] PyPI missing cp312 and cpy314 wheels for manylinux aarch64 #1848 plumbed cp312/cp314.
cpy314t-*targets to all four platform manifests inrelease.yml,and tighten the fileset ABI matching so
cp314andcp314taredistinct (exact ABI-tag match, not substring) — the
check-release-filesetREADME already distinguishescpy314vscpy314ttarget types, so the infra supports it.
cp314andcp314tfor all fourplatforms (24 → 24 GIL + 4 free-threaded, depending on final scope).
Notes / caveats
cp314twheel ≠ free-threading-safe. Under a free-threadedinterpreter, a C/CFFI extension that does not declare free-threading support
causes the runtime to re-enable the GIL (with a warning) at import. So a
cp314t wheel that merely compiles may not deliver real no-GIL parallelism, and
publishing one is an implicit claim of thread-safety. Before shipping cp314t:
assess NVX (CFFI) and the relevant pure-Python paths for free-threading
correctness, and declare free-threading support appropriately (verify what
CFFI exposes for this on 3.14). This may warrant its own sub-issue.
uv/ python-build-standalone provides afree-threaded 3.14 for each target (notably Windows amd64 and the manylinux
aarch64 container) before committing to "all platforms".
cp311–cp313 in this scope. Whether to also ship
cp313t(free-threading wasexperimental in 3.13) is left open.
References
symmetric (this issue is the follow-up that the substring match let slip).
fallback viable in the meantime.
.github/workflows/release.yml:856(manifest target),justfile:79(interpreter mapping),
.cicd/actions/check-release-fileset(fileset check).This analysis was produced with AI assistance (Claude Code) and requires human review before filing. Which I did.
Checklist