docs(deps): record why cadquery-ocp stays unbounded - #388
Merged
Conversation
#386 noted `cadquery-ocp>=7.8` as the one unbounded pin in the `[cadquery]` extra, latent untidiness left after PR #387 fixed the actual cause. Investigated: no bound should be added, and the reason belongs next to the pin so it is not re-raised. Measured with `uv pip install --dry-run --no-config -e '.[cadquery]'`, uv 0.11.12: as declared (>=7.8) cadquery-ocp==7.9.3.1.1 py3.12 and py3.13 with `<8` added cadquery-ocp==7.9.3.1.1 identical requirement deleted cadquery-ocp==7.9.3.1.1 identical The specifier is inert because CadQuery already depends on `cadquery-ocp` directly and caps it more precisely than we could: `cadquery 2.8.0` requires `cadquery-ocp<8.0,>=7.9.3.1`, which is what holds `8.0.1.0.0` (uploaded 2026-09-05T11:26:52Z) out of the solve. CadQuery is the thing compiled against OCP, so its cap tracks the real invariant and a copy here would only go stale. A stale copy is not harmless, and it does not announce itself. On py3.12, `cadquery>=2.6,<3` with `cadquery-ocp>=7.8,<7.9` resolves `cadquery==2.7.0` / `cadquery-ocp==7.8.1.1.post1` at exit 0 — a silent backtrack to an older engine, which is the failure class this project exists to catch. Once CadQuery ships a major built against OCP 8, a hardcoded `<8` inside `cadquery>=2.8,<3` would do exactly that. No bound in this file could have prevented #386 in any case: the `--no-deps --reinstall-package` re-assert that installed the wrong major reads no requirement here at all. Comment only; the resolution is byte-identical before and after.
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.
Closes the loose end #386 left under "Note, not the cause":
[cadquery]declares
cadquery-ocp>=7.8, the only unbounded pin of the three.Conclusion: no bound should be added. This PR is a comment only — the
resolution is byte-identical before and after.
The pin's specifier is inert
Measured, uv 0.11.12,
uv pip install --dry-run --no-config -e '.[cadquery]' pytest:cadquery-ocp>=7.8(as declared)cadquery-ocp==7.9.3.1.1cadquery-ocp>=7.8,<8cadquery-ocp==7.9.3.1.1cadquery-ocp==7.9.3.1.1cadquerydepends oncadquery-ocpdirectly, so naming it here adds no package,and the bounds add no constraint. Read from the published metadata rather than
restated:
cadquery 2.8.0→cadquery-ocp<8.0,>=7.9.3.1build123d 0.11.1→cadquery-ocp-novtk<8.0,>=7.9That
<8.0is what holdscadquery-ocp 8.0.1.0.0(uploaded2026-09-05T11:26:52Z) out of the solve. CadQuery is the thing compiledagainst OCP, so its cap tracks the real invariant — which is not "OCP < 8" but
"the OCP CadQuery was built for". We cannot express the latter; CadQuery already
does.
A duplicate cap is not free, and it fails silently
The scenario #386 raises is "if the transitive cap ever loosened". But the cap
loosens precisely when CadQuery declares OCP 8 safe — and
cadquery>=2.8,<3admits that release. A hardcoded
<8would then constrain something we have noevidence about, and it would not error. Reproduced on py3.12:
A stale OCP cap with an older CadQuery still in range silently backtracks the
engine and exits 0. No warning, no diagnostic. That is this project's own
thesis violated in its packaging metadata, and it is what a
<8written todaybuys us the day CadQuery moves major.
(On py3.13 the same pair errors instead, because the older OCP has no cp313
wheels. The silent path is the one that matters:
requires-python = ">=3.12"and CI runs 3.12.)
And it would not have prevented #386
#386's failure was OCP 8 installed over a CadQuery built for 7.9, by
uv pip install --no-deps --reinstall-package cadquery-ocp cadquery-ocp.--no-depsreads no requirement inpyproject.tomlat all. The fix was #387's,in the justfile, and it is the right one.
Gate
just check— clean (ruff format --check,gen_docs --check,ruff check,pyright 0 errors)just test—1378 passed in 106.72sjust test-cadquery-only—1133 passed, 236 skipped in 68.49sRefs #386, #387.