From 56abeca874334033c19e19f1e46a23247f5ecc3b Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 15 Jun 2026 10:09:10 -0400 Subject: [PATCH 1/3] Route QA group through the reserved qa= keyword in run_tests The explicit-args run_tests dispatcher treats "QA" as a reserved group name that is resolved against the qa= keyword, not looked up in the groups Dict. Registering it via groups = Dict("QA" => qa_group) left qa unset, so a GROUP=QA matrix entry hit the reserved-name branch and threw ArgumentError: GROUP="QA" was requested but no qa body was provided. Pass the qa_group thunk as qa = qa_group. GROUP=QA and the "Quality" umbrella alias both resolve to it; GROUP=Core / GROUP=All are unchanged. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- test/runtests.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runtests.jl b/test/runtests.jl index f30ce4a..66a23a3 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -23,7 +23,7 @@ run_tests(; @safetestset "ANTLR Parser Tests" include("test_antlr_parser.jl") return @safetestset "Error Message Tests" include("test_error_messages.jl") end, - groups = Dict("QA" => qa_group), + qa = qa_group, umbrellas = Dict("Quality" => ["QA"]), # Original runtests ran QA/Quality only for those explicit GROUPs, never under # "All"; curate "All" to Core only to preserve that. From a5e990550e7aa73af301288ae498a288d34efc69 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Tue, 16 Jun 2026 05:10:07 -0400 Subject: [PATCH 2/3] Allow Modelica parameter name "Nd" in typos spellcheck The PID_Controller.bmo test fixture uses the standard Modelica LimPID derivative-gain parameter `Nd` (both as the parameter name 'PI.Nd' and in its description string). typos flags `Nd` -> `And`; add it to default.extend-words as a domain false-positive so spellcheck passes. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- .typos.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.typos.toml b/.typos.toml index 79b68a4..0d7bd16 100644 --- a/.typos.toml +++ b/.typos.toml @@ -1 +1,3 @@ -[default.extend-words] \ No newline at end of file +[default.extend-words] +# Nd is the Modelica LimPID derivative-gain parameter name in the PID_Controller test fixture +Nd = "Nd" From b5ba4abeaab7a32b262a900b20e50731fe7d46dc Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Tue, 16 Jun 2026 09:01:46 -0400 Subject: [PATCH 3/3] Fix JET MethodError in when-equation callback construction (Julia 1.12) `eval_AST(::BaseModelicaWhenEquation)` built the zero-crossing equation vector as `[crossing ~ 0]`. Because `to_zero_crossing`/`eval_when_rhs` return a Union that includes a vector arm, `crossing ~ 0` is inferred as `Union{Equation, Vector{Equation}}`, making `[crossing ~ 0]` an `Union{Vector{Equation}, Vector{Vector{Equation}}}`. The `Vector{Vector{Equation}}` arm has no matching `SymbolicContinuousCallback` method, which JET's report_package flags as a genuine MethodError on the QA group (Julia 1 = 1.12 channel; this was the single report failing test/qa/test_jet.jl:12 there, while lts/1.10 did not exercise that arm). Annotate both SymbolicContinuousCallback zero-crossing literals as `Equation[crossing ~ 0]` so they are unambiguously `Vector{Equation}`. A when-condition is always scalar, so this is behavior-preserving for valid input and removes the spurious method path. Verified locally on Julia 1.12.6 against the test/qa env: JET report_package over all 364 top-level definitions now finds 0 reports ("No errors detected"), so test_jet.jl:12 passes. Runic v1.7 reports the file already formatted. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- src/evaluator.jl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/evaluator.jl b/src/evaluator.jl index f389079..e8528ca 100644 --- a/src/evaluator.jl +++ b/src/evaluator.jl @@ -376,9 +376,14 @@ function eval_AST(when_eq::BaseModelicaWhenEquation) # Only fire on positive zero-crossing (condition becomes true) → Modelica edge semantics condition_sym = eval_when_rhs(condition_ast; in_body = false) crossing = to_zero_crossing(condition_sym) + # A when-condition is scalar, so `crossing ~ 0` is a single Equation. + # Annotate the literal as Equation[...] so it is always Vector{Equation}: + # without it inference admits a spurious Vector{Vector{Equation}} arm + # (crossing is a Union including a vector case) for which + # SymbolicContinuousCallback has no matching method. push!( callbacks, ModelingToolkit.SymbolicContinuousCallback( - [crossing ~ 0], affects; + Equation[crossing ~ 0], affects; affect_neg = nothing, discrete_parameters = discrete_params_for_cb ) @@ -766,7 +771,7 @@ function eval_AST(model::BaseModelicaModel) modified = (; off = off_sym) ) cb = ModelingToolkit.SymbolicContinuousCallback( - [crossing ~ 0], + Equation[crossing ~ 0], affect; affect_neg = affect_neg, reinitializealg = BrownFullBasicInit(),