Kshana PNT-resilience simulator
Validated Kshana PNT simulator: orbits, GNSS, fusion, receiver trust, interference maps.
التثبيت
أضف هذا إلى إعدادات MCP في عميلك (Claude Desktop: claude_desktop_config.json، وCursor: .cursor/mcp.json، ويستخدم VS Code وغيره الصيغة نفسها «mcpServers»).
ghcr.io/ashfordeou/kshana-mcp:0.39.0claude mcp add kshana-pnt-resilience-simulator -e 'KSHANA_MCP_IQ_DIR=<KSHANA_MCP_IQ_DIR>' -e 'KSHANA_MCP_IQ_MAX_SAMPLES=50000000' -- docker run -i --rm ghcr.io/ashfordeou/kshana-mcp:0.39.0
{
"mcpServers": {
"kshana-pnt-resilience-simulator": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/ashfordeou/kshana-mcp:0.39.0"
],
"env": {
"KSHANA_MCP_IQ_DIR": "<KSHANA_MCP_IQ_DIR>",
"KSHANA_MCP_IQ_MAX_SAMPLES": "50000000"
}
}
}
}
متغيرات البيئة
KSHANA_MCP_IQ_DIRFolder the GNSS IQ tools (iq_scene, iq_acquire, iq_track, iq_frontend, iq_info, iq_campaign, iq_campaign_status) may read and write; every IQ path argument is relative to it. Unset leaves the IQ file tools off; the other tools are unaffected. In a container, mount a volume and point this at it.KSHANA_MCP_IQ_MAX_SAMPLESMost complex samples one IQ call may generate or process (default 50000000).
kshana-mcpclaude mcp add kshana-pnt-resilience-simulator -e 'KSHANA_MCP_IQ_DIR=<KSHANA_MCP_IQ_DIR>' -e 'KSHANA_MCP_IQ_MAX_SAMPLES=50000000' -- npx -y kshana-mcp@0.39.0
{
"mcpServers": {
"kshana-pnt-resilience-simulator": {
"command": "npx",
"args": [
"-y",
"kshana-mcp@0.39.0"
],
"env": {
"KSHANA_MCP_IQ_DIR": "<KSHANA_MCP_IQ_DIR>",
"KSHANA_MCP_IQ_MAX_SAMPLES": "50000000"
}
}
}
}
متغيرات البيئة
KSHANA_MCP_IQ_DIRFolder the GNSS IQ tools (iq_scene, iq_acquire, iq_track, iq_frontend, iq_info, iq_campaign, iq_campaign_status) may read and write; every IQ path argument is relative to it. Unset leaves the IQ file tools off; the other tools are unaffected. In a container, mount a volume and point this at it.KSHANA_MCP_IQ_MAX_SAMPLESMost complex samples one IQ call may generate or process (default 50000000).
kshana-mcpclaude mcp add kshana-pnt-resilience-simulator -e 'KSHANA_MCP_IQ_DIR=<KSHANA_MCP_IQ_DIR>' -e 'KSHANA_MCP_IQ_MAX_SAMPLES=50000000' -- uvx kshana-mcp==0.39.0
{
"mcpServers": {
"kshana-pnt-resilience-simulator": {
"command": "uvx",
"args": [
"kshana-mcp==0.39.0"
],
"env": {
"KSHANA_MCP_IQ_DIR": "<KSHANA_MCP_IQ_DIR>",
"KSHANA_MCP_IQ_MAX_SAMPLES": "50000000"
}
}
}
}
متغيرات البيئة
KSHANA_MCP_IQ_DIRFolder the GNSS IQ tools (iq_scene, iq_acquire, iq_track, iq_frontend, iq_info, iq_campaign, iq_campaign_status) may read and write; every IQ path argument is relative to it. Unset leaves the IQ file tools off; the other tools are unaffected. In a container, mount a volume and point this at it.KSHANA_MCP_IQ_MAX_SAMPLESMost complex samples one IQ call may generate or process (default 50000000).
التوثيق
مأخوذ من ملف README للمشروع على GitHub ويُحدَّث أسبوعيًا. تفتح الروابط على GitHub.
المحتويات
Kshana · क्षण · the precise instant
An open-source simulator for PNT (positioning, navigation and timing) resilience.
Open Kshana Studio · Install · Capabilities · Evidence · Research · Documentation · Cite
Contents
- Rehearse the minute GNSS goes dark
- What's new in 0.39, What's new in 0.38, and 0.38 in depth: jammertest scoring, the receiver's own flags, machine inputs, timing and holdover, standards packs, LunaNet AFS, the lab round trip, kshana-bench, the observatory, exporters, optical, space-user navigation and lunar infrastructure
- Kshana Studio and every Studio page
- Capabilities: the table of areas, every scenario kind by family, every command, every surface
- How a run works, Missions
- Evidence: the ledger, capability domains
- Install, Architecture (and the diagrams), AI assistant
- Editions, Research, Cite, Licence
- Reference: usage, scenario format, output, repository layout, FAQ, troubleshooting, versioning, roadmap, contributing, documentation
Rehearse the minute GNSS goes dark
Kshana replays jamming, spoofing and clock holdover when GNSS (Global Navigation Satellite System) signals fail, and tells you how long a system keeps time and position inside its budget, and which clock or sensor buys the most margin. It is one Rust engine. It runs in a terminal, a notebook, an IDE (integrated development environment), an AI (artificial intelligence) assistant, or in your browser.
Every run is reproducible bit for bit from the scenario, the seed and the engine version. Every capability carries one of three labels in a machine-checked ledger: VALIDATED (an independent external oracle agrees), MODELLED (internally consistent, and said out loud) or PARTNER (a hardware partner owns it).
Status: v0.39.0. A validated, reproducible simulation substrate for PNT resilience. Timing and holdover come first, because that domain is the best validated. Kshana is a study and trade-off instrument: not radio-frequency (RF) signal-generator hardware (it drives no radio and transmits nothing; its signal-level output is baseband IQ sample files for software receivers), not a hardware or certified GNSS receiver (its software receiver is an analysis tool) and not a flight product. New to the field? Start with the plain-language primer and the glossary.
What's new in 0.39
0.39 adds no feature and changes no result; the engine's output is the 0.38 output. It fixes one thing on the command line, updates dependencies of the cross-validation tooling, and states the benchmark verdicts in full.
- Command line.
kshana kinds | head(any closed standard output) no longer panics: the program exits quietly with status 141, as other tools do for a closed pipe. Other write errors still report themselves. - Dependencies.
memmap20.9.11 in the two ANISE cross-check locks andpillow13.0.0 andcertifi2026.10.19 in the oracle environment pins, all underxval/: nothing that ships changed. - kshana-bench, all verdicts. Against the pre-registered bars, three are NOT MET, each pinned by a test:
A2 (
agc_k_sigmaAUC 0.766 against at least 0.80), D1 (largest gap 0.0301) and task (b) R1 (carried, not re-run). No bar was loosened (Bench).
What's new in 0.38
0.38 makes the neutral referee measurable: it scores receiver logs against a published test schedule, reads more receivers and sensors, tests timing systems, and ships a benchmark and an interference observatory. It stays advisory: nothing here is certified, no result is a type approval, and nothing transmits. Each row states what the ledger holds for it (how a label is earned); a status names only what was checked, and the ledger row and the linked page say what was not.
| New in 0.38 | What it does, and why | Ledger status | Read |
|---|---|---|---|
| Jammertest scoring | kshana jammertest import reads the published NPRA test catalogue and transmission plan as scheduled truth; jammertest score scores a receiver log per test (detection latency, missed alarms, false alarms, time to recover), as a signed evidence pack if you give a key | MODELLED: one ledger row. The bars were pre-registered before any scored run; on the JammerTest 2024 data the minimum-data rule failed in both runs (4 and 7 scorable windows against 10 required), so no bar is assessable and nothing is claimed | Jammertest |
| The receiver's own flags | UBX-NAV-STATUS spoofDetState, UBX-SEC-SIG and NovAtel RXSTATUS read into a per-epoch self_report and compared with Kshana's alarms (both, receiver only, Kshana only, neither); a Septentrio SBF reader and read-only --serial input | MODELLED; agreement between a receiver's detector and Kshana's is not validation | Receiver trust |
| More receivers and sensors | RTKLIB .pos, NovAtel OEM7, RTCM 3 MSM4/MSM7 C/N0 (from the BSD-licensed pyrtcm tables, not the RTCM text), GNSS-SDR monitor streams, an IMU log as a second sensor, a ROS 2 package, a gnss_lib_py bridge, and imu-fit for hybrid sensor parameters | MODELLED: six ledger rows; self-written fixtures only, no capture from a real receiver, IMU, GNSS-SDR run or ROS graph was read | Machine inputs |
| Timing and holdover tests | the holdover-test kind scores a holdover test (GNSS removed by the operator, holdover, recovery) from a measured time-error record against ITU-T masks, "measured against the mask"; linuxptp and chrony log readers; the hardware stages and the lab-attestation field | MODELLED: two ledger rows; the times are the operator's statement, not verified | Timing HIL, Hardware safety |
| Standards packs, LunaNet AFS, lab round trip | scored packs for DHS RPCF, IMO MSC.1/Circ.1575 and ICAO Doc 9849 Appendix F against bars stated before the run, "supports evidence for"; a NIST IR 8323r1 crosswalk; a LunaNet AFS code generator and checker; a signed pack that links a lab run's scenario, test conditions, receiver log and score | MODELLED for the packs and the round trip; the AFS code check is VALIDATED against its printed check columns (see the ledger rows) | Standards, LunaNet AFS |
| kshana-bench and the observatory | fixed tasks, splits and metrics for interference detection, IQ detection, holdover prediction and the optimism gap, with a sealed holdout and a static leaderboard; a reproducible daily interference product with a 24 h delay, coarse cells and no attribution | no ledger row of its own: it scores submissions, and its baselines are labelled MODELLED in the result files; against the pre-registered bars the scorer, C1 to C3 and D2 are met and three bars are NOT MET (pinned by tests): A2 (agc_k_sigma AUC 0.766 against at least 0.80 on the test split), D1 (largest gap 0.0301) and task (b) R1 (carried, not re-run); see xval/bench/RESULTS-v2.md | Bench, Observatory |
| Exporters | trust telemetry as Home Assistant MQTT discovery and state messages (publish only, no credentials) beside Prometheus, CEF, LEEF and OTLP | MODELLED: one ledger row | Trust telemetry |
| Optical link margin against time | the optical-atmosphere kind can write one seeded realisation of a site's weather as a link-margin series | MODELLED: one ledger row; one draw from the model, not the climate | Optical atmosphere |
0.37's highlights: changelog. The full 0.38 list is in the changelog.
0.38 in depth
Each capability from the table above, in a few lines: what it does, one command to run it, one
picture drawn from a real run of the engine, and what the ledger holds for it. The pictures
are written by tools/gen_figures_038.py into
docs/figures/0.38/ (never drawn by hand): python3 tools/gen_figures_038.py
rewrites them from a built engine, and --check fails if one is stale or its caption here differs.
Where an input is a log, it is a made-up one the script writes, because the real third-party logs
are never vendored, and the caption says so. Everything below is advisory: not certified, not a
type approval, and nothing transmits. A status names what was checked and nothing more;
how a label is earned.
Jammertest scoring
kshana jammertest import turns the published NPRA test catalogue and transmission plan into
scheduled truth, and kshana jammertest score scores a receiver log against it: for each
scheduled test, whether it was detected, how late, and how long the receiver took to recover, plus
false alarms outside every slot. The catalogue is fetched, never vendored.
xval/jammertest-plan/fetch.sh ../jammertest-plan
kshana jammertest score session.toml --catalog ../jammertest-plan/testcatalog2025.json \
--plan ../jammertest-plan/plan-tuesday-2025-09-16.json --location 1 --json
Ledger status: MODELLED. The bars were fixed before any scored run; on the JammerTest 2024 data the minimum-data rule failed in both runs, so no bar is assessable and nothing is claimed. Jammertest.
The receiver's own flags
UBX-NAV-STATUS spoofDetState, UBX-SEC-SIG and NovAtel RXSTATUS are read into a per-epoch
self_report and set beside Kshana's alarms: both, receiver only, Kshana only, or neither. A
Septentrio SBF reader and a read-only --serial input feed the same comparison. Neither side is
ground truth.
kshana receiver-trust session.toml # [log] format = "ubx", path = "receiver.ubx"
Ledger status: MODELLED. Agreement between a receiver's detector and Kshana's is not validation. Receiver trust.
More receivers and sensors
RTKLIB .pos, NovAtel OEM7, RTCM 3 MSM4/MSM7 C/N0, GNSS-SDR monitor streams, an IMU log as a second
sensor, a ROS 2 package and a gnss_lib_py bridge all end in the same receiver-trust timeline.
imu-fit reads the sensor parameters the hybrid and fusion scenarios need off a stationary IMU
log, so a scenario can be run with the sensor you actually have.
kshana imu-fit still.csv --format csv --axis x --expected-mean 0 --id bench-imu
Ledger status: MODELLED. Self-written fixtures only; no capture from a real receiver, IMU, GNSS-SDR run or ROS graph was read. Machine inputs.
Timing and holdover tests
The holdover-test kind scores a holdover test (GNSS removed by the operator, holdover, recovery)
from a measured time-error record against ITU-T masks, and says so in those words: measured
against the mask. linuxptp and chrony log readers feed it; the hardware stages and the
lab-attestation field say who stated what.
kshana scenarios/holdover-test-example.toml
Ledger status: MODELLED. The times GNSS was removed and restored are the operator's statement, not verified. Timing HIL, Hardware safety.
Standards packs
Scored packs for the DHS Resilient PNT test profiles, IMO MSC.1/Circ.1575 and ICAO Doc 9849
Appendix F, plus a NIST IR 8323r1 crosswalk in compliance-report. Each test runs a bundled
scenario and compares a result field with a bar stated before the run; a test that needs a receiver
log is listed as needing an input, not scored. The wording is "supports evidence for".
kshana standards-pack list
kshana standards-pack run imo-circ-1575
Ledger status: MODELLED. A met bar says a modelled scenario met a stated bar, nothing about a product; every miss is kept and pinned by a test. Standards.
LunaNet AFS
The LunaNet Augmented Forward Signal code generator (Gold, Weil and tertiary codes, the message frame and its error coding) and a checker for a recorded or generated symbol stream, pinned to one edition of the specification.
kshana lunanet-afs-check spec
kshana lunanet-afs-check generate --frames 2 --out afs.sym
kshana lunanet-afs-check symbols afs.sym
Ledger status: VALIDATED for the code and synchronisation checks, against the values the specification prints (which it marks TBC); one check is NOT MET, kept and pinned (one printed tertiary-code column differs: the document prints the same value for two PRNs). The LDPC and CRC words of subframes 2 to 4 are not checked. The ledger rows say exactly which. LunaNet AFS.
Lab round trip
kshana.test-conditions/1 is a published description of what a laboratory did (events, times,
powers). kshana evidence round-trip links the scenario hash, the conditions hash, the receiver log
hash and the score into one signed pack, and refuses a pack whose conditions and scoring scenario
disagree about the events. Kshana never produces or replays a signal: how a scenario reached a
receiver is the operator's responsibility.
kshana evidence --help
The picture is the layout of a pack. Ledger status: MODELLED. Test conditions, Test bench.
kshana-bench
Fixed tasks, splits and metrics for interference detection, IQ detection, holdover prediction and the optimism gap, with a sealed holdout and a static leaderboard. It scores submissions; it is not a ranking of receivers.
kshana bench baseline --task d --split test --out results/
Ledger status: no ledger row of its own; the baselines are labelled MODELLED in the result files.
Against the pre-registered bars the scorer, C1 to C3 and D2 are met and three bars are NOT MET, each
pinned by a test: A2 (agc_k_sigma AUC 0.766 against at least 0.80 on the test split), D1 (largest gap
0.0301) and task (b) R1 (carried from the earlier campaign, not re-run). The figures are in
xval/bench/RESULTS-v2.md. Bench.
Interference observatory
One product per UTC day and region from an open aircraft-position archive, on a fixed coarse grid: each cell is degraded, not degraded, or not observed (which is not "clear"). Released no earlier than 24 h after the day ends, with small cells suppressed and no attribution of cause.
kshana interference-map daily /path/to/extracted/2026-09-15 \
--dataset adsb-lol --day 2026-09-15 --bbox 53.5,9.0,66.0,31.0 --out products/
The picture is the committed sample days, not an observatory product. Ledger status: MODELLED: no external oracle, no ground truth and no cause attribution; a cell that is not observed was not assessed, which is not the same as clear. Observatory method.
Exporters
Trust telemetry as Prometheus text, CEF, LEEF, OTLP and Home Assistant MQTT discovery and state messages. The command publishes only to a destination you give it and holds no credentials.
kshana trust-telemetry --result session.result.json --print-metrics
kshana trust-telemetry --result session.result.json --print-syslog --format cef
Ledger status: MODELLED. Trust telemetry.
Optical link margin against time
The optical-atmosphere kind can write one seeded realisation of a site's weather as a link-margin
series: cloud episodes, a liquid-water column for each, one scintillation sample per step. The
Studio's Optical PNT page opens the optical-atmosphere scenarios.
kshana scenarios/optical-atmosphere-network.toml
Ledger status: MODELLED. One draw from the model, not the climate. Optical atmosphere.
New Studio views
kshana.dev/studio gains a Bridge replay (two runs side by side on one
mission clock, at /studio/replay/), an Optical PNT page
(/studio/optical/), a Holdover test page (/studio/holdover/) and an observatory viewer
(/studio/observatory/). They run the same engine in the browser, nothing is uploaded, and they carry
the same advisory statement. The pictures above are drawn from the engine's own output by a script;
they are not screenshots of these pages.
Space-user navigation (gnss-ssv)
For a spacecraft above, around or far past the GNSS orbits: how many GNSS signals it can use, how strong they are, how good the geometry is, and what an onboard filter can do with them. One kind, four modes, chosen by the scenario's tables: a shell of users (the share of time with one and four signals, per constellation), a trajectory (signals, C/N0, dilution of precision and the limb-ray medium along an orbit), a navigation run (a nine-state filter on pseudoranges, to the Moon) and a formation (relative navigation of deputies about a chief). The public source for the availability comparison is the interoperable GNSS Space Service Volume booklet (UN OOSA ST/SPACE/75, from the International Committee on GNSS), which is itself a simulation; it is fetched, never vendored. Full page: docs/SSV.md.
kshana scenarios/gnss-ssv-shell.toml # shell: the upper space service volume, reduced size
kshana scenarios/gnss-ssv-heo.toml # trajectory: a high Earth orbit, limb medium
kshana scenarios/gnss-ssv-nav-lunar.toml # navigation: an onboard filter toward the Moon
kshana scenarios/gnss-ssv-formation-heo.toml # formation: relative navigation
Ledger status: MODELLED, and the comparison with the booklet mostly misses. The bars were fixed before the run. Of eight, only S0 (the inverse link budget, 13 of 13 values) and S6 (the lunar mission) are met. S1 to S5 and S7 are NOT MET: the upper and lower service volume geometry (43 of 52 and 48 of 52 cells), the 15/20/25 dB-Hz upper service volume, the six GEO missions, the HEO mission, and the parametric sidelobe pattern against measured GPS panel patterns. Almost every miss in S1 to S5 involves GLONASS, and the booklet prints two different reference angles for it; a diagnostic variant that uses the other pair brings S1, S2 and S4 to every cell, but it does not replace the run of record and no row is VALIDATED. The formation run's absolute filter is also overconfident (mean normalised error squared well above the value of about 3 that a consistent filter gives).
Space-user navigation, what the comparison shows.
Lunar infrastructure (lunar-infrastructure)
The Moon's orbit and surface as navigation and geodetic infrastructure, in five studies chosen by
study: od-consistency (an onboard Earth-GNSS orbit determination in a halo orbit against an
independent ground one), carrier-phase (integer ambiguity fixing between surface stations and an
orbiter), frame-coestimation (the lunar datum from Earth-station ranging with and without orbiter
links), space-tie (laser, VLBI and GNSS offsets on one spacecraft against the local-tie error) and
geodesy-sensitivity (which observable family sees the Love numbers h2, k2 and l2). The model is a
restricted three-body one with stated simplifications and illustrative inputs. Full page:
docs/LUNAR-INFRASTRUCTURE.md.
kshana scenarios/lunar-infrastructure-od-consistency.toml
kshana scenarios/lunar-infrastructure-carrier-phase.toml # quick; the scored run takes about eight minutes
kshana scenarios/lunar-infrastructure-frame-coestimation.toml
kshana scenarios/lunar-infrastructure-space-tie.toml
kshana scenarios/lunar-infrastructure-geodesy-sensitivity.toml
Ledger status: MODELLED, and three bars are NOT MET. The numerics are checked against independent numpy and scipy programs; nothing is compared with a measurement of a lunar quantity, and nothing is VALIDATED. Met: the two orbit solutions are consistent (mean q 5.81 against 6 expected), and orbiter links raise the smallest datum eigenvalue about 111-fold, assuming a known orbit. Not met: the injected 3e-10 m/s2 model error is not detected (C3: the onboard solution is known to about 350 m, so about ten metres hides in its covariance); integer fixing is not achieved (1 to 3 % success at 25 dBi, and at the registered 12 dBi the problem cannot be formed); and the trace half of G3 for adding an observable family (the trace rose in 12 of 28 additions, each time because the family raised the rank). Each miss is pinned by a test. Lunar infrastructure.
Kshana Studio
Open kshana.dev/studio and the whole engine runs in your browser, compiled to WebAssembly. Nothing to install, and nothing is uploaded. The Studio has two views of the same engine, and a switch in the header moves between them, keeping the scenario, the view and any settings you changed.
The Simple view is where the Studio opens. It starts from questions (how many satellites can I see, can I trust my position fix, how long can a clock keep time, what does a jammer do to my receiver) and from a map of everything the engine can do, each area with its share of validated methods. Open a scenario and the answer comes first: one plain sentence, written for what that scenario measures, then its key figures and a chart. At most five settings are on show, the ones that change the answer most; the rest wait under Advanced settings. How this is computed explains the method, and For researchers gives the engine's own figures, the scenario file, the code to run it from Python and the citation.
The Advanced view is the full dashboard: the scenario library, five numbered steps (Choose, Set, Run, Read results, Share or export), the key figures with PASS and FAIL chips where the run states a threshold, and every panel: overview, charts, maps, replay, the engine's report and exports. One search box reaches scenarios, domains and the fields inside them, and you can pin up to four runs and compare them side by side.
The Simple view's opening screen, and the Advanced view after a run
The Studio's source and its build notes are in web/README.md.
The site
The rest of kshana.dev is built from this repository's own files and engine runs: missions, capabilities, the evidence ledger, the published research and the editions.
Capabilities
One engine covers the whole failure chain, from the first jammed satellite to the last
nanosecond of clock holdover. The engine has 87 scenario kinds; kshana kinds lists
them and docs/SCENARIOS.md documents every field.
| Capability | What it answers |
|---|---|
| Spectrum | how a jammer takes the GNSS L band, band by band, second by second |
| Clocks and timing | how long each clock holds time after GNSS is lost |
| Constellations around any body | coverage, dilution of precision and availability around the Earth, the Moon or Mars |
| Solar system | where every planet is, and the light time of any link |
| Low-Earth-orbit navigation | a pass, a link, a navigation message and a fused fix, stage by stage |
| Campaigns | a chained mission, a sweep or a Monte Carlo ensemble in one scenario |
| Animation | a run's time series as an animated drawing, a player or frames |
| Reports | every figure with its unit and its label, in HTML (HyperText Markup Language) and JSON (JavaScript Object Notation) |
| Interoperability exports | orbits and geometry for other tools: SP3, CCSDS OMM and OEM, CZML, KML, GeoJSON, STK and SigMF |
| Maritime trust | can the bridge trust this fix: a 0-100 score and reasons for a vessel's NMEA, live or from a log (advisory, not type-approved navigation equipment) |
| NMEA training streams | synthetic bridge NMEA with scripted jamming and spoofing and an instructor log, for crew training (text only; never for a vessel's live navigation systems; advisory, not type-approved navigation equipment) |
| Interference map | where aircraft and ships reported degraded navigation data, and how much of a route it touches |
| Evidence packs | a signed, offline-verifiable technical record of a vessel's log window and what the engine computed from it, for an incident report (advisory, not type-approved navigation equipment) |
| Trust telemetry | the trust stream as Prometheus metrics, SIEM events and optional OpenTelemetry, with a sample Grafana dashboard (deploy/grafana/kshana-gnss-trust.json) |
| Signal K and OpenCPN | the trust score on a boat's Signal K server and in OpenCPN, with a reference build for a small computer next to the receiver (advisory, not type-approved navigation equipment) |
| Test-bench export | kshana bench-export: a scenario's vehicle motion and events for a laboratory GNSS simulator (no signal is written), and how to score the receiver's log afterwards |
| Compliance mapping and report | kshana compliance-report: which rows of public resilience frameworks a set of runs supports evidence for, and the gap that is left |
| Notebooks | runnable tutorials: vessel trust and training streams, an interference-map route exposure, compliance mapping and the test bench, quantum against classical GDOP |
| Galileo OSNMA verifier | which satellites' navigation data a receiver can cryptographically authenticate, and why a check fails; Kshana grants no rights under the EU's OSNMA ICD IPRs (see the NOTICE in the page) |
The export formats in full: SP3 is Standard Product 3; CCSDS OMM and OEM are the Orbit Mean-elements and Orbit Ephemeris Messages of the Consultative Committee for Space Data Systems; CZML and KML are the Cesium and Keyhole Markup Languages; STK is Systems Tool Kit; SigMF is the Signal Metadata Format.
Each capability, drawn from a real run: the L-band waterfall, the coverage map, the solar system and a low-Earth-orbit pass
Run any of them with kshana example <scenario> > s.toml && kshana s.toml: the scenarios
are l-band-waterfall-jamming, constellation-multi-gnss-coverage, solar-system-tour
and leo-pass-iridium.
The maritime and interference capabilities, drawn from committed synthetic inputs: a trust score, an interference map with route exposure, a training stream and an evidence pack
All four are made-up data and advisory: they show the format and the behaviour of the software, not how any receiver or system performs against interference. Run the first with kshana receiver-trust examples/maritime-trust/session.toml, the second with kshana route-exposure on the samples in examples/interference-map/, the third with kshana nmea-scenario scenarios/training/coastal-drag-off.toml --out drag.nmea (training use only: never feed it to live navigation equipment), and the fourth as in docs/EVIDENCE-PACKS.md.
The full capability table, domain by domain
The full domain-by-domain detail follows; for a per-capability maturity ledger see
docs/CAPABILITY.md and docs/VALIDATION.md.
| Domain | Capability | ||||
|---|---|---|---|---|---|
| Orbit & geometry | SGP4/SDP4 propagation (validated to 4.12 mm against all 666 AIAA 2006-6753 vectors); real two-line elements (a committed, date-stamped Celestrak gps-ops snapshot) or synthetic Walker-delta constellations whose mean elements realise the i:T/P/F formula to under 1 km over a 24 h propagation; multi-constellation visibility, dilution of precision — geometric, position, horizontal, vertical and time (GDOP/PDOP/HDOP/VDOP/TDOP), validated to 1e-6 against gnss_lib_py 1.0.4, Stanford NAV Lab (Navigation and Autonomous Vehicles Laboratory), and GNSS availability; a gradient-free constellation-design optimiser, streets-of-coverage minimum-satellite sizing, a multi-constellation comparison tool, and a Walker design sweep that tabulates coverage / PDOP / revisit-time over a planes × satellites grid and reports the Pareto-optimal designs. | ||||
| Numerical propagator | A Cowell numerical propagator (src/propagator.rs) complementing the analytic SGP4/SDP4 path, with a hierarchical seven-perturbation force model (src/forces.rs): two-body + the full J2–J6 zonal field (the Earth-oblateness zonal harmonic coefficients J2 to J6; the exact analytic gradient of its disturbing potential), an optional EGM2008 tesseral spherical-harmonic geopotential to degree/order 70 (Earth Gravitational Model 2008; src/gravity_sh.rs; real NGA — US (United States) National Geospatial-Intelligence Agency — coefficients, Holmes–Featherstone normalized-Legendre recurrence, cross-checked against the closed-form Legendre functions and the analytic ∇V identity), epoch-driven Sun and Moon third-body gravity (a built-in low-precision ephemeris, no DE/SPK — Development Ephemeris / SPICE Spacecraft and Planet Kernel — kernel), solar-radiation pressure (cannonball model with a conical umbra+penumbra shadow), atmospheric drag (Vallado piecewise-exponential density, co-rotating atmosphere), the post-Newtonian Schwarzschild relativistic correction, and the Lense–Thirring frame-dragging term (IERS — International Earth Rotation and Reference Systems Service — Conventions 2010 §10, linear in Earth's angular momentum, ~1–2 orders below Schwarzschild) — driven by a choice of two adaptive integrators (RK4 — fourth-order Runge–Kutta — step-doubling or the Dormand–Prince RK5(4) embedded pair). Validated against Orekit 12.2 (CS GROUP, Apache-2.0) NumericalPropagator/DormandPrince853 — 278 epochs across LEO (low Earth orbit) + GTO (geostationary transfer orbit), the conservative-force tiers agreeing to a worst-case **\ | Δr\ | 0.08 m over 24 h** (tests/numerical_cowell_propagator_reference.rs); the atmospheric-drag tier is characterised separately (≈ 333 m / 24 h) and the absolute Sun/Moon-ephemeris and density inputs stay honestly Modelled. Additional internal evidence (not external validation): the unperturbed orbit is checked against the exact universal-variable Kepler solution to sub-metre over 24 h, energy/angular-momentum conserve to ~1e-9, and each perturbation matches a hand-derived closed-form signature. | ||
| Maneuvers & trajectory design | Impulsive ΔV nodes with 6×6 covariance propagation (ECI — Earth-centred inertial — / LVLH — local vertical, local horizontal — execution-error frames), finite-burn integration checked against the closed-form Tsiolkovsky rocket equation to < 0.01 %, an Izzo-2015 single-revolution Lambert solver, an exact universal-variable Kepler propagator, and a porkchop (launch × arrival) C3 (launch energy) / arrival-V∞ sweep emitted as a JSON contour grid — the performance-simulation layer above GMAT/Orekit, with every Lambert output round-tripped against two-body truth and the porkchop minimum checked against the analytic Hohmann floor. | ||||
| Time systems & reference frames | IERS leap-second UTC / TAI / TT / UT1 scales (Coordinated Universal Time, International Atomic Time, Terrestrial Time, and the Earth-rotation time Universal Time 1), a Julian-date API (application programming interface), the IAU-2000 (International Astronomical Union) Earth Rotation Angle (ERA), GMST-based (Greenwich Mean Sidereal Time) TEME ↔ ECEF (true equator, mean equinox ↔ Earth-centred, Earth-fixed) with WGS-84 (World Geodetic System 1984) geodetic frames, IAU 2006 precession (Fukushima–Williams), full IAU 2000A/2000B nutation, IERS polar motion, and the equinox-free CIO-based IAU 2006/2000A GCRS↔ITRS reduction (CIO = Celestial Intermediate Origin) — all validated bit-for-bit against the SOFA/ERFA vectors, and independently cross-checked against ANISE (the pure-Rust NAIF/SPICE reimplementation; NAIF = the Navigation and Ancillary Information Facility of NASA, the US National Aeronautics and Space Administration): kshana's GCRS→ITRS vs ANISE's ITRF93 (International Terrestrial Reference Frame 1993) from JPL's earth_latest_high_prec.bpc, the same IERS Earth-orientation parameters fed to both, agree to ≤ 0.86 m on the ground / ≤ 3.6 m at GNSS orbit (max 0.028″) across eight epochs 2020–2023. | ||||
| Inertial | Three-axis strapdown INS — quaternion attitude, WGS-84 NED (north-east-down) mechanization, coning/sculling compensation, and a deterministic IMU error model (scale-factor, misalignment, g-sensitivity, quantization, drift); a first-principles cold-atom-interferometer accelerometer (Mach–Zehnder phase, quantum projection noise, contrast decay, vibration coupling) that derives the velocity-random-walk coefficient; and a sequential-importance-resampling particle filter for map-aided (terrain-/gravity-referenced) GPS-denied navigation. | ||||
| Alt-PNT (GPS-denied) | A cold-atom gravimeter measurement model whose white-noise floor (σ = ASD/√τ, ASD = amplitude spectral density) is derived from the CAI accelerometer physics; a low-degree, fully-normalised spherical-harmonic gravity-anomaly field (checked against the closed-form Legendre functions and a hand-derived single-term anomaly) plus synthetic mascons; the gravity-functional synthesis kernel (gravity_sh::gravity_magnitude / gravity_disturbance_mgal) — the "map reader" a gravity-aided navigator matches against — is validated against the GRS80 normal-gravity standard (Geodetic Reference System 1980), reproducing the closed-form Somigliana normal gravity and the published γ_e / γ_p to 3.5e-12 and producing a physically-bounded disturbance map from the real ICGEM (International Centre for Global Earth Models) EGM2008 field (RMS — root mean square — ≈ 26 mGal, max ≈ 89 mGal at d/o 70; tests/icgem_gravity_reference.rs); 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 — terrain contour matching / Sandia Inertial Terrain-Aided Navigation — against an SRTM (Shuttle Radar Topography Mission) .hgt DEM (digital elevation model), src/altpnt/terrain.rs), an IGRF-14 geomagnetic main field (14th-generation International Geomagnetic Reference Field) to degree/order 13 (src/igrf.rs, checked 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 (Navigation Innovation and Support Programme) Quantum Wayfarer target. | ||||
| Fusion | Loosely-coupled 15-state GNSS/INS error-state EKF (extended Kalman filter) 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 self-consistency-checked to 0.77 m RMS over a 30-minute curving LEO pass that includes a 120-second GNSS outage (a filter-consistency figure, not an external-oracle validation — this navigator stays MODELLED); 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. | ||||
| 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). | ||||
| Observability & estimation theory | A general, reusable Fisher-information / Cramér–Rao layer (src/fim.rs): the information matrix M = HᵀWH, the Cramér–Rao lower bound, observability rank and datum-defect null space (Moore–Penrose pseudo-inverse), and D/A/E/T-optimal experiment-design scalars from a symmetric Jacobi eigensolver. Validated — eigenvalues vs numpy.linalg.eigh, the CRLB covariance vs σ²(XᵀX)⁻¹ via numpy.linalg.inv, and GNSS DOP from the information matrix, all matched to 1e-9 (tests/fim_observability_reference.rs), and additionally cross-checked against the Kay (1993) closed-form bounds with Monte-Carlo CRLB attainment. It underpins the DOP engine, the passive-geolocation CRLB, and the lunar absolute-station observability theorem (below). | ||||
| 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 (STM) and a single-shooting differential corrector (cr3bp_jacobian, propagate_state_stm, differential_correct_halo) that produces genuinely periodic halo / NRHO (near-rectilinear halo orbit) 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 (L2 = the second Earth–Moon Lagrange point; 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 (Lunar Augmented Navigation Service)/Gateway ephemeris; the selenocentric MCI/MCMF (Moon-centred inertial / Moon-centred, Moon-fixed) transform of the corrected orbit is a follow-on); plus LunaNet / LNIS (LunaNet Interoperability Specification) 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 (user range error) drives the protection level well above a 50 m alert limit (src/lunar.rs, scenarios/lunanet-araim.toml); and a surface-beacon DOP augmentation (src/lunar_beacon.rs) showing how a few surveyed surface ranging beacons supply the low-elevation, wide-azimuth line-of-sight rows an all-overhead orbit-only set lacks — collapsing the ill-conditioned south-polar GDOP and, via a root-sum-square error budget, the realized position accuracy in metres (reusing the gnss_lib_py-validated DOP kernel and the airless-horizon visibility closed form; the dilution-of-precision analysis is written up in arXiv:2607.06212). | ||||
| Lunar PNT suite | A lunar/cislunar navigation suite layered on the CR3BP core, each a runnable kind: Lunar Coordinate Time (lunar-time-offset, src/lunar_time.rs — the secular LTC/TCL − TT rate (LTC = Lunar Coordinate Time; TCL = its French form, Temps-Coordonnée Lunaire) from the self-potential difference + kinetic term, reported with the published 56–59 µs/day band); a geodetic lunar VLBI (very-long-baseline interferometry) delay observable (lunar-vlbi, src/lunar_vlbi.rs — an Earth-baseline near-field two-range-difference delay + rate, cross-checked against the same-codebase plane-wave Δ-DOR (delta differential one-way ranging) in the far-field limit, partials finite-difference-verified); a joint multi-technique OD + clock batch estimator (lunar-joint-od-clock, src/lunar_combination.rs — a Gauss–Newton fit fusing VLBI + lunar-local ranges + inter-satellite ranges) carrying a Fisher-information observability result: internal ranging alone leaves a six-degree-of-freedom rigid-body datum defect, so a surface station's absolute position is unobservable until an Earth-frame tie is added — an Earth-baseline VLBI delay restores observability for a sparse constellation and sharpens the Cramér–Rao bound for a rich one, the absolute datum closing at three non-collinear Earth stations (the observability result written up in arXiv:2607.02566); reference-frame realisation (lunar-frame-realisation, src/lunar_frame_realise.rs — a 7-parameter Helmert datum fit + IAU 2015 WGCCRE orientation tie — WGCCRE = the IAU Working Group on Cartographic Coordinates and Rotational Elements); a Moonlight/LCNS-class service-volume analysis (LCNS = Lunar Communications and Navigation Services; moonlight-service-volume, src/lunar_service.rs — DOP / coverage / availability + a generalised lunar ARAIM HPL/VPL (horizontal/vertical protection level) envelope, reusing the gnss_lib_py-validated DOP kernel and the LunaNet σ_URE≈30 m machinery); lunar differential PNT (lunar-differential-pnt, src/lunar_dpnt.rs — a lunar differential-GNSS / satellite-based-augmentation-system (SBAS) analogue: exact common-mode clock cancellation + first-order spatial decorrelation vs baseline, reusing the DO-229E SBAS protection level — DO-229E being the RTCA (formerly the Radio Technical Commission for Aeronautics) minimum operational performance standard for SBAS receivers); and a LunaNet/IOAG-aligned interoperability export (IOAG = Interagency Operations Advisory Group; lunar-interop-export, src/lunar_interop.rs — CCSDS-OEM (Orbit Ephemeris Message) + lunar-time-scale round-trip in the IAU 2015 lunar body frame, wrapped in the KIF envelope). Evidence tiers per piece are in the verification matrix: Lunar Coordinate Time, the joint OD + clock estimator, reference-frame realisation and the service-volume geometry are VALIDATED (each against the independent oracle its row names, as is the VLBI delay's kernel path); the VLBI observable, the datum-defect observability result, differential PNT and the interoperability export are MODELLED. Parameters are illustrative public-source values — not validated against real VLBI/Gateway tracking, not affiliated with or endorsed by any agency, no TRL (technology readiness level) / heritage claim. | ||||
| 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 (pseudo-noise) ranging (CCSDS 414, the pseudo-noise ranging standard), and Δ-DOR plane-of-sky (CCSDS 506, the Delta-DOR standard), with solar-plasma/tropo/iono media; CCSDS-TDM (503) tracking-data-message parse + emit; a reduced-dynamic Square-Root Information Filter (RTN — radial, transverse, normal — 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 (Goddard Mars Model 3) gravity, an IAU body-fixed Mars frame, a pluggable EphemerisProvider seam, two-part Julian dates + TT↔TDB (Barycentric Dynamical Time)); and the mars-pnt relay-PNT scenario (a MARCONI areostationary relay constellation) with an end-to-end GSE performance simulator (GSE = ground-support equipment) (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. | ||||
| Solar system & any-body PNT | A kernel-free whole-solar-system ephemeris (src/ephem.rs, src/ephem_provider.rs): every planet from the JPL Standish Keplerian elements (Table 1, 1800–2050 AD; Tables 2a/2b, 3000 BC–3000 AD) with each planet's published nominal error, the Earth and Moon split by the lunar series, and Phobos, Deimos, Io, Europa, Ganymede, Callisto and Titan from JPL mean elements and the IAU (International Astronomical Union) rotation model; any body relative to any other in the ICRF (International Celestial Reference Frame). Body now carries GM (gravitational parameter), radii, J2 (the second zonal harmonic) where published and the IAU pole and prime meridian for eighteen bodies. The solar-system kind reports positions, velocities, constants, light time and one-/two-way range between any two bodies (the existing radiometric light-time solver, with the solar Shapiro delay) and an orbit track per body — enough to draw an interactive solar system; the body-pnt kind positions an orbiter or a lander around any body (scenarios/mars-orbit-pnt.toml, scenarios/europa-surface-pnt.toml) with a local Walker constellation, the dilution-of-precision and Gauss–Newton machinery, and a deep-space range from Earth. Validated against JPL Horizons (DE441, JPL Development Ephemeris 441): Mercury–Saturn and the Earth from Table 1 within twice the nominal error (worst 1.87×), all eight planets from Tables 2a/2b (worst 1.71×), and the Earth–Mars/Jupiter light time. Modelled: Uranus and Neptune from Table 1 (2.0× and 5.2× the stated error against DE441), Pluto, the moons, and the body-pnt navigation results. | ||||
| Fused MEO + LEO PNT | src/leo_fusion/: system-agnostic LEO positioning, navigation and timing over any constellation (Walker shells, element sets, GNSS presets) and any signal (carrier, chip rate, C/N0 envelope, signal-in-space range error), with optional one-file presets carrying their sources (Xona Pulsar X1/X5, Iridium STL, Starlink signals of opportunity, CentiSpace, a representative C-band system, the ATOMIC zero-clock ephemeris model). leo-pvt: batch Doppler positioning from range rate (single- and multi-satellite, clock-drift and velocity states, single-pass along/cross-track geometry and the mirror solution), joint GNSS + LEO weighted least squares with per-system inter-system biases and caller-supplied per-signal sigmas, the DOP against the number of LEO satellites, polar and Arctic coverage, and LEO time transfer to UTC against C/N0 and the oscillator. leo-ppp: a float PPP (precise point positioning) EKF (extended Kalman filter) with GNSS only and with LEO, its convergence time and a chi-square NEES consistency test. ntn-positioning: 5G non-terrestrial-network positioning from the Cramér-Rao bound of the bandwidth. Validated: the LEO Doppler envelope against the published Iridium and Xona figures. Modelled: the rest, with the PPP trend compared against Li et al. (2019) — see docs/LEO-PNT-FUSION.md. | ||||
| Integrity | Snapshot and solution-separation (ARAIM-style) RAIM — receiver autonomous integrity monitoring — with horizontal/vertical protection levels (HPL/VPL), fault detection & exclusion, and Stanford integrity diagrams; an explicit integrity-risk-budget multiple-hypothesis solution separation (MHSS) protection level, including the dual-/multi-constellation constellation-wide fault mode (EU (European Union) ARAIM / DO-316, the RTCA performance standard for GPS airborne equipment with aircraft-based augmentation), exercised on a real GPS + Galileo snapshot (scenarios/araim-gps-galileo.toml). The protection level applies the one-sided nominal-bias projection `b_k = Σ_i | s_i | ·b_nomper fault mode and the **integrity** sigma σ_URA (user range accuracy; distinct from the accuracy σ_URE, user range error) from the Integrity Support Message — see [docs/ARAIM_REFERENCE.md](docs/ARAIM_REFERENCE.md). The detection kernel (the χ²/non-central-χ²/normal thresholds and K-multipliers) is **externally validated against SciPy** across 171 cases (tests/raim_reference.rs`); the geometry reuses the gnss_lib_py-validated DOP kernel. The ARAIM MHSS integrity-risk budget allocation itself has no published numeric oracle and stays honestly Modelled. | ||
| Augmentation (SBAS) | SBAS / WAAS protection levels (WAAS = the Wide Area Augmentation System) in the DO-229E weighted-least-squares form (precision-approach and en-route K-factors) and the L1/L5 dual-frequency ionosphere-free combination (L1 and L5 being two GPS civil signal bands; IS-GPS-705, the GPS interface specification for the L5 signal, γ₁₅ ≈ 1.793) that underpins DO-316 — src/sbas.rs. The protection-level algorithm is externally validated against the RTKLIB SBAS-PL fork (RTKLIB = the open real-time-kinematic positioning library; PL = protection level) (zsiki/rtklib_ws waasprotlevels(), Siki & Takács 2017, DO-229D — the previous revision of DO-229 — App. J) run on real EGNOS data (European Geostationary Navigation Overlay Service), reproducing its HPL to < 2e-3 m (tests/sbas_reference.rs); gLAB (the GNSS Laboratory tool suite) v6.0.0 confirmed the identical convention. | ||||
| Clock & timing | Two-state Kalman holdover (Joseph-form covariance, NIS/NEES — normalised innovation squared / normalised estimation error squared — consistency health); Allan-family stability (ADEV / MDEV / TDEV / HDEV / MTIE — Allan, modified Allan, time and Hadamard deviation, and maximum time interval error) with noise-type-specific confidence intervals and a full IEEE-1139 five-coefficient power-law fit (IEEE Std 1139, the Institute of Electrical and Electronics Engineers frequency-and-time metrology definitions) — the estimators are validated on real hardware against Stable32: a real 5071A caesium primary standard vs a hydrogen maser (556,990 phase samples, 16 averaging factors, OADEV/OHDEV — overlapping Allan/Hadamard deviation — to 1e-3; tests/cs5071a_reference.rs) and the canonical Stable32 PHASE.DAT regression series (139 averaging factors, OADEV/MDEV/TDEV to 1e-3; tests/phasedat_reference.rs); the ADEV/MDEV/TDEV estimators and the telecom MTIE wander metric are additionally cross-checked against the independent allantools 2024.06 library to < 1e-9 on the NIST SP 1065 series (tests/mtie_reference.rs, tests/mdev_tdev_reference.rs); geometric corrections (Sagnac, GNSS common-view); and the operational transfer methods — TWSTFT (two-way satellite time and frequency transfer) with the BIPM (International Bureau of Weights and Measures) Sagnac closed form, GNSS common-view, PPP (precise point positioning) 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. A conditional Timing Protection Level (src/tpl.rs) extends holdover to spoofing: a bound on the undetected time error, given an independent cross-check, that composes a k-sigma monitor floor, the van-Loan coast variance over the detection latency, and a CUSUM (cumulative-sum) time-to-alarm. Calibrated on a real recorded spoof (JammerTest 2024) and reproducible via cargo run --example tpl_jammertest; MODELLED composition (no integrity-risk-per-hour budget), conditional on detection — there is no finite unconditional bound. | ||||
| GNSS measurement domain | Forward pseudorange / Doppler synthesis with Klobuchar (broadcast) and IONEX / TEC-grid (IONosphere map EXchange format / total electron content; 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). | ||||
| Resilience | Link-budget jamming (J/S → effective C/N₀ → loss of lock — jammer-to-signal ratio, carrier-to-noise-density ratio — 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 figure of merit (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 (automatic gain control) monitor, and a signal-quality (SQM — signal-quality monitoring, 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. A framework-aligned resilience-scoring engine (src/resilience/) maps an architecture's simulated behaviour to per-dimension sub-scores across Kshana's own seven resilience categories (not DHS terms), aligned to the US Department of Homeland Security Resilient PNT Conformance Framework, then studies the decision-stability of any single composite score or maturity Level under a Dirichlet weighting simplex and a five-threat ensemble — Kendall-τ rank instability, top-1 winner flip rate, and common-mode diversity collapse (Hill-N2), with an integrity-hashed assurance report (35 hand-derived oracle tests). Reproducible via cargo run --example resilience_report; MODELLED synthetic architectures, a self-assessment aligned to RPCF v2.0, not a certification. See docs/RESILIENCE-CROSSWALK.md. | ||||
| Passive RF geolocation | TDOA/FDOA emitter geolocation (time-/frequency-difference of arrival; src/geolocation.rs) — locate a jammer or spoofer (or an opportunistic source for reverse-PNT) from time-difference-of-arrival hyperboloids across a receiver network, solved by Gauss–Newton least squares; adding frequency-difference-of-arrival with moving receivers jointly recovers the emitter's position and velocity, with the Cramér–Rao bound on the position covariance derived from the network geometry. MODELLED (internal-consistency oracles: forward→inverse round-trips, the J·CRLB = I identity, GDOP monotonicity, and the estimator attaining its own CRLB under Monte-Carlo) — a point-source line-of-sight model, no multipath / NLOS (non-line-of-sight), receiver-clock-bias, or refraction terms. | ||||
| Nav-signal & code tracking | The signal level between the link budget and the measurement domain (src/navsignal.rs): unit-area power spectral densities (PSDs) for BPSK-R(n) (binary phase-shift keying with rectangular chips) and sine-BOC(m,n) (binary offset carrier); the spectral-separation coefficient (SSC) κ = ∫ 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 (DLL = delay-lock loop; Kaplan & Hegarty; ~sub-metre for C/A — the GPS coarse/acquisition code — at 45 dB-Hz); and the multipath error envelope (coherent EML, early-minus-late — 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). | ||||
| Interoperability | RINEX-3 multi-GNSS broadcast-ephemeris ingestion (GPS, Galileo, QZSS — Japan's Quasi-Zenith Satellite System —, BeiDou MEO/IGSO — medium Earth orbit / inclined geosynchronous orbit — via IS-GPS-200, the GPS interface specification; GLONASS, Russia's Global Navigation Satellite System, via PZ-90 — the Russian Parametry Zemli 1990 datum — state-vector RK4) usable as a constellation source (RINEX in, PNT geometry out); a RINEX-3 observation parser (pseudorange, carrier phase, Doppler, signal strength; the 4.00 observation layout is expected to parse but is untested, and RINEX 4 navigation files are refused by name rather than mis-decoded) that now feeds a single-point-positioning (SPP) 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 (Orbit Mean-elements Message) export for flight-dynamics tools (GMAT, Orekit, STK — Systems Tool Kit); and CCSDS-TDM (503) tracking-data-message parse + emit for deep-space radiometric tracking. | ||||
| Mission analysis (systems engineering) | First-order mission-design budgets, each a runnable kind: two-body launch & ascent geometry (launch-window — launch azimuth sin Az = cos i/cos lat, minimum inclination, Earth-rotation bonus, dogleg plane-change Δv, daily opportunities; src/launch.rs); an Allen–Eggers ballistic re-entry corridor (reentry — peak deceleration, peak-g velocity/altitude, peak-heating velocity; src/reentry.rs); Earth-observation coverage geometry (eo-coverage — swath / nadir GSD (ground sample distance) / off-nadir access / revisit via the SMAD (Space Mission Analysis and Design) space triangle; src/eo_payload.rs); a 3-DOF attitude & pointing error budget (three-degree-of-freedom; attitude-budget — worst-case gravity-gradient torque + RSS (root-sum-square) pointing budget; src/attitude_budget.rs); ground-station pass prediction (passes — AOS/TCA/LOS, acquisition of signal / time of closest approach / loss of signal, max elevation, access time; src/passes.rs); and a one-way link budget over the CCSDS 401 / DSN 810-005 link equation (the CCSDS radio-frequency and modulation standard / the Deep Space Network link design handbook; link-budget — FSPL (free-space path loss), C/N₀, Eb/N₀ (energy-per-bit to noise-density ratio), margin, closure; src/linkbudget.rs). MODELLED first-order analytic budgets — the pre-hardware layer below STK/GMAT/Basilisk, not a 6-DoF or radiometric replacement. | ||||
| Decision analysis & trade-off (MCDA) | A full multi-criteria decision-analysis (MCDA) suite (src/mcda/) spanning all four method families — value aggregation (WSM, WPM, WASPAS — weighted sum model, weighted product model, weighted aggregated sum product assessment), distance-to-ideal (TOPSIS, Technique for Order of Preference by Similarity to Ideal Solution), compromise programming (VIKOR, from the Serbian for multi-criteria optimisation and compromise solution), and outranking (PROMETHEE II, Preference Ranking Organization Method for Enrichment of Evaluations; ELECTRE I, from the French for elimination and choice expressing reality), plus ratio-system MOORA (Multi-Objective Optimization on the basis of Ratio Analysis) and proportional COPRAS (Complex Proportional Assessment) — with AHP (Analytic Hierarchy Process) pairwise-comparison priority weighting (Consistency Ratio), a Pareto non-dominated front, weight-sensitivity analysis, and multi-attribute utility scoring. The nine aggregators reproduce the independent third-party libraries pymcdm (WSM / WPM / WASPAS / MOORA / TOPSIS / VIKOR / PROMETHEE II) and pyDecision (ELECTRE I, COPRAS) to < 1e-9, and the AHP priority vector + Consistency Ratio match Saaty's Random-Index table and the SciPy/LAPACK principal eigensolver to < 1e-9 (tests/mcda_*_reference.rs). VALIDATED — the decision layer under the trade-study engine. | ||||
| Space environment | A space-weather environment model (space-weather, src/space_weather.rs): solar (F10.7 / centred-81-day F10.7a — the 10.7 cm solar radio flux) and geomagnetic (Kp, the planetary K-index, with the definitional Kp↔ap table — ap being its linear planetary amplitude) activity indices, the Jacchia-1971 exospheric temperature they drive (validated vs published solar min/mean/max), and the activity-corrected vs static thermospheric neutral density at altitude — the solar-cycle density dependence the static USSA76 (US Standard Atmosphere 1976) atmosphere omits. MODELLED: a calibrated first-order scale-height coupling, not a data-validated (NRLMSISE — the US Naval Research Laboratory Mass Spectrometer and Incoherent Scatter Radar Exosphere model) atmosphere. | ||||
| AI/ML evaluation & trade | An RF-impairment detection evaluation testbed (impairment-eval, src/impairment_eval.rs): a labelled, parameter-grounded synthetic corpus (nominal / jamming / spoof-time / spoof-position / multipath), a detector-agnostic ROC/AUC (receiver operating characteristic / area under the curve) harness scoring any detector (energy \ | agc \ | sqm \ | parity \ | fused) with per-class Pd (probability of detection) at a target Pfa (probability of false alarm), and the in- vs out-of-distribution optimism gap (distribution-shift mode). Plus a quantum-vs-classical PNT trade (quantum-trade, src/quantum_trade.rs) quantifying a candidate clock's timing/inertial holdover benefit from a measured-ADEV curve vs a classical baseline, with the long-τ floor caveat carried on the artifact and a GNSS-denied resilience-vs-time envelope. The evaluation metrics (AUC / confusion / Pd-Pmd, Pmd being the probability of missed detection) are validated to an exact match against scikit-learn 1.9.0 — including on real ESA OPS-SAT telemetry (the OPSSAT-AD anomaly-detection dataset, Ruszczak et al. 2025, CC BY 4.0 — Creative Commons Attribution 4.0), where Kshana's Mann–Whitney ROC AUC reproduces scikit-learn's roc_auc_score to < 1e-9 on the held-out test split and a transparent peak-count detector separates the labelled anomalies at AUC ≈ 0.85 (tests/opssat_ad_reference.rs) — and the trade engine's numerical kernels (ADEV NNLS — non-negative least squares — fit, χ² consistency bands, van-Loan clock Q) against scipy 1.17.1; the device-benefit numbers built on top stay MODELLED operating characteristics — never field/IQ (in-phase/quadrature sample) data, no good/bad verdict. Building on the testbed, a deeper optimism-gap study (src/impairment_study.rs, impairment_ml.rs, eval_stats.rs) scores a 13-detector panel (energy/AGC/SQM/parity plus seeded logistic-regression and one-hidden-layer-MLP — multi-layer perceptron — detectors), fits in- vs out-of-distribution scaling laws with a permutation null, and learns a leave-one-out predictor of out-of-distribution degradation from in-distribution statistics (cargo run --example optimism_study). A software-defined-receiver front end (src/sdr.rs — raw IQ/IF (intermediate-frequency) → correlator early/prompt/late taps → SQM) and real-data ingest adapters (src/realdata/ — RINEX, u-blox UBX (the u-blox binary protocol), GnssLogger, JammerTest, Yunnan, SatGrid) let the same detectors run over recordings supplied locally (no datasets are committed). The quantum-vs-classical resilience crossover map under parameter uncertainty (src/crossover.rs; cargo run --bin crossover_study) regenerates the inertial and clock crossover studies behind the Results figures. |
| Quantum-Enabled PNT demonstrator | Three runnable, MODELLED application areas behind the open engine, each emitting honest TradeEvidence + a representativeness / gaps-to-flight record (src/representativeness.rs): trusted quantum time transfer (quantum-time-transfer, src/timetransfer_chain.rs — an end-to-end optical-lattice-clock + photonic-link vs CSAC (chip-scale atomic clock) + RF two-way budget, with a reused timing protection level, a delay/replay-attack security FoM (1 − P_md), and clock-anomaly detection + CUSUM latency); GNSS-free quantum navigation (quantum-gnss-free-nav, src/quantum_nav_od.rs — a cold-atom-interferometer inertial coast vs a navigation-grade INS over a GNSS outage, honest that with no external fix the accelerometer bias is unobservable so the error still grows); and quantum-system fault/anomaly detection (quantum-anomaly-detect, src/quantum_faults.rs — a labelled fault catalogue with a bootstrap-CI (confidence-interval) ROC AUC from the externally-validated eval_stats and a minimum-detectable-fault at a fixed false-alarm rate). A shared quantum device error-model library (src/quantum_devices.rs) and a unified quantum-vs-classical trade harness (src/qtrade.rs) underpin them. The validated kernels they ride (eval-metrics vs scikit-learn, trade kernels vs scipy) are reused; the device-benefit numbers built on top stay MODELLED — illustrative public-source device/link parameters, models the class, no TRL / flight heritage / certification, no agency endorsement. | ||||
| Frugal engineering & integrity impact | A cost-per-coverage ROI (return on investment) lens (src/frugal.rs) — cost per unit of delivered coverage for an architecture trade — and a detection-miss → integrity-impact mapping (src/integrity_impact.rs) that turns a monitor's missed-detection rate into its integrity-risk contribution. MODELLED decision-support budgets, additive. | ||||
| Artifact interchange | The Kshana Interchange Format (KIF) (src/interchange.rs) — a versioned, self-describing envelope wrapping a scenario result with its kind, schema version, and MODELLED/VALIDATED labels, so a stored artifact stays self-documenting and older envelopes remain forward-compatibly readable. |
Each capability is reachable as a Rust API, a runnable scenario kind, or both.
Maturity per capability — validated, runnable, or library — is tracked in
docs/CAPABILITY.md. A machine-checked verification matrix
(src/verification.rs) renders the requirement → module → test → oracle → status
cross-reference, with unit-tested honesty invariants that permit a validated label
only where an independent external oracle backs it — and that record the
hardware/PA (product-assurance) capabilities Kshana deliberately does not provide.
The four sensor packs, as first published (results)
Results
Each scenario compares a quantum sensor against its classical counterpart through a
~1.8 h GNSS outage. Numbers are reproducible (scenario + seed + version).
What quantum sensors buy when GNSS is gone — clock-holdover · seed 42 · drawn at engine 0.39.0, and every figure above re-checked against the current engine on each build by tests/published_figures_still_reproduce.rs · SVG
The advantage is outage- and vibration-dependent, with an explicit break-even where classical wins — shown honestly across the technology-readiness ladder (optical-clock figures are ground-demonstrator targets; no strontium optical clock has flown):
Quantum-vs-classical resilience crossover — clock holdover TRL ladder (top) · inertial advantage map with break-even contour (bottom). Regenerable via cargo run --release --bin crossover_study.
Dead-reckoning position error during a GNSS outage: the quantum sensor (blue)
stays flat near the spec; the classical sensor (red) diverges to tens of kilometres.
Generated by Kshana from scenarios/imu-deadreckoning.toml.
| Pack | Scenario | Quantum | Classical |
|---|---|---|---|
| 1 — Clock holdover | clock-holdover.toml (20 ns spec) | optical clock holds the full outage | CSAC breaches the spec mid-outage |
| 2 — Inertial dead-reckoning | imu-deadreckoning.toml (100 m spec) | cold-atom: ~41 m, holds full outage | nav-grade: breaches in ~350 s → tens of km |
| 3 — Time transfer (optical inter-satellite link) | timetransfer.toml | optical: ~0.3 mm ranging | RF (TWSTFT): ~150 mm ranging |
| 4 — Hybrid fusion (capstone) | hybrid-pnt.toml | full position+timing for the whole outage | position-limited at ~350 s |
The capstone shows the fusion thesis: optical inter-satellite time-transfer keeps even a classical clock locked, isolating the inertial sensor as the classical suite's weak link — i.e. quantum inertial + optical timing together.
Clock holdover through a GNSS outage: the optical clock (blue) stays inside the
20 ns spec for the full coast; the chip-scale clock (red) breaches it part-way.
Generated by Kshana from scenarios/clock-holdover.toml.
A further scenario, orbit-gnss-challenged.toml, derives GNSS availability from
orbital geometry rather than hand-authored windows: a spacecraft inside the GNSS
shell is propagated against a GPS-like Walker constellation, and the visible-satellite
count (line-of-sight, Earth-occultation, elevation mask) sets the fix state at each
step. Over a day the user is in fix only ~59% of the time; the quantum clock holds a
5 ns timing solution through every gap (availability 1.0), the chip-scale clock
only ~0.83.
Timing error over a day with GNSS availability derived from orbital geometry: the
visible-satellite count (line-of-sight, Earth-occultation, elevation mask) sets the fix
state at each step, so the clock must coast every gap — the optical clock holds the 5 ns
spec while the chip-scale clock breaches it. Generated by Kshana from
scenarios/orbit-gnss-challenged.toml.
The constellation can also be given as real two-line element sets (TLEs). A full TLE
(line 1 + line 2) is propagated with the full SGP4/SDP4 model — including
atmospheric drag and the deep-space lunar-solar and 12 h / 24 h resonance terms that
matter for ~12 h GNSS orbits — validated against the official AIAA 2006-6753 vectors
to a worst-case ≈ 4 mm. scenarios/orbit-sgp4-gps.toml ships a real Celestrak
gps-ops snapshot of the operational GPS constellation (2021-07-28, 30 satellites)
and requires valid TLE checksums — two-line element sets are open data from the US
Space Force / 18th Space Defense Squadron catalogue, redistributed by Celestrak
(Dr T. S. Kelso, celestrak.org); refresh with
scripts/fetch_tles.sh. A line-2-only block keeps
the analytic two-body propagation (scenarios/orbit-real-tle.toml); the two forms can
be mixed in one constellation. A constellation can equally be built from a block of
RINEX-3 GPS broadcast-ephemeris records — the format a receiver decodes —
propagated by the IS-GPS-200 user algorithm and fed through the same geometry
(scenarios/orbit-rinex.toml).
What it is / is not, in full
What it is / is not
It is: a deterministic, dependency-light engine spanning the PNT stack — orbit geometry, inertial navigation, GNSS/INS fusion, integrity, clocks, and timing. It runs a scenario (often a GNSS outage), evolves calibrated sensor error models through the appropriate estimator, and scores the result against the operational figures of merit — emitting a reproducible JSON (JavaScript Object Notation) result and an SVG chart, from a Rust library, a command-line interface (CLI), a Python extension, an in-browser WebAssembly module, a Model Context Protocol (MCP) server for AI agents, or a JetBrains IDE (integrated development environment) plugin.
It is not: flight hardware, a quantum-payload design, a full GNSS signal
receiver, a radio-frequency (RF) signal simulator or hardware-in-the-loop rig, or a
certified avionics product — and it does not replace MATLAB/Simulink, STK (Systems Tool
Kit) or Orekit; it sits next to them and exchanges files with them. Quantum-hardware fidelity comes from
published error models, not from this tool. The granular maturity of each
capability is documented in docs/CAPABILITY.md.
It is not (yet): a full atom-interferometry physics engine (most quantum sensors
consume published Allan/noise-budget coefficients; the CAI (cold-atom interferometer) accelerometer has a
first-principles layer — Mach–Zehnder phase, projection noise, contrast decay, and
vibration coupling, plus Coriolis and light-shift systematics — but wavefront systematics and
fringe-ambiguity resolution remain a P2 (roadmap phase 2, the quantum physics layer)
roadmap layer, see ROADMAP.md and docs/QUANTUM-MODELS.md);
a certified or hardware GNSS receiver (it solves a single-point PVT (position, velocity and time) position
fix from real RINEX (Receiver Independent Exchange Format) code observations — validated
on real IGS (International GNSS Service) data — and its IQ layer (kshana iq, since 0.31.0)
acquires and tracks recorded or generated baseband samples in software, as an analysis
receiver: it does not drive radio hardware or transmit, is not a certified receiver, and does
no carrier-phase positioning (RTK or PPP)); or a full mission-design suite (it has Lambert / porkchop /
maneuver / orbit-determination building blocks, but is the performance-simulation layer
above GMAT (General Mission Analysis Tool)/Orekit, not a replacement). Owning this scope is deliberate. If you need first-principles cold-atom
interferometer error budgets (e.g. CARIOQA-PMP-grade — Cold Atom Rubidium Interferometry
in Orbit for Quantum Accelerometry, Pathfinder Mission Preparation — or X-37B-style validation), see
the P2 roadmap and get in touch to collaborate.
Low-Earth-orbit navigation
Low-Earth-orbit (LEO) satellites pass fast and loud. The leo-pnt-chain kind follows one
system through every stage: the signal, the pass and its link, the navigation message, and
the fused position, velocity and time (PVT) fix and precise point positioning (PPP). Each
stage hands its numbers to the next. See docs/LEO-PNT.md.
Every scenario kind by family
The engine's scenario kinds, filed under families. Each family has a page with one entry per kind (the
engine's description and fields, an example command, headline numbers from a run, the
verification matrix rows that name it, and the chart the engine itself writes) and a
contact sheet of those charts; docs/KINDS.md indexes them all. The table is written by
tools/gen_readme_blocks.py and the pages by
tools/gen_kinds_index.py, and both fail if the engine gains a kind no family names.
| Family | What it answers | Kinds | Run one |
|---|---|---|---|
| Clocks, timing and holdover | how long a clock keeps time without GNSS, and how a timing system holds up against its masks | clock, sweep, sweep-nd, telecom-timing, slot-timing, timetransfer, time-transfer-budget, holdover-test, quantum-time-transfer | kshana scenarios/clock-holdover.toml |
| Inertial, fusion and quantum sensors | dead reckoning and sensor fusion through a GNSS outage, with classical and quantum sensors | inertial, hybrid, fusion, hybrid-ukf, gnss-ins, ins-trn-coast, quantum-gnss-free-nav, quantum-anomaly-detect, quantum-trade | kshana scenarios/gnss-ins.toml |
| GPS-denied alternative PNT | navigating from gravity, terrain and other fields when GNSS is gone | gravity-map, terrain-nav, terrain-slam, combined-altpnt, conflict-resilience | kshana scenarios/combined-altpnt.toml |
| Constellations, coverage and geometry | where satellites are, who sees them and how good the geometry is, around the Earth, the Moon or Mars | orbit, ephemeris, constellation-design, solar-system, body-pnt, mars-pnt, passes | kshana scenarios/orbit-gnss-challenged.toml |
| GNSS measurements, positioning and integrity | pseudoranges, position fixes, protection levels and the space environment | integrity, gnss-sim, pvt, araim-reference-check, space-weather, realtime-frame-eop | kshana scenarios/integrity-raim.toml |
| Jamming, spoofing and the spectrum | how interference reaches a receiver and whether it is detected | jamming, spoof, spoof-detect, tracking-loop, spectrum, impairment-eval | kshana scenarios/jamming-demo.toml |
| Low-Earth-orbit navigation | a pass, a link, a navigation message and a fused fix, stage by stage | leo-signal, leo-pass, leo-navmsg, leo-pvt, leo-ppp, ntn-positioning, leo-pnt-chain | kshana scenarios/leo-pnt-end-to-end.toml |
| Lunar and cislunar | navigation, time, frames and geodesy at the Moon | lunar-integrity, lunar-time-offset, lunar-time-budget, lunar-vlbi, lunar-vlbi-fim, lunar-joint-od-clock, lunar-frame-realisation, lunar-frame-campaign, lunar-llr-datum, moonlight-service-volume, lunar-differential-pnt, lunar-station-coverage, lunar-beacon, lunar-interop-export, cislunar-observability, cislunar-arc-recovery, lunar-attack-surface, lunar-jamming, earth-gnss-lunar, lunar-infrastructure | kshana scenarios/lunar-infrastructure-od-consistency.toml |
| Space-user navigation | GNSS signals for spacecraft above, around and beyond the GNSS orbits | gnss-ssv | kshana scenarios/gnss-ssv-shell.toml |
| Optical PNT | optical links through the atmosphere and optical-plus-RF figures of merit | optical-atmosphere, hybrid-optical-rf | kshana scenarios/optical-atmosphere-network.toml |
| Mission analysis, links and space operations | launch, ascent, entry, attitude, links, contact planning and file formats | launch-window, ascent-losses, reentry, entry-heating, eo-coverage, eo-radiometry, attitude-budget, aocs, link-budget, acm-link, contact-schedule, aperture-duty-cycle, space-packet, oem-interop | kshana scenarios/launch-window.toml |
| Campaigns | chained missions, sweeps and ensembles built from the other kinds | campaign | kshana scenarios/campaign-jam-spoof-holdover-integrity.toml |
Every command
kshana <scenario.toml> runs a scenario; every other command is a subcommand, and kshana --help prints the usage
of all of them. The commands are --study, --validate, kinds, example, receiver-trust (with live and
evidence), evidence (keygen, verify, attach-timestamp, round-trip), jammertest (import, score),
trust-telemetry, imu-fit, nmea-scenario, interference-map (adsb, ais, daily, sensitivity,
fetch-land), route-exposure, bench (spec, truth, cases, score, baseline, seal, reveal-check,
manifest, verify-manifest, validate, leaderboard), bench-export, compliance-report,
lunanet-afs-check, standards-pack, osnma, iq (scene, acquire, track, sweep, labfit, campaign,
conditions, frontend, monitor, inventory, info, extract, convert, decimate), sky and skyline.
docs/COMMANDS.md gives each one's purpose, a verified example and its docs page.
Every surface
One engine, the same results everywhere: the command line, the Rust library, Python, JavaScript and WebAssembly,
the MCP server with its plugin commands and skills, Kshana Studio (every page runs in the browser, no install, nothing uploaded), the
ROS 2, Signal K, OpenCPN, GNSS-SDR and gnss_lib_py integrations, the systemd, Docker and Grafana deploy kits, and the
JetBrains plugin. docs/ALL-SURFACES.md lists them with how to get each and the names of all
the plugin commands, skills and Studio pages; docs/SURFACES.md says, for every command and kind,
which surface carries it and which do not, with the reason.
How a run works
A scenario is a TOML (Tom's Obvious, Minimal Language) file: a kind, a seed and the parameters. The engine runs it and writes the result, a chart and a report beside it, and the exports you ask for.
This bundled scenario runs 2 h: 10 min of GNSS, then about 1.8 h with GNSS denied. It asks how long a strontium optical lattice clock and a chip-scale atomic clock (CSAC) each hold time to within 20 ns.
kshana example clock-holdover > clock-holdover.toml
kshana clock-holdover.toml
scenario 5ba83a232b94 | quantum holdover 6600s p95 1.20e-4ns integrity 1.000 security n/a (no attack) | classical holdover 2610s p95 19.7ns integrity 1.000 security n/a (no attack)
wrote clock-holdover.result.json, clock-holdover.chart.svg, clock-holdover.report.html, and clock-holdover.report.json
The optical clock holds the 20 ns budget for the whole 6600 s outage; the CSAC holds it for
2610 s, and is inside the budget for 95.6% of the run against 100% for the optical clock.
kshana example lists every bundled scenario.
Missions
Ten sectors ask ten different questions of the same engine. Each has bundled scenarios to start from.
| Sector | Start with |
|---|---|
| Defence and security | campaign-jam-spoof-holdover-integrity, spoof-meaconing |
| Space, Earth orbit | orbit-gnss-challenged, leo-pnt-end-to-end |
| Moon, Mars and deep space | lunar-relay-constellation, mars-orbit-pnt |
| Aviation and drones | small-uas-jammed-nav, araim-gps-galileo |
| Maritime | maritime-strait-jamming, maritime-port-approach-coast |
| Road | automotive-urban-canyon |
| Rail | rail-tunnel-coast |
| Critical infrastructure and timing | clock-holdover, clock-ensemble |
| Telecom and 5G (the fifth generation of mobile networks) | telecom-prtc-holdover-24h, leo-vertical-5g-network-timing |
| Science and research | sweep-clock-stability, quantum-pnt-demonstrator.suite |
The question each sector asks
| Sector | The question it asks | Start with |
|---|---|---|
| Defence and security | How long do our navigation and timing stay trustworthy under jamming and spoofing, and which layers keep us in spec? | campaign-jam-spoof-holdover-integrity, spoof-meaconing |
| Space: Earth orbit | Does my spacecraft see enough navigation satellites, how long does its clock hold time between fixes, and what would a low-orbit navigation layer add? | orbit-gnss-challenged, leo-pnt-end-to-end |
| Lunar and deep space | Will a lander, rover or orbiter at the Moon, at Mars or further out get a trustworthy position and time? | lunar-relay-constellation, mars-orbit-pnt |
| Aviation and drones | After a jammer takes GNSS away, how long does my uncrewed aircraft system (UAS) stay inside its position budget, and is integrity available on my route? | small-uas-jammed-nav, araim-gps-galileo |
| Maritime | How far across the water does a jammer reach, would a position push be caught, and how long can a ship coast into port? | maritime-strait-jamming, maritime-spoof-position-push, maritime-port-approach-coast |
| Road and automotive | How far does a car drift under an overpass or past a roadside jammer? | automotive-urban-canyon |
| Rail | How many seconds into a tunnel can a train still tell which track it is on? | rail-tunnel-coast |
| Critical infrastructure and timing | If GNSS time is lost or spoofed, how long do a power grid, a trading venue or a data centre keep traceable time? | clock-holdover, clock-ensemble |
| Telecom and 5G | If the GNSS time reference is lost, does my network clock stay inside the ITU-T masks, and for how long? | telecom-prtc-holdover-24h, leo-vertical-5g-network-timing |
| Science and research | Can I reproduce, extend and cite a PNT result, down to the seed? | sweep-clock-stability, quantum-pnt-demonstrator.suite |
Evidence
176 of 388 capabilities validated against independent external oracles; 208 honestly labelled Modelled. Each row of the verification matrix names a capability, the oracle it is checked against, the test that runs the check, and the label that follows. Continuous integration (CI) makes it impossible to call a capability VALIDATED without an independent external oracle.
| Label | Rows | Meaning |
|---|---|---|
| VALIDATED | 176 | an independent external oracle agrees: real data, an independent implementation or published reference vectors |
| MODELLED | 208 | checked against analytic truth or simulation self-consistency, and said out loud |
| PARTNER | 4 | owned by a hardware partner; Kshana holds no oracle for it |
A few of the checks: all 666 AIAA (American Institute of Aeronautics and Astronautics)
2006-6753 SGP4 (Simplified General Perturbations 4) vectors to 4.12 mm; the Cowell force
model to 0.08 m against Orekit 12.2; Galileo to 0.61 m and Swarm-A to 0.10 m against real
precise ephemerides of the European Space Agency (ESA). Tests hold near 95 % line coverage of
src/, gated at 85 % in CI. The ledger is
docs/VERIFICATION-MATRIX.md, generated from
src/verification.rs: the full 388-row matrix, and why each
Modelled row has no external oracle in docs/MODELLED-RATIONALE.md.
How validation works, the curated highlight table and the evidence figures
Validation, reproducibility & honesty
- Every noise term is calibrated to a published, cited figure and validated
against the standard relation (Allan deviation for clocks; Groves' dead-reckoning
error growth for inertial; the timing→ranging conversion for time transfer). Status
per term is tracked in
docs/VALIDATION.mdasvalidatedornot modeled— nothing is presented as validated that is not. - Reproducible by construction:
scenario + seed + engine version → identical bits.scripts/check-reproducible.shenforces it; quantum and classical runs use independent seeds so their noise is uncorrelated. - Maturity is stated honestly: optical-clock and optical-link figures are targets / ground-demonstrator results, not flown.
Validation at a glance
Every row is enforced by a named test in CI. This table is a curated highlight;
the full machine-checked matrix is 388 rows — 176 VALIDATED, 208 MODELLED, 4 PARTNER
(src/verification.rs), with the complete evidence (and what is honestly not yet
validated) in docs/VALIDATION.md and the per-release
kshana-validation-summary.html
artifact (generated by cargo run --bin validation_report, SLSA-attested — Supply-chain
Levels for Software Artifacts).
The Status column states the kind of evidence, matching the validation ladder above: VALIDATED = checked against an independent external oracle (real data, an independent library, or published reference vectors); MODELLED = checked against analytic truth or simulation self-consistency (no independent external dataset). VALIDATED describes the method of checking, not a pass/fail — an honest miss against a real external oracle stays VALIDATED, while a comparison that no matrix row names as an oracle (the LRO — Lunar Reconnaissance Orbiter — fit above) is shown as MODELLED. CI rows are process guards, not figures of merit. A few real-data islands (the measured caesium clock, Stable32 PHASE.DAT, and the OPS-SAT/ICGEM checks where the raw inputs carry no redistribution licence) are data-gated: the test prints a skip notice and stays green when the input is absent, and the public reference numbers are committed under tests/fixtures/. Reproduce the raw inputs with the matching scripts/fetch_*.sh.
| Status | Capability | Agreement | Reference / oracle |
|---|---|---|---|
| VALIDATED | SGP4/SDP4 propagation | 666/666 vectors, worst 4.12 mm | AIAA 2006-6753 (Vallado tcppver.out) + head-to-head vs the independent sgp4 crate |
| VALIDATED | Reference frames — IAU 2000A/B nutation, IAU 2006/2000A CIO chain, ERA | bit-for-bit (X,Y to 1e-14, s to 1e-18, ERA to 1e-12) | ERFA/SOFA eraXys06a · eraC2ixys · eraEra00 · eraNut00a/b |
| MODELLED | GCRS→ITRS vs an independent SPICE engine | max 0.028″ → ≤ 0.86 m ground, ≤ 3.6 m GNSS orbit | ANISE (pure-Rust NAIF/SPICE), same IERS finals2000A EOP, 8 epochs 2020–2023 (compared against this reference; no verification-matrix row names it as an external oracle, so it is not labelled VALIDATED) |
| MODELLED | EGM2008 geopotential (degree/order 70) | acceleration = ∇V to < 1e-6; zonal collapse to validated J2 | NGA EGM2008 coefficients + analytic ∇V identity |
| VALIDATED | Gravity-functional synthesis (gravity-aided / GNSS-free nav map) | GRS80 Somigliana + γ_e/γ_p to 3.5e-12; real EGM2008 disturbance map physical (RMS ≈ 26 mGal, d/o 70) | GRS80 (Moritz 1980, IAG — International Association of Geodesy) Somigliana normal gravity + real ICGEM EGM2008 (tests/icgem_gravity_reference.rs) |
| VALIDATED | Allan estimators (ADEV/MDEV/TDEV/HDEV) + confidence bands | reproduce reference deviations; χ² bands match | NIST SP 1065 (Riley), 1000-point Table 31/32 |
| VALIDATED | Allan estimators on a real measured caesium clock | OADEV/OHDEV to 1e-3 (observed ≤ 3e-5), 16 averaging factors | Stable32 on a real 5071A Cs vs H-maser, 556,990 pts (tests/cs5071a_reference.rs, data-gated) |
| VALIDATED | Allan estimators on the canonical Stable32 PHASE.DAT | OADEV/MDEV/TDEV to 1e-3 (observed ≤ 5e-5), 139 averaging factors | Stable32 reference deviations for PHASE.DAT (tests/phasedat_reference.rs, data-gated) |
| MODELLED | IMU error model — ARW / VRW / bias-instability | recovered to < 5 % (bias-instability < 15 %) | Analog Devices ADIS16465 datasheet; NaveGo reference profile |
| VALIDATED | Numerical Cowell propagator + force model (conservative tiers) | worst position error 0.08 m over 24 h, 278 epochs (LEO + GTO) | Orekit 12.2 NumericalPropagator/DormandPrince853 (CS GROUP), tests/numerical_cowell_propagator_reference.rs |
| MODELLED | Cowell drag tier + absolute Sun/Moon-ephemeris & density inputs | drag tier characterised ≈ 333 m / 24 h; unperturbed matches universal-variable Kepler sub-m, energy/momentum ~1e-9 | built-in low-precision ephemeris + analytic Kepler |
| MODELLED | Lambert · Tsiolkovsky · porkchop | round-trip to two-body truth; ΔV < 0.01 % | Izzo 2015 · rocket equation · analytic Hohmann floor |
| MODELLED | 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 |
| MODELLED | 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 (compared against this reference; no verification-matrix row names it as an external oracle, so it is not labelled VALIDATED) |
| MODELLED | 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 (compared against this reference; no verification-matrix row names it as an external oracle, so it is not labelled VALIDATED) |
| MODELLED | Force-model fit vs LRO lunar (honest miss) | 6.67 m reduced-dynamic, above the 5 m target | JPL Horizons LRO (NAIF −85) + GRAIL (Gravity Recovery and Interior Laboratory) GRGM660PRIM (compared against this reference; no verification-matrix row names it as an external oracle, so it is not labelled VALIDATED) |
| MODELLED | Deep-space Mars OD (reduced-dynamic SRIF) | ≈ 0.2 m Mars-LMO (simulation FoM, not real-mission) | synthetic closed-loop OD — estimator-machinery validation |
| MODELLED | 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) (compared against this reference; no verification-matrix row names it as an external oracle, so it is not labelled VALIDATED) |
| VALIDATED | 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) |
| MODELLED | 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 |
| MODELLED | GPS-denied gravity-map navigation | ~70 km INS drift → ~145 m recovered | ESA NAVISP Quantum Wayfarer target |
| MODELLED | Terrain-referenced navigation (TERCOM/SITAN) | 70 km drift → < 500 m (grid-resolution floor ~140 m) | SRTM .hgt DEM; hand-injected drift (non-circular check) |
| MODELLED | IGRF-14 main field (degree/order 13) | pole ~80.7°N, dipole ~29.7 µT, physical 22–67 µT band | IAGA (International Association of Geomagnetism and Aeronomy) igrf14coeffs.txt (Schmidt semi-normalised) |
| MODELLED | 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 |
| MODELLED | 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 |
| MODELLED | ARAIM dual-constellation integrity | constellation-wide fault mode on real GPS + Galileo | EU ARAIM TR (technical report) / DO-316; Celestrak gps-ops 2021-07-28 (compared against this reference; no verification-matrix row names it as an external oracle, so it is not labelled VALIDATED) |
| VALIDATED | GNSS geometry / DOP (GDOP/PDOP/HDOP/VDOP/TDOP) | match to 1e-6 relative across 8 geometries (well-conditioned → near-singular) | gnss_lib_py 1.0.4 (Stanford NAV Lab) — independent library (tests/dop_reference.rs) |
| VALIDATED | ML detector-evaluation metrics (AUC/ROC/confusion/Pd-Pmd/precision/F1) | exact counts + < 1e-9 over 5 datasets × 24 thresholds | scikit-learn 1.9.0 (Pedregosa et al., JMLR — Journal of Machine Learning Research — 2011) — independent library (tests/eval_metrics_reference.rs) |
| VALIDATED | Anomaly-detection ROC AUC on real ESA OPS-SAT telemetry | AUC reproduces scikit-learn to < 1e-9; peak-count detector AUC ≈ 0.85 on the labelled test split | scikit-learn roc_auc_score on the OPSSAT-AD test split (Ruszczak et al. 2025, CC BY 4.0) — real OPS-SAT telemetry (tests/opssat_ad_reference.rs) |
| VALIDATED | Quantum-trade numerical kernels (ADEV NNLS fit · χ² consistency bands · van-Loan clock Q) | NNLS + Q exact; χ² < 5e-4 at operating dof ≥ 48 | scipy 1.17.1 — optimize.nnls / stats.chi2.ppf / linalg.expm (tests/scipy_reference.rs) |
| VALIDATED | MTIE / MDEV / TDEV telecom wander metrics (ITU-T G.810/G.823/G.8261/G.811 — the International Telecommunication Union's Telecommunication Standardization Sector recommendations) | MTIE (9 averaging factors, bit-exact) and MDEV + TDEV (8 factors, < 1e-9 relative) on the NIST SP 1065 LCG (linear congruential generator) series | allantools 2024.06 mtie / mdev / tdev — independent library (tests/mtie_reference.rs, tests/mdev_tdev_reference.rs) |
| VALIDATED | MCDA trade-study methods — all four decision families, nine externally-validated aggregators (WSM · WPM · WASPAS · MOORA · COPRAS · TOPSIS · VIKOR · PROMETHEE II · ELECTRE I) plus AHP pairwise-comparison priority weighting | scores / rankings / concordance matrices reproduced to < 1e-9 | pymcdm + pyDecision (independent third-party MCDA libraries) + Saaty RI (Random Index) / SciPy-LAPACK eig (tests/mcda_*_reference.rs) |
| VALIDATED | LEO Doppler envelope from the orbit and carrier | Iridium maximum within 5 % of the published ±36 kHz; Xona Pulsar X1 inside the published 32–34 kHz | RNTF LEO PNT test results; Leclère, Marathe & Reid, arXiv:2509.19551 (tests/leo_doppler_reference.rs) |
| MODELLED | PPP convergence with LEO augmentation | 7.4 → 4.8 / 3.2 / 2.7 / 2.3 min with 60 / 96 / 192 / 288 LEO satellites, monotone; filter NEES inside the χ² band | trend compared with Li et al., J. Geod. 93:749 (2019) (9.6 → 7.0 / 3.2 / 2.1 / 1.3 min); constellations and noise not reproduced |
| MODELLED | Conditional Timing Protection Level (holdover-limited undetected time error under spoofing) | composition reproduces the multi-step clock_state covariance recursion; calibrated on a real recorded spoof | JammerTest 2024 (Zenodo 15911589) scalars + van-Loan / CUSUM closed forms (examples/tpl_jammertest) |
| MODELLED | PNT-resilience scoring + decision-instability | 35 hand-derived oracle tests; byte-deterministic study artifact (fixed seed) | DHS RPCF v2.0 mapping + Dirichlet / Kendall-τ / Hill-N2 closed forms — synthetic architectures, not a certification |
| MODELLED | RF-impairment optimism-gap study (scaling laws + leave-one-out predictor) | permutation-null significance; byte-deterministic artifact (5 seeds) | synthetic parameter-grounded corpus — the eval metrics are VALIDATED vs scikit-learn (above); the study is MODELLED |
| CI | Cross-platform reproducibility | bit-identical input + shape goldens on 3 OSes (operating systems) | Linux / macOS / Windows CI matrix, SHA-256 goldens |
| CI | Test coverage | ~95 % line on src/ excluding src/*_data.rs and src/main.rs, gated ≥ 85 % | cargo-tarpaulin (LLVM engine) |
How a capability earns its label — the CI-enforced invariant: no external oracle ⇒ cannot be Validated · SVG
Top: every Validated row is backed by an external dataset, by construction. Bottom: SGP4 matches the official reference in every regime (worst 4.12 mm). SVG · SVG
176 Validated · 208 Modelled · 4 Partner — SVG
Capability domains
Every capability of the public map, by domain, with its ledger label. The domain table is written by
tools/gen_readme_blocks.py from web/capabilities.json, the same file the
Studio's map of everything reads.
The full table, domain by domain with every capability and its label, is docs/CAPABILITY-DOMAINS.md.
Install
One line gets the command-line tool: cargo install kshana. Every channel ships
v0.39.0 from the same tagged commit.
| Channel | Install | Guide |
|---|---|---|
| Try in the browser | open https://kshana.dev | Studio guide |
| Command line (Rust) | cargo install kshana | Command-line usage |
| Rust library | cargo add kshana | API reference on docs.rs |
| Python | pip install kshana | Python API guide |
| JavaScript and WebAssembly | npm install kshana | npm and WebAssembly guide |
| AI assistant (MCP server, cargo) | cargo install kshana-mcp | MCP server guide |
| Docker image | docker run --rm -i ghcr.io/ashfordeou/kshana-mcp | MCP server guide: Docker |
| Claude Desktop extension | double-click the .mcpb for your system: macOS (Apple silicon) · macOS (Intel) · Windows · Linux (x86-64) · Linux (Arm) | Every MCP install snippet |
| Cursor (one click) | Add to Cursor (npx) · Add to Cursor (Docker) · npx -y kshana-mcp@0.39.0 | Every MCP install snippet |
| VS Code (one click) | Install in VS Code (npx) · Install in VS Code (Docker) · npx -y kshana-mcp@0.39.0 | Every MCP install snippet |
| Claude Code | claude mcp add kshana -- npx -y kshana-mcp@0.39.0 | Every MCP install snippet |
| npx | npx -y kshana-mcp@0.39.0 | Every MCP install snippet |
| uvx / pipx | uvx kshana-mcp==0.39.0 | Every MCP install snippet |
| Homebrew | brew install ashfordeOU/tap/kshana-mcp | Every MCP install snippet |
| Scoop | scoop bucket add ashforde https://github.com/ashfordeOU/scoop-bucket && scoop install kshana-mcp | Every MCP install snippet |
| winget | winget install AshfordeOU.KshanaMcp | Every MCP install snippet |
| Prebuilt binary | download kshana-mcp-<target> from the release and check it against SHA256SUMS | Every MCP install snippet |
| Official MCP registry | search io.github.ashfordeOU/kshana-mcp | Every MCP install snippet |
| Remote (streamable HTTP), self-hosted | kshana-mcp --http 127.0.0.1:8080 | Self-hosting guide |
| Claude Code plugin marketplace | /plugin marketplace add ashfordeOU/kshana | Using Kshana from an agent |
| JetBrains IDE plugin | Settings → Plugins → Marketplace → search "Kshana" (plugin ID dev.kshana.ide) | Plugin guide |
| Signal K plugin | npm install signalk-kshana-trust | Signal K plugin guide |
| OpenCPN plugin | download the plugin tarball from the release | OpenCPN catalogue submission |
| Grafana dashboard | import kshana-grafana-*.json from the release | Dashboard source |
| Reference-build image | docker pull ghcr.io/ashfordeou/kshana-reference-build | Marine integrations |
MCP is the Model Context Protocol. Pin a release with cargo install kshana --version 0.39.0,
pip install kshana==0.39.0 or npm install kshana@0.39.0. To build from source, see
Install and build under Reference.
Run a scenario from Python and from WebAssembly
import json, kshana
toml = open("clock-holdover.toml").read()
result = json.loads(kshana.run(toml))
print(kshana.version(), result["quantum"]["fom"]["holdover_s"], result["classical"]["fom"]["holdover_s"])
# 0.39.0 6600.0 2610.0
Beyond run, the module exposes run_full (JSON, SVG and the one-line summary at once),
run_typed, validate_toml, list_kinds / scenario_kinds and error_kind; see
docs/PYTHON_API.md.
The npm package is the whole engine compiled to WebAssembly. In Node.js, hand the binary to
initSync; in a browser, await init() fetches it (see README.npm.md).
import { readFileSync } from "node:fs";
import { createRequire } from "node:module";
import { initSync, run, summary, version } from "kshana";
const wasm = createRequire(import.meta.url).resolve("kshana/kshana_bg.wasm");
initSync({ module: readFileSync(wasm) });
const toml = readFileSync("clock-holdover.toml", "utf8");
const result = JSON.parse(run(toml));
console.log(version(), result.quantum.fom.holdover_s, result.classical.fom.holdover_s);
// 0.39.0 6600 2610
console.log(summary(toml));
Architecture
One open engine sits at the centre, and every surface runs it: the command line, the Rust library, Python, WebAssembly and Kshana Studio, the MCP server, the Docker image and the JetBrains plugin. The same scenario file gives the same bytes on each. Kshana Pro sits on top as a separate overlay that depends on the engine and never forks it.
Inside the engine: the domain layers and the verification ledger
One engine, many front doors. A single Rust core (kshana) runs every scenario,
reached through a CLI, a Python extension, an in-browser WebAssembly module, an MCP
server for AI agents, and a JetBrains IDE plugin — all converging on one
api::run_toml dispatch. Inside, the sensor packs plug into a common error-model
interface; alongside them sit a reference-frame layer (IAU 2006/2000A
precession–nutation and the CIO-based GCRS↔ITRS reduction), an astrodynamics/numerical
layer (analytic SGP4/SDP4 and a numerical Cowell propagator with its
EGM2008/perturbation force model, maneuver design, and orbit determination), an
integrity/GNSS layer (RAIM/ARAIM, SBAS, the measurement domain, jamming, cislunar),
a fusion / alt-PNT layer (the GNSS/INS estimators and the gravity/terrain/magnetic
map-matchers), a deep-space & lunar layer (radiometric Mars-PNT and the
lunar PNT suite, its evidence tier per piece in the matrix — LTC time, VLBI, joint OD+clock, frame realisation, service-volume,
differential PNT, interop), a mission-analysis layer (launch / re-entry / coverage /
pointing / pass / link budgets and the space-weather environment), and the open
resilience & AI/ML study layer (RPCF resilience scoring, the RF-impairment optimism
gap, and the quantum-enabled PNT demonstrator) whose reproducible artifacts ride the
validated kernels.
Two standalone, workspace-excluded crates sit beside the core — mcp/kshana-mcp
(the MCP server, built on the edition-2024 rmcp SDK) and xval/anise-frames (the
ANISE/SPICE frame cross-check, which pulls MPL-2.0 (Mozilla Public License 2.0) deps) — kept out of the published
crate's dependency graph, Cargo.lock, license gate, and MSRV (minimum supported Rust version) build by the root
Cargo.toml exclude list. The JetBrains plugin (ide/jetbrains) is a separate Kotlin
project. See docs/ARCHITECTURE.md for the full set of diagrams.
The rendered diagrams (engine flow, module map, distribution) are in docs/ARCHITECTURE.md.
Diagrams
The diagrams are Mermaid sources in docs/diagrams/, rendered to SVG and PNG into
docs/assets/diagrams/ (tools/render-diagram-chromium.sh <name> on Linux, the other two
render-diagram scripts elsewhere), and a record binds each PNG to the exact SVG it came from. Tests pin the
counts they state. The charts in the sections above are drawn by tools from engine runs; these show how the
parts fit.
One dispatch, one engine, reproducible output · SVG · source system-overview.mmd
Every surface, from the same engine · SVG · source surfaces.mmd
The inner loop of a run · SVG · source engine-flow.mmd
From a receiver log to a trust score and what uses it · SVG · source trust-flow.mmd
Scenario to signed pack; Kshana never produces or replays a signal · SVG · source lab-round-trip.mmd
How Studio runs, locally · SVG · source studio-flow.mmd
Test and release flow, from local gates to a verified release and the site-only path · SVG · source release-flow.mmd · docs/RELEASING.md
Where the code lives · SVG · source module-map.mmd
What ships where, and what checks it · SVG · source distribution.mmd
AI assistant
kshana-mcp is an MCP server: your assistant runs the actual engine and
reads back its JSON, instead of guessing the maths. Each of its 49 tools is a thin wrapper
over a public function of the kshana library, so no simulation logic lives in the server.
Install the MCP server
Advisory, not type-approved navigation equipment: the operator remains responsible for navigation. The server runs on your computer; nothing is sent to Ashforde OÜ.
Pick any channel. Every link and snippet is generated from one script
(scripts/gen_mcp_install.py) and checked in continuous integration; snippets for Claude Desktop,
Claude Code, Cursor, VS Code, Windsurf, Zed, Goose, Codex CLI, Gemini CLI and Continue are in
docs/MCP-INSTALL.md.
| Channel | Command or button | Requires | Pinned form |
|---|---|---|---|
| Claude Desktop extension | double-click the .mcpb for your system: macOS (Apple silicon) · macOS (Intel) · Windows | none | kshana-mcp-<target>.mcpb of v0.39.0 |
| Cursor (one click) | npx (Node) · Docker | Node, or Docker | kshana-mcp@0.39.0 / ghcr.io/ashfordeou/kshana-mcp:0.39.0 |
| VS Code (one click) | npx (Node) · Docker · Insiders (npx) | Node, or Docker | kshana-mcp@0.39.0 / ghcr.io/ashfordeou/kshana-mcp:0.39.0 |
| Claude Code | claude mcp add kshana -- npx -y kshana-mcp@0.39.0 · plugin: /plugin marketplace add ashfordeOU/kshana then /plugin install kshana@ashforde | Node (or Docker) | kshana-mcp@0.39.0 |
| npx | npx -y kshana-mcp@0.39.0 | Node 18+ | kshana-mcp@0.39.0 |
| uvx / pipx | uvx kshana-mcp==0.39.0 · pipx run kshana-mcp==0.39.0 | Python 3.9+ with uv or pipx | kshana-mcp==0.39.0 |
| Docker | docker run -i --rm ghcr.io/ashfordeou/kshana-mcp:0.39.0 | Docker | ghcr.io/ashfordeou/kshana-mcp:0.39.0 |
| Homebrew | brew install ashfordeOU/tap/kshana-mcp | brew | formula for v0.39.0 |
| Scoop | scoop bucket add ashforde https://github.com/ashfordeOU/scoop-bucket then scoop install kshana-mcp | Scoop (Windows) | manifest for v0.39.0 |
| winget | winget install AshfordeOU.KshanaMcp | winget (Windows) | --version 0.39.0 |
| cargo | cargo install kshana-mcp --version 0.39.0 | Rust 1.88+ | kshana-mcp 0.39.0 |
| Prebuilt binary | the release page: kshana-mcp (Linux x86-64), kshana-mcp-<target>[.exe], checked by SHA256SUMS and gh attestation verify | none | v0.39.0 |
| MCP registry | io.github.ashfordeOU/kshana-mcp (found by registry-aware clients) | a registry-aware client | 0.39.0 |
| Remote (streamable HTTP) | kshana-mcp --http 127.0.0.1:8080, self-hosted: see docs/deploy/mcp-http.md | your own host | v0.39.0 |
In Claude Code the same server arrives as a plugin: /plugin marketplace add ashfordeOU/kshana, then
/plugin install kshana@ashforde. The plugin adds slash commands over the tools: /kshana-run,
/kshana-assess-receiver, /kshana-evidence-pack, /kshana-interference-map,
/kshana-training-scenario, /kshana-bench-export, /kshana-compliance-report, /kshana-iq,
/kshana-import-route, /kshana-marine-integrations and /kshana-jammertest. The vessel-trust tools feed the Signal K and
OpenCPN integrations: docs/MARINE-INTEGRATIONS.md.
Per-client set-up is in docs/integrations.md. The server is listed
in the official MCP registry as io.github.ashfordeOU/kshana-mcp.
The 49 tools
Scenarios and reports
| Tool | What it does |
|---|---|
run_scenario | Run a scenario from a TOML (Tom's Obvious, Minimal Language) definition |
list_scenario_kinds | The 87 built-in scenario kinds with descriptions + required/optional fields — so the agent can construct a valid scenario |
validate_scenario | Pre-flight check: parse the TOML and detect its kind, without running |
list_example_scenarios | The bundled reference scenarios as JSON |
get_example_scenario | The TOML text of one bundled reference scenario, byte for byte the file under scenarios/ |
report_scenario | Run a scenario and return its report |
animate_scenario | Run a scenario and return its time series as an animation |
sky_geometry | Sky geometry under an azimuth-dependent skyline: the visible and hidden satellites, DOP, the east-north-up covariance and the horizontal error ellipse; or a skyline preset with its provenance |
Export and interoperability
| Tool | What it does |
|---|---|
list_export_formats | Which interoperability formats apply to a scenario (czml, kml, geojson, stk, sigmf), the reason when one does not, and the specification each writer follows |
export_interop | Export a scenario as CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, STK (Systems Tool Kit) ephemeris .e, or SigMF (Signal Metadata |
import_route | Write a GeoJSON LineString route into a scenario that flies a waypoint track (terrain-nav, terrain-slam, gravity-map, combined-altpnt) and return the new TOML |
export_sp3 | Export an orbit scenario's constellation as SP3-c (Standard Product 3, revision c) precise ephemeris |
export_omm | Export an orbit scenario's elements as a CCSDS (Consultative Committee for Space Data Systems) 502.0-B-2 OMM (Orbit Mean-elements Message) catalogue |
export_oem | Export an orbit scenario's state series as CCSDS OEM (Orbit Ephemeris Message) 2.0 ephemeris — the TEME (true equator, mean equinox) position and |
export_table_csv | Run a scenario and return its reproducibility table as CSV (comma-separated values) — the byte-stable table the CLI (command-line interface) writes as <scenario>.table.csv |
export_test_bench | A scenario's vehicle motion and events for a laboratory GNSS simulator (kshana bench-export) |
Receiver and vessel trust
| Tool | What it does |
|---|---|
assess_receiver_log | Assess a real GNSS (global navigation satellite system) receiver log for trust |
assess_vessel_stream | Score a bounded NMEA 0183 excerpt (at most 2 MiB and 20,000 epochs |
assess_vessel_log | A vessel's NMEA 0183 log (at most 4 MiB) as a batch run, with the session TOML stating the vessel's limits |
create_evidence_pack | A signed evidence pack for a window of a vessel's log (kshana receiver-trust evidence) |
attach_evidence_timestamp | Bind an RFC 3161 timestamp token (base64 of the .tsr bytes) to a pack, in memory (kshana evidence attach-timestamp) |
verify_evidence_pack | Verify a pack (kshana evidence verify) |
generate_training_nmea | Synthetic bridge NMEA 0183 for crew training from a nmea-scenario TOML (jamming, position drag-off, time spoof, replay delay) with the instructor log (kshana-nmea-training/1) |
build_interference_map | A GNSS interference map from ADS-B or AIS position reports as CSV text (at most 4 MiB) |
route_exposure | The share of a route's length in degraded, not-degraded, unassessed and not-observed cells of one or more interference maps, optionally within a date range |
trust_telemetry | A trust stream (JSON lines) or receiver-trust result rendered as Prometheus text, CEF or LEEF syslog lines or an OTLP JSON payload, with the kshana trust-telemetry encoders |
jammertest_import | Read the published Jammertest test catalogue and transmission plan (NPRA/jammertest-plan, MIT) as scheduled truth (kshana jammertest import): one test area's slots become receiver-trust events with the catalogue id and year in each label. Planned slots, not recorded on-air times; no contact field of the plan is read. MODELLED. See docs/JAMMERTEST.md. |
jammertest_score | Score a receiver log against that schedule (kshana jammertest score): per test the detection latency, missed alarms and time to recover, and the false alarms outside every slot. Text logs as log, binary (ubx, sbf) as log_base64. A signed pack needs a key: command line. Advisory only; MODELLED. |
fit_imu_log | Accelerometer and gyro parameters of the hybrid and fusion scenarios fitted from a stationary IMU log (CSV or EuRoC) by Allan deviation, with a ready-to-paste [accel_classical] table and the log's SHA-256 (kshana imu-fit). Text in, JSON out; MODELLED. |
GNSS IQ (work-directory files; off in HTTP mode)
| Tool | What it does |
|---|---|
iq_signals | The GNSS IQ layer's set-up |
iq_info | Describe one IQ (in-phase and quadrature) recording in the work directory without processing it |
iq_scene | Generate a multi-satellite GNSS IQ scene into the work directory (kshana iq scene) |
iq_acquire | FFT (fast Fourier transform) acquisition of one or more PRNs (pseudo-random noise codes) over a recording (kshana iq acquire), optionally behind front-end stages |
iq_track | Acquire, then track with the DLL/PLL/FLL (delay-, phase- and frequency-locked loop) bank (kshana iq track), with the loops from a `kshana.loop-desig |
iq_frontend | Apply receiver front-end and interference-mitigation DSP (digital signal processing |
iq_sweep | Replay one IQ recording in the work directory across several tracking-loop designs (kshana iq sweep) |
iq_monitor | Run the interference and spoofing detection monitors over an IQ recording in the work directory (kshana iq monitor) |
iq_labfit | Fit the tracking-loop loss-of-lock model to lab runs (kshana iq labfit) from an iq-labfit scenario whose logs are inline (text or base64 |
iq_test_conditions | Validate a kshana.test-conditions/1 file given as text and return the resolved conditions with their hash |
iq_campaign | Run a lab-replay campaign (kshana iq campaign) |
iq_campaign_status | A campaign output folder's progress |
Compliance mapping
| Tool | What it does |
|---|---|
compliance_report | The public-framework mapping filled from result documents given as text (kshana compliance-report) |
compliance_mapping | The static mapping tables (or, with sources, the source documents they cite with versions and URLs) as Markdown, led by the same statement |
list_standards_packs | The standards packs (kshana standards-pack list): scored scenario sets for the DHS Resilient PNT framework test profiles, IMO MSC.1/Circ.1575 and ICAO Doc 9849 Appendix F |
run_standards_pack | One pack run against bars stated before the run: each test MET, NOT MET or NEEDS INPUT; MODELLED, rates no product |
lunanet_afs_check | The LunaNet Augmented Forward Signal checked against LNIS V5 AD1 Volume A (LSIS-AFS V1.0): the codes against the printed tables, or a symbol stream against the frame format; LDPC and CRC-24Q of subframes 2 to 4 are not verified |
create_round_trip_pack | The signed laboratory round-trip pack: scenario, kshana.test-conditions/1 document, receiver log and score linked by hash |
Benchmark
| Tool | What it does |
|---|---|
score_benchmark | A kshana-bench submission scored against a truth file, both JSON text (kshana bench score, bench/SPEC.md): the result file with the spec version, split, input hashes and the task's metrics. MODELLED; describes a log or corpus, never a product. |
render_leaderboard | kshana-bench result files rendered as the static leaderboard page (HTML text), each validated first. |
Editions
The whole engine is free. Kshana Pro and custom studies are for programmes that need more, and every paid route starts with a message: there are no prices here.
| Free | Kshana Pro | Custom study | |
|---|---|---|---|
| What it is | the whole open engine, all 87 scenario kinds, no feature gate | a proprietary overlay on the same engine, under contract | a MODELLED PNT-resilience study of your system, done for you |
| Licence | AGPL-3.0 (GNU Affero General Public License, version 3), or a commercial licence | proprietary | contract |
| How to start | install or open kshana.dev | request a Pro evaluation | request a study |
What Pro is, in the words of docs/PRO.md:
A strict superset of open Kshana. Pro depends on the open engine as a library and never forks it. Every open scenario kind runs in Pro unchanged, and an open scenario runs in Pro with no licence at all.
No new physics. Pro adds no physical model and changes none. Every Pro number comes from runs of the open engine, so a Pro figure is as trustworthy as the open scenario kind it came from, and never more.
Pro answers a programme's next questions: which design to fly (a design optimiser and its
Pareto front), how sure the answer is (uncertainty and sensitivity), and whether the mission
meets its requirements (a mission dossier, requirements traceability, trade studies, a
scenario regression check, clock digital twins, a study dossier and an on-premises
service). It also watches a campaign of figures and fails a pipeline when one gets worse,
tests candidate signal plans against the open satellite-navigation signals in both
directions (spectrum coexistence), and queues studies in an on-premises job service with a
hash-chained delivery ledger. Each is described, with what it produces and what it does not do, in
docs/PRO.md. Nothing Pro produces is a certification, and a custom study is
not a certification either.
What Kshana Pro reads from the open engine, and support from Ashforde® OÜ
What Kshana Pro builds on. Every part of Pro works from the open engine and leaves it unchanged:
- The design optimiser, the uncertainty study and the mission dossier run open-engine scenarios through the engine's public interface and compute every number from the runs' results. Each output keeps the VALIDATED, MODELLED or PARTNER tier the open engine gave each figure, never a higher one.
- Clock digital twins use the open engine's clock model and its Allan-deviation estimator: a twin is calibrated to the device's published Allan budget, then checked by estimating the twin's Allan deviation with the open estimator.
- Trade studies run every architecture option as an open-engine scenario, unchanged, and rank the options on a figure of merit read from each run's result.
- Campaign watch reads its figures from the results of open-engine runs of the scenarios in a pack, and compares them with the previous passing run.
- Spectrum coexistence reads every physical number from open-engine runs of the
leo-signalandconstellation-designkinds, and adds only the sum over the satellites in view and the ranking of the plans. - The on-premises job service runs open and Pro scenarios through the same engine and stores each result as the run returned it.
- Evidence packs record, for each run, the scenario hash the open engine stamps on its result, so a figure in a pack can be reproduced by re-running its scenario.
- Systems-engineering and programme tooling. Kshana Pro's model-based
systems-engineering (MBSE) and programme tooling checks a programme's requirements
against runs of the open engine: it imports requirements as comma-separated values
(CSV), or as a documented subset of the Requirements Interchange Format (ReqIF) or of
Systems Modeling Language version 2 (SysML v2) text, evaluates each acceptance
criterion, with its unit, against the values a run wrote, and produces a verification
cross-reference matrix (VCRM), a SysML v2 model, a change-impact report and an offline
evidence pack. It re-runs and recomputes nothing, and reads only what the open engine
publishes: each run's
result.json(the fields a criterion names, their units, the reproducibility stamp of scenario hash, seed, engine version and schema version, and the run's label and figure tiers), itsreport.json(kind, reproducibility record and capability labels), the scenario file (its hash, kind, seed and parameters), the field-units schema (each field's unit, provenance and evidence tier) and the verification matrix (each capability's VALIDATED, MODELLED or PARTNER label).
Support & professional services
Kshana is free and open source under the AGPL-3.0 and professionally developed and maintained by Ashforde® OÜ (Estonia). The open engine is complete and usable on its own. For organisations that need more, Ashforde® OÜ offers:
- Commercial support & integration — embedding Kshana in your toolchain, custom scenarios, and priority fixes.
- Custom sensor models — calibrated to your hardware, including export-sensitive resilience models maintained in a private overlay.
- Kshana Pro — proprietary model-based systems-engineering (MBSE) and programme
tooling that checks a programme's requirements against runs of the open engine and
produces a verification cross-reference matrix (VCRM), a Systems Modeling Language
version 2 (SysML v2) model, a change-impact report and an offline evidence pack. It
re-runs nothing and reads only the engine's published outputs: each run's
result.jsonandreport.json, the scenario file, the field-units schema and the verification matrix's labels (the full list is under Editions). - Kshana Pro design, uncertainty and mission tooling — the Pareto front of a design
space, uncertainty and sensitivity over thousands of runs, and a one-command mission
dossier with a verification matrix and a PDF; see
docs/PRO.md. - Kshana Pro campaign watch, spectrum coexistence and job service — a pipeline that
fails when a watched figure gets worse, signal plans tested against the open
satellite-navigation signals in both directions, and an on-premises job queue with a
hash-chained delivery ledger; see
docs/PRO.md. - Training & consulting on quantum/classical PNT performance analysis.
This is the open-core model: the engine is, and stays, openly licensed; the sustaining business is expertise, support, and the proprietary extensions — not license fees. Contact contact@ashforde.org · ashforde.org.
Research
Studies built on the open engine are published on arXiv. Each names the engine command behind it, so its numbers can be regenerated from a committed scenario or study example.
| Paper | What it shows | Engine command |
|---|---|---|
| *Anticipating the Optimism Gap: Predicting Distribution-Shift Degradation of RF-Impairment Detectors from In-Distribution Statistics* | ||
| arXiv:2606.22054 · doi:10.48550/arXiv.2606.22054 | The drop in a GNSS interference detector's score once conditions shift can be predicted from in-distribution statistics alone, on an open synthetic testbed and then on open field recordings. | cargo run --release --example optimism_study -- paper-artifacts/optimism-study.json |
| *A Conditional Timing Protection Level: Holdover-Limited Undetected Time Error Under GNSS Spoofing* | ||
| arXiv:2606.24210 · doi:10.48550/arXiv.2606.24210 | A GNSS timing receiver under spoofing has no finite unconditional bound on undetected time error, so the paper gives a conditional one, calibrated on a recorded over-the-air spoof from the public JammerTest 2024 campaign. | cargo run --release --example tpl_jammertest |
| *How Stable Is a PNT Resilience Score? Decision-Instability of Single-Number Resilience Ratings under Framework-Aligned Weighting* | ||
| arXiv:2607.05415 · doi:10.48550/arXiv.2607.05415 | A single composite resilience score is a stable basis for a decision only where one design dominates; where designs contend, re-weighting alone can change the winner. | cargo run --release --example resilience_report -- paper-artifacts/resilience-study.json |
| *Earth-baseline VLBI restores the observability of a lunar surface station in joint orbit-and-clock determination* | ||
| arXiv:2607.02566 · doi:10.48550/arXiv.2607.02566 | Ranging inside a lunar constellation leaves a surface station's absolute position unobservable; a very-long-baseline interferometry (VLBI) delay from Earth restores it when the constellation is sparse, and sharpens it when it is rich. | the lunar-joint-od-clock kind: kshana example lunar-joint-od-clock > s.toml && kshana s.toml |
| *The Cost of Lunar South-Polar Geometry, and Surface Beacons as the Efficient Fix: A Dilution-of-Precision Analysis* | ||
| arXiv:2607.06212 · doi:10.48550/arXiv.2607.06212 | Planned constellations of four to six satellites give poor geometry at the lunar south pole, and a few surface ranging beacons fix it far more cheaply than more satellites. | the lunar-beacon kind: kshana example lunar-beacon > s.toml && kshana s.toml |
| *Cislunar navigation is an observability problem: arc-length thresholds, Gramian conditioning, and the Doppler lever* | ||
| arXiv:2610.23871 · doi:10.48550/arXiv.2610.23871 | Dilution of precision is undefined for range-only cislunar tracking, because velocity is unobservable at a snapshot, so the paper uses the observability Gramian on four planar distant retrograde orbits: range-only is rank 2 of 4 at a snapshot and needs an arc of about 2.09 h to become fully observable, with conditioning improving as the arc lengthens; range-rate (Doppler) gives rank 4 instantly; and co-estimating a station with satellite states and clocks stays rank-deficient by one unless an external interferometric observable is added. Requirements belong in arc-length, conditioning and measurement-type budgets, not DOP. | the cislunar-observability kind: kshana scenarios/cislunar-observability.toml (its sibling cislunar-arc-recovery tests the threshold with an independent finite-difference estimator) |
The three study examples write byte-deterministic artifacts (fixed seeds) that record their
engine version, seeds and a configuration hash. The three lunar and cislunar papers are built on the
lunar suite (each piece's evidence tier is in the verification matrix); their geometry and dilution-of-precision claims are also cross-checked
against separate oracles in tests/validate_p*.rs. More in
Reproducible study artifacts under Reference.
Cite
If you use Kshana in academic or technical work, please cite the version you used, with the
scenario and seed. CITATION.cff holds the machine-readable metadata, and
GitHub shows a "Cite this repository" button from it. Every release is archived on Zenodo;
the concept DOI (Digital Object Identifier)
10.5281/zenodo.20528627 always resolves to the
latest version.
Baweja, C. (2026). Kshana — a PNT-resilience simulator with quantum-sensor performance models. Ashforde OÜ. https://doi.org/10.5281/zenodo.20528627
The papers above:
Baweja, C. (2026). Anticipating the Optimism Gap: Predicting Distribution-Shift Degradation of RF-Impairment Detectors from In-Distribution Statistics. arXiv:2606.22054. https://doi.org/10.48550/arXiv.2606.22054
Baweja, C. (2026). A Conditional Timing Protection Level: Holdover-Limited Undetected Time Error Under GNSS Spoofing. arXiv:2606.24210. https://doi.org/10.48550/arXiv.2606.24210
Baweja, C. (2026). How Stable Is a PNT Resilience Score? Decision-Instability of Single-Number Resilience Ratings under Framework-Aligned Weighting. arXiv:2607.05415. https://doi.org/10.48550/arXiv.2607.05415
Baweja, C. (2026). Earth-baseline VLBI restores the observability of a lunar surface station in joint orbit-and-clock determination. arXiv:2607.02566. https://doi.org/10.48550/arXiv.2607.02566
Baweja, C. (2026). The Cost of Lunar South-Polar Geometry, and Surface Beacons as the Efficient Fix: A Dilution-of-Precision Analysis. arXiv:2607.06212. https://doi.org/10.48550/arXiv.2607.06212
Baweja, C. (2026). Cislunar navigation is an observability problem: arc-length thresholds, Gramian conditioning, and the Doppler lever. arXiv:2610.23871. https://doi.org/10.48550/arXiv.2610.23871
Licence
Kshana is dual-licensed: the GNU AGPL-3.0-only (LICENSE), or a
commercial licence from Ashforde® OÜ for closed integration that the AGPL does not suit.
LICENSING.md explains which applies. Contributions are licensed inbound
under the AGPL and also grant Ashforde® OÜ the right to include them in the commercial
edition; sign off each commit with git commit -s (see CONTRIBUTING.md).
"Kshana" and its marks are trademarks of Ashforde® OÜ: the licence covers the code, not the
name, so please rename forks.
Reference
The long material, collapsed. Every document is listed in Documentation.
Install & build from source
Install & build
Requires a Rust toolchain (≥ 1.85, the rust-version in Cargo.toml; developed on 1.93).
git clone https://github.com/ashfordeOU/kshana
cd kshana
cargo build --release
cargo test # all tests pass
Usage: the command line in full
Usage
Run any scenario; the CLI dispatches on the scenario's kind field and writes
<scenario>.result.json, <scenario>.chart.svg, <scenario>.report.html and
<scenario>.report.json next to it — plus <scenario>.table.csv for the kinds that
publish a table. The report (a HyperText Markup Language (HTML) page and a JSON document
with the same content) carries an executive summary, every input with its unit, the
results and charts, a campaign's sweep, Monte Carlo or chain tables, an events timeline,
the VALIDATED / MODELLED / PARTNER label and source of every capability the run used,
what is not modelled, and a reproducibility record (engine version, Secure Hash
Algorithm 256-bit (SHA-256) digests, seed, platform and the exact command). It prints to
a clean PDF (Portable Document Format) file from the browser on A4 or Letter paper; the
engine writes no PDF itself. See docs/REPORTS.md.
cargo run -- scenarios/clock-holdover.toml
cargo run -- scenarios/imu-deadreckoning.toml
cargo run -- scenarios/timetransfer.toml
cargo run -- scenarios/hybrid-pnt.toml
cargo run -- scenarios/orbit-gnss-challenged.toml
cargo run -- scenarios/orbit-sgp4-gps.toml
cargo run -- scenarios/orbit-rinex.toml
cargo run -- scenarios/integrity-raim.toml
# Export a propagated constellation to an SP3-c precise-ephemeris file:
cargo run -- scenarios/orbit-sgp4-gps.toml --export-sp3 gps.sp3
# Export the constellation's mean elements to a CCSDS OMM catalogue (one OMM
# message per TLE-defined satellite, with its real NORAD id / COSPAR designator):
cargo run -- scenarios/orbit-sgp4-gps.toml --export-omm gps.omm
# Export the velocity-carrying state to a CCSDS OEM 2.0 ephemeris (GMAT/Orekit/STK):
cargo run -- scenarios/orbit-sgp4-gps.toml --export-oem gps.oem
# Export the geometry for a globe, a map or a mission-analysis tool: CZML, KML,
# GeoJSON, STK .e, or SigMF for the spectrum kind (every format that applies):
cargo run -- scenarios/jamming-demo.toml --export all
--export <czml|kml|geojson|stk|sigmf|all|list> writes CZML (the Cesium Language),
الأسئلة الشائعة
ما هو Kshana PNT-resilience simulator؟
Validated Kshana PNT simulator: orbits, GNSS, fusion, receiver trust, interference maps.
كيف أثبّت Kshana PNT-resilience simulator؟
يعمل على جهازك. في Claude Code: claude mcp add kshana-pnt-resilience-simulator -e 'KSHANA_MCP_IQ_DIR=<KSHANA_MCP_IQ_DIR>' -e 'KSHANA_MCP_IQ_MAX_SAMPLES=50000000' -- docker run -i --rm ghcr.io/ashfordeou/kshana-mcp:0.39.0. وفي العملاء الآخرين، الصق إعداد JSON من هذه الصفحة في إعدادات MCP الخاصة بهم.
هل يحتاج Kshana PNT-resilience simulator إلى مفتاح API؟
لا يذكر إدراجه في السجل أي مفتاح أو سر إلزامي. قد تتطلب بعض الميزات حسابًا لدى الخدمة التي يتصل بها.
هل Kshana PNT-resilience simulator مفتوح المصدر؟
نعم. شيفرته متاحة على GitHub بترخيص AGPL-3.0.
من يصون Kshana PNT-resilience simulator؟
ينشره ashfordeOU. يدرجه AI.tn لكنه لا يصونه ولا يوصي به.
من سجل MCP الرسمي. الإدراج ليس توصية: راجع شيفرة الخادم وصلاحياته قبل منحه الوصول إلى بياناتك.