v0.14.0
Fixed
- Robustness hardening from an adversarial battle-test pass. (1)
sbas_protection_levelnow
rejects non-finite elevation/azimuth/variance and negative or non-finite covariance diagonals
(a near-singular geometry scaled up by small σ could previously slip the absolute-pivot gate and
return a NaN VPL / absurd HPL as a validSome— a silent integrity failure). (2) The
numerical propagator (propagate/propagate_dopri) fails closed on a non-finite initial state
instead of spinning the adaptive controller forever. (3) The DEM cell helper no longer panics on
a single-sample (1×N) grid. (4)lunar_look_angleazimuth is held strictly in[0, 360).
(5)SphericalHarmonicField::from_gfcrejects non-physical (NaN / non-positive)GM/radius.
Added
validation_reportbinary + release artifact: a dependency-free generator that emits a
one-page, print-ready HTML validation summary indexing every CI-enforced validation (SGP4
666/666, EGM2008, bit-for-bit frames, NIST Allan, IMU datasheets, ARAIM/SBAS, 3-OS
reproducibility, coverage) to its test and external oracle. The release workflow generates
kshana-validation-summary.htmland attaches it (with SLSA provenance) to each tagged release.- numpy-interop pytest + wheel hardening:
tests/python/test_numpy_interop.py(run in CI)
plus a pinned manylinux container and anauditwheel showverification step in the wheel build. - Tutorials & education:
docs/tutorials/(three worked tutorials, per-domain annotated
scenarios, Tier-1/2/3 exercises) withtests/tutorials.rspinning every quoted number to live
engine output. - External submission artifacts (
paper/,notebooks/,submissions/): a JOSS paper
draft, a quantum-vs-classical notebook, and ready-to-file kits for awesome-gnss / ESA Navipedia
/ NASA ASCL / ESA ESSR / ION/IAC, plusFUNDING.yml— staging the external steps for submission. - Terrain-referenced & combined alt-PNT navigation (
altpntmodule): a TERCOM/SITAN
terrain-matching navigator over a DEM (.hgtloader + synthetic-fixture generator) and a
combined gravity + magnetic (IGRF) + terrain GPS-denied navigator, exposed asterrain-navand
combined-altpntscenario kinds. Validated by terrain-match convergence (a known injected
offset recovered) and a bounded combined-filter error over a GPS-denied window. - LunaNet LANS geometry (
lunar): named lunar surface sites (Apollo 11/15/16, Shackleton
rim) with authoritative selenographic coordinates, surface look angles (az/el/range),
visibility/coverage, and site DOP, validated against the Moon radius, the published site
coordinates, and the radial-overhead 90° elevation identity. - Guided browser playground: guided-mode sliders, a tabbed output panel, a first-run tour
overlay, parameter-sweep and multi-run-overlay modes, a dependency-free canvas/SVG 3D orbit
view (the orbit pack now emits an additiveeci_track), an embed/iframe mode, and
download-as-HTML-report — each with node unit tests in CI. - Datasheet-validated IMU error model (
tests/imu_allan_spec.rs): ADIS16465/16488/16460
ARW/VRW/bias-instability recovered from the synthesised Allan deviation and checked against the
manufacturer specs (NIST SP1065 / IEEE 952 identification). - NIST SP1065 Allan-estimator validation (
tests/allan_nist_sp1065_1000point.rs): the four
estimators reproduce the published 1000-point reference deviations and Table-32 confidence
bounds. - SBAS / DO-229E protection levels, L1/L5 ionosphere-free, and a DO-316 compliance map
(sbasmodule).sbas_protection_levelforms the weighted geometry matrix from each
satellite's elevation/azimuth and UDRE/GIVE/airborne/tropo error budget, inverts the normal
matrix (sharedorbit::invert4), and projects the variances into HPL/VPL via the DO-229E
K-factors (PA 6.0/5.33, NPA 6.18).iono_free_l1l5adds the GPS L1/L5 ionosphere-free
pseudorange (IS-GPS-705,γ₁₅ = 1.79327), validated to cancel the engine's independent
first-order ionospheric delay.do316_compliance_maptraces DO-316/DO-229E requirements to
the implementing functions. Validated against closed-form K-factor definitions, the numpy
inv(GᵀG)reference geometry, and the two-route covariance identity; the published-PL
RTKLIB/gLAB conformance cross-check is documented as founder-gated indocs/COMPLIANCE.md. - Full tesseral spherical-harmonic gravity — the EGM2008 field to degree/order 70.
A newgravity_sh::SphericalHarmonicFieldevaluates the geopotential and its acceleration
in the Earth-fixed frame from fully-normalizedC̄_nm, S̄_nmcoefficients, using the stable
Holmes–Featherstone normalized Legendre recurrence (de-normalizing would overflow at this
degree). The shipped coefficients are the NGA EGM2008 product (public domain, via ICGEM),
bundled inegm2008_data.rsand reproduced bit-for-bit bytools/gen_egm2008.pyfrom the
committedtools/egm2008_to70.gfc; any ICGEM.gfcmodel loads viafrom_gfc. Validated
against three independent oracles: point-mass collapse (C̄00-only =−μr/|r|³), a zonal-only
field reproducing the existingforces::zonal_accelto ~1e-9, and the analytic acceleration
matching the finite-difference gradient of the directly-summed potential to <1e-6. - General-relativistic Lense–Thirring (frame-dragging) acceleration
(forces::lense_thirring_accel, IERS 2010 Eq. 10.12), the gravitomagnetic term beyond the
existing Schwarzschild correction, wired into the numerical propagator via a new
ForceModel::lense_thirring()flag. Validated as linear in the Earth's angular momentum and
1–2 orders of magnitude below the Schwarzschild term, the regime of the LAGEOS / Gravity
Probe B measurements. - A
Propagatortrait unifying the analytic and numerical orbit propagators. The
numerical Cowell force-model propagator is now a first-class peer of SGP4: a new
NumericalPropagatortype (initial state +ForceModel+Tolerance+ choice of
step-doubling or Dormand–PrinceIntegrator) andSgp4both implement
propagator::Propagator, whosestate_at(t_seconds) -> StateVectorreturns the inertial
TEME state in SI units (m, m/s) so the two are interchangeable behind a
Box<dyn Propagator>. The SGP4 impl is the exact km/min→SI conversion of the inherent
method (verified by an equality test); the numerical impl clears the same sub-metre
exact-Kepler gate through the trait, the two adaptive drivers agree, and aPropagatorError
surfaces the underlying SGP4 code.
Full changelog: CHANGELOG.md · Docs: README