-
Notifications
You must be signed in to change notification settings - Fork 0
Audit Findings
Audit anchor: this gap list was originally generated against commit
587e2e7(April 27, 2026) and refreshed against7619f2f(May 10, 2026). When the tree advances, regenerate from the matrix.
Prioritized gap list derived from JEOD-Capability-Matrix. Every
non-covered, non-derived, non-n/a matrix row is reflected here, sorted
into three buckets:
- Release blockers — capabilities a downstream mission crate could reasonably reach for and find missing or numerically wrong.
- Documentation/discoverability blockers — capability is in code but not surfaced through a recipe, example, or doc.
- Nice-to-have / accepted divergence — gaps where the cost of closing exceeds the value, or where the JEOD capability is niche.
Each bucket-1 entry has a one-line "what's required to close" note that can be copy-pasted as a GitHub issue title.
The original audit at 587e2e7 listed 10 release blockers and 4 documentation blockers. Five of those have closed:
-
B1.1 / B1.9 — frame-attached body integration and
SIM_ref_attachparity (DB.13–DB.21) closed by #309. -
B1.2 — dynamic body-action lifecycle (
SIM_removable_body_action) closed by #311. -
B1.8 —
GroundFacetcontact geometry (SIM_ground_contact) closed by #261. -
B2.3 — per-integrator-group time-step coordination is documented in
the Integration-Groups wiki page and the
astrodyn_bevy::setsrustdoc.
The page below tracks only the items that remain open.
These should either be closed before tagging a release or have an explicit "accepted divergence with rationale" decision recorded.
B1.3 — UTL.07: LSODE integrator not ported (tracking: #200)
Gap: JEOD's LSODE (variable-order Adams/BDF, stiff/non-stiff) is the
primary integrator for missions with stiff dynamics (e.g. very low-altitude
drag-dominated, or high-eccentricity perigee passes). astrodyn has RK4,
RKF45, ABM4, Gauss-Jackson — no stiff integrator. tier3_sim_lsode
exercises ABM4 as a placeholder.
Close with: port LSODE proper, or document as accepted divergence and recommend RKF45 with tight error tolerance for stiff cases.
Issue title: Port LSODE integrator or document accepted divergence
B1.4 — VRF.dyncomp.12 / VRF.dyncomp.13: SIM_dyncomp RUN_6C / RUN_6D drag-maneuver scenarios not covered (tracking: #201)
Gap: RUN_6A is derived; RUN_6B is covered (Bevy parity wrapper reinstated in #416); RUN_6C and RUN_6D have no direct cross-validation. These exercise drag + impulsive maneuver combinations.
Close with: regenerate JEOD reference CSVs for RUN_6C/RUN_6D and add
two new tier3_simulation_run6c/run6d tests.
Issue title: Add Tier 3 cross-validation for SIM_dyncomp RUN_6C/RUN_6D
B1.5 — VRF.dyncomp.21 / VRF.dyncomp.25: SIM_dyncomp RUN_9B / RUN_10B not covered (tracking: #202)
Gap: rotational-state edge cases (RUN_9B = combined torques scenario, RUN_10B = circular orbit + zero rate). The 9-series and 10-series are otherwise covered.
Close with: regenerate references, add tier3_simulation_run9b and
tier3_simulation_run10b.
Issue title: Add Tier 3 coverage for SIM_dyncomp RUN_9B and RUN_10B
B1.6 — BCH.02: Rosetta hyperbolic Earth swing-by mission benchmark (tracking: #203)
Gap: JEOD's Integrated_Validation/SIM_Earth_Moon includes a Rosetta
swing-by case. astrodyn has hyperbolic-orbit unit coverage
(tier3_orbinit_hyperbolic) but no full mission scenario. This is a
real-data benchmark — the kind of case downstream users are most likely
to point at.
Close with: build crates/astrodyn/src/recipes/scenarios/rosetta.rs
and tier3_simulation_rosetta_swingby. Reference data is in JEOD.
Issue title: Add Rosetta swing-by mission benchmark (BCH.02)
B1.7 — BCH.04 / VRF.mars.02 / VRF.mars.03: Phobos mission scenarios (tracking: #204)
Gap: Mars-Phobos system not modeled. Requires Phobos ephemeris
(available in DE) and small-body gravity treatment (we have point-mass
for moons, which is fine for Phobos at Mars-orbit altitudes). The
RUN_orb_init_phobos tests orbital initialization around a small body.
Close with: add Phobos to crates/astrodyn/src/recipes/mars.rs,
build tier3_phobos_orbit and tier3_phobos_orbit_init.
Issue title: Add Phobos mission scenarios (BCH.04, VRF.mars.02–03)
B1.10 — ENV.20 / VRF.gv.02: SIM_csr_compare (CSR vs GGM gravity-model cross-check) not ported (tracking: #207)
Gap: JEOD verifies that switching between gravity coefficient sets (CSR and GGM) preserves expected differences. We support GGM05C/GGM02C only and have no CSR data. This is a gravity-model breadth gap.
Close with: either (a) ingest a CSR coefficient set and add a cross-check, or (b) document as accepted divergence and recommend GGM05C as the production default.
Issue title: Decide on CSR gravity coefficient support (ENV.20)
These capabilities exist in code but are not visible to a downstream user unless they read the source. A release that hides them is worse than one that doesn't ship them.
B2.1 — DYN.14 / VRF.ba.02: LVLH-frame body initialization needs a recipe (tracking: #208)
Gap: SIM_lvlh_init exercises spawning a vehicle at a LVLH-relative
position. We support this via vehicle_builder but no recipes::*
example or doc shows it. Users who want "spawn this satellite 50 km
behind that station" will not find the path.
Close with: add recipes::orbital_elements::iss_relative_lvlh() or
similar; add a tier3_sim_lvlh_init direct cross-validation.
B2.2 — INT.04: Aero-thermal coupling has no end-to-end example (tracking: #209)
Gap: thermal_rider.rs covers the SRP side (tier3_sim_srp_rk4_thermal)
but the aero side (drag coefficient varying with surface temperature) has
no Tier 3. Users who want temperature-dependent drag will not know we
support it.
Close with: add tier3_sim_aero_thermal exercising a heating/cooling
cycle with drag-coefficient variation.
B2.4 — UTL.19: Surface-model primitives beyond FlatPlate (tracking: #211)
Gap: JEOD's surface model has FlatPlate, FlatPlateCircular, Cylinder. We have FlatPlate only. FlatPlateCircular is used for solar panel + dish geometry; Cylinder is used for tank/body modeling. Users who want non-flat geometry will write their own.
Close with: add FlatPlateCircular and Cylinder facet types to
crates/astrodyn_interactions/src/surface_model.rs, plus aero+SRP coverage.
These are gaps where the cost of closing exceeds the value. Each is paired with a one-line rationale for accepting the divergence.
-
DYN.01 / DYN.08 / DYN.12 / DYN.17 / DYN.27 — three-frame model (structure / composite_body / core_body) is partially modeled. The separation matters for high-fidelity attitude sims with offset CoM and structural thermal flexure; for typical orbital missions the composite-body integration is sufficient. Tracked under JEOD_invariants.md (DB.04, DB.12–DB.17, DB.21, MA.11–MA.20).
-
DYN.14 / VRF.ba.02 / DYN.17 — body attachment edge cases (180° yaw attach-by-point) — JEOD_INV: MA.16 deferred. Affects only a narrow attachment geometry; flagged in invariant catalog.
-
ENV.23 / VRF.ep.02 — propagated-planet ephemeris — pattern where planets are propagated under sim physics rather than read from ephemeris. Useful in orbit-determination research, not mission ops. We require ANISE-loaded ephemeris.
-
ENV.24 — simple analytical ephemeris fallback — low-fidelity fallback for sims without DE files. We require ANISE.
-
ENV.34 — generic per-planet RNP — Earth, Moon, Mars covered; arbitrary planet RNP (e.g. Venus, Mercury rotation) not exposed. Mercury sims use inertial-frame integration.
-
INT.13 — spring-pair contact interaction — primarily for joint/cable models. Not used in typical orbital missions.
-
INT.14 / VRF.sm.01 — articulated surface model — moving panels (e.g. solar-array tracking, antenna pointing). Static surfaces only.
-
UTL.13 — Gauss quadrature — used in JEOD only for legacy surface-model integration; unused in main pipeline.
-
VRF.db.04 — SIM_verif_shutdown — JEOD shutdown sequence. Rust
Drophandles resource cleanup; no equivalent test needed. -
DAT.03 — Earth GEMT1 (legacy gravity model) — loader works; no trajectory test. Modern users prefer GGM05C.
-
DAT.07 — Moon LP150Q (Lunar Prospector 150) — loader works; no trajectory test. GRAIL150 is the modern default.
-
VRF.ba.01 — SIM_orbinit per-RUN coverage — 5 of 46 JEOD RUNs are CSV-validated via Docker; the other 41 are exercised analytically through family invariants (energy/angular-momentum conservation, Cartesian↔element round-trip). The 5 covered RUNs (ISS inertial, STS inertial, ISS pfix, STS pfix, STS trans-state) are representative across orbit-IC types. Closing the remaining 41 would require Docker regeneration of all 46 CSVs and a corresponding Tier 3 per RUN.
-
VRF.ba.04 — SIM_verif_attach_mass per-RUN coverage — 8 of 21 JEOD RUNs (RUN_01, 02, 03, 04, 10, 11, 101, 102) are covered. The 8 covered RUNs span the basic attach geometries; the remaining 13 are advanced attach/reattach permutations (e.g. 180° yaw, multi-stage chains) that exercise the same code paths through different inputs.
These 16 rows are explicitly n/a in the matrix with a documented Rust
equivalent. Listed here for completeness so the audit's "did we consider
this?" answer is yes:
- ENV.21 (DE4xx parser) → ANISE
- ENV.29 (exponential atmosphere) → astrodyn addition for analytical tests
- ENV.36 (SPICE) → ANISE
- UTL.03 (frame subscription) → Bevy schedule
- UTL.09 (integration loop) → Bevy
FixedUpdate - UTL.20 (containers) → Rust collections + Bevy reflection
- UTL.21 (memory manager) → Rust ownership
- UTL.22 (message handler) →
panic!+tracing - UTL.23 (named item) → Bevy
Entity+Name - UTL.24 (Trick sim interface) → Bevy ECS
- UTL.25 (Trick CSV) → CSV via
csvcrate in tests - UTL.26 (model template) → idiomatic Rust crate structure
- EXP.03 (experimental message) →
tracing - VRF.dyncomp.29–30 (checkpoint create/restore) → Bevy reflection covers state, not active integrator state — accepted divergence
- VRF.na.01–05 (SIM_container, SIM_memory, SIM_message_handler_verif, SIM_integ_loop, SIM_simulation_interface) → all subsumed by the language/runtime equivalents above
- DAT.17 (DE4xx binary) →
.bspSPK kernels via ANISE
| Bucket | Open items | Action |
|---|---|---|
| 1 — Release blockers | 6 | Close before release, or record explicit accepted-divergence decision |
| 2 — Doc/discoverability | 3 | Close in docs/recipes layer |
| 3 — Nice-to-have / accepted | 35 | No action needed; documented above for future reference |
Five originally bucket-1/bucket-2 items closed since the audit anchored at 587e2e7: B1.1 / B1.9 (#309), B1.2 (#311), B1.8 (#261), B2.3 (Integration-Groups wiki page). Bucket 1 is the actionable list. Bucket 3 is the audit's record that we considered each gap and accepted it.
When JEOD is upgraded or new astrodyn capability is added:
- Re-walk the matrix; any row whose status changes gets a dated note.
- Re-derive this gap list. Bucket 3 items don't move unless their rationale changes (e.g. a user request elevates a niche feature).
- Bucket 1 items either close (delete the entry) or graduate to bucket 3 with an "accepted divergence" rationale.
The matrix and this gap list are intentionally a snapshot, not an auto-derived view. Treat them as living documents updated when capability status changes — same cadence as JEOD_invariants.md.