Skip to content

Raise downgrade-compat floors to a mutually consistent set#335

Open
ChrisRackauckas-Claude wants to merge 1 commit into
SciML:masterfrom
ChrisRackauckas-Claude:fix-downgrade-compat-floors
Open

Raise downgrade-compat floors to a mutually consistent set#335
ChrisRackauckas-Claude wants to merge 1 commit into
SciML:masterfrom
ChrisRackauckas-Claude:fix-downgrade-compat-floors

Conversation

@ChrisRackauckas-Claude

@ChrisRackauckas-Claude ChrisRackauckas-Claude commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

Summary

Raises several downgrade-compat floors to a mutually consistent set (upper bounds unchanged, so regular CI is unaffected). This is valid compat hygiene, but see the important note below: it does not by itself turn Downgrade Tests - Core green — that red is an upstream Resolver.jl bug.

package old floor new floor
ChainRulesCore 1.18 1.25.1
DifferentiationInterface 0.7 0.7.16
FiniteDiff 2.12 2.27
StaticArrays 1.6.4 1.9.7
Zygote 0.6.69, 0.7 0.7.10

These bumps remove genuine floor-vs-floor inconsistencies (FiniteDiff↔DifferentiationInterface, ChainRulesCore↔Zygote, Zygote↔SciMLBase, DI↔Mooncake, DI↔StaticArrays). Raising a floor never loosens anything for regular CI.

The Downgrade Tests - Core red is an upstream Resolver.jl bug (not fixable here)

Reproduced CI's downgrade resolution exactly (Resolver.jl at HEAD + julia-downgrade-compat@v2's downgrade.jl, --julia=1.10). The blocker is Mooncake, and it is a resolver defect:

  • Mooncake >= 0.4.140 (all 0.5.x) declares julia = ["1.10.8 - 1.10", "1.11.6 - 1"]. The downgrade resolver minimizes julia to its floor 1.10.0 (because --min=@deps includes JULIA_UUID), so it reports Mooncake 0.5.6 unsatisfiable.
  • The floors are actually consistent: pinning every direct dep to =floor and resolving with stock Pkg on Julia 1.10.11 succeeds, and using Mooncake loads at 0.5.6. So a valid all-floor solution exists.
  • Resolver.jl fails the trivial 2-package case: Mooncake = "0.5.6" + julia with --julia=1.10.8 (the exact supported patch) still returns Mooncake => nothing, even though 1.10.8 ∈ spec and every Mooncake dep has a compatible version.
  • It is specific to the bounded sub-range: --julia=1.11 (the "1.11.6 - 1" band) resolves Mooncake fine; --julia=1.10.8-1.10 (the "1.10.8 - 1.10" band) does not. Resolver mishandles the bounded "1.10.8 - 1.10" sub-range of the multi-range julia compat vector.

Repo-side workarounds do not help (verified end-to-end): raising the julia floor to 1.10.8 (resolver ignores project julia compat for julia selection, still offers 1.10.0), and skip: Mooncake (the merged-extras path ignores the skip list). The only repo "fix" would be downgrading Mooncake into 0.4.x, which loses real functionality and is not acceptable.

Fix belongs upstream in SciML/Resolver.jl (bounded "X - Y" julia sub-range handling) or julia-actions/julia-downgrade-compat (honor skip in merged resolution).

See the analysis comment for the full reproduction and commands.

Verification

  • Reproduced the exact Unsatisfiable locally on Julia 1.10 via Resolver.jl + the downgrade action.
  • Confirmed all-floor consistency with stock Pkg on 1.10.11 (manifest written, Mooncake 0.5.6 loads).
  • Confirmed the bug is the bounded "1.10.8 - 1.10" julia sub-range (resolves on the 1.11 band, fails on the 1.10 band).

Please ignore until reviewed by @ChrisRackauckas

The Downgrade Tests - Core job failed at the julia-downgrade-compat
resolution step with "Unsatisfiable": when every dependency is pinned to
its compat floor and resolved on Julia 1.10, several floors had drifted
out of mutual consistency:

- FiniteDiff floor 2.12 was incompatible with DifferentiationInterface
  floor 0.7 (FiniteDiff < 2.27 caps DI at 0.6.x via its DI extension).
- ChainRulesCore floor 1.18 was below what Zygote 0.7 requires (>= 1.25.1).
- Zygote floor 0.6.69 was below what SciMLBase floor 2.104 requires (>= 0.7.10).
- DifferentiationInterface floor 0.7 only supports Mooncake 0.4.x, while the
  Mooncake floor is 0.5.6; DI gained Mooncake 0.5.x support in 0.7.16.
- DifferentiationInterface 0.7.16's StaticArrays extension requires
  StaticArrays >= 1.9.7, above the old 1.6.4 floor.

Raise the floors to the lowest mutually consistent set:
  ChainRulesCore 1.18 -> 1.25.1
  DifferentiationInterface 0.7 -> 0.7.16
  FiniteDiff 2.12 -> 2.27
  StaticArrays 1.6.4 -> 1.9.7
  Zygote "0.6.69, 0.7" -> 0.7.10

Upper bounds are unchanged, so the regular CI (which uses the latest of
each) is unaffected. Verified locally on Julia 1.10: the merged
test-target project with every dep pinned to its floor now resolves
(previously Unsatisfiable), and each bumped dep resolves to exactly its
new floor, confirming these are minimal.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ChrisRackauckas-Claude

Copy link
Copy Markdown
Contributor Author

Update: the floor bumps in this PR do NOT fix the Downgrade Tests - Core red — root cause is an upstream Resolver.jl bug

After reproducing the CI downgrade resolution exactly locally (cloning SciML/Resolver.jl at its current HEAD and running julia-downgrade-compat@v2's downgrade.jl against this repo on --julia=1.10), I found the floor bumps here are correct hygiene but cannot make the job green. The actual blocker is Mooncake, and it is a Resolver.jl defect, not a compat-floor inconsistency in this repo.

What actually happens

The downgrade job builds the merged test project and runs resolve.jl ... --min=@deps --julia=1.10. @deps includes JULIA_UUID, so julia is minimized to its floor 1.10.0. The single unsatisfiable requirement is Mooncake:

UNSAT_REQS: Mooncake
RESOLVED julia      => 1.10.0
RESOLVED Mooncake   => nothing

Mooncake's compat floor here is 0.5.6. Mooncake >= 0.4.140 (which includes all of 0.5.x) declares:

julia = ["1.10.8 - 1.10", "1.11.6 - 1"]

i.e. on the 1.10 line it requires patch >= 1.10.8. The downgrade resolver offers julia 1.10.0, so it reports Mooncake unsatisfiable.

Why this is a Resolver.jl bug, not a floor problem

  1. The floors are genuinely mutually consistent. Pinning every direct dep to its compat floor (=floor) and resolving with stock Pkg on Julia 1.10.11 succeeds — a full manifest is written (julia_version = 1.10.11), and using Mooncake loads cleanly at 0.5.6. So the registry data admits a valid all-floor solution.

  2. Resolver.jl fails even in the trivial 2-package case. With just Mooncake = "0.5.6" + julia, resolve.jl --min=@deps --julia=1.10.8 (so julia is pinned to exactly 1.10.8, the one patch Mooncake supports on the 1.10 line) still returns Mooncake => nothing. The provider confirms 1.10.8 ∈ Mooncake-0.5.6 julia spec == true, and every one of Mooncake 0.5.6's direct deps has versions that satisfy both its compat and julia 1.10.8. There is no real diamond.

  3. It is specific to the bounded first sub-range of the multi-range julia compat vector. Resolving the same Mooncake = "0.5.6" with --julia=1.11 (hitting the "1.11.6 - 1" band) resolves fine, but --julia=1.10.8-1.10 (hitting the "1.10.8 - 1.10" band) returns Mooncake => nothing. Resolver mishandles the bounded "1.10.8 - 1.10" sub-range of ["1.10.8 - 1.10", "1.11.6 - 1"].

Consequence for fixes in this repo

  • Raising the julia compat floor to 1.10.8 does not help: resolve.jl ignores the project's julia compat for julia-version selection (it uses only --julia, which lts maps to 1.10), so it still offers 1.10.0. Verified: still Unsatisfiable.
  • skip: Mooncake on the reusable downgrade workflow does not help either: in the merged-extras path, julia-downgrade-compat's create_merged_project ignores the skip list, so Mooncake is still in the --min=@deps set. Verified end-to-end: still Unsatisfiable.
  • The only repo-side "fix" would be to drop Mooncake's floor into the 0.4.x range (a real downgrade that loses 1.10.8 support semantics and would break code/tests against the Mooncake 0.5 API) — not acceptable.

This needs an upstream fix in SciML/Resolver.jl (handle the bounded "X - Y" julia sub-range in a multi-range compat vector) or in julia-actions/julia-downgrade-compat (honor the skip list in the merged-extras resolution path). The compat-floor bumps in this PR remain valid improvements and are kept, but the Downgrade Tests - Core red will persist until the upstream resolver issue is addressed.

The QA (Julia 1) red on master was an unrelated self-hosted-runner infra error ("the self-hosted runner lost communication with the server") and already passes on this branch.

Please ignore until reviewed by @ChrisRackauckas

@ChrisRackauckas ChrisRackauckas marked this pull request as ready for review June 21, 2026 10:56
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.

2 participants