Summary
In the CI workflow (.github/workflows/ci.yml), the "Install dependencies and run tests with tox-uv" step for Python 3.15 consistently takes ~2+ minutes, while every other version finishes in ~20–55s. It's the long pole of the matrix on every PR.
Evidence
Per-version test job durations from a recent green run (run 28987084211):
| job |
duration |
| test (3.10) |
54s |
| test (3.11) |
48s |
| test (3.12) |
48s |
| test (3.13) |
49s |
| test (3.14) |
39s |
| test (3.14t) |
53s |
| test (3.15) |
137s |
Where
.github/workflows/ci.yml:
- Matrix:
python-version: ["3.10", ..., "3.14t", "3.15"] with allow-prereleases: true.
- Step:
uvx --with tox-uv tox -e py$(echo ${{ matrix.python-version }} | tr -d '.')
setup-uv cache is enabled (enable-cache: true, keyed on uv.lock).
Likely cause (to confirm)
Python 3.15 is a prerelease, so several dependencies with native extensions likely have no prebuilt wheels for 3.15 yet and get built from source under tox-uv (e.g. cryptography, pydantic-core, and other Rust/C-extension deps). The workflow already carries a related note that cryptography doesn't ship 3.15 free-threaded wheels (matrix comment near 3.15t), which supports this theory.
The tox environment build is also likely not hitting the setup-uv cache the same way, since source builds and prerelease resolution differ from the locked wheel set.
Investigation / next steps
Impact
Adds ~1.5 min to every PR's critical path with no added coverage benefit (3.14 already exercises the newest stable behavior). Low urgency, but easy CI-time win.
Summary
In the
CIworkflow (.github/workflows/ci.yml), the "Install dependencies and run tests with tox-uv" step for Python 3.15 consistently takes ~2+ minutes, while every other version finishes in ~20–55s. It's the long pole of the matrix on every PR.Evidence
Per-version
testjob durations from a recent green run (run 28987084211):Where
.github/workflows/ci.yml:python-version: ["3.10", ..., "3.14t", "3.15"]withallow-prereleases: true.uvx --with tox-uv tox -e py$(echo ${{ matrix.python-version }} | tr -d '.')setup-uvcache is enabled (enable-cache: true, keyed onuv.lock).Likely cause (to confirm)
Python 3.15 is a prerelease, so several dependencies with native extensions likely have no prebuilt wheels for 3.15 yet and get built from source under tox-uv (e.g.
cryptography,pydantic-core, and other Rust/C-extension deps). The workflow already carries a related note thatcryptographydoesn't ship 3.15 free-threaded wheels (matrix comment near3.15t), which supports this theory.The tox environment build is also likely not hitting the
setup-uvcache the same way, since source builds and prerelease resolution differ from the locked wheel set.Investigation / next steps
uv pip install --verbose/uv's resolution output).mainonly) until it stabilizes.Impact
Adds ~1.5 min to every PR's critical path with no added coverage benefit (3.14 already exercises the newest stable behavior). Low urgency, but easy CI-time win.