control-toolbox / control-toolbox/CTFlows.jl

Tighten the compat bounds: keep only the newest major

Open
#413 0 comments 0 reactions 1 assignee Claimed by @ocots View on GitHub
Dominant language
Julia
Stars
2
Forks
3
Avg merge
22h 16m
Merged PRs (30d)
9

Description

Four `[compat]` entries list several majors.

| entry | now | suggested |
| --- | --- | --- |
| `CUDA` | `5, 6` | `6` |
| `DiffEqBase` | `6, 7` | `7` |
| `ForwardDiff` | `0.10, 1` | `1` |
| `GPUArraysCore` | `0.1, 0.2` | `0.2` |

⚠️ **CTFlows is the one sibling that depends on `NonlinearSolve`.** It has no `CUDSS` entry
today, so the trap below does not bite — but if `CUDSS` is ever added here, it must be `"0.7"`,
not `"0.8"`, for the same reason it must be in OptimalControl.

## Why now

The ecosystem decision (2026-08-26) is to keep only the newest major where it resolves. The
trigger was `MadNLPGPU = "0.8, 0.10"`, which spans a behaviour change: up to 0.8, `CUDSS` was a
**hard** dependency, so `using MadNLPGPU` armed the GPU extension by accident; from 0.9 it is a
**weak** dependency and must be loaded explicitly. Keeping both in range forces the
documentation to describe two worlds, and only one of them is ever resolved.

## The one trap — do not harmonise `CUDSS` across the ecosystem

`CUDSS 0.8.0` requires `LinearSolve ≤ 2.28`, while `NonlinearSolve 4` requires
`LinearSolve ≥ 3.48`. So the right bound **differs per repository**, measured 2026-08-26:

| repository | has `NonlinearSolve` | `CUDSS = "0.8"` |
| --- | --- | --- |
| CTSolvers, CTDirect | no | **resolves** — CUDA 6.2.0, MadNLPGPU 0.10.2, no LinearSolve at all |
| OptimalControl | yes (4.28.0) | **unsatisfiable** — must stay `"0.7"` |

That divergence is correct. Do not "fix" it into a single shared value.

## Related

- Ecosystem plan: `OptimalControl.jl/.reports/campaign/F-compat-tighten.md`
- Decision record: `OptimalControl.jl/.reports/campaign/decisions.md` §1
- [CTSolvers#216](https://github.com/control-toolbox/CTSolvers.jl/issues/216) — the GPU
`ExtensionError` names `MadNLPGPU` when the missing trigger is `CUDSS`. Tightening to 0.10
makes that message wrong 100% of the time instead of sometimes, so the two changes belong
together.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.