From e4d3e715ef94c5d344068c2d075029446bc000b2 Mon Sep 17 00:00:00 2001 From: aaron Date: Thu, 20 Aug 2026 21:07:29 -0400 Subject: [PATCH 1/3] release: v0.10.0 --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ Project.toml | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9388cfe..cab39cbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,34 @@ Changes before v0.9.8 are not recorded here — see the ## [Unreleased] +## [0.10.0] — 2026-08-20 + +### Added + +- **`solve!` returns `SolveStats`** — termination status (MOI code), raw status + string, NLP objective, IPM iterations, solve wall time, and solver symbol — + from both the Ipopt and MadNLP paths. Previously both paths ended in + `return nothing` after `MOI.optimize!`, discarding everything the solver + knew; callers re-parsed stdout or installed callbacks to learn whether a + solve converged. Additive in practice (code that ignored the return still + works). ([#133](https://github.com/harmoniqs/DirectTrajOpt.jl/pull/133)) + +### Changed (behaviour — see the entry below for the headline) + +- Notation pass across docs and docstrings: "knot points" for N, "timestep" + reserved for the per-knot Δt. ([#131](https://github.com/harmoniqs/DirectTrajOpt.jl/pull/131)) + +### Housekeeping + +- Coverage campaign: 86.45% → **99.45%** line coverage, 59 new tests; 2 + unreachable debug branches removed; the historical vector-syntax + finite-difference test de-flaked at the root (its `norm(a) − 1.0` fixture + was kinky at zero — finite-difference Hessians across a kink are unstable; + replaced by a smooth fixture with a tighter tolerance). + ([#135](https://github.com/harmoniqs/DirectTrajOpt.jl/pull/135), + [#136](https://github.com/harmoniqs/DirectTrajOpt.jl/pull/136)) + + ### Changed - **Behaviour change — `QuadraticRegularizer` now weights each knot by a single diff --git a/Project.toml b/Project.toml index 22cb8087..7465f307 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "DirectTrajOpt" uuid = "c823fa1f-8872-4af5-b810-2b9b72bbbf56" -version = "0.9.8" +version = "0.10.0" authors = ["Aaron Trowbridge and contributors"] [deps] From 54f8540b288aaba9509e6e115f9ca52964ce422f Mon Sep 17 00:00:00 2001 From: aaron Date: Thu, 20 Aug 2026 22:49:27 -0400 Subject: [PATCH 2/3] =?UTF-8?q?test(aqua):=20persistent=5Ftasks=20broken-w?= =?UTF-8?q?ith-evidence=20=E2=80=94=20the=201.12-runner=20flake?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fails intermittently on PR CI (twice consecutively on this release PR) while passing locally everywhere and failing main runs too; the check is sensitive to runner-level async timing. Stops gating releases on a coin flip; revisit when the Aqua/1.12.7 interaction is understood. --- test/aqua.jl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/aqua.jl b/test/aqua.jl index 5553e721..e5a5ffaf 100644 --- a/test/aqua.jl +++ b/test/aqua.jl @@ -11,5 +11,15 @@ # have the other submodules `import ..CommonInterface: hessian_structure` # rather than re-export. undefined_exports = (broken = true,), + # persistent_tasks flakes on GitHub's 1.12 runners: it fails + # intermittently on PR CI while passing locally on every platform + # tried, and it has failed MAIN runs too (observed across #133, + # #135, #136, and the 0.10.0 release PR — twice consecutively). + # The check runs `has_persistent_tasks` against a freshly + # precompiled package and is sensitive to runner-level async + # timing (Julia 1.12.7's scheduler). Mark broken-with-evidence + # rather than gating every release on a coin flip; revisit when + # the Aqua/1.12 interaction is understood. + persistent_tasks = (broken = true,), ) end From bf3f6fcbbb48646d1cb744d14618ca896505da81 Mon Sep 17 00:00:00 2001 From: aaron Date: Fri, 21 Aug 2026 00:27:07 -0400 Subject: [PATCH 3/3] =?UTF-8?q?test(aqua):=20persistent=5Ftasks=20broken?= =?UTF-8?q?=20on=201.12=20only=20=E2=80=94=20live=20on=201.10/1.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The unconditional broken=true made Aqua report 'Unexpected Pass' as an error on the healthy versions (the flake is 1.12-runner-specific). --- test/aqua.jl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/aqua.jl b/test/aqua.jl index e5a5ffaf..d49edc2c 100644 --- a/test/aqua.jl +++ b/test/aqua.jl @@ -12,14 +12,14 @@ # rather than re-export. undefined_exports = (broken = true,), # persistent_tasks flakes on GitHub's 1.12 runners: it fails - # intermittently on PR CI while passing locally on every platform - # tried, and it has failed MAIN runs too (observed across #133, - # #135, #136, and the 0.10.0 release PR — twice consecutively). - # The check runs `has_persistent_tasks` against a freshly - # precompiled package and is sensitive to runner-level async - # timing (Julia 1.12.7's scheduler). Mark broken-with-evidence - # rather than gating every release on a coin flip; revisit when - # the Aqua/1.12 interaction is understood. - persistent_tasks = (broken = true,), + # intermittently on 1.12 PR CI while passing locally on every + # platform tried, and it has failed 1.12 MAIN runs too (observed + # across #133, #135, #136, and the 0.10.0 release PR). On + # 1.10/1.11 it passes deterministically — so the check is LIVE + # there and broken only where it flakes (an unconditional + # broken=true makes Aqua report 'Unexpected Pass' as an error on + # the healthy versions). Revisit when the Aqua/1.12 interaction + # is understood. + persistent_tasks = (broken = VERSION.major == 1 && VERSION.minor == 12,), ) end