Skip to content

check-compat-bounds: restore full-workspace resolution + bucket rule#79

Merged
mtfishman merged 1 commit intomainfrom
mf/check-compat-bucket-rule
Apr 23, 2026
Merged

check-compat-bounds: restore full-workspace resolution + bucket rule#79
mtfishman merged 1 commit intomainfrom
mf/check-compat-bucket-rule

Conversation

@mtfishman
Copy link
Copy Markdown
Member

@mtfishman mtfishman commented Apr 23, 2026

Summary

Before: the compat-bounds check failed whenever a package's compat entry allowed a version that the resolver could not actually install — even if the gap was only at the patch or minor level within the same breaking-version range.

After: the check only fails when the gap crosses a breaking-version boundary (a major bump for v >= 1.0, a minor bump for 0.x). If the resolver lands on a version in the same breaking range as the max-allowed version, the check passes.

This targets the case the check is really meant to catch: a package claims support for a breaking version of a dependency that it cannot actually exercise, because something else in the workspace holds it in an earlier range. Smaller within-range gaps close on their own as upstreams release patches and no longer produce failing checks.

This also restores the original full-workspace resolution (including weakdeps and subdir projects), which #78 had narrowed to root deps only. With the bucket-based comparison in place, the narrower scope is no longer needed to keep the check from being noisy, and the wider scope catches aspirational claims involving optional extensions or test-only deps that #78 missed.

Reverts the core-only resolution introduced in #78 in favor of a more
targeted rule that addresses the original "too pedantic" complaint
without sacrificing honesty about what the workspace can actually
reach.

The new rule resolves against the full workspace (weakdeps + subdir
projects included, same as pre-#78) and compares the *breaking bucket*
of the resolved version against the bucket of the max-allowed version.
Breaking buckets:
  - v >= 1.0     -> (major,)
  - 0.1 <= v < 1 -> (0, minor)
  - 0 < v < 0.1  -> (0, 0, patch)

Within-bucket gaps (e.g. compat "0.6" resolved at 0.6.4 while 0.6.5
exists) are allowed and no longer flag. Those gaps resolve themselves
on the next upstream release and don't change what the package claims
to support at the API-break level. Cross-bucket claims (e.g.
"0.18, 0.19" resolved at 0.18.22 because a weakdep pins DataStructures)
still flag — that's the aspirational-claim case the check is meant
to catch.

Tested locally against ITensorNetworks (flags DataStructures 0.18/0.19
cross-bucket — legitimate), ITensorFormatter (flags test JuliaSyntax
0.4.10/1 cross-bucket — legitimate; no longer flags the within-bucket
Runic "1.5.1" vs 1.7.0 gap), and BlockSparseArrays (flags TensorAlgebra
0.7/0.9 cross-bucket — legitimate; no longer flags the within-bucket
MAK 0.6.4/0.6.5 gap, which was the original motivation for the
overly-pedantic-check complaint).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@mtfishman mtfishman merged commit e9999c6 into main Apr 23, 2026
1 check passed
@mtfishman mtfishman deleted the mf/check-compat-bucket-rule branch April 23, 2026 19:13
mtfishman added a commit to ITensor/ITensorFormatter.jl that referenced this pull request Apr 23, 2026
`JuliaFormatter 2.3.0` (the latest registered version) pins
`JuliaSyntax` to `0.4.10`. That makes `test/Project.toml`'s entry
`JuliaSyntax = "0.4.10, 1"` aspirational — the `1` disjunct is never
reachable.

Under the compat-bounds check's breaking-bucket rule
([ITensorActions#79](ITensor/ITensorActions#79)),
this spans two buckets (0.4 and 1) and fails the check. Narrowing to
`"0.4.10"` collapses to a single bucket.

Widen back whenever JuliaFormatter ships a release with broader
JuliaSyntax compat.

### Supersedes

- Closes #52

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
mtfishman added a commit to ITensor/ITensorNetworks.jl that referenced this pull request Apr 23, 2026
The `EinExprs` weakdep (via `ITensorNetworksEinExprsExt`) pins
`DataStructures` to `0.18`. The `0.19` entry in the root compat is never
reachable when the extension is loaded, so it is aspirational.

Under the compat-bounds check's breaking-bucket rule
([ITensorActions#79](ITensor/ITensorActions#79)),
this spans two buckets (0.18 and 0.19) and fails the check. Narrowing to
`"0.18"` collapses to a single bucket.

Widen back if `EinExprs` loosens its `DataStructures` compat, or remove
the entry entirely once `EinExprs` support is dropped.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
mtfishman added a commit to ITensor/BlockSparseArrays.jl that referenced this pull request Apr 23, 2026
Follow-up to #258. Under the bucket-rule compat check
([ITensorActions#79](ITensor/ITensorActions#79)),
within-bucket gaps no longer fail, so root can go back to `"0.6"`
instead of the narrow `"0.6.0 - 0.6.4"`.

`test/Project.toml` still needs to exclude MatrixAlgebraKit 0.6.5
because of its JLArrays compat break. Switching from `"0.6.0 - 0.6.4"`
to `"0.6.0 - 0.6.4, 0.6.6"` lets the resolver auto-pick up 0.6.6 as soon
as it's registered, with no further compat bump required here. The
trailing `"0.6.6"` uses bare caret semver (`[0.6.6, 0.7.0)`) so it stays
in the 0.6 bucket — `">=0.6.6"` would also admit 0.7+.

Closes #259.

### Changes

- root: `MatrixAlgebraKit = "0.6.0 - 0.6.4"` → `"0.6"`
- test: `MatrixAlgebraKit = "0.6.0 - 0.6.4"` → `"0.6.0 - 0.6.4, 0.6.6"`
- Patch version bump.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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