docs(standard): require a floors job that resolves the declared dependency floors - #109
Merged
Merged
Conversation
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.
Adds
floorsto section 7's job table: a job that resolves every direct dependency at its declaredfloor, wheel-only, on every matrix entry.
Why
A declared floor is a claim that the package installs and works against that version, and today
nothing in the org tests it.
just installrunsuv lock --upgrade, sopytestresolveseverything at its newest on every run, on both entry points. The bottom of every declared range
ships unexercised.
It rots there, and two repos have already been bitten:
could not install on 3.14.
pydantic>=2floor that nocp313wheel satisfies below pydantic 2.8.1. Found the same day thejob was made wheel-only, on a repo whose gate had already been green for two PRs.
Three repos invented a gate for this independently (
compose2pod,faststream-outbox,lite-bootstrap). That is the usual sign it belongs in the standard.What the standard does and does not fix
It fixes the obligation and two properties, because both are things a repo gets silently wrong:
--no-build(or--only-binarynaming the offender) the resolvercompiles an sdist and reports success, so the job passes on a floor no wheel user can reach.
This is exactly what hid the pydantic floor above.
versions can still disagree on whether those versions install, which is the whole point of a
marked floor.
It deliberately does not fix the YAML. The three existing gates differ for real reasons:
lite-bootstrapcannot run pytest at the floors (itsconftest.pyhard-imports optionaldependencies the floor target omits) so it smoke-imports per extras group;
compose2podscopes--only-binaryto PyYAML and drops3.14tbecause no PyYAML ships acp314twheel;faststream-outboxruns the full suite underuv sync --no-build. Any single mandated snippetbreaks two of the three. This is also the position section 7 already takes on a shared workflow
(#95).
One thing this overrules
lite-bootstrapruns its gate fromscheduled.ymlonly, on the recorded grounds thatlowest-directresolves transitive dependencies at their newest, so an upstream release can turnit red for reasons no PR caused. That is true, but it does not distinguish this job from
pytest:installupgrades the lockfile, sopytestis exposed to the same upstream churn on every PR, andthe org already accepts that. The standard therefore says
floorsruns from both entry points, andlite-bootstrapchanges when the sweep reaches it. Say so here if you would rather keep itscheduled-only and I will invert the rule instead.
Scope this creates
The job table is core, so this makes 20 repos non-conformant until swept: the 12
modern-di-*,db-retry,httpware,semvertag,eof-fixer,faststream-redis-timers,faststream-concurrent-aiokafka, plus reconciling the three that already have a gate.modern-dideclares no dependencies and needs nothing;
that-dependsis exempt from the core;chat-appandthe two templates publish nothing and have no
_checks.yml.Expect first runs to go red. A red is a floor raise in
pyproject.toml, which only helps futureinstalls: already-released versions keep the wrong floor.
Verification
uv run mkdocs build --strictclean,uv run pytest132 passed / 29 skipped. Both new linksresolve; neither matches the offline gate's remap pattern, so
links.ymlcovers them weekly.