kshana 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  <p align="center">
13
13
  <a href="https://ashfordeou.github.io/kshana/"><img src="https://img.shields.io/badge/playground-try%20in%20browser-c79e63" alt="Live playground — run in your browser, no install"></a>
14
14
  <a href="tests/sgp4_verification.rs"><img src="https://img.shields.io/badge/SGP4-666%2F666%20AIAA%20vectors%20%C2%B7%204.12mm-3fb950" alt="SGP4 validated against all 666 AIAA 2006-6753 vectors, worst 4.12 mm"></a>
15
- <a href="https://github.com/ashfordeOU/kshana/actions/workflows/ci.yml"><img src="https://img.shields.io/badge/coverage-~97%25%20line-3fb950" alt="~97% line coverage on src/ (cargo-tarpaulin LLVM engine), gated at 85% in CI"></a>
15
+ <a href="https://github.com/ashfordeOU/kshana/actions/workflows/ci.yml"><img src="https://img.shields.io/badge/coverage-~96%25%20line-3fb950" alt="~96% line coverage on src/ (cargo-tarpaulin LLVM engine), gated at 85% in CI"></a>
16
16
  <a href="https://github.com/ashfordeOU/kshana/actions/workflows/ci.yml"><img src="https://github.com/ashfordeOU/kshana/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
17
17
  <a href="https://github.com/ashfordeOU/kshana/releases"><img src="https://img.shields.io/badge/release-v0.17.0-c79e63" alt="Release v0.17.0"></a>
18
18
  <a href="https://plugins.jetbrains.com/plugin/32181-kshana--pnt-simulator"><img src="https://img.shields.io/badge/JetBrains-Marketplace-c79e63" alt="Kshana on the JetBrains Marketplace"></a>
@@ -128,9 +128,11 @@ consume published Allan/noise-budget coefficients; the CAI accelerometer has a
128
128
  first-principles layer — Mach–Zehnder phase, projection noise, contrast decay, and
129
129
  vibration coupling — but Coriolis and light-shift systematics remain a **P2** roadmap
130
130
  layer, see [`ROADMAP.md`](ROADMAP.md) and [`docs/QUANTUM-MODELS.md`](docs/QUANTUM-MODELS.md));
131
- a GNSS receiver or PVT solver (it models the measurement domain and resilience, not
132
- signal acquisition or a least-squares fix); or a mission-design / orbit-determination
133
- tool. Owning this scope is deliberate. If you need first-principles cold-atom
131
+ a full GNSS *signal-acquisition* receiver (it now solves a single-point **PVT** position
132
+ fix from real RINEX code observations validated on real IGS data — but does **not**
133
+ acquire or track raw signal); or a full mission-design suite (it has Lambert / porkchop /
134
+ maneuver / orbit-determination building blocks, but is the performance-simulation layer
135
+ *above* GMAT/Orekit, not a replacement). Owning this scope is deliberate. If you need first-principles cold-atom
134
136
  interferometer error budgets (e.g. CARIOQA-PMP-grade or X-37B-style validation), see
135
137
  the P2 roadmap and [get in touch](#support--professional-services) to collaborate.
136
138
 
@@ -146,17 +148,23 @@ the P2 roadmap and [get in touch](#support--professional-services) to collaborat
146
148
  | **Alt-PNT (GPS-denied)** | A cold-atom **gravimeter measurement model** whose white-noise floor (`σ = ASD/√τ`) is derived from the CAI accelerometer physics; a low-degree, fully-normalised **spherical-harmonic gravity-anomaly field** (validated against the closed-form Legendre functions and a hand-derived single-term anomaly) plus synthetic mascons; and a **gravity-map-matching particle filter** that recovers a GPS-denied track from the anomaly sequence it flies through. It extends to **terrain-referenced navigation** (TERCOM/SITAN against an SRTM `.hgt` DEM, `src/altpnt/terrain.rs`), an **IGRF-14 geomagnetic main field** to degree/order 13 (`src/igrf.rs`, validated against the tilted-dipole closed form and ∇V finite differences), and a **combined gravity + magnetic + terrain** navigator that fuses all three scalar channels through one particle filter (information is additive — no channel makes the fix worse). A **60-minute GPS-denied benchmark** (a ~700 km / one-hour outage where the inertial solution drifts to ~70 km) is recovered to **~145 m (< 500 m)** by a hierarchical coarse-to-fine matcher — the ESA NAVISP *Quantum Wayfarer* target. |
147
149
  | **Fusion** | Loosely-coupled 15-state GNSS/INS error-state EKF with closed-loop feedback (the `gnss-ins` pack); a **tightly-coupled** pseudorange update that keeps correcting with fewer than four satellites; a coupled **clock + position** filter; a general **unscented (sigma-point) Kalman** estimator for strongly nonlinear measurements; a tightly-coupled GNSS/INS **UKF navigator** (pseudorange + Doppler) whose force-model orbital coast is validated to **0.77 m RMS** over a 30-minute curving LEO pass that includes a 120-second GNSS outage; and a full **17-state tightly-coupled GNSS/INS UKF** (position, velocity, attitude error, accelerometer and gyro biases, clock bias and drift) whose **quantum-CAI dead-reckoning** coasts a 120-second outage on the cold-atom accelerometer's derived velocity-random-walk. |
148
150
  | **Orbit determination** | Recovery of an orbital state `[r, v]` from ground-station range tracking, composing the two-body + J2 force model and RK4 integrator with a **Gauss–Newton batch** corrector (`determine_orbit_batch`, sub-metre / mm·s⁻¹ from noiseless ranges, ~2 m at a 5 m noise floor) and a **sequential** unscented-filter variant (`determine_orbit_sequential`). |
149
- | **Lunar & cislunar** | An Earth–Moon **circular restricted three-body (CR3BP)** propagator in the rotating frame — conserved Jacobi constant and all five Lagrange points (`src/cr3bp.rs`) — plus **LunaNet / LNIS** cislunar PNT geometry (MCI↔MCMF reduction, selenographic coordinates) with a **lunar south-pole ARAIM** pass that honestly surfaces the integrity gap: a ~30 m σ_URE drives the protection level well above a 50 m alert limit (`src/lunar.rs`, `scenarios/lunanet-araim.toml`). |
151
+ | **Lunar & cislunar** | An Earth–Moon **circular restricted three-body (CR3BP)** propagator in the rotating frame — conserved Jacobi constant and all five Lagrange points (`src/cr3bp.rs`) — now with a **6×6 state-transition matrix and a single-shooting differential corrector** (`cr3bp_jacobian`, `propagate_state_stm`, `differential_correct_halo`) that produces genuinely periodic **halo / NRHO** orbits: the STM is validated against finite differences, corrected orbits close to machine precision, and seeding the published apolune state reproduces the **L2 southern 9:2 NRHO** (the Gateway orbit) at period ≈ 6.57 d / perilune ≈ 3,250 km, consistent with the published ≈ 6.56 d / ≈ 3,370 km (a CR3BP — circular, Sun-free — solution, **not** validated against a real LANS/Gateway ephemeris; the selenocentric MCI/MCMF transform of the corrected orbit is a follow-on); plus **LunaNet / LNIS** cislunar PNT geometry (MCI↔MCMF reduction, selenographic coordinates) with a **lunar south-pole ARAIM** pass that honestly surfaces the integrity gap: a ~30 m σ_URE drives the protection level well above a 50 m alert limit (`src/lunar.rs`, `scenarios/lunanet-araim.toml`). |
152
+ | **Deep-space & Mars PNT** | An open **radiometric navigation engine**: iterative light-time + **Shapiro** relativistic delay, two-/one-/three-way **Doppler & range** (Moyer two-leg), coherent transponder turnaround ratios, regenerative/PN ranging (CCSDS 414), and **Δ-DOR** plane-of-sky (CCSDS 506), with solar-plasma/tropo/iono media; **CCSDS-TDM (503)** tracking-data-message parse + emit; a **reduced-dynamic Square-Root Information Filter** (RTN empirical accelerations + a 3-state onboard clock + Mars atmospheric drag) that does **Mars-LMO orbit determination to ≈ 0.2 m** in a synthetic closed loop; a joint **one-way + two-way fusion** estimator; a multi-body dynamics core (`Body{μ, re, zonals, gravity, IAU-pole}`, Mars GMM-3 gravity, an IAU body-fixed Mars frame, a pluggable `EphemerisProvider` seam, two-part Julian dates + TT↔TDB); and the **`mars-pnt`** relay-PNT scenario (a MARCONI areostationary relay constellation) with an end-to-end **GSE performance simulator** (geometry → link budget → observables → SRIF → covariance). **Simulation-validated** (covariance / closed-loop figures of merit); the Sun-central Mars dynamics are cross-checked against JPL **DE440** (137 m @ 1-day arc, `xval/anise-mars-od`). Real DSN/ESTRACK tracking-data validation is on the roadmap. |
150
153
  | **Integrity** | Snapshot and solution-separation (ARAIM-style) RAIM with horizontal/vertical protection levels (HPL/VPL), fault detection & exclusion, and Stanford integrity diagrams; an explicit integrity-risk-budget (**MHSS**) protection level, including the **dual-/multi-constellation constellation-wide fault mode** (EU ARAIM / DO-316), exercised on a real GPS + Galileo snapshot (`scenarios/araim-gps-galileo.toml`). |
151
154
  | **Augmentation (SBAS)** | **SBAS / WAAS protection levels** in the DO-229E weighted-least-squares form (precision-approach and en-route K-factors) and the **L1/L5 dual-frequency ionosphere-free** combination (IS-GPS-705, γ₁₅ ≈ 1.793) that underpins DO-316 — `src/sbas.rs`, with the protection-level geometry cross-checked against a NumPy `inv(GᵀG)` reference. |
152
- | **Clock & timing** | Two-state Kalman holdover (Joseph-form covariance, NIS/NEES consistency health); Allan-family stability (ADEV / MDEV / TDEV / HDEV) with noise-type-specific confidence intervals and a full **IEEE-1139 five-coefficient power-law fit**; geometric corrections (Sagnac, GNSS common-view); and the operational transfer methods — **TWSTFT** with the BIPM Sagnac closed form, **GNSS common-view**, **PPP** ionosphere-free time transfer, a free-space **optical** link with turbulence scintillation, and an inverse-variance **clock-ensemble (paper) timescale** below the best contributing clock. |
155
+ | **Clock & timing** | Two-state Kalman holdover (Joseph-form covariance, NIS/NEES consistency health); Allan-family stability (ADEV / MDEV / TDEV / HDEV) with noise-type-specific confidence intervals and a full **IEEE-1139 five-coefficient power-law fit**; geometric corrections (Sagnac, GNSS common-view); and the operational transfer methods — **TWSTFT** with the BIPM Sagnac closed form, **GNSS common-view**, **PPP** ionosphere-free time transfer, a free-space **optical** link with turbulence scintillation, and an inverse-variance **clock-ensemble (paper) timescale** below the best contributing clock. A **GNSS-denied clock-holdover calculator** (`src/holdover.rs`) exposes the closed-form van-Loan coast-error growth as a *holdover-to-threshold* inversion — how long a clock free-runs before its timing error exceeds budget — across representative classical and quantum-clock classes; **modelled** (cross-checked against the multi-step `clock_state` covariance recursion), and honest that for a very stable clock the holdover to a tight threshold is set by the *assumed* long-tau noise floor, not the cited ADEV. |
153
156
  | **GNSS measurement domain** | Forward pseudorange / Doppler synthesis with **Klobuchar** (broadcast) and **IONEX / TEC-grid** (measured) ionosphere — including an IONEX file parser, time interpolation between maps, and the thin-shell slant-obliquity mapping — **Saastamoinen + Niell** troposphere, and snapshot RAIM (HPL/VPL). |
154
- | **Resilience** | Link-budget **jamming** (J/S → effective C/N₀ → loss of lock); a stochastic **time-spoof detector** (Neyman–Pearson / χ²₁ energy test with closed-form and Monte-Carlo P_fa/P_md and a Security FoM of 1 − P_md); and a **multi-layer spoof detector** fusing a RAIM-consistency parity test (with the common-mode blind spot modelled honestly), an RF AGC-power monitor, and a signal-quality (SQM early-minus-late) monitor. |
155
- | **Interoperability** | **RINEX-3** multi-GNSS broadcast-ephemeris ingestion (GPS, Galileo, QZSS, BeiDou MEO/IGSO via IS-GPS-200; GLONASS via PZ-90 state-vector RK4) usable as a constellation source (RINEX in, PNT geometry out); a **RINEX-3/4** observation parser (pseudorange, carrier phase, Doppler, signal strength) that now **feeds a single-point-positioning solver** (`pvt`) real code observations in, a real **receiver position** out, validated on IGS data; an **SP3-c/d** precise-ephemeris reader/writer with 9th-order Lagrange interpolation; and **CCSDS OEM 2.0 + OMM** (mean-elements) export for flight-dynamics tools (GMAT, Orekit, STK). |
157
+ | **Resilience** | Link-budget **jamming** (J/S → effective C/N₀ → loss of lock, with the anti-jam spectral-separation factor `Q` now **derived from the actual signal and jammer power spectra** via `src/navsignal.rs` — `Q = 1/(R_c·κ)`, cross-checked in CI against the previous representative constant); a stochastic **time-spoof detector** (Neyman–Pearson / χ²₁ energy test with closed-form and Monte-Carlo P_fa/P_md and a Security FoM of 1 − P_md); and a **multi-layer spoof detector** fusing a RAIM-consistency parity test (with the common-mode blind spot modelled honestly), an RF AGC-power monitor, and a signal-quality (SQM early-minus-late) monitor; and a **quantum-inertial dead-reckoning error budget** (`QuantumNavBudget`, `src/inertial/quantum_imu.rs`) composing the cold-atom-interferometer white-noise velocity-random-walk with residual bias (cross-checked against the independent `AccelModel` integrator) and scale-factor error into a position-drift-over-holdover figure — the inertial twin of the clock holdover. |
158
+ | **Nav-signal & code tracking** | The **signal level** between the link budget and the measurement domain (`src/navsignal.rs`): unit-area **power spectral densities** for **BPSK-R(n)** and **sine-BOC(m,n)**; the **spectral-separation coefficient** κ = ∫ G_s·G_i df, which **derives the anti-jam `Q`** the jamming model uses (`Q = 1/(R_c·κ)`) from the actual signal/jammer spectra instead of a representative constant; the **RMS (Gabor) bandwidth** (BOC > BPSK the ranging-information / Cramér–Rao measure); the **coherent early–late DLL code-tracking thermal-noise jitter** (Kaplan & Hegarty; ~sub-metre for C/A at 45 dB-Hz); and the **multipath error envelope** (coherent EML narrow-correlator suppression). Validated against closed-form anchors (BPSK self-SSC = 2/(3·R_c), unit-area PSDs, sub-metre C/A jitter). This is signal-**performance** analysis, **not** antenna / RF-payload hardware design (a payload partner's role). |
159
+ | **Interoperability** | **RINEX-3** multi-GNSS broadcast-ephemeris ingestion (GPS, Galileo, QZSS, BeiDou MEO/IGSO via IS-GPS-200; GLONASS via PZ-90 state-vector RK4) usable as a constellation source (RINEX in, PNT geometry out); a **RINEX-3/4** observation parser (pseudorange, carrier phase, Doppler, signal strength) that now **feeds a single-point-positioning solver** (`pvt`) — real code observations in, a real **receiver position** out, validated on IGS data; an **SP3-c/d** precise-ephemeris reader/writer with 9th-order Lagrange interpolation; and **CCSDS OEM 2.0 + OMM** (mean-elements) export for flight-dynamics tools (GMAT, Orekit, STK); and **CCSDS-TDM (503)** tracking-data-message parse + emit for deep-space radiometric tracking. |
156
160
 
157
161
  Each capability is reachable as a Rust API, a runnable scenario `kind`, or both.
158
162
  Maturity per capability — *validated*, *runnable*, or *library* — is tracked in
159
- [`docs/CAPABILITY.md`](docs/CAPABILITY.md).
163
+ [`docs/CAPABILITY.md`](docs/CAPABILITY.md). A **machine-checked verification matrix**
164
+ (`src/verification.rs`) renders the requirement → module → test → oracle → status
165
+ cross-reference, with unit-tested honesty invariants that permit a *validated* label
166
+ only where an independent **external** oracle backs it — and that record the
167
+ hardware/PA capabilities Kshana deliberately does **not** provide.
160
168
 
161
169
  ## Results
162
170
 
@@ -252,6 +260,9 @@ cargo run -- scenarios/orbit-sgp4-gps.toml --export-sp3 gps.sp3
252
260
  # Export the constellation's mean elements to a CCSDS OMM catalogue (one OMM
253
261
  # message per TLE-defined satellite, with its real NORAD id / COSPAR designator):
254
262
  cargo run -- scenarios/orbit-sgp4-gps.toml --export-omm gps.omm
263
+
264
+ # Export the velocity-carrying state to a CCSDS OEM 2.0 ephemeris (GMAT/Orekit/STK):
265
+ cargo run -- scenarios/orbit-sgp4-gps.toml --export-oem gps.oem
255
266
  ```
256
267
 
257
268
  **Interoperability role.** Kshana is the *performance-simulation* layer that sits
@@ -358,11 +369,25 @@ plugin from the JetBrains Marketplace (or *Settings → Plugins → Marketplace
358
369
 
359
370
  ## Scenario format
360
371
 
361
- Scenarios are declarative TOML. A top-level `kind` selects the pack — **twenty** in
362
- all (`clock` is the default if omitted): `inertial`, `timetransfer`, `hybrid`, `fusion`,
372
+ Scenarios are declarative TOML. A top-level `kind` selects the pack — **thirty-four** in
373
+ all (`clock` is the default if omitted): `inertial`, `timetransfer`, `hybrid`, `hybrid-ukf`, `fusion`,
363
374
  `gnss-ins`, `orbit`, `ephemeris`, `gnss-sim`, `integrity`, `lunar-integrity`, `spoof`,
364
- `spoof-detect`, `jamming`, `sweep`, `sweep-nd`, `gravity-map`, `terrain-nav`,
365
- `combined-altpnt`, and `pvt`.
375
+ `spoof-detect`, `jamming`, `sweep`, `sweep-nd`, `gravity-map`, `terrain-nav`, `terrain-slam`,
376
+ `combined-altpnt`, `pvt`, `mars-pnt`, `impairment-eval` (AI/ML RF-impairment detection
377
+ evaluation testbed — labelled synthetic corpus + detector-agnostic ROC/AUC harness +
378
+ in/out-of-distribution optimism gap), `quantum-trade` (quantum-vs-classical PNT
379
+ trade with measured-ADEV ingestion + GNSS-denied resilience envelope; MODELLED),
380
+ `space-weather` (solar/geomagnetic indices + Jacchia-71 exospheric temperature +
381
+ activity-driven thermospheric density over the static atmosphere; MODELLED),
382
+ `oem-interop` (CCSDS OEM import/round-trip bridge for GMAT/Orekit/STK ephemerides;
383
+ MODELLED), the mission-analysis trio `launch-window` (two-body launch azimuth /
384
+ plane-change / opportunities), `reentry` (Allen-Eggers ballistic re-entry corridor),
385
+ `eo-coverage` (EO swath / GSD / access / revisit geometry), `space-packet` (CCSDS
386
+ 133.0 TM/TC Space Packet framing — exact bit layout, round-trip verified), and
387
+ `attitude-budget` (3-DOF gravity-gradient torque + RSS pointing error budget),
388
+ `passes` (ground-station rise/set pass prediction — AOS/TCA/LOS, max elevation,
389
+ access), and `link-budget` (one-way CCSDS/DSN link equation — FSPL / Eb·N₀ /
390
+ margin / closure) — all MODELLED.
366
391
  Common fields: `seed`, a `[time]` grid, a `[gnss]` availability timeline (the outage
367
392
  driver), and per-sensor blocks with `provenance` strings citing the source of every
368
393
  figure. Example (clock):
@@ -593,7 +618,7 @@ flowchart LR
593
618
 
594
619
  ```mermaid
595
620
  flowchart TD
596
- cli["CLI · Python · WebAssembly · MCP server · JetBrains plugin"] --> api["api — run_toml: typed dispatch over 20 kinds"]
621
+ cli["CLI · Python · WebAssembly · MCP server · JetBrains plugin"] --> api["api — run_toml: typed dispatch over 34 kinds"]
597
622
  subgraph shared["Shared core"]
598
623
  types["types · scenario · GNSS timeline"]
599
624
  allan["allan — ADEV/MDEV/TDEV/HDEV"]
@@ -617,13 +642,14 @@ flowchart TD
617
642
  gsh["gravity_sh — EGM2008 d/o 70"]
618
643
  integ["integrator — RK4 · DOPRI"]
619
644
  man["maneuver · orbit_determination"]
620
- cr["cr3bp — Earth–Moon CR3BP"]
645
+ cr["cr3bp — Earth–Moon CR3BP + halo/NRHO corrector"]
621
646
  end
622
647
  subgraph intg["Integrity & GNSS"]
623
648
  raim["raim — RAIM/ARAIM · HPL/VPL"]
624
649
  sbas["sbas — DO-229E PL · L1/L5"]
625
650
  gsim["gnss_sim · ionex — measurement domain"]
626
651
  jam["jamming — J/S → C/N₀"]
652
+ nsig["navsignal — PSD · SSC → anti-jam Q · DLL jitter"]
627
653
  lun["lunar — cislunar ARAIM"]
628
654
  end
629
655
  subgraph fnav["Fusion & alt-PNT"]
@@ -631,13 +657,19 @@ flowchart TD
631
657
  grav["gravimeter · mapmatch · particle_filter"]
632
658
  terr["altpnt/terrain · igrf — terrain + magnetic"]
633
659
  end
660
+ subgraph ds["Deep-space & Mars"]
661
+ dsr["radiometric · ccsds_tdm — light-time · Δ-DOR · TDM"]
662
+ dso["deepspace_od — reduced-dynamic SRIF"]
663
+ dsm["mars_pnt · gse_sim — relay-PNT + GSE sim"]
664
+ end
634
665
  subgraph io["Interop formats"]
635
- iofmt["rinex · sp3 · oem · omm · glonass"]
666
+ iofmt["rinex · sp3 · oem · omm · glonass · ccsds_tdm"]
636
667
  end
637
668
  api --> packs
638
669
  api --> astro
639
670
  api --> intg
640
671
  api --> fnav
672
+ api --> ds
641
673
  packs --> shared
642
674
  astro --> frames
643
675
  orbit --> sgp4
@@ -645,6 +677,7 @@ flowchart TD
645
677
  prop --> gsh
646
678
  prop --> integ
647
679
  cr --> integ
680
+ nsig --> jam
648
681
  fus --> p2
649
682
  grav --> p2
650
683
  terr --> grav
@@ -666,7 +699,7 @@ flowchart LR
666
699
  core["kshana core<br/>library + CLI"]
667
700
  mcp["mcp/kshana-mcp<br/>MCP server (excluded crate)"]
668
701
  ide["ide/jetbrains<br/>Kotlin IDE plugin"]
669
- xval["xval/anise-frames<br/>SPICE cross-check (excluded)"]
702
+ xval["xval/anise-{frames,lunar-od,mars-od}<br/>SPICE/DE440 cross-checks (excluded)"]
670
703
  end
671
704
  core --> crates["crates.io"]
672
705
  core --> pypi["PyPI — wheels"]
@@ -685,7 +718,7 @@ flowchart LR
685
718
  ```
686
719
  kshana/
687
720
  ├── src/ # the kshana core crate (library + CLI)
688
- │ ├── api.rs · main.rs · lib.rs # typed dispatch (20 kinds) + CLI + crate root
721
+ │ ├── api.rs · main.rs · lib.rs # typed dispatch (34 kinds) + CLI + crate root
689
722
  │ ├── python.rs · wasm.rs # optional PyO3 / wasm-bindgen bindings
690
723
  │ ├── types.rs · scenario.rs · allan.rs # shared core (time grid, GNSS timeline, Allan)
691
724
  │ │
@@ -703,18 +736,21 @@ kshana/
703
736
  │ ├── orbit.rs · sgp4.rs · tle.rs · walker.rs # geometry, SGP4/SDP4, TLE, Walker design
704
737
  │ ├── propagator.rs · forces.rs · gravity_sh.rs · integrator.rs # Cowell + perturbations (EGM2008 d/o70, GR) + RK4/DOPRI
705
738
  │ ├── maneuver.rs · batch_ls.rs · orbit_determination.rs # burns/Lambert/porkchop, Gauss-Newton, OD
706
- │ ├── cr3bp.rs · lunar.rs # Earth–Moon CR3BP, cislunar/LunaNet ARAIM
739
+ │ ├── cr3bp.rs · lunar.rs # Earth–Moon CR3BP + halo/NRHO STM corrector, cislunar/LunaNet ARAIM
740
+ │ ├── body.rs · mars_frame.rs · ephem_provider.rs · radiometric.rs · ccsds_tdm.rs # deep-space: multi-body · Mars frame · ephemeris seam · radiometric obs + CCSDS-TDM
741
+ │ ├── deepspace_od.rs · clock_state.rs · mars_atmos.rs · mars_pnt.rs · linkbudget.rs · gse_sim.rs # SRIF OD · onboard clock · Mars drag · relay-PNT · link budget · GSE sim
707
742
  │ │
708
743
  │ ├── fusion/ # GNSS/INS — EKF · UKF · tightly_coupled(17) · coupled · closed_loop
709
744
  │ ├── raim.rs · sbas.rs # RAIM/ARAIM HPL/VPL, SBAS DO-229E PLs + L1/L5 iono-free
710
- │ ├── gnss_sim.rs · ionex.rs · jamming.rs # measurement domain, ionosphere maps, jamming
745
+ │ ├── gnss_sim.rs · ionex.rs · pvt.rs · jamming.rs # measurement domain · ionosphere maps · single-point positioning · jamming
746
+ │ ├── navsignal.rs # nav-signal PSD (BPSK-R/BOC) · spectral-separation → anti-jam Q · DLL code-tracking jitter · multipath envelope
711
747
  │ ├── gravimeter.rs · igrf.rs · mapmatch.rs · particle_filter.rs · altpnt/ # gravity/magnetic/terrain alt-PNT
712
748
  │ ├── rinex.rs · rinex_obs.rs · glonass.rs · sp3.rs · oem.rs · omm.rs · permalink.rs # interop formats
713
749
  │ └── bin/validation_report.rs # builds the release validation-summary HTML
714
750
 
715
751
  ├── mcp/kshana-mcp/ # standalone, workspace-EXCLUDED crate — the MCP server (+ Dockerfile, server.json)
716
752
  ├── ide/jetbrains/ # standalone Kotlin/Gradle IntelliJ-Platform plugin
717
- ├── xval/anise-frames/ # standalone, workspace-EXCLUDED crate — ANISE/SPICE frame cross-check
753
+ ├── xval/anise-{frames,lunar-od,mars-od}/ # standalone, workspace-EXCLUDED ANISE/SPICE cross-checks (frames · lunar DE440 · Mars DE440)
718
754
 
719
755
  ├── scenarios/ # one cited .toml per kind + geometry-driven + GPS-denied
720
756
  ├── scripts/ # reproducibility + repo-hygiene + SBOM guards
@@ -787,14 +823,18 @@ artifact (generated by `cargo run --bin validation_report`, SLSA-attested).
787
823
  | Force-model fit vs Galileo precise ephemeris (full-arc) | **0.61 m** 3-D RMS, 24 h, d/o-70, force-only | ESA/ESOC `ESA0MGNFIN` final orbit (E11), real `finals2000A` EOP |
788
824
  | Force-model fit vs Swarm-A precise ephemeris (reduced-dynamic) | **0.10 m** 3-D RMS (empirical-tier bound, not a measure) | ESA `SW_OPER_SP3ACOM_2_` precise orbit |
789
825
  | Force-model fit vs LRO lunar (honest miss) | **6.6 m** reduced-dynamic, *above* the 5 m target | JPL Horizons LRO (NAIF −85) + GRAIL `GRGM660PRIM` |
826
+ | Deep-space Mars OD (reduced-dynamic SRIF) | **≈ 0.2 m** Mars-LMO (simulation FoM, *not* real-mission) | synthetic closed-loop OD — estimator-machinery validation |
827
+ | Sun-central Mars dynamics vs JPL DE440 | **137 m @ 1-day arc** (grows with arc = unmodelled n-body) | JPL DE440 via ANISE (`xval/anise-mars-od`, kernel-gated) |
790
828
  | Single-point positioning vs a surveyed IGS coordinate (real observations) | **5.7 m** 3-D RMS / **1.1 m** horizontal, dual-frequency iono-free code SPP | IGS station ABMF survey + GPS broadcast ephemeris, 2018-05-13 (`tests/pvt_abmf.rs`) |
791
829
  | Tightly-coupled GNSS/INS UKF | **0.77 m RMS** over a 30-min LEO pass incl. a 120 s outage | force-model coast, hand-derived |
792
830
  | GPS-denied gravity-map navigation | ~70 km INS drift → **~145 m** recovered | ESA NAVISP *Quantum Wayfarer* target |
793
831
  | Terrain-referenced navigation (TERCOM/SITAN) | 70 km drift → **< 500 m** (grid-resolution floor ~140 m) | SRTM `.hgt` DEM; hand-injected drift (non-circular check) |
794
832
  | IGRF-14 main field (degree/order 13) | pole ~80.7°N, dipole ~29.7 µT, physical 22–67 µT band | IAGA `igrf14coeffs.txt` (Schmidt semi-normalised) |
833
+ | Nav-signal modulation & code tracking | BPSK self-SSC = **2/(3·R_c)**; unit-area PSDs; **sub-metre** C/A DLL jitter @ 45 dB-Hz | Closed-form SSC/PSD anchors + Kaplan & Hegarty DLL thermal-noise formula |
834
+ | CR3BP halo/NRHO differential corrector | STM = finite differences; orbit closes to **machine precision**; L2 9:2 NRHO **≈ 6.57 d / perilune ≈ 3,250 km** | finite-difference STM check + published L2 southern 9:2 NRHO (≈ 6.56 d / ≈ 3,370 km) — CR3BP, not a real Gateway ephemeris |
795
835
  | ARAIM dual-constellation integrity | constellation-wide fault mode on real GPS + Galileo | EU ARAIM TR / DO-316; Celestrak `gps-ops` 2021-07-28 |
796
836
  | Cross-platform reproducibility | bit-identical input + shape goldens on 3 OSes | Linux / macOS / Windows CI matrix, SHA-256 goldens |
797
- | Test coverage | **~97 % line** on `src/`, gated ≥ 85 % | cargo-tarpaulin (LLVM engine) |
837
+ | Test coverage | **~96 % line** on `src/`, gated ≥ 85 % | cargo-tarpaulin (LLVM engine) |
798
838
 
799
839
  ## FAQ
800
840
 
@@ -855,9 +895,9 @@ for released history, and [`docs/CAPABILITY.md`](docs/CAPABILITY.md) for the
855
895
  per-capability roadmap. The **ITRF-precise frame reduction** is now delivered — the
856
896
  full CIO-based IAU 2006/2000A GCRS↔ITRS chain (polar motion + sub-arcsecond nutation),
857
897
  validated bit-for-bit against SOFA/ERFA and independently cross-checked against ANISE
858
- (pure-Rust SPICE) to ≤ 3.6 m at GNSS orbit. Near-term items include two-part Julian
859
- dates, tightly-coupled carrier-phase fusion, and surfacing the loosely-/tightly-coupled
860
- GNSS/INS navigator across more packs. The
898
+ (pure-Rust SPICE) to ≤ 3.6 m at GNSS orbit. Near-term items include tightly-coupled carrier-phase fusion and surfacing the
899
+ loosely-/tightly-coupled GNSS/INS navigator across more packs; the **deep-space / Mars
900
+ radiometric-navigation** engine landed in v0.17.0 (simulation-validated). The
861
901
  **quantum physics layer** is a **P2** item: the CAI accelerometer is now simulated from
862
902
  first principles (Mach–Zehnder phase, projection noise, contrast decay, vibration
863
903
  coupling), while the clock/time-transfer sensors are still driven by published
@@ -888,7 +928,7 @@ entry for every user-visible change. Participation is governed by our
888
928
 
889
929
  If you use Kshana in academic or technical work, please cite it. Machine-readable
890
930
  metadata is in [`CITATION.cff`](CITATION.cff) (GitHub renders a "Cite this repository"
891
- button from it); cite the version you used (e.g. `v0.17.0`) together with the
931
+ button from it); cite the version you used (e.g. `v0.18.0`) together with the
892
932
  scenario and seed for full reproducibility. Every release is archived on Zenodo with
893
933
  a citable DOI — the concept DOI [10.5281/zenodo.20528627](https://doi.org/10.5281/zenodo.20528627)
894
934
  always resolves to the latest version.
@@ -906,7 +946,7 @@ the [`CHANGELOG.md`](CHANGELOG.md). Every result is reproducible from
906
946
 
907
947
  | Channel | Install / get | Contents |
908
948
  |---------|---------------|----------|
909
- | [crates.io](https://crates.io/crates/kshana) | `cargo install kshana` · `kshana = "0.16"` | Rust library + CLI |
949
+ | [crates.io](https://crates.io/crates/kshana) | `cargo install kshana` · `kshana = "0.18"` | Rust library + CLI |
910
950
  | [crates.io](https://crates.io/crates/kshana-mcp) | `cargo install kshana-mcp` | the MCP server |
911
951
  | [PyPI](https://pypi.org/project/kshana/) | `pip install kshana` | abi3 wheels (Linux/macOS/Windows) + sdist |
912
952
  | [npm](https://www.npmjs.com/package/kshana) | `npm install kshana` | WebAssembly module + JS wrapper |
@@ -952,25 +992,28 @@ Contact **contact@ashforde.org**.
952
992
 
953
993
  **Validation oracles & standards** — the external authorities Kshana's checks are anchored to:
954
994
 
955
- - Vallado, Crawford, Hujsak & Kelso — *Revisiting Spacetrack Report #3* ([AIAA 2006-6753](https://celestrak.org/publications/AIAA/2006-6753/)): the SGP4/SDP4 verification set Kshana matches to 4.12 mm, and the worked frame examples the TEME→ITRF chain is checked against.
995
+ - Vallado, Crawford, Hujsak & Kelso — *Revisiting Spacetrack Report #3* ([AIAA 2006-6753](https://doi.org/10.2514/6.2006-6753); [test data](https://celestrak.org/publications/AIAA/2006-6753/)): the SGP4/SDP4 verification set Kshana matches to 4.12 mm, and the worked frame examples the TEME→ITRF chain is checked against.
956
996
  - IAU [SOFA](https://www.iausofa.org/) / [ERFA](https://github.com/liberfa/erfa) — the reference time and frame routines the IAU 2000A nutation and the CIO GCRS↔ITRS reduction are validated bit-for-bit against.
957
997
  - Petit & Luzum (eds.) — *IERS Conventions (2010)*, [IERS TN 36](https://www.iers.org/IERS/EN/Publications/TechnicalNotes/tn36.html) (Earth-orientation, polar motion, and frame standards).
958
- - Riley — *Handbook of Frequency Stability Analysis*, [NIST SP 1065](https://tf.nist.gov/general/pdf/2220.pdf) (Allan-deviation relations and the NBS14 reference series).
959
- - Montenbruck & Gill — *Satellite Orbits: Models, Methods and Applications* (Springer): the force models behind the force-model fit to agency precise ephemerides.
998
+ - Riley — *Handbook of Frequency Stability Analysis*, [NIST SP 1065](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication1065.pdf) (Allan-deviation relations and the NBS14 reference series).
999
+ - Montenbruck & Gill — *Satellite Orbits: Models, Methods and Applications* ([Springer](https://doi.org/10.1007/978-3-642-58351-3)): the force models behind the force-model fit to agency precise ephemerides.
1000
+ - Howell — *Three-dimensional, periodic, halo orbits*, Celestial Mechanics 32(1) (1984), [doi:10.1007/BF01358403](https://doi.org/10.1007/BF01358403); Zimovan-Spreen, Howell & Davis — *Near rectilinear halo orbits and nearby higher-period dynamical structures*, Astrodynamics 6 (2022), [doi:10.1007/s42064-021-0125-x](https://doi.org/10.1007/s42064-021-0125-x) (the halo/NRHO families the CR3BP differential corrector reproduces).
960
1001
 
961
1002
  **Device & method physics** — the cited sources behind the sensor models:
962
1003
 
963
1004
  - Origlia, Schiller, Bongs et al. — [arXiv:1503.08457](https://arxiv.org/abs/1503.08457) (strontium optical lattice clock, space-oriented goal).
964
- - Oelker et al., *Nature Photonics* (2019) — [JILA PDF](https://jila-pfc.colorado.edu/sites/default/files/2019-09/Oelker-Sr%20record%20stability_2019-Nature_Photonics.pdf) (laboratory Sr clock, 4.8×10⁻¹⁷).
1005
+ - Oelker et al., *Nature Photonics* (2019) — [doi:10.1038/s41566-019-0493-4](https://doi.org/10.1038/s41566-019-0493-4) (laboratory Sr clock, 4.8×10⁻¹⁷).
965
1006
  - Templier et al., *Science Advances* (2022) — [arXiv:2209.13209](https://arxiv.org/abs/2209.13209) (hybrid quantum accelerometer triad).
966
1007
  - Groves, *Principles of GNSS, Inertial, and Multisensor Integrated Navigation* — [IEEE AESS tutorial (UCL Discovery)](https://discovery.ucl.ac.uk/id/eprint/1470141/) (dead-reckoning error growth).
967
1008
  - Giorgetta et al., *Nature Photonics* 7, 434 (2013) — [arXiv:1211.4902](https://arxiv.org/abs/1211.4902); Deschênes et al., *Phys. Rev. X* 6, 021016 (2016) — [APS](https://journals.aps.org/prx/abstract/10.1103/PhysRevX.6.021016) (optical two-way time-frequency transfer; the optical inter-satellite link models its non-reciprocity budget after these).
1009
+ - Betz — *Binary Offset Carrier Modulations for Radionavigation*, NAVIGATION 48(4) (2001), [doi:10.1002/j.2161-4296.2001.tb00247.x](https://doi.org/10.1002/j.2161-4296.2001.tb00247.x) (the BOC modulation and spectral-separation theory behind `src/navsignal.rs`).
1010
+ - Kaplan & Hegarty (eds.) — *Understanding GPS/GNSS: Principles and Applications* (3rd ed., Artech House, 2017): the anti-jam effective-C/N₀ equation and the early–late DLL code-tracking thermal-noise jitter the nav-signal and jamming models use.
968
1011
 
969
1012
  **Comparison & open prior art** — the tools and surveys Kshana is positioned against:
970
1013
 
971
- - Humphreys et al. — *TEXBAT* (ION GNSS 2012): the spoofing test-battery parameters the multi-layer detector is characterised against.
1014
+ - Humphreys et al. — [*TEXBAT*](https://radionavlab.ae.utexas.edu/texbat/) (ION GNSS 2012): the spoofing test-battery parameters the multi-layer detector is characterised against.
972
1015
  - González et al. — [NaveGo](https://github.com/rodralez/NaveGo) (2017): the open, validated inertial-navigation error profiles used as the classical baseline.
973
- - Iiyama, Casadesús Vila & Gao — *LuPNT* (ION GNSS+ 2023, Stanford NavLab): open lunar-PNT simulator.
1016
+ - Iiyama, Casadesús Vila & Gao — [*LuPNT*](https://github.com/Stanford-NavLab/LuPNT) (ION GNSS+ 2023, Stanford NavLab): open lunar-PNT simulator.
974
1017
  - Knowles, Kanhere, Neamati & Gao — *gnss\_lib\_py*, SoftwareX 27 (2024), [doi:10.1016/j.softx.2024.101811](https://doi.org/10.1016/j.softx.2024.101811): open GNSS data analysis.
975
1018
  - Li, Zaminpardaz, Kealy & Greentree — *Quantum sensors for enhanced positioning and navigation: a comprehensive review*, GPS Solutions 30(1):62 (2026), [doi:10.1007/s10291-026-02030-y](https://doi.org/10.1007/s10291-026-02030-y).
976
- - Bertone et al. — *Advances in Space Research* (2021): GRAIL reduced-dynamic OD, the empirical-acceleration floor the LRO fit reproduces.
1019
+ - Bertone et al. — *Earth and Space Science* 8(6) (2021), [doi:10.1029/2020EA001454](https://doi.org/10.1029/2020EA001454): GRAIL reduced-dynamic OD, the empirical-acceleration floor the LRO fit reproduces.
package/kshana_bg.wasm CHANGED
Binary file
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "Chakshu Baweja <contact@ashforde.org>"
6
6
  ],
7
7
  "description": "Open, reproducible PNT-resilience simulator with quantum-sensor performance models",
8
- "version": "0.17.0",
8
+ "version": "0.18.0",
9
9
  "license": "Apache-2.0",
10
10
  "repository": {
11
11
  "type": "git",