Skip to content

Fix Downgrade CI: raise compat lower bounds to a resolvable, testable minimum set#64

Merged
ChrisRackauckas merged 3 commits into
SciML:mainfrom
ChrisRackauckas-Claude:fix/downgrade-ci-min-bounds
Jun 15, 2026
Merged

Fix Downgrade CI: raise compat lower bounds to a resolvable, testable minimum set#64
ChrisRackauckas merged 3 commits into
SciML:mainfrom
ChrisRackauckas-Claude:fix/downgrade-ci-min-bounds

Conversation

@ChrisRackauckas-Claude

Copy link
Copy Markdown
Contributor

This PR should be ignored until reviewed by @ChrisRackauckas.

Problem

The Downgrade workflow fails on main for all three groups (Core, QA, Applications). It was added on 2026-06-02 by the centralized-workflows migration and has never had a green run: the first completed run on main (7425dea, 2026-06-02T16:58Z) failed, as has every run since (8bc824b 2026-06-07, 476fdbf 2026-06-09). The boundary is therefore the introduction of the workflow itself, not registry drift or a repo commit: the minimum versions allowed by [compat] were never mutually resolvable with the test set, and the workflow is the first thing that ever checked them.

First failing Core job on main (2026-06-02):

ERROR: LoadError: Unsatisfiable requirements detected for package CUDA [052768ef]:
 ├─restricted to versions 4-5 by project, leaving only versions: 4.0.0-5.11.2
 └─restricted by compatibility requirements with GPUArrays [0c68f7d7] to versions:
   [3.3.5-3.13.1, 6.0.0-6.1.0] or uninstalled — no versions left
   └─GPUArrays restricted to versions 8.4.2 by an explicit requirement

Root cause

The downgrade workflow resolves the package manifest to the minimum versions allowed by [compat] (Resolver.jl --min=@deps) and then runs Pkg.test(; allow_reresolve=false), so the test sandbox cannot move those pins. The old lower bounds (SciMLBase = "1", NonlinearSolve = "1", LinearSolve = "2", Zygote = "0.6", ...) fail in several independent ways:

  1. The source code requires the SciMLOperators ≥ 1 interface. All FunctionOperator callbacks in the package use the 5-argument matvec(w, v, u, p, t) convention introduced in SciMLOperators 1.x; SciMLOperators 0.3/0.4 call the in-place op as op(v, u, p, t). I verified this empirically: at intermediate minimums (SciMLBase 2.54, LinearSolve 2.36.1 → SciMLOperators 0.3.12) the Core CPU suite throws 8 MethodErrors in every FunctionOperator-based solve (IPM and adjoint paths). Reaching SciMLOperators 1.x requires SciMLBase ≥ 2.100 and LinearSolve ≥ 3.13.
  2. The minimal manifest pins force CUDA 6 in the test sandbox. SparseMatrixColorings resolves to 0.4.27 (pulled in via NonlinearSolve), which requires CUDA 6; CUDA 6 in turn needs NNlib ≥ 0.9.34 and DiffEqBase ≥ 6.215, and DiffEqBase ≥ 6.215 needs SciMLBase ≥ 2.143. test/Project.toml gets CUDA = "4, 5, 6".
  3. Old minimums break test-time precompilation. E.g. SciMLSensitivity 7.75 references SciMLBase.LinearAliasSpecifier while its compat still allows SciMLBase 2.54 (upstream under-constraint) — precompile failure at minimum versions; SciMLSensitivity ≥ 7.100 (needed to work with FastBroadcast 1.3) requires SciMLBase ≥ 2.147.
  4. The test environment needs OrdinaryDiffEq ≥ 6.106 (forced by the DataStructures 0.19.5 / PreallocationTools 1.2 pins), which sets floors for LinearSolve (3.61, via OrdinaryDiffEqDifferentiation ≥ 2.5 with FastBroadcast 1.3), NonlinearSolve (4.12), SimpleNonlinearSolve (2.7), Polyester (0.7.18), FillArrays (1.13), PrecompileTools (1.2.1 — note 1.3.x is Julia 1.12+ only), and TruncatedStacktraces (1.4).
  5. NNlib ≥ 0.9.32 requires ForwardDiff 1, and SciMLBase ≥ 2.102 requires Zygote ≥ 0.7 (≥ 0.7.5 once ForwardDiff 1 is in play), so the 0.10.x / 0.6.x lower bounds were unreachable.
  6. ParametricMCPs is unresolvable in this stack. Every resolvable release caps ForwardDiff at 0.10 (directly or via SymbolicTracingUtils' SciMLOperators 0.3 cap). This PR cherry-picks the commit from Breaking dependency updates: CUDA 6, DiffEqBase 7, OrdinaryDiffEq 7, Optimization 5 (supersedes #59) #63 that removes the ParametricMCPs comparison benchmark from the test suite (910692a).

Changes

Project.toml [compat] lower-bound raises:

package old new
CommonSolve 0.2 0.2.6
FillArrays 1 1.13
ForwardDiff 0.10, 1 1
GPUArraysCore 0.1, 0.2 0.2
LinearSolve 2, 3 3.61
NNlib 0.8, 0.9 0.9.34
NonlinearSolve 1, 2, 3, 4 4.12
PATHSolver 1 1.4
Polyester 0.7 0.7.18
PrecompileTools 1 1.2.1
SciMLBase 1, 2, 3.1 2.147, 3.1
SimpleNonlinearSolve 0.1, 1, 2 2.7
TruncatedStacktraces 1 1.4
Zygote 0.6, 0.7 0.7.5

test/Project.toml: CUDA = "4, 5""4, 5, 6", and the ParametricMCPs test dependency removal cherry-picked from #63.

These bounds only drop version combinations that could never have passed the test suite (either unresolvable together with the test dependencies, or runtime-broken against the SciMLOperators 0.x interface), so no working configuration is lost.

Verification (local, Julia 1.10.11)

  • Reproduced the CI failure on unmodified main with the workflow's exact procedure (Resolver.jl --min=@deps with the workflow's skip list, then Pkg.test(; allow_reresolve=false)): same minimal pins as CI and the same unsatisfiable-requirements error.
  • With this PR, the downgrade resolution succeeds and pins (selection): SciMLBase 2.147.0, NonlinearSolve 4.12.0, SimpleNonlinearSolve 2.9.0, LinearSolve 3.61.0, SciMLOperators 1.22.0, Zygote 0.7.5, ForwardDiff 1.0.1, NNlib 0.9.34, FillArrays 1.13.0, Polyester 0.7.18, PATHSolver 1.4.0, CommonSolve 0.2.6, TruncatedStacktraces 1.4.0, PrecompileTools 1.2.1, GPUArraysCore 0.2.0.
  • Pkg.test(; allow_reresolve=false) against that pinned manifest, run to completion for all three Downgrade CI groups (BACKEND_GROUP=CPU):
    • Core: 212 pass, 0 fail, 0 error, 6 broken — passed
    • QA: 5 pass, 1 broken — passed
    • Applications: 41 pass, 1 broken — passed

Relationship to #63: that PR updates the upper bounds (CUDA 6, DiffEqBase 7, OrdinaryDiffEq 7, Optimization 5) for the latest stack; this PR fixes the lower bounds for Downgrade CI on main as it currently stands. They share only the ParametricMCPs-removal commit, so whichever lands first, the other rebases cleanly.

🤖 Generated with Claude Code

ChrisRackauckas and others added 2 commits June 10, 2026 02:18
ParametricMCPs (including its latest release, 0.1.17) caps ForwardDiff at
0.10 through a weak dependency, which makes it impossible to resolve a test
environment containing NonlinearSolve >= 4.17 (requires ForwardDiff 1),
NNlib >= 0.9.32, or CUDA >= 6. This is what made the GPU CI jobs on the
dependabot update PR fail at version resolution, and it silently held the
CPU test jobs back on DiffEqBase 6 / OrdinaryDiffEq 6 / CUDA 5 /
ForwardDiff 0.10.

Dropping the ParametricMCPs comparison benchmark lets the test environment
resolve the full updated stack (CUDA 6.1, DiffEqBase 7.5, OrdinaryDiffEq
7.0, Optimization 5.6, ForwardDiff 1.4, NonlinearSolve 4.19,
SciMLSensitivity 7.112, SciMLBase 3.18). The ComplementaritySolve.jl side
of the benchmark testset is kept since it exercises forward solves and
Zygote adjoints for both in-place and out-of-place problems.

Core, Applications, and QA test groups all pass locally against the
updated stack with no source changes required.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…able and testable

The Downgrade workflow (added 2026-06-02 with the centralized workflows
migration) has never passed: it resolves the manifest to the minimum
versions allowed by [compat] and runs Pkg.test(allow_reresolve=false),
and the old lower bounds (SciMLBase 1, NonlinearSolve 1, LinearSolve 2,
Zygote 0.6, ...) were never mutually resolvable with the test
dependencies, nor runtime-correct:

- The source uses the SciMLOperators >= 1 FunctionOperator interface
  (5-arg matvec(w, v, u, p, t)). Any resolution with SciMLOperators
  0.3/0.4 (i.e. LinearSolve 2.x or SciMLBase < 2.100) fails at runtime
  with MethodErrors in every FunctionOperator-based solve.
- The minimal manifest pins SparseMatrixColorings 0.4.27, which forces
  CUDA 6; CUDA 6 needs NNlib >= 0.9.34 and DiffEqBase >= 6.215, which
  needs SciMLBase >= 2.143.
- NNlib >= 0.9.32 requires ForwardDiff 1, and SciMLBase >= 2.102
  requires Zygote >= 0.7 (>= 0.7.5 with ForwardDiff 1).
- The test environment needs OrdinaryDiffEq >= 6.106 (DataStructures
  0.19.5 / PreallocationTools 1.2 pins), which sets the floors for
  LinearSolve (3.61 via OrdinaryDiffEqDifferentiation 2.5+ with
  FastBroadcast 1.3), NonlinearSolve (4.12), SimpleNonlinearSolve (2.7),
  Polyester (0.7.18), FillArrays (1.13), PrecompileTools (1.2.1, since
  1.3 is Julia 1.12+), and TruncatedStacktraces (1.4).
- SciMLSensitivity needs >= 7.100 to work with FastBroadcast 1.3, which
  requires SciMLBase >= 2.147.

All raised bounds only drop version combinations that could never have
passed the test suite. Verified locally on Julia 1.10.11 with the
workflow's downgrade resolution followed by
Pkg.test(allow_reresolve=false): Core (212 pass), QA (5 pass), and
Applications (41 pass) all green at the pinned minimum versions
(SciMLBase 2.147.0, NonlinearSolve 4.12.0, LinearSolve 3.61.0,
SimpleNonlinearSolve 2.9.0, SciMLOperators 1.22.0, Zygote 0.7.5,
ForwardDiff 1.0.1, NNlib 0.9.34, FillArrays 1.13.0, Polyester 0.7.18,
PATHSolver 1.4.0, CommonSolve 0.2.6, TruncatedStacktraces 1.4.0,
PrecompileTools 1.2.1).

test/Project.toml additionally allows CUDA 6, required by the pinned
SparseMatrixColorings.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ChrisRackauckas ChrisRackauckas marked this pull request as ready for review June 15, 2026 08:55
@ChrisRackauckas ChrisRackauckas merged commit 41ce876 into SciML:main Jun 15, 2026
10 of 11 checks passed
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