Roadmap
Everything in this document is a plan. Nothing here is a description of the current repository except where it says so. The README's Status table is the authority on what works today; this document is the authority on the order things are intended to arrive in.
The rule for every milestone is the same: a stranger can clone the repository at that tag and run something real.
v0.1 — the honest spine
In progress. What it needs, and where each piece stands:
| Piece | State |
|---|---|
| Core types, frames, quaternions, units | done, property-tested |
| ISA atmosphere | done, validated against the published tables |
| Nonlinear 6-DOF equations of motion | done, validated against closed-form solutions of Euler's equations |
| Fixed-step RK4 | done, order verified |
analyze.modes |
done, validated against NASA CR-2144 |
| Pipeline runner and CLI | done |
ci.yml, determinism.yml |
done |
| A reference aircraft model | done, nonlinear, validated |
trim.level |
done, validated |
linearize.finitediff |
done, validated |
| One example: YAML file to modal table | done, three of them, all checked by CI |
v0.1 is complete. The chain runs end to end: a nonlinear aircraft model built from non-dimensional derivatives, trimmed by a constrained root-find that reports its residual and Jacobian conditioning and refuses to return a best-effort answer, linearised by central differences with a Richardson truncation estimate per entry, and analysed into a labelled modal table. It reproduces NASA CR-2144's published dimensional derivatives to 0.26% and its published modes to 1.0%.
No AI. No GUI.
This is the credibility floor and nothing ships before it.
v0.2 — analysis and design
Done. Frequency response (analyze.freqresp), evaluated by Hessenberg
solves with the grid refined around the system's own lightly damped modes, and
all four margin types: gain, phase and delay (analyze.margins) with every
crossover reported, and the disk margin (analyze.diskmargin) with its
guaranteed gain and phase range and a destabilising perturbation on the
boundary. Validated against closed-form transfer functions and against the
published worked example of Seiler, Packard & Gahinet (2020); see
docs/VERIFICATION.md.
Also done: singular values for MIMO loops (analyze.sigma) and the sensitivity
and complementary-sensitivity peaks (analyze.sensitivity), with the classical
margins M_S and M_T guarantee — SISO only, which is the source's own scope.
Remaining. synth.pid, synth.lqr, CARE via the generalised Schur method
validated against the CAREX benchmark collection, root locus, and
sim.nonlinear with actuator position and rate limits in the loop. A
high-fidelity aircraft model with its provenance, and the modal validation gate
against published values.
The synthesis half of that is designed but not built, and the design is
written around how it would be verified rather than around its API:
RFC-0001. No src/synth/ code merges until the
two open reference questions in it are answered.
Reports with embedded plots landed as HTML rather than Markdown.
tools/report/ emits a run record and scripts/gen-report-page.py draws a
single self-contained page from it — trim point, labelled modal table, pole map,
Bode with every crossover marked, and a Nyquist against the disk-margin disk —
published for the NT-33A reference case and diffed by CI. Markdown reports carry
tables only, which is what report.markdown does today.
Known gap carried forward: EVERY peak over frequency in galata — the disk
margin, M_S, M_T and the largest singular value — is found on a refined
frequency grid rather than by the exact Hamiltonian-eigenvalue method (Boyd &
Balakrishnan; Bruinsma & Steinbuch), so each is a lower bound on the true
H-infinity norm and the derived robustness margins are upper bounds on the true
ones. The error is in the optimistic direction and is documented at every point
it surfaces. Closing it is a single piece of work — one exact norm routine
behind src/analyze/peak_search.hpp — and it would tighten all four at once.
v0.3 — the desktop application
Tauri shell, 3-D viewport, the plot suite (Bode, Nyquist with the disk-margin disk drawn, Nichols with handling-quality boundaries, labelled pole-zero map, root locus with a live gain slider), the pipeline editor. Signed installers for three platforms.
No AI yet — the application has to be useful without it.
v0.4 — the AI layer
Provider abstraction with Anthropic, OpenAI, the OpenAI-compatible generic
adapter and Ollama. Secrets in the OS keychain. The agent loop, the first twelve
tools, the audit log, budgets, and the eval suite. galata-mcp ships in the
same release.
The agent composes and runs pipelines. It never produces a number itself; tools return handles to computed artefacts and the chat renders those artefacts.
v0.5 — identification and hardware in the loop
Frequency sweeps, coherence, transfer-function fitting. A MAVLink SITL bridge. The single-axis pitch-rig example with measured-versus-predicted step responses, its raw data and its bill of materials.
v1.0 — freeze
Plugin ABI v1 final, agent tool contract v1 final, the full provider set, handling qualities, Monte Carlo, gain scheduling, the published verification and validation report, and a documentation site that resolves.
Tagged only when all of that is true.
Aircraft model data
Coefficient data ships in this repository only when it is transcribed from a US Government work, which is in the public domain. Data traceable only to a copyrighted source ships as a loader plus documented instructions for obtaining the data — never as data. A dataset whose licensing position cannot be established with confidence is not shipped at all.
Where no published reference value can be found for a validation case, that case
is marked unvalidated in docs/VERIFICATION.md.