Skip to content

Release DelayDiffEq 6.1.1 and OrdinaryDiffEqDefault 2.4.2 with correct OrdinaryDiffEqCore floors - #4078

Merged
ChrisRackauckas merged 1 commit into
SciML:masterfrom
ChrisRackauckas-Claude:delaydiffeq-odecore-compat-floor
Jul 30, 2026
Merged

Release DelayDiffEq 6.1.1 and OrdinaryDiffEqDefault 2.4.2 with correct OrdinaryDiffEqCore floors#4078
ChrisRackauckas merged 1 commit into
SciML:masterfrom
ChrisRackauckas-Claude:delaydiffeq-odecore-compat-floor

Conversation

@ChrisRackauckas-Claude

Copy link
Copy Markdown
Member

Please ignore until reviewed by @ChrisRackauckas. Opened as a draft.

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 DEOptions from 21 type params / 41 fields to 23 / 43 (stage_limiter!, step_limiter!). It updated lib/DelayDiffEq/src/solve.jl in the same commit, so the monorepo stayed self-consistent — monorepo CI builds with path = deps and never sees the mismatch.

What it missed: bumping DelayDiffEq's version and its OrdinaryDiffEqCore floor. DelayDiffEq 6.1.0 was registered from 56ffb5267 (2026-07-23 15:22), three hours before #3835, and declares OrdinaryDiffEqCore = "4". So a plain Pkg.add("DelayDiffEq") resolves 6.1.0 + 4.11.0 and every DDE solve throws:

ERROR: MethodError: no method matching (OrdinaryDiffEqCore.DEOptions{...})(...)
  @ DelayDiffEq ~/.julia/packages/DelayDiffEq/wWvEW/src/solve.jl:341

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
OrdinaryDiffEqCore 4.0.0 – 4.8.0 21 params / 41 fields
OrdinaryDiffEqCore 4.8.1 – 4.11.0 23 params / 43 fields
DelayDiffEq 6.0.0 – 6.1.0 (all registered 6.x) constructs with 21 params / 41 args
DelayDiffEq on master 23 params / 43 args ✓

→ 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 references OrdinaryDiffEqCore.AutoDePSpecialize, added in #3692 and first present in 4.8.1. Against 4.8.0 it fails to precompile:

ERROR: LoadError: UndefVarError: `AutoDePSpecialize` not defined in `OrdinaryDiffEqCore`

This is what made a DelayDiffEq-only retrocap insufficient — capping DelayDiffEq at ≤4.8.0 leaves OrdinaryDiffEqDefault 2.4.1 in the resolution, which then needs ≥4.8.1. OrdinaryDiffEqTsit5 (≥2.1.1) and OrdinaryDiffEqRosenbrock (≥2.6.1) already declare 4.10.0; OrdinaryDiffEqDefault is the one that was missed.

→ version 2.4.2, OrdinaryDiffEqCore = "4.8.1".

Verification

Ran locally, not inferred:

  • Reproduced the failure: fresh env, Pkg.add("DelayDiffEq") → 6.1.0 + OrdinaryDiffEqCore 4.11.0 → the MethodError above at solve.jl:341, matching a downstream StateSelection.jl report verbatim.
  • Confirmed AutoDePSpecialize is absent from OrdinaryDiffEqCore 4.8.0 and present in 4.8.1 by scanning the sources of every installed 4.x.
  • This branch: lib/DelayDiffEq at 6.1.1 with the 4.8.1 floor, developed against released OrdinaryDiffEqCore 4.11.0, solves a constant-lag DDEProblem with MethodOfSteps(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 → floor 4.8.1); handled separately.

Worth a separate discussion: DEOptions is 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

…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
@ChrisRackauckas-Claude

Copy link
Copy Markdown
Member Author

CI status: every failure here is pre-existing on master

Checked each red workflow against the corresponding master run rather than assuming. This PR introduces no new failures.

Check Result Evidence it is not from this PR
CI (44 jobs) failure Failing job set is identical to master run 30535290549 — 44 vs 44, zero difference either direction
Sublibrary CI (18 jobs) failure All 18 die at instantiate on a SciMLBase constraint (see below), not an OrdinaryDiffEqCore one
Downgrade Sublibraries failure Identical 56-job failing set to master 30535290426; lib/DelayDiffEq and lib/OrdinaryDiffEqDefault are already failing there
Downgrade failure Identical failure signature to master, same stage
Documentation failure Same SciMLBase deadlock; failing on master for 4 consecutive runs
IntegrationTest failure Failing on master for 4 consecutive runs
format-check failure Runic flags lib/OrdinaryDiffEqCore/src/disco.jl, lib/OrdinaryDiffEqCore/src/integrators/controllers.jl, test/Integrators_I/disco_tests.jl — untouched here; this PR changes only two Project.toml files, which Runic does not check
Runic Suggestions, Spell Check, Benchmark this PR success

Root cause of the master-wide breakage

#4059 raised the monorepo to SciMLBase 3.40, but the newest registered NonlinearSolveBase (2.38.0) caps SciMLBase at 3.37.0 - 3.39:

SciMLBase log:
 ├─restricted to versions 3.39.0 - 3   by OrdinaryDiffEq 7.2.0
 ├─restricted to versions 3.40.0 - 3   by OrdinaryDiffEqNonlinearSolve 2.6.0
 └─restricted by compatibility requirements with NonlinearSolveBase
       to versions: 3.19.0 - 3.39.1 — no versions left

SciMLBase would have to be both >= 3.40.0 and <= 3.39.1, so nothing in the repo can instantiate. This clears when a NonlinearSolveBase release allowing SciMLBase 3.40 is registered — General already carries a compat row for 2.38.1 - 2 at SciMLBase = "3.37.0 - 3", but 2.38.1 is not registered yet.

Why that does not affect confidence in this change

The compat fix was verified against released packages, independently of this repo's CI: lib/DelayDiffEq from this branch (6.1.1, floor OrdinaryDiffEqCore = "4.8.1"), developed against registered OrdinaryDiffEqCore 4.11.0, solves a constant-lag DDEProblem with MethodOfSteps(Tsit5())retcode=Success. The same setup on DelayDiffEq 6.1.0 reproduces the reported MethodError at solve.jl:341.

Since registration does not gate on CI, these two releases can go out without waiting for the NonlinearSolveBase release, which is what unblocks the downstream DDE failures.

@ChrisRackauckas
ChrisRackauckas marked this pull request as ready for review July 30, 2026 11:25
@ChrisRackauckas
ChrisRackauckas merged commit a99731a into SciML:master Jul 30, 2026
11 of 144 checks passed
ChrisRackauckas added a commit to ChrisRackauckas-Claude/OrdinaryDiffEq.jl that referenced this pull request Jul 31, 2026
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
ChrisRackauckas added a commit that referenced this pull request Jul 31, 2026
…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>
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