Skip to content

v0.18.0

Choose a tag to compare

@github-actions github-actions released this 17 Jun 09:39
· 29 commits to main since this release

Added

  • Eleven new runnable scenario kinds — two-tender demonstrators, a CCSDS interop
    bridge, and a first-order mission-analysis / environment suite (all MODELLED,
    additive; existing reproducibility goldens unchanged).
    Each is CLI / Python /
    WASM / MCP dispatchable, ships a scenarios/<kind>.toml, and carries an explicit
    MODELLED label in its result JSON and one-line summary (a per-kind test in
    tests/dominance_demonstrators.rs asserts the label is present and that the output
    never contains the string VALIDATED):

    • impairment-eval (src/impairment_eval.rs) — AI/ML RF-impairment detection
      evaluation testbed: a labelled synthetic corpus + a detector-agnostic
      ROC/AUC harness + an in/out-of-distribution optimism-gap report (operating
      characteristics only — never field/IQ data).
    • quantum-trade (src/quantum_trade.rs) — quantum-vs-classical PNT trade with
      measured-ADEV ingestion and a GNSS-denied resilience envelope.
    • space-weather (src/space_weather.rs) — solar/geomagnetic indices (Kp↔ap IAGA
      table, daily Ap, centred 81-day F10.7a), Jacchia-71 exospheric temperature, and
      an activity-driven thermospheric-density coupling over a static atmosphere (NOT an
      NRLMSISE absolute-density model).
    • oem-interop (src/oem.rs) — CCSDS 502.0 OEM import + round-trip bridge for
      GMAT / Orekit / STK ephemerides (the parse_oem reader, exact inverse of the writer).
    • launch-window (src/launch.rs) — two-body launch azimuth (sin Az = cos i/cos lat),
      plane-change Δv, site-rotation bonus, and daily-opportunity geometry.
    • reentry (src/reentry.rs) — Allen-Eggers ballistic re-entry corridor:
      peak deceleration, peak-g and peak-heating velocities, peak-g altitude.
    • eo-coverage (src/eo_payload.rs) — EO swath / GSD / access / revisit geometry
      (SMAD space-triangle).
    • space-packet (src/space_packet.rs) — CCSDS 133.0-B Space Packet primary-header
      encode/decode with bit-exact round-trip.
    • attitude-budget (src/attitude_budget.rs) — 3-DOF gravity-gradient torque +
      RSS pointing-error budget (scalar pre-hardware budget, not a control loop).
    • passes (src/passes.rs) — ground-station rise/set pass prediction (AOS/TCA/LOS,
      max elevation, access).
    • link-budget (src/linkbudget.rs) — one-way CCSDS-401 / DSN-810-005 link equation
      (C/N₀ = EIRP − FSPL − L_other + G/T − k, FSPL / Eb·N₀ / margin / closure).
  • 17-state hybrid quantum + classical tightly-coupled UKF — surfaced as a runnable
    scenario (MODELLED).
    A new hybrid-ukf scenario kind (src/fusion/hybrid_ukf.rs,
    scenarios/hybrid-ukf.toml) that turns the previously API-only 17-state tightly-coupled
    GNSS/INS unscented filter (src/fusion/tightly_coupled17.rs) into a scenario the
    CLI/Python/WASM/MCP bindings can dispatch. The 17-state error vector is the 15 INS error
    states
    (position, velocity, attitude misalignment, accel + gyro bias) augmented with the
    CAI-derived accelerometer-bias correction — the cold-atom interferometer
    (src/inertial/quantum_imu.rs) sets the velocity-random-walk floor q_va, so the long-term
    coast drift is the quantum-sensor-limited one — and a 2-state phase + frequency clock
    whose process noise comes from the q-parameter clock engine
    (clock_state::q_from_allan, mapping a clock's Allan-deviation profile to the q_wf/q_rw
    PSDs, scaled to range units). The platform is GNSS-aided for a lead-in (the filter learns
    the biases, velocity and clock), then coasts through a GNSS outage on the CAI IMU + clock
    alone, so the run demonstrates classical-IMU short-term + quantum long-term
    hybridisation. The figure of merit is filter self-consistency: pooled NEES
    (Normalised Estimation Error Squared, over the estimable position/velocity/clock subset) and
    innovation-whiteness NIS (Normalised Innovation Squared) over a Monte-Carlo ensemble,
    checked against their 95% χ² bands (Bar-Shalom §5.4). The matched filter lands inside the
    bands; a deliberately mistuned filter (the q_factor / r_factor knobs) is flagged — an
    objectively checkable, discriminating gate, not a rubber stamp. The NEES/innovation-
    whiteness check is the STATISTICAL ORACLE: a self-consistency statement (the filter's
    reported covariance honestly matches the spread of its own errors under the modelled noise),
    NOT a real-world accuracy guarantee.
    Honest scope: everything is modelled / simulation
    — the CAI and clock inputs are bracketed, literature-representative values, not measured
    hardware; the CAI hardware and its Key-Person stay partner-owned; nothing here implies
    TRL > 3, flight heritage, or external validation (the result JSON and one-line summary carry
    these labels explicitly). The single constant-velocity, level trajectory leaves attitude and
    IMU-bias states only weakly observable, so NEES is assessed over the 8 estimable states; a
    manoeuvring trajectory for full-17 observability is roadmap. Also adds Ukf::update_stats
    (returns the per-update NIS) and TightlyCoupled17::{update_gnss_nis, nees, nees_subset}
    consistency instrumentation. All existing scenarios are unaffected (additive; reproducibility
    goldens unchanged).

  • Sequential (recursive) terrain-referenced navigation — SITAN as a running filter.
    A new terrain-slam scenario kind (src/altpnt/sequential.rs,
    scenarios/terrain-slam.toml) that runs the existing altimeter-vs-DEM measurement
    model epoch by epoch through the particle_filter SIR engine, rather than the
    batch coarse-to-fine search terrain-nav uses to recover a single constant INS
    offset. At each waypoint the cloud is propagated by the INS-reported increment (itself
    corrupted by the per-step drift growth), reweighted by the terrain match, and
    resampled on degeneracy — so a time-varying INS drift is tracked along the
    track, which a constant-offset fit structurally cannot do. On the synthetic DEM the
    recursive estimate stays bounded and re-converges (final ≈ 70 m) while the unaided
    inertial solution diverges unbounded to ≈ 5 km; per-epoch error follows terrain
    distinctiveness (it coasts on the biased INS over flat saddles and re-locks over
    distinctive relief), and the effective-sample-size monitor confirms a healthy cloud.
    Honest scope: the map is known and fixed — recursive localization against a
    stored DEM (the localization half of terrain SLAM), not joint map estimation;
    non-circular by construction (the injected drift ramp is the independent truth). All
    existing scenarios are unaffected (additive; reproducibility goldens unchanged).

  • GNSS-denied resilience spine + FutureNAV demonstrator slices (src/holdover.rs,
    and resilience-envelope foundations under src/impairment_eval.rs, src/quantum_trade.rs,
    src/navsignal.rs, src/inertial/quantum_imu.rs, with FutureNAV verification slices in
    src/verification.rs). Composes the alternative-PNT building blocks — clock holdover,
    signal tracking, inertial coast, terrain — into a single GNSS-outage resilience narrative.
    MODELLED; additive.

  • Kshana Interchange Format (KIF) — a versioned, self-describing artifact envelope
    (src/interchange.rs). A schema-tagged wrapper around scenario results so a stored
    artifact carries its kind, schema version, and MODELLED/VALIDATED labels with it, and
    older envelopes stay forward-compatibly readable. Additive; existing result JSON unchanged.

  • Navigation-signal modulation / tracking + CR3BP halo/NRHO differential corrector
    (src/navsignal.rs, src/cr3bp.rs). A first-order nav-signal modulation & tracking model,
    and a circular-restricted three-body differential corrector for halo / near-rectilinear
    halo orbits, surfaced on the existing deep-space capability axis. MODELLED.

  • Distribution-shift evaluation mode + corpus severity-scale knob for impairment-eval
    (src/impairment_eval.rs). Adds an explicit in/out-of-distribution split and a tunable
    corpus severity scale to the ROC/AUC optimism-gap harness (operating characteristics only —
    never field/IQ data).

  • Cost-per-coverage ROI + detection-miss integrity-impact mapping (src/frugal.rs,
    src/integrity_impact.rs). A frugal-engineering ROI lens (cost per unit coverage) and a
    mapping from detection-miss rate to integrity impact. MODELLED; additive.

  • Cited cold-atom-interferometer (CAI) error-model parameter sheet
    (src/inertial/quantum_imu.rs). A literature-referenced, bracketed parameter sheet for the
    CAI inertial model — inputs are cited, not measured hardware (no TRL / flight claim); it
    feeds the hybrid-ukf velocity-random-walk floor.

  • Project governance. GOVERNANCE.md documenting the decision model and the open/closed
    boundary; the capability map's community/governance row moves none → partial to reflect it.

Fixed

  • ARAIM integrity protection level — nominal bias (b_nom) and σ_URA now applied. The
    MHSS protection level now subtracts the one-sided nominal-bias projection
    b_k = Σ_i |s_i|·b_nom per fault mode, and uses the integrity sigma σ_URA (distinct
    from the accuracy sigma σ_URE) carried on the Integrity Support Message. This makes the
    protection level more conservative and standards-correct, and therefore changes the PL
    values reported by existing integrity scenarios
    . The ISM/scenario gains #[serde(default)]
    sigma_ura_m / b_nom_m fields, so inputs that leave them unset retain prior behaviour. See
    docs/ARAIM_REFERENCE.md for the restored b_k formula and the honest implementation note.

  • Spoof-monitor χ² consistency. parity_raim_test now uses the shared
    raim::chi2_quantile inverse-χ² path, removing a second divergent χ² implementation so RAIM
    and the parity spoof monitor agree on their thresholds.

  • gravity-map-nav wired into the CLI dispatcher. The scenario was previously reachable
    only through the API; it now dispatches as a kind= like every other scenario.

  • Documentation/count accuracy. Scenario-kind counts in the README are now pinned to
    api::list_scenario_kinds().len() by a scenario_count_doc_sync test, so the documented
    count can no longer drift from the dispatcher.


Get this release

Download — attached below, prebuilt (no toolchain needed); each artifact carries
SLSA build-provenance (verify with gh attestation verify <file> --repo AshfordeOU/kshana):

  • kshana — the simulator CLI / engine (Linux x86-64)
  • kshana-mcp — the Model Context Protocol server (Linux x86-64)
  • kshana-sbom.cdx.json — CycloneDX SBOM
  • kshana-validation-summary.html — the per-release validation summary

On macOS or Windows, install from a registry below — the PyPI wheels, the npm/WASM
package, and the Docker image are all cross-platform.

Install from a package registry:

Channel Get it
crates.io cargo install kshana · cargo install kshana-mcp
PyPI pip install kshana
npm npm install kshana
ghcr.io docker run -i ghcr.io/ashfordeou/kshana-mcp:0.18.0
MCP registry io.github.ashfordeOU/kshana-mcp (auto-discovered by MCP clients)
JetBrains Marketplace search "Kshana" in your IDE → Plugins

No install: run it in your browser at kshana.dev · Cite: DOI 10.5281/zenodo.20528627


Full changelog: CHANGELOG.md · Docs: README