Repository navigation
Roadmap: M0 to M8 #2
Description
Tracking issue for the milestones in docs/spec.md.
M5 is the milestone that justifies the project. Everything before it is infrastructure; everything after it is elaboration. Every quantitative figure in the spec is a projection until M5 replaces it with a measurement.
| Deliverable | Gate | Status | |
|---|---|---|---|
| M0 | Repository, specification, CI | — | ✅ done (#1) |
| M1 | Sgp4<T> generic, double path |
Vallado verification suite passes | open |
| M2 | CelesTrak client and cache; TLE-vs-later-TLE divergence; catalogue and globe | An end-to-end divergence number for the ISS | open |
| M3 | PreciseMath, the PreciseNumber path, high-precision π |
Performance gate | not filed |
| M4 | Frames (TEME↔ITRF↔GCRF) and EOP; CDDIS/ILRS SP3 | LAGEOS-1 against laser-ranging truth | not filed |
| M5 | Storage comparison panel; Monte-Carlo Δ_data; element inspector | The decomposition works | not filed |
| M6 | Cowell integrator and force model; time inspector | The Julian Date staircase | not filed |
| M7 | Space-Track; JPL Horizons third bodies | Full catalogue, element-set history | not filed |
| M8 | Conjunction screening, polish, documentation | — | not filed |
M3 onwards are deliberately not filed yet. Their content is in the spec, and filing thin placeholders for work months out is tracker noise — each gets an issue when it is next.
Upstream dependencies
| Issue | Blocks | Effect |
|---|---|---|
| PreciseNumber#78 | M3 | PreciseNumber implements INumber<T> and nothing else — no Sqrt, Sin, Cos, Atan2, all of which SGP4 needs. Osculator.Math.Precise supplies them locally until it lands. |
| PreciseNumber#79 | M3 | π carries 26 significant digits against a default division precision of 50, so argument reduction caps the precise path near 21 usable digits. Must be resolved before M5's numbers can be trusted. |
| Semantics#237 | M1 (ergonomics) | Vector forms have no From{Unit} factories, so every Position3D is built in raw metres with a hand-written ×1000. |
| Semantics#239 | M1 | StorageMath.Sqrt<T> is internal, so the type-generic Newton root has to be reimplemented here. |
| Semantics#240 | M1 | No GravitationalParameter dimension, so μ is carried as a bare T. |
| Semantics#244 | — | Already worked around with PrivateAssets="all"; recorded so the workaround can be removed when it is fixed. |
| ImGuiApp#411 | M2 | No virtualized table, and the catalogue is ~30,000 rows. |
| ImGuiApp#413 | M2 | No backend-agnostic 3D; the globe is a CPU raster uploaded per frame until this lands. |
None of these block M1, whose gate is the double path.
A sequencing problem in the spec, worth settling before M2
M2's loop is "propagate an old element set forward and compare against a later one for the same object" — which needs an element-set history. CelesTrak serves the current elements for an object, not past ones. So M2 as specified either:
- accumulates its own history by polling and storing snapshots, which means the first useful divergence measurement is days after the app first runs; or
- needs Space-Track, which the spec schedules at M7 and which is the only source here that carries historical element sets.
Option 2 pulls a credentialed data source forward into the milestone the spec wanted to depend on only CelesTrak. Option 1 keeps M2 auth-free but makes its gate untestable on day one. Raised in #3.
Activity
matt-edmondson commentedon Sep 16, 2026
Triage
Category: Feature Request (tracking issue)
Priority: Medium
Area: repository roadmap, M0–M8
Medium as a tracking issue — it carries no work of its own; the priority that matters is on the milestone issues beneath it. Flagged here mainly because it is the one place the cross-repo dependency web is written down, and two entries in that table have moved since it was filed.
Suggested assignment: none specific.
Related — two upstream dependencies now have open PRs, so the table is out of date:
StorageMath.Sqrt<T>internal, blocks M1) — open PR Make StorageMath public, and add Cbrt, RootN and Hypot Semantics#247, "Make StorageMath public, and add Cbrt, RootN and Hypot". If it merges, the M1 row's "has to be reimplemented here" stops being true.The other rows are current: Semantics#237, #240 and ImGuiApp#411, #413 are all open with no PRs. Semantics#244 (recorded as worked around with
PrivateAssets="all") is triaged High in its own repo with no fix in flight, so the workaround stays for now.Open PR covering this: none.
Suggested next step: the M2 sequencing problem is raised in both this issue and #3, and answered in neither — it is the one open decision on the critical path, so it is worth resolving in one place and having the other defer to it rather than restating the options twice. On the roadmap itself, the choice not to file M3–M8 as placeholders is a good one and worth keeping; the table does that job without generating tracker noise. Refreshing the two dependency rows above would keep it doing its job accurately.
Generated by Claude Code