Skip to content

QA: run_qa v1.6 form + ExplicitImports#69

Merged
ChrisRackauckas merged 5 commits into
SciML:mainfrom
ChrisRackauckas-Claude:qa/run_qa-v1.6-explicit-imports
Jul 4, 2026
Merged

QA: run_qa v1.6 form + ExplicitImports#69
ChrisRackauckas merged 5 commits into
SciML:mainfrom
ChrisRackauckas-Claude:qa/run_qa-v1.6-explicit-imports

Conversation

@ChrisRackauckas-Claude

Copy link
Copy Markdown
Contributor

Please ignore until reviewed by @ChrisRackauckas.

Brings this repo's QA onto the SciMLTesting run_qa v1.6 form and enables ExplicitImports.

What changed

  • Collapses the hand-rolled QA group (test/aqua.jl + test/explicit_imports.jl) into a single run_qa(ComplementaritySolve; ...) call in test/qa.jl; test/runtests.jl QA group now includes qa.jl.
  • aqua_kwargs preserves the genuine non-broken Aqua disables: ambiguities = false (too many downstream ambiguities), persistent_tasks = false (PATHSolver precompile workload), project_extras = false, deps_compat = false.
  • aqua_broken = (:piracies,) preserves the prior piracies = (; broken = true) suppression. The two flagged methods are the intentional, documented ArrayInterfaceCore.can_setindex piracy for FillArrays.AbstractFill and Zygote.OneElement in src/ComplementaritySolve.jl. Tracked in QA: Aqua piracies known-broken (intentional ArrayInterfaceCore.can_setindex piracy) #68.
  • explicit_imports = true enables all six ExplicitImports checks (previously only no_implicit_imports + no_stale_explicit_imports ran).

Test-deps (test/Project.toml)

  • Add SciMLTesting with [compat] SciMLTesting = "1.6".
  • Drop ExplicitImports (now transitive via SciMLTesting) and Aqua (no Aqua sub-check that requires it as a direct dep is enabled — both ambiguities and piracies are off).

ExplicitImports findings

  • no_implicit_imports: pass (module already uses using X: name everywhere).
  • no_stale_explicit_imports: pass (no stale imports; nothing kept-for-downstream).
  • all_explicit_imports_via_owners: pass.
  • all_qualified_accesses_via_owners: pass.
  • all_qualified_accesses_are_public: ignored-list of third-party / Base non-public names (each documented by source pkg): Base.Fix1/Fix2 (public in 1.12+); SciMLBase.ReturnCode enum members Infeasible/MaxIters/MaxTime/Success/T/Terminated and SciMLBase.NullParameters; PATHSolver MCP_*/solve_mcp; Zygote.OneElement; ArrayInterfaceCore.can_setindex; ForwardDiff.jacobian.
  • all_explicit_imports_are_public: ignored-list TruncatedStacktraces.@truncate_stacktrace, FillArrays.AbstractFill, CommonSolve.init/solve/solve!.
  • No findings required ei_broken; no implicit-imports mass refactor was needed.

Verification

Ran the QA group locally against released SciMLTesting 1.6.0 (Julia 1.10) via Pkg.test with GROUP=QA BACKEND_GROUP=CPU:

[ Info: Running tests for QA group
Test Summary:         | Pass  Broken  Total   Time
Complementarity Solve |    9       1     10  24.3s
     Testing ComplementaritySolve tests passed

Per-check breakdown: Aqua (Unbound type parameters / Undefined exports / Stale dependencies) pass; aqua: piracies (broken) = 1 Broken; all six ExplicitImports checks pass. 0 Fail / 0 Error.

🤖 Generated with Claude Code

@ChrisRackauckas-Claude

Copy link
Copy Markdown
Contributor Author

Final EI ignore-sweep + compat verification (post make-public releases)

Re-verified the public-API ExplicitImports cleanup against the now-registered make-public releases: SciMLBase 3.27.0, SciMLTesting 1.7.0, CommonSolve 0.2.9, ExplicitImports 1.15.0, Aqua 0.8.16 (Pkg resolve, no dev of base libs).

Caller-migration (DiffEqBase.X -> SciMLBase.X): none needed. src/ already accesses every SciMLBase-owned name through SciMLBase (e.g. SciMLBase.NullParameters, using SciMLBase: ReturnCode, ...); there is no ext/ and no DiffEqBase qualified access anywhere in source.

Ignore-sweep: emptied both public-API ignore tuples, then ran the two checks directly with ignore=() on Julia 1.12 to enumerate what genuinely still flags. The flagged set is exactly the genuine non-public third-party survivors (no SciMLBase / CommonSolve / Base name appears -- those are now public and stay stripped), so each is restored as ALLOWED:

  • all_qualified_accesses_are_public: MCP_MajorIterationLimit, MCP_MinorIterationLimit, MCP_NoProgress, MCP_Solved, MCP_TimeLimit, solve_mcp (PATHSolver); OneElement (Zygote); can_setindex (ArrayInterfaceCore); jacobian (ForwardDiff).
  • all_explicit_imports_are_public: @truncate_stacktrace (TruncatedStacktraces); AbstractFill (FillArrays).
  • The four structural checks (no_implicit_imports, no_stale_explicit_imports, all_*_via_owners) are clean.

Compat: bumped test/Project.toml SciMLTesting floor "1.6" -> "1.7" so CI resolves the gated release (1.7.0 gates the two public-API checks to Julia >= 1.11; a 1.6.x resolve would run them on the 1.10 LTS and spuriously flag public names).

Verification (registered releases, no dev):

Julia 1.12 (public-API checks RUN):
Quality Assurance | 9 Pass  1 Broken  10 Total   (0 Fail / 0 Error)

Julia 1.10 LTS (public-API checks SKIPPED via SciMLTesting 1.7 gating):
Quality Assurance | 7 Pass  1 Broken   8 Total   (0 Fail / 0 Error)

The 1 Broken in both is the intentional, documented :piracies (ArrayInterfaceCore.can_setindex for FillArrays.AbstractFill / Zygote.OneElement), tracked in #68. The 1.10 lane drops exactly the two public-API subtests (10 -> 8), confirming the gating.

The qa.jl public-API ignore lists are therefore not fully empty -- the 11 surviving entries are all genuine non-public third-party names and remain ALLOWED. No ei_broken was added/needed.

Please ignore until reviewed by @ChrisRackauckas.

🤖 Generated with Claude Code

@ChrisRackauckas-Claude ChrisRackauckas-Claude marked this pull request as ready for review June 27, 2026 20:59
ChrisRackauckas and others added 4 commits July 3, 2026 04:12
Collapse the hand-rolled QA group (test/aqua.jl + test/explicit_imports.jl)
into a single SciMLTesting.run_qa call (v1.6 form) and enable all six
ExplicitImports checks.

- aqua_kwargs preserves the genuine non-broken Aqua disables (ambiguities,
  persistent_tasks, project_extras, deps_compat).
- aqua_broken = (:piracies,) preserves the prior `piracies = (; broken = true)`
  suppression (intentional ArrayInterfaceCore.can_setindex piracy for
  FillArrays.AbstractFill and Zygote.OneElement); tracked in SciML#68.
- explicit_imports = true turns on all six EI checks. The four structural
  checks (no_implicit_imports, no_stale_explicit_imports, *_via_owners) pass
  as-is. The two public-API checks get per-name ignore-lists for third-party
  and Base non-public names (documented by source package).
- test deps: add SciMLTesting (compat "1.6"); drop ExplicitImports (transitive
  via SciMLTesting) and Aqua (no Aqua sub-check needing it as a direct dep is
  enabled — ambiguities and piracies are both off).

QA group verified locally against released SciMLTesting 1.6.0 (Julia 1.10):
9 Pass, 1 Broken (piracies), 0 Fail/Error.

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

SciMLTesting 1.7.0 gates the two public-API ExplicitImports checks
(check_all_qualified_accesses_are_public, check_all_explicit_imports_are_public)
to Julia >= 1.11. With the make-public releases (SciMLBase 3.24.0,
CommonSolve 0.2.9, plus Base.Fix1/Fix2 public on >=1.12), the following
ignore entries are now redundant and are removed:

  all_qualified_accesses_are_public: Fix1, Fix2 (Base),
    Infeasible, MaxIters, MaxTime, Success, T, Terminated,
    NullParameters (SciMLBase)
  all_explicit_imports_are_public: init, solve, solve! (CommonSolve)

Surviving entries are genuine internals of non-Chris deps still not made
public: PATHSolver (MCP_* / solve_mcp), Zygote (OneElement),
ArrayInterfaceCore (can_setindex), ForwardDiff (jacobian),
TruncatedStacktraces (@truncate_stacktrace), FillArrays (AbstractFill).

Verified QA group green-or-broken (0 hard fail) on Julia 1.12
(public checks run, 9 pass / 1 broken=piracies) and Julia 1.10 lts
(public checks skipped, 7 pass / 1 broken) against registered releases.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SciMLTesting 1.7.0 gates the two public-API ExplicitImports checks
(check_all_qualified_accesses_are_public / check_all_explicit_imports_are_public)
to Julia >= 1.11. The previous floor "1.6" allowed the resolver to pick a
pre-gating 1.6.x, under which those checks would also run on the 1.10 LTS and
spuriously flag genuinely-public names (the public-API backport is not seen as
public on 1.10). Raising the floor to "1.7" guarantees CI resolves the gated
release, so the LTS lane correctly skips the public-API checks.

Verified the QA group against the registered releases (SciMLBase 3.27.0,
SciMLTesting 1.7.0, CommonSolve 0.2.9, ExplicitImports 1.15.0, Aqua 0.8.16):

  * Julia 1.12 (public-API checks RUN): 9 Pass / 1 Broken (:piracies) / 0 Fail.
    With empty public-API ignore lists the two checks flag exactly the genuine
    non-public third-party survivors already in the lists -- PATHSolver
    (MCP_*/solve_mcp), Zygote (OneElement), ArrayInterfaceCore (can_setindex),
    ForwardDiff (jacobian), TruncatedStacktraces (@truncate_stacktrace),
    FillArrays (AbstractFill); no SciMLBase/CommonSolve/Base name flags, so the
    prior strip of those now-public names stands. The four structural EI checks
    are clean.
  * Julia 1.10 LTS (public-API checks SKIPPED): 7 Pass / 1 Broken (:piracies) /
    0 Fail -- exactly the two public-API checks drop out.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Eliminate 3 of the EI public-API ignore entries by fixing the root cause
instead of ignoring:

- Migrate the `can_setindex` type piracy from the non-public
  `ArrayInterfaceCore.can_setindex` to `ArrayInterface.can_setindex`
  (declared `public` in ArrayInterface >= 7.26 on Julia 1.11+), dropping the
  `:can_setindex` ignore and the stale ArrayInterfaceCore dependency. The
  `FillArrays.AbstractFill`/`FillArrays.OneElement` `can_setindex` methods are
  now provided upstream by ArrayInterface's FillArrays extension, so the
  redundant `AbstractFill` piracy line is removed (it would otherwise overwrite
  the extension method and break precompilation).
- Replace the archived TruncatedStacktraces.jl dependency with a faithful local
  no-op `@truncate_stacktrace` macro. The upstream macro already expands to
  `nothing` on Julia >= 1.10 (its `DISABLE` constant is `true` for that range),
  which matches this package's `julia = "1.10"` compat floor, so behavior is
  identical. Drops the `@truncate_stacktrace` explicit-import ignore.

Remaining EI ignores are genuinely irreducible external API:
- PATHSolver `MCP_*` / `solve_mcp` (no exports, no `public`),
- `Zygote.OneElement` (Zygote-internal type used in the documented piracy),
- `ForwardDiff.jacobian` (documented but not `public`),
- `FillArrays.AbstractFill` (documented but neither exported nor `public`,
  still needed by `__unfillarray`).

Verified GROUP=QA on Julia 1.12 (SciMLTesting 1.7.0): Quality Assurance
9 pass / 1 broken / 0 fail. The 1 broken is the pre-existing intentional
`:piracies` Aqua exception (issue SciML#68).

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
@ChrisRackauckas-Claude ChrisRackauckas-Claude force-pushed the qa/run_qa-v1.6-explicit-imports branch from 8863035 to 8c9bb94 Compare July 3, 2026 08:26
TruncatedStacktraces.jl is archived and its @truncate_stacktrace expands to
`nothing` on julia >= 1.10 (this package's compat floor). The locally-reproduced
no-op macro and its 9 call sites therefore did nothing at runtime, so remove them
outright instead of keeping the stub.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
@ChrisRackauckas ChrisRackauckas merged commit e00280d into SciML:main Jul 4, 2026
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