Release DelayDiffEq 6.1.1 and OrdinaryDiffEqDefault 2.4.2 with correct OrdinaryDiffEqCore floors - #4078
Conversation
…t OrdinaryDiffEqCore floors SciML#3835 changed DEOptions from 21 type params / 41 fields to 23 / 43 by adding stage_limiter!/step_limiter!. It updated lib/DelayDiffEq's construction site in the same commit, so the monorepo stayed consistent, but DelayDiffEq's version and its OrdinaryDiffEqCore floor were not touched. DelayDiffEq 6.1.0 was registered three hours earlier from the pre-SciML#3835 tree with compat "4", so Pkg resolves it against OrdinaryDiffEqCore >= 4.8.1 and every DDE solve throws a MethodError on the DEOptions constructor. Separately, OrdinaryDiffEqDefault 2.4.1 declares OrdinaryDiffEqCore = "4.8" but references OrdinaryDiffEqCore.AutoDePSpecialize, which first exists in 4.8.1. With 4.8.0 it fails to precompile with an UndefVarError. Both are metadata-only; the source in this repo is already correct. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KA1YU64UArbEbZrzF5Mvdz
CI status: every failure here is pre-existing on masterChecked each red workflow against the corresponding master run rather than assuming. This PR introduces no new failures.
Root cause of the master-wide breakage#4059 raised the monorepo to
Why that does not affect confidence in this changeThe compat fix was verified against released packages, independently of this repo's CI: Since registration does not gate on CI, these two releases can go out without waiting for the |
Six floors on master permit dependency versions that lack symbols the code references. AutoMerge has been rejecting the OrdinaryDiffEqBDF 2.4.1 and OrdinaryDiffEqSDIRK 2.8.2 registrations since 2026-07-29 for two of them. DiffEqBase floors (Core, Differentiation, NonlinearSolve) All three require SciMLBase = "3.40", but the first DiffEqBase permitting SciMLBase 3.40 is 7.10.0. With a DiffEqBase floor of "7"/"7.8" the resolver has no solution at all — `Pkg.instantiate()` on any of the three fails with an unsatisfiable DiffEqBase. Raised to "7.10". OrdinaryDiffEqBDF and OrdinaryDiffEqFIRK -> OrdinaryDiffEqCore "4.12" Both read integrator.is_disco_step and integrator.disco_checkpoint. Those ODEIntegrator fields arrived with the DISCO work merged 2026-07-29 (SciML#3720) and are not in any released Core; the first to carry them is 4.12.0. Against Core 4.11.0 BDF fails to load with FieldError: type OrdinaryDiffEqCore.ODEIntegrator has no field `is_disco_step` FIRK's master tree already diverges from the registered 2.5.0 (which predates the field use), so it is bumped to 2.5.1 to make the corrected floor releasable. OrdinaryDiffEqSDIRK -> OrdinaryDiffEqNonlinearSolve "2.6" Imports can_smooth_est, added in SciML#3823. The version carrying it was never registered (ONLS goes 2.5.0 -> master 2.6.0), so against any released ONLS SDIRK fails to load with UndefVarError: `can_smooth_est` not defined in `OrdinaryDiffEqSDIRK` Audit method, since this class keeps recurring (SciML#2600, SciML#4078, SciML#4079) Diffed the ODEIntegrator struct between the registered Core 4.11.0 tree and master for added fields, then grepped every sublibrary for accesses to them; and cross-referenced every qualified access and explicit import name against the registered OrdinaryDiffEqCore 4.11.0 and OrdinaryDiffEqNonlinearSolve 2.5.0 trees. No sublibrary references a Core *name* absent at 4.11.0 — the only Core gaps are the two struct fields — and can_smooth_est is the only NonlinearSolve gap. Verified locally: SDIRK loads against the in-tree ONLS, and BDF loads and solves (FBDF on a scalar decay problem returns 0.36790983175798864). Metadata-only apart from the FIRK version bump. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ZqxphdTA1MydR1WXye9Jc
…es (#4084) * Correct dependency floors blocking the pending base and solver releases Six floors on master permit dependency versions that lack symbols the code references. AutoMerge has been rejecting the OrdinaryDiffEqBDF 2.4.1 and OrdinaryDiffEqSDIRK 2.8.2 registrations since 2026-07-29 for two of them. DiffEqBase floors (Core, Differentiation, NonlinearSolve) All three require SciMLBase = "3.40", but the first DiffEqBase permitting SciMLBase 3.40 is 7.10.0. With a DiffEqBase floor of "7"/"7.8" the resolver has no solution at all — `Pkg.instantiate()` on any of the three fails with an unsatisfiable DiffEqBase. Raised to "7.10". OrdinaryDiffEqBDF and OrdinaryDiffEqFIRK -> OrdinaryDiffEqCore "4.12" Both read integrator.is_disco_step and integrator.disco_checkpoint. Those ODEIntegrator fields arrived with the DISCO work merged 2026-07-29 (#3720) and are not in any released Core; the first to carry them is 4.12.0. Against Core 4.11.0 BDF fails to load with FieldError: type OrdinaryDiffEqCore.ODEIntegrator has no field `is_disco_step` FIRK's master tree already diverges from the registered 2.5.0 (which predates the field use), so it is bumped to 2.5.1 to make the corrected floor releasable. OrdinaryDiffEqSDIRK -> OrdinaryDiffEqNonlinearSolve "2.6" Imports can_smooth_est, added in #3823. The version carrying it was never registered (ONLS goes 2.5.0 -> master 2.6.0), so against any released ONLS SDIRK fails to load with UndefVarError: `can_smooth_est` not defined in `OrdinaryDiffEqSDIRK` Audit method, since this class keeps recurring (#2600, #4078, #4079) Diffed the ODEIntegrator struct between the registered Core 4.11.0 tree and master for added fields, then grepped every sublibrary for accesses to them; and cross-referenced every qualified access and explicit import name against the registered OrdinaryDiffEqCore 4.11.0 and OrdinaryDiffEqNonlinearSolve 2.5.0 trees. No sublibrary references a Core *name* absent at 4.11.0 — the only Core gaps are the two struct fields — and can_smooth_est is the only NonlinearSolve gap. Verified locally: SDIRK loads against the in-tree ONLS, and BDF loads and solves (FBDF on a scalar decay problem returns 0.36790983175798864). Metadata-only apart from the FIRK version bump. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ZqxphdTA1MydR1WXye9Jc * Also floor Differentiation and NonlinearSolve on Core 4.12 / Differentiation 3.6 Same rule as the DiffEqBase floors in the previous commit, applied to the sibling dependencies rather than DiffEqBase: a package requiring SciMLBase = "3.40" cannot resolve against any sibling version whose own compat caps SciMLBase below 3.40. OrdinaryDiffEqDifferentiation -> OrdinaryDiffEqCore "4.12" OrdinaryDiffEqNonlinearSolve -> OrdinaryDiffEqCore "4.12" OrdinaryDiffEqNonlinearSolve -> OrdinaryDiffEqDifferentiation "3.6" The released Core tops out at 4.11.0, which declares SciMLBase = "3.39", and the released Differentiation at 3.5.0. With the old "4" / "4.6" / "3" floors both packages are unresolvable: Unsatisfiable requirements detected for package OrdinaryDiffEqCore: restricted to versions 4 by OrdinaryDiffEqDifferentiation, leaving 4.0.0 - 4.11.0 restricted by compatibility requirements with SciMLBase to versions: uninstalled Exactly four packages on master require SciMLBase 3.40 — DiffEqBase, OrdinaryDiffEqCore, OrdinaryDiffEqDifferentiation, OrdinaryDiffEqNonlinearSolve — so only their sibling floors need this treatment. Packages that still allow SciMLBase 3.39 resolve fine against the older siblings and are left alone. This fixes the release order: DiffEqBase 7.10.0 (registered), then OrdinaryDiffEqCore 4.12.0, then OrdinaryDiffEqDifferentiation 3.6.0, then OrdinaryDiffEqNonlinearSolve 2.6.0, then the blocked BDF and SDIRK. Verified locally: Core 4.12.0 with [sources] stripped resolves against registry-only dependencies (picking DiffEqBase 7.10.0) and loads; ONLS and Differentiation instantiate and load in-tree. Their registry-only check has to wait until Core 4.12.0 is actually registered. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: ChrisRackauckas-Claude <accounts@chrisrackauckas.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Metadata-only. Fixes two independent registry breakages; the source in this repo is already correct.
1. DelayDiffEq 6.1.0 is broken against every OrdinaryDiffEqCore ≥ 4.8.1
#3835 reworked limiters as solve-level options, taking
DEOptionsfrom 21 type params / 41 fields to 23 / 43 (stage_limiter!,step_limiter!). It updatedlib/DelayDiffEq/src/solve.jlin the same commit, so the monorepo stayed self-consistent — monorepo CI builds withpath =deps and never sees the mismatch.What it missed: bumping DelayDiffEq's version and its
OrdinaryDiffEqCorefloor. DelayDiffEq 6.1.0 was registered from56ffb5267(2026-07-23 15:22), three hours before #3835, and declaresOrdinaryDiffEqCore = "4". So a plainPkg.add("DelayDiffEq")resolves 6.1.0 + 4.11.0 and every DDE solve throws:The "closest candidate" Julia prints is the older 46-arg shim kept for DelayDiffEq ≤5.x. No shim exists for the intermediate 41-arg layout that 6.0.0–6.1.0 uses.
Layout boundary, checked against registry tree hashes:
DEOptions→ version 6.1.1,
OrdinaryDiffEqCore = "4.8.1".2. OrdinaryDiffEqDefault 2.4.1 has an off-by-one floor
It declares
OrdinaryDiffEqCore = "4.8"but referencesOrdinaryDiffEqCore.AutoDePSpecialize, added in #3692 and first present in 4.8.1. Against 4.8.0 it fails to precompile:This is what made a DelayDiffEq-only retrocap insufficient — capping DelayDiffEq at ≤4.8.0 leaves
OrdinaryDiffEqDefault2.4.1 in the resolution, which then needs ≥4.8.1.OrdinaryDiffEqTsit5(≥2.1.1) andOrdinaryDiffEqRosenbrock(≥2.6.1) already declare4.10.0;OrdinaryDiffEqDefaultis the one that was missed.→ version 2.4.2,
OrdinaryDiffEqCore = "4.8.1".Verification
Ran locally, not inferred:
Pkg.add("DelayDiffEq")→ 6.1.0 + OrdinaryDiffEqCore 4.11.0 → theMethodErrorabove atsolve.jl:341, matching a downstream StateSelection.jl report verbatim.AutoDePSpecializeis absent from OrdinaryDiffEqCore 4.8.0 and present in 4.8.1 by scanning the sources of every installed 4.x.lib/DelayDiffEqat 6.1.1 with the 4.8.1 floor, developed against released OrdinaryDiffEqCore 4.11.0, solves a constant-lagDDEProblemwithMethodOfSteps(Tsit5())→SOLVED, retcode=Success.I did not run the in-repo DelayDiffEq test suite for this change: the monorepo resolves sublibraries via
[sources]path deps, so it is structurally insensitive to compat metadata and would exercise nothing here. The end-to-end check against registered packages above is the test that actually covers it.Follow-up
Retroactive compat bounds are still wanted in General for the already-registered broken versions (DelayDiffEq 6.0.0–6.1.0 →
"4.0.0 - 4.8.0", OrdinaryDiffEqDefault 2.4.1 → floor4.8.1); handled separately.Worth a separate discussion:
DEOptionsis documented public API and #3835 changed its field layout under a minor bump. The existing 46-arg shim shows source compatibility was the intent — the 41-arg path was simply overlooked. Adding a 41-arg/21-param shim to OrdinaryDiffEqCore would heal 6.0.0–6.1.0 without registry surgery.🤖 Generated with Claude Code
https://claude.ai/code/session_01KA1YU64UArbEbZrzF5Mvdz