kshana 0.16.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.
Files changed (3) hide show
  1. package/README.md +110 -35
  2. package/kshana_bg.wasm +0 -0
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -12,9 +12,9 @@
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
- <a href="https://github.com/ashfordeOU/kshana/releases"><img src="https://img.shields.io/badge/release-v0.16.0-c79e63" alt="Release v0.16.0"></a>
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>
19
19
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-Apache_2.0-blue.svg" alt="License: Apache-2.0"></a>
20
20
  <a href="Cargo.toml"><img src="https://img.shields.io/badge/rust-1.75%2B-orange.svg" alt="Rust 1.75+"></a>
@@ -44,16 +44,26 @@ citable table in [`docs/PROVENANCE.md`](docs/PROVENANCE.md).
44
44
  *Free and open source under Apache-2.0, professionally developed and maintained by
45
45
  Ashforde OÜ — commercial support, integration, and proprietary extensions available.*
46
46
 
47
- > **Status: v0.16.0 · a simulation substrate, not yet a product.** A validated,
47
+ > **Status: v0.17.0 · a simulation substrate, not yet a product.** A validated,
48
48
  > fully reproducible engine spanning the PNT stack — orbit geometry and constellation
49
49
  > design, a numerical (Cowell) propagator with a six-perturbation force model, maneuver
50
50
  > and trajectory design, time systems, inertial navigation (incl. map-aided and
51
51
  > gravity-map-matching alt-PNT), GNSS/INS fusion (loose, tight, UKF, coupled
52
52
  > clock+position, 17-state), orbit determination, ARAIM integrity, clocks, advanced
53
- > time-and-frequency transfer, the GNSS measurement domain, and resilience (jamming +
54
- > multi-layer spoofing).
53
+ > time-and-frequency transfer, the GNSS measurement domain, resilience (jamming +
54
+ > multi-layer spoofing), and an open **deep-space / Mars radiometric navigation**
55
+ > engine (light-time + Shapiro, CCSDS-TDM, reduced-dynamic SRIF, one-/two-way fusion).
55
56
  > Honest by design: every figure of merit is labelled *validated* or *not-modeled*, and
56
57
  > optical-clock figures are space goals on ground hardware (no strontium optical clock has flown).
58
+ >
59
+ > **Validation ladder** (maturity is *not* uniform across domains — and saying so is the point):
60
+ > | Domain | Tier |
61
+ > |---|---|
62
+ > | Earth PNT (orbit, frames, time, clocks, IMU, integrity) | **Real-data validated** — ESA SP3 (Galileo 0.13 m, Swarm-A 0.10 m), NIST SP1065, SOFA/ERFA, heritage vectors |
63
+ > | Deep-space / Mars navigation | **Simulation-validated** — synthetic closed-loop OD + analytic self-consistency; Sun-central dynamics cross-checked vs JPL **DE440** (137 m @ 1-day arc) |
64
+ > | Real-mission deep-space OD | **Roadmap** — pending real DSN/ESTRACK tracking-data validation |
65
+ >
66
+ > Deep-space figures (Mars-LMO OD ≈ 0.2 m; relay-PNT orbiter 0.4 m / rover 5.1 m) are **simulation / covariance figures of merit**, not real-mission results.
57
67
  > See **[Capabilities](#capabilities)** for what it does, **[What it is / is not](#what-it-is--is-not)**
58
68
  > for scope, and [`docs/CAPABILITY.md`](docs/CAPABILITY.md) / [`docs/VALIDATION.md`](docs/VALIDATION.md)
59
69
  > for per-capability maturity. The overclaim closure ledger
@@ -118,9 +128,11 @@ consume published Allan/noise-budget coefficients; the CAI accelerometer has a
118
128
  first-principles layer — Mach–Zehnder phase, projection noise, contrast decay, and
119
129
  vibration coupling — but Coriolis and light-shift systematics remain a **P2** roadmap
120
130
  layer, see [`ROADMAP.md`](ROADMAP.md) and [`docs/QUANTUM-MODELS.md`](docs/QUANTUM-MODELS.md));
121
- a GNSS receiver or PVT solver (it models the measurement domain and resilience, not
122
- signal acquisition or a least-squares fix); or a mission-design / orbit-determination
123
- 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
124
136
  interferometer error budgets (e.g. CARIOQA-PMP-grade or X-37B-style validation), see
125
137
  the P2 roadmap and [get in touch](#support--professional-services) to collaborate.
126
138
 
@@ -136,17 +148,23 @@ the P2 roadmap and [get in touch](#support--professional-services) to collaborat
136
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. |
137
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. |
138
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`). |
139
- | **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. |
140
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`). |
141
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. |
142
- | **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. |
143
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). |
144
- | **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. |
145
- | **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); 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. |
146
160
 
147
161
  Each capability is reachable as a Rust API, a runnable scenario `kind`, or both.
148
162
  Maturity per capability — *validated*, *runnable*, or *library* — is tracked in
149
- [`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.
150
168
 
151
169
  ## Results
152
170
 
@@ -242,6 +260,9 @@ cargo run -- scenarios/orbit-sgp4-gps.toml --export-sp3 gps.sp3
242
260
  # Export the constellation's mean elements to a CCSDS OMM catalogue (one OMM
243
261
  # message per TLE-defined satellite, with its real NORAD id / COSPAR designator):
244
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
245
266
  ```
246
267
 
247
268
  **Interoperability role.** Kshana is the *performance-simulation* layer that sits
@@ -348,10 +369,25 @@ plugin from the JetBrains Marketplace (or *Settings → Plugins → Marketplace
348
369
 
349
370
  ## Scenario format
350
371
 
351
- Scenarios are declarative TOML. A top-level `kind` selects the pack — **seventeen** in
352
- all (`clock` is the default if omitted): `inertial`, `timetransfer`, `hybrid`, `fusion`,
353
- `gnss-ins`, `orbit`, `gnss-sim`, `integrity`, `lunar-integrity`, `spoof`, `jamming`,
354
- `sweep`, `sweep-nd`, `gravity-map`, `terrain-nav`, and `combined-altpnt`.
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`,
374
+ `gnss-ins`, `orbit`, `ephemeris`, `gnss-sim`, `integrity`, `lunar-integrity`, `spoof`,
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.
355
391
  Common fields: `seed`, a `[time]` grid, a `[gnss]` availability timeline (the outage
356
392
  driver), and per-sensor blocks with `provenance` strings citing the source of every
357
393
  figure. Example (clock):
@@ -582,7 +618,7 @@ flowchart LR
582
618
 
583
619
  ```mermaid
584
620
  flowchart TD
585
- cli["CLI · Python · WebAssembly · MCP server · JetBrains plugin"] --> api["api — run_toml: typed dispatch over 17 kinds"]
621
+ cli["CLI · Python · WebAssembly · MCP server · JetBrains plugin"] --> api["api — run_toml: typed dispatch over 34 kinds"]
586
622
  subgraph shared["Shared core"]
587
623
  types["types · scenario · GNSS timeline"]
588
624
  allan["allan — ADEV/MDEV/TDEV/HDEV"]
@@ -606,13 +642,14 @@ flowchart TD
606
642
  gsh["gravity_sh — EGM2008 d/o 70"]
607
643
  integ["integrator — RK4 · DOPRI"]
608
644
  man["maneuver · orbit_determination"]
609
- cr["cr3bp — Earth–Moon CR3BP"]
645
+ cr["cr3bp — Earth–Moon CR3BP + halo/NRHO corrector"]
610
646
  end
611
647
  subgraph intg["Integrity & GNSS"]
612
648
  raim["raim — RAIM/ARAIM · HPL/VPL"]
613
649
  sbas["sbas — DO-229E PL · L1/L5"]
614
650
  gsim["gnss_sim · ionex — measurement domain"]
615
651
  jam["jamming — J/S → C/N₀"]
652
+ nsig["navsignal — PSD · SSC → anti-jam Q · DLL jitter"]
616
653
  lun["lunar — cislunar ARAIM"]
617
654
  end
618
655
  subgraph fnav["Fusion & alt-PNT"]
@@ -620,13 +657,19 @@ flowchart TD
620
657
  grav["gravimeter · mapmatch · particle_filter"]
621
658
  terr["altpnt/terrain · igrf — terrain + magnetic"]
622
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
623
665
  subgraph io["Interop formats"]
624
- iofmt["rinex · sp3 · oem · omm · glonass"]
666
+ iofmt["rinex · sp3 · oem · omm · glonass · ccsds_tdm"]
625
667
  end
626
668
  api --> packs
627
669
  api --> astro
628
670
  api --> intg
629
671
  api --> fnav
672
+ api --> ds
630
673
  packs --> shared
631
674
  astro --> frames
632
675
  orbit --> sgp4
@@ -634,6 +677,7 @@ flowchart TD
634
677
  prop --> gsh
635
678
  prop --> integ
636
679
  cr --> integ
680
+ nsig --> jam
637
681
  fus --> p2
638
682
  grav --> p2
639
683
  terr --> grav
@@ -655,7 +699,7 @@ flowchart LR
655
699
  core["kshana core<br/>library + CLI"]
656
700
  mcp["mcp/kshana-mcp<br/>MCP server (excluded crate)"]
657
701
  ide["ide/jetbrains<br/>Kotlin IDE plugin"]
658
- xval["xval/anise-frames<br/>SPICE cross-check (excluded)"]
702
+ xval["xval/anise-{frames,lunar-od,mars-od}<br/>SPICE/DE440 cross-checks (excluded)"]
659
703
  end
660
704
  core --> crates["crates.io"]
661
705
  core --> pypi["PyPI — wheels"]
@@ -674,7 +718,7 @@ flowchart LR
674
718
  ```
675
719
  kshana/
676
720
  ├── src/ # the kshana core crate (library + CLI)
677
- │ ├── api.rs · main.rs · lib.rs # typed dispatch (17 kinds) + CLI + crate root
721
+ │ ├── api.rs · main.rs · lib.rs # typed dispatch (34 kinds) + CLI + crate root
678
722
  │ ├── python.rs · wasm.rs # optional PyO3 / wasm-bindgen bindings
679
723
  │ ├── types.rs · scenario.rs · allan.rs # shared core (time grid, GNSS timeline, Allan)
680
724
  │ │
@@ -692,18 +736,21 @@ kshana/
692
736
  │ ├── orbit.rs · sgp4.rs · tle.rs · walker.rs # geometry, SGP4/SDP4, TLE, Walker design
693
737
  │ ├── propagator.rs · forces.rs · gravity_sh.rs · integrator.rs # Cowell + perturbations (EGM2008 d/o70, GR) + RK4/DOPRI
694
738
  │ ├── maneuver.rs · batch_ls.rs · orbit_determination.rs # burns/Lambert/porkchop, Gauss-Newton, OD
695
- │ ├── 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
696
742
  │ │
697
743
  │ ├── fusion/ # GNSS/INS — EKF · UKF · tightly_coupled(17) · coupled · closed_loop
698
744
  │ ├── raim.rs · sbas.rs # RAIM/ARAIM HPL/VPL, SBAS DO-229E PLs + L1/L5 iono-free
699
- │ ├── 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
700
747
  │ ├── gravimeter.rs · igrf.rs · mapmatch.rs · particle_filter.rs · altpnt/ # gravity/magnetic/terrain alt-PNT
701
748
  │ ├── rinex.rs · rinex_obs.rs · glonass.rs · sp3.rs · oem.rs · omm.rs · permalink.rs # interop formats
702
749
  │ └── bin/validation_report.rs # builds the release validation-summary HTML
703
750
 
704
751
  ├── mcp/kshana-mcp/ # standalone, workspace-EXCLUDED crate — the MCP server (+ Dockerfile, server.json)
705
752
  ├── ide/jetbrains/ # standalone Kotlin/Gradle IntelliJ-Platform plugin
706
- ├── 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)
707
754
 
708
755
  ├── scenarios/ # one cited .toml per kind + geometry-driven + GPS-denied
709
756
  ├── scripts/ # reproducibility + repo-hygiene + SBOM guards
@@ -773,13 +820,21 @@ artifact (generated by `cargo run --bin validation_report`, SLSA-attested).
773
820
  | Numerical (Cowell) propagator, unperturbed | **sub-metre over 24 h**; energy/momentum conserve ~1e-9 | exact universal-variable Kepler |
774
821
  | Lambert · Tsiolkovsky · porkchop | round-trip to two-body truth; ΔV **< 0.01 %** | Izzo 2015 · rocket equation · analytic Hohmann floor |
775
822
  | Orbit determination (Gauss–Newton batch) | sub-m / mm·s⁻¹ noiseless; ~2 m at a 5 m noise floor | two-body + J2 over an RK4 arc |
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 |
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 |
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) |
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`) |
776
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 |
777
830
  | GPS-denied gravity-map navigation | ~70 km INS drift → **~145 m** recovered | ESA NAVISP *Quantum Wayfarer* target |
778
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) |
779
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 |
780
835
  | ARAIM dual-constellation integrity | constellation-wide fault mode on real GPS + Galileo | EU ARAIM TR / DO-316; Celestrak `gps-ops` 2021-07-28 |
781
836
  | Cross-platform reproducibility | bit-identical input + shape goldens on 3 OSes | Linux / macOS / Windows CI matrix, SHA-256 goldens |
782
- | 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) |
783
838
 
784
839
  ## FAQ
785
840
 
@@ -840,9 +895,9 @@ for released history, and [`docs/CAPABILITY.md`](docs/CAPABILITY.md) for the
840
895
  per-capability roadmap. The **ITRF-precise frame reduction** is now delivered — the
841
896
  full CIO-based IAU 2006/2000A GCRS↔ITRS chain (polar motion + sub-arcsecond nutation),
842
897
  validated bit-for-bit against SOFA/ERFA and independently cross-checked against ANISE
843
- (pure-Rust SPICE) to ≤ 3.6 m at GNSS orbit. Near-term items include two-part Julian
844
- dates, tightly-coupled carrier-phase fusion, and surfacing the loosely-/tightly-coupled
845
- 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
846
901
  **quantum physics layer** is a **P2** item: the CAI accelerometer is now simulated from
847
902
  first principles (Mach–Zehnder phase, projection noise, contrast decay, vibration
848
903
  coupling), while the clock/time-transfer sensors are still driven by published
@@ -873,7 +928,7 @@ entry for every user-visible change. Participation is governed by our
873
928
 
874
929
  If you use Kshana in academic or technical work, please cite it. Machine-readable
875
930
  metadata is in [`CITATION.cff`](CITATION.cff) (GitHub renders a "Cite this repository"
876
- button from it); cite the version you used (e.g. `v0.16.0`) together with the
931
+ button from it); cite the version you used (e.g. `v0.18.0`) together with the
877
932
  scenario and seed for full reproducibility. Every release is archived on Zenodo with
878
933
  a citable DOI — the concept DOI [10.5281/zenodo.20528627](https://doi.org/10.5281/zenodo.20528627)
879
934
  always resolves to the latest version.
@@ -891,7 +946,7 @@ the [`CHANGELOG.md`](CHANGELOG.md). Every result is reproducible from
891
946
 
892
947
  | Channel | Install / get | Contents |
893
948
  |---------|---------------|----------|
894
- | [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 |
895
950
  | [crates.io](https://crates.io/crates/kshana-mcp) | `cargo install kshana-mcp` | the MCP server |
896
951
  | [PyPI](https://pypi.org/project/kshana/) | `pip install kshana` | abi3 wheels (Linux/macOS/Windows) + sdist |
897
952
  | [npm](https://www.npmjs.com/package/kshana) | `npm install kshana` | WebAssembly module + JS wrapper |
@@ -935,10 +990,30 @@ Contact **contact@ashforde.org**.
935
990
 
936
991
  ## Key references
937
992
 
938
- - Riley, *Handbook of Frequency Stability Analysis* [NIST SP 1065](https://tf.nist.gov/general/pdf/2220.pdf) (Allan-deviation relations).
993
+ **Validation oracles & standards** the external authorities Kshana's checks are anchored to:
994
+
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.
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.
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).
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).
1001
+
1002
+ **Device & method physics** — the cited sources behind the sensor models:
1003
+
939
1004
  - Origlia, Schiller, Bongs et al. — [arXiv:1503.08457](https://arxiv.org/abs/1503.08457) (strontium optical lattice clock, space-oriented goal).
940
- - 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⁻¹⁷).
941
1006
  - Templier et al., *Science Advances* (2022) — [arXiv:2209.13209](https://arxiv.org/abs/2209.13209) (hybrid quantum accelerometer triad).
942
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).
943
- - 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).
944
- - Optical inter-satellite time-transfer concept see Giorgetta and Deschênes above.
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.
1011
+
1012
+ **Comparison & open prior art** — the tools and surveys Kshana is positioned against:
1013
+
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.
1015
+ - González et al. — [NaveGo](https://github.com/rodralez/NaveGo) (2017): the open, validated inertial-navigation error profiles used as the classical baseline.
1016
+ - Iiyama, Casadesús Vila & Gao — [*LuPNT*](https://github.com/Stanford-NavLab/LuPNT) (ION GNSS+ 2023, Stanford NavLab): open lunar-PNT simulator.
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.
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).
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.16.0",
8
+ "version": "0.18.0",
9
9
  "license": "Apache-2.0",
10
10
  "repository": {
11
11
  "type": "git",