Skip to content

QA: run_qa v1.6 form + ExplicitImports#122

Open
ChrisRackauckas-Claude wants to merge 4 commits into
SciML:masterfrom
ChrisRackauckas-Claude:qa-run_qa-v1.6-explicit-imports
Open

QA: run_qa v1.6 form + ExplicitImports#122
ChrisRackauckas-Claude wants to merge 4 commits into
SciML:masterfrom
ChrisRackauckas-Claude:qa-run_qa-v1.6-explicit-imports

Conversation

@ChrisRackauckas-Claude

Copy link
Copy Markdown
Contributor

Please ignore until reviewed by @ChrisRackauckas.

Brings test/qa onto the SciMLTesting 1.6 run_qa form with ExplicitImports enabled (all 6 checks).

Changes

  • test/qa/qa.jl (new): single run_qa(SimpleDiffEq; explicit_imports = true, ei_kwargs = ...) body. Replaces the hand-rolled explicit_imports_tests.jl (which ran only no_implicit_imports + no_stale_explicit_imports) and adds the standard Aqua suite + the JET test_package typo check on top of the full ExplicitImports check set.
  • test/qa/explicit_imports_tests.jl removed (subsumed by run_qa).
  • test/qa/jet_tests.jl -> test/qa/jet_type_stability_tests.jl: the existing JET report_opt integrator type-stability tests are preserved unchanged. They are a distinct check the run_qa test_package mode does not cover, and all pass, so they are kept as their own file in the QA group (folder-discovery runs every .jl in test/qa).
  • root Project.toml: add LinearAlgebra = "1" compat (fixes the Aqua deps_compat check for the stdlib dep — newly run now that Aqua is in the suite); drop ExplicitImports from deps/compat/targets (now transitive via SciMLTesting); bump SciMLTesting compat to "1.6".
  • test/qa/Project.toml: add Aqua as a direct dep (Aqua.test_ambiguities spawns a child process that does using Aqua, so it must be a direct dep, not just transitive via SciMLTesting); drop ExplicitImports (transitive via SciMLTesting); bump SciMLTesting to "1.6".

ExplicitImports findings

The 2 originally run checks (no_implicit_imports, no_stale_explicit_imports) still pass with no ignores.

The 4 newly enabled owner/public checks flag names that SimpleDiffEq imports/accesses through DiffEqBase, which re-exports SciMLBase's solver-extension API and FastBroadcast's @.. macro. These are other packages' non-public names, so per the conversion policy they are ignored per-check via ei_kwargs ignore lists (no source change, no risky refactor), with the owning package documented in comments:

  • @.. — owned by / non-public in FastBroadcast (re-exported by DiffEqBase)
  • AbstractODEAlgorithm, AbstractODEIntegrator, AbstractSDEAlgorithm, ConstantInterpolation, DEIntegrator, ODE_DEFAULT_NORM, __init, __solve, build_solution, calculate_solution_errors!, has_analytic, is_diagonal_noise, isadaptive, allows_arbitrary_number_types, allowscomplex, isautodifferentiable — owned by / non-public in SciMLBase (re-exported by DiffEqBase)

No @test_broken, aqua_broken, jet_broken, or ei_broken markers are needed: Aqua passes all 8 sub-checks, JET report_package returns 0 reports, and the ExplicitImports findings are resolved by the documented ignore-lists.

Verification

Run locally against released SciMLTesting 1.6.0 (Pkg-resolved, no dev-from-branch) on Julia 1.11 and 1.10 (LTS):

QA/jet_type_stability_tests.jl |    8      8
QA/qa.jl                       |   18     18

0 fail / 0 error / 0 broken on both lanes.

🤖 Generated with Claude Code

Convert the hand-rolled test/qa to the SciMLTesting 1.6 run_qa form with
ExplicitImports enabled (all 6 checks).

- test/qa/qa.jl: single run_qa(SimpleDiffEq; explicit_imports = true, ...)
  body. This adds Aqua (8 sub-checks, all pass) + the JET test_package typo
  check (clean, 0 reports) on top of the ExplicitImports checks, replacing the
  separate hand-rolled explicit_imports_tests.jl (no_implicit_imports +
  no_stale_explicit_imports only).
- ExplicitImports: the 4 newly enabled owner/public checks flag names that
  SimpleDiffEq imports/accesses through DiffEqBase (which re-exports SciMLBase's
  solver-extension API and FastBroadcast's @..). These are other packages'
  non-public names, ignored per-check via ei_kwargs with the source pkg
  documented. The 2 originally run checks still pass.
- root Project.toml: add LinearAlgebra = "1" compat (fixes Aqua deps_compat for
  the stdlib dep), drop ExplicitImports (now transitive via SciMLTesting), bump
  SciMLTesting compat to "1.6".
- test/qa/Project.toml: add Aqua as a direct dep (Aqua.test_ambiguities spawns a
  child process that does `using Aqua`, so it must be a direct dep), drop
  ExplicitImports (transitive via SciMLTesting), bump SciMLTesting to "1.6".
- Preserve the existing JET report_opt integrator type-stability tests
  (renamed jet_tests.jl -> jet_type_stability_tests.jl); these are a distinct,
  passing check the run_qa test_package mode does not cover.

Verified locally against released SciMLTesting 1.6.0 on Julia 1.11 and 1.10
(LTS): QA/qa.jl 18/18, QA/jet_type_stability_tests.jl 8/8, 0 fail/error/broken.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ChrisRackauckas and others added 2 commits June 25, 2026 11:07
The run_qa JET typo check (newly enabled by this conversion) is clean on
Julia 1.10/1.11 (JET 0.9.x) but surfaces 36 reports on Julia 1.12 (JET 0.11.x).
The src/ is byte-identical to master, so the findings predate this PR; the
conversion only turned the JET check on. One is a genuine latent bug
(src/euler/euler.jl:199 reads `length(u)` before `u` is assigned in the
in-place interpolant); the rest are `may be undefined` reports on
correlated-branch control flow (`q11`, `cur_t`) that JET 0.9 proved safe but
JET 0.11 cannot.

Gate `jet_broken` on `VERSION >= v"1.12"` so the QA(julia 1 = 1.12) lane
records Broken (green) while these stand, and the still-clean 1.10/1.11 lts
lanes keep running the hard test_package check. A blanket jet_broken would
record an Unexpected-Pass error on 1.10/1.11. The marker auto-flips to an error
once the reports are resolved. Tracked in SciML#123.

Verified locally (CI-equivalent path-developed SimpleDiffEq, SciMLTesting 1.6.0):
QA/qa.jl 18/18 on 1.10 (LTS) and 1.11; 17 pass + 1 broken on 1.12.

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

The make-public releases are live (SciMLBase 3.27.0, DiffEqBase 7.6.0,
SciMLTesting 1.7.0). Finish the public-API ExplicitImports cleanup:

- Migrate qualified accesses / imports of SciMLBase-owned names that are now
  public in 3.27.0 off DiffEqBase onto SciMLBase: `build_solution`,
  `is_diagonal_noise`, `AbstractSDEAlgorithm`, `AbstractODEAlgorithm`, and the
  method-extended trait predicates (`isadaptive`, `isautodifferentiable`,
  `allowscomplex`, `allows_arbitrary_number_types`). Add SciMLBase to [deps] and
  set compat `SciMLBase = "3.27"`. SciMLBase re-exports these identically through
  DiffEqBase (same function objects), so dispatch and behavior are unchanged
  (verified with ODE/SDE solves on Julia 1.12).
- Bump DiffEqBase floor to "7" (6.x pins SciMLBase 2.x, which predates these
  public names) in both the package and the QA env; bump QA SciMLTesting to "1.7".
- Empty the public-API EI ignore lists (`all_qualified_accesses_are_public`,
  `all_explicit_imports_are_public`), then restore only the names that remain
  non-public in their accessed module: `@..` (FastBroadcast's, re-exported by
  DiffEqBase) and the SciMLBase solver-extension internals that are not among
  the names SciMLBase declared public (`AbstractODEIntegrator`,
  `ConstantInterpolation`, `DEIntegrator`, `__init`, `__solve`,
  `calculate_solution_errors!`, `has_analytic`). `ODE_DEFAULT_NORM` drops out of
  the lists (now public in DiffEqBase 7.6). The `*_via_owners` ignores are left
  untouched.

Verified Julia 1.12 (public checks run): 17 pass, 1 broken (the pre-existing JET
1.12 marker, SciML#123), 0 fail/error. Verified Julia 1.10 (public checks skip via the
SciMLTesting 1.7 >=1.11 gate): 16 pass, 0 fail/error/broken.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ChrisRackauckas-Claude ChrisRackauckas-Claude marked this pull request as ready for review June 29, 2026 09:51
Migrate the eight solver-extension names SimpleDiffEq accessed through
DiffEqBase (which only re-exports them) to their owner SciMLBase, now that
SciMLBase 3.30 declares them public: __init, __solve, has_analytic,
calculate_solution_errors!, AbstractODEIntegrator, DEIntegrator,
ConstantInterpolation. The re-export shares the owner binding so the change
is behavior-preserving (verified solve(SimpleRK4/SimpleEuler/SimpleFunctionMap)
produce identical results).

Import @.. from its owner FastBroadcast instead of DiffEqBase (added as a
direct dep) and use it unqualified so the explicit-import is not stale.

With every flagged name now reached through its public owner, all six
ExplicitImports checks pass with no ignore lists, so drop the entire
ei_kwargs block (and the stale AbstractODEAlgorithm/AbstractSDEAlgorithm/
build_solution/is_diagonal_noise ignore entries, which were already accessed
via SciMLBase). The jet_broken=VERSION>=1.12 marker is unrelated to EI and
kept (tracked in SciML#123).

Verified GROUP=QA on Julia 1.12 (SciMLBase 3.30.0, SciMLTesting 1.7.0):
17 pass / 1 broken (the SciML#123 JET marker) / 0 fail / 0 error.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.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