@@ -207,9 +207,16 @@ The `pytest` job MUST run `just install` then `just test-ci` on every matrix ent
207207
208208### CI6 · ` floors ` job { #CI6 }
209209
210- The ` floors ` job MUST resolve every direct dependency at its declared floor, wheel-only
211- (` --no-build ` , or ` --only-binary ` naming the dependency that needs it), on every matrix entry, then
212- run the suite or an import. It MUST gate every pull request and MUST be skipped on the schedule,
210+ The ` floors ` job MUST install every direct dependency at its declared floor, wheel-only, on every
211+ matrix entry, then run the suite or an import. It MUST do so in two steps, pinning the floors with
212+ builds allowed and then installing the pins with builds disabled:
213+
214+ ``` yaml
215+ - run : uv pip compile pyproject.toml --all-extras --no-deps --resolution lowest-direct -o floors.txt
216+ - run : uv pip install -r pyproject.toml --all-extras --constraints floors.txt --no-build
217+ ` ` `
218+
219+ A repo that runs the suite adds ` --group dev` to the install. It MUST gate every pull request and MUST be skipped on the schedule,
213220with `if : github.event_name != 'schedule'` on the job (a called workflow sees its caller's `github`
214221context).
215222
@@ -222,7 +229,13 @@ declared range ships untested. It has rotted there before
222229([compose2pod#126](https://github.com/modern-python/compose2pod/issues/126),
223230[faststream-outbox#190](https://github.com/modern-python/faststream-outbox/pull/190)).
224231Wheel-only, because a floor reachable only by compiling an sdist is not one a user installing a
225- wheel can reach, and without the flag the resolver builds one and reports success. Every matrix
232+ wheel can reach, and without the flag the resolver builds one and reports success. Two steps,
233+ because the flag alone does not fail on such a floor : it makes the wheel-less version ineligible,
234+ and `lowest-direct` climbs to the lowest version that has a wheel, so the job passes on a version
235+ the repo never declared
236+ ([compose2pod#135](https://github.com/modern-python/compose2pod/pull/135)). Pinning with builds
237+ allowed fixes the declared floor first, and the wheel-only install then fails on it
238+ ([compose2pod#139](https://github.com/modern-python/compose2pod/pull/139)). Every matrix
226239entry, because wheel coverage is per interpreter. On the pull request, because that is where a floor
227240breaks : a diff starts using an API newer than the declared floor. `lite-bootstrap` ran its floors
228241only on the schedule and shipped such a break to PyPI
0 commit comments