Skip to content

ci: resolve the floors wheel-only; fix the 3.13 pydantic floor - #190

Merged
lesnik512 merged 1 commit into
mainfrom
ci/lowest-wheels-only
Sep 20, 2026
Merged

lesnik512 merged 1 commit into
mainfrom
ci/lowest-wheels-only

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Follow-up to #188.

The gap

uv sync --resolution lowest-direct falls back to building a source
distribution when a package has no wheel for the running interpreter. So the
lowest leg answers "do the floors resolve and pass on a machine with a
compiler", which is not the question. A user installing into a slim image has
no toolchain, and for them a floor with no wheel is a hard install failure that
CI reports as green.

uv sync spells the fix --no-build ("don't build source distributions"). The
leg already passes --no-install-project, so this constrains dependencies only.

What it found

pydantic>=2.8; python_version == '3.13' is a floor that exists for wheel
coverage and does not achieve it. Against main, wheel-only:

error: Distribution `pydantic-core==2.20.0` can't be installed because it is
marked as `--no-build` but has no binary distribution

Bisected on a verified 3.13.15 interpreter:

pydantic pydantic-core cp313 wheel
2.8.0 2.20.0 no
2.8.1 2.20.1 yes
2.8.2 2.20.1 yes

So the floor moves to >=2.8.1, and the comment above it, which asserted 2.8,
is corrected to match what the wheels actually show.

The matrix gains 3.12

#188 omitted it on the grounds that its floors resolve to the same versions as
3.11's. That is true and it is not sufficient: wheel coverage is per-interpreter,
so two legs resolving identical versions can still disagree on whether those
versions install. 3.12 passes today, but nothing was checking. The comment
justifying the omission is replaced rather than patched.

Verified

All four legs, wheel-only, with the corrected floor:

leg resolve pydantic suite
3.11 OK 2.0.2 517 passed, 107 skipped
3.12 OK 2.0.2 517 passed, 107 skipped
3.13 OK 2.8.1 517 passed, 107 skipped
3.14 OK 2.12.0 517 passed, 107 skipped

The 107 skips are the Postgres tests, which run in CI. just lint-ci clean.

Credit

The failure mode came from a parallel session working on compose2pod, which
measured the same thing for PyYAML: 6.0.1 and 6.0.2 install by compiling
the sdist, so a floor of >=6.0.1 passes CI and still fails in a minimal image,
while 6.0.3 is the first with a cp314 wheel. Same class of bug, same fix.

`uv sync --resolution lowest-direct` builds a missing wheel from source, so
the `lowest` leg went green on a floor that still fails anywhere without a
build toolchain. `--no-build` makes that a resolution error instead.

It immediately found one: `pydantic>=2.8` on 3.13 is a wheel-coverage floor
that does not cover the wheel. 2.8.0 carries pydantic-core 2.20.0, which
ships no cp313 wheel; 2.8.1 carries 2.20.1, which does.

The matrix gains 3.12. Its floors resolve to the same versions as 3.11, which
is why it was left out, but wheel coverage is per-interpreter and version
equality does not imply it.
@github-actions

Copy link
Copy Markdown

Benchmark gate

✅ gate passed

scenario msg/s delete/msg WALrec/msg WALB/msg fpi upd del dead_tup
consumer/w1/b10 989 1.000 6.78 914 242 5000 5000 10000
consumer/w1/b100 1016 1.000 6.82 920 243 5000 5000 10000
consumer/w2/b10 1177 1.000 6.77 942 242 5000 5000 10000
consumer/w2/b100 1371 1.000 6.73 955 243 5000 5000 10000
consumer/w4/b10 1035 1.000 6.82 996 263 5000 5000 10000
consumer/w4/b100 1516 1.000 6.86 1035 245 5000 5000 10000
consumer/w1/b100/tfbs100 5099 0.010 6.07 1116 243 5000 5000 10000
producer/w1/b100 2106 0.000 3.04 584 0 0 0 0

Gated (fails the build): delete_calls + tuple counters (upd/del/ins) + the producer's insert_calls, exact; select_calls within +2; wal_records within a 10% band. msg/s, WAL bytes and total calls are informational (timing/FPI noise).

@lesnik512
lesnik512 merged commit 7ea5e0b into main Sep 20, 2026
13 checks passed
@lesnik512
lesnik512 deleted the ci/lowest-wheels-only branch September 20, 2026 14:37
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