Kshana — Architektura
Kshana jest jednym silnikiem zorganizowanym w warstwy nad wspólnym rdzeniem: pakiety czujników (zegar, inercja, transfer czasu, hybryda); warstwa astrodynamiki / numeryczna (analityczny SGP4/SDP4 (SGP4: Simplified General Perturbations 4; SDP4: Simplified Deep-space Perturbations 4), numeryczny propagator Cowella z modelem sił o siedmiu zaburzeniach, projekt manewrów, wyznaczanie orbity z pomiarów odległości ze stacji naziemnych oraz dopasowanie modelu sił do precyzyjnych efemeryd agencji); warstwa czasu i układów odniesienia (skale czasu IERS (International Earth Rotation and Reference Systems Service), precesja–nutacja IAU (International Astronomical Union) 2006/2000A oraz redukcja CIO (Celestial Intermediate Origin) GCRS↔ITRS (GCRS: Geocentric Celestial Reference System; ITRS: International Terrestrial Reference System)); warstwa fuzji (estymatory GNSS/INS (GNSS: globalny system nawigacji satelitarnej; INS: inercyjny system nawigacji)); oraz warstwy integralności, odporności, alt-PNT (PNT: pozycjonowanie, nawigacja i czas) i Księżyca (RAIM/ARAIM/SBAS (RAIM: autonomiczne monitorowanie integralności przez odbiornik; ARAIM: zaawansowane autonomiczne monitorowanie integralności przez odbiornik; SBAS: system wspomagania oparty na satelitach), zagłuszanie i wielowarstwowa detekcja spoofingu, dopasowanie do map grawitacji/terenu/pola magnetycznego oraz PNT cislunarny); a także nowsze warstwy LEO-PNT (PNT na niskiej orbicie okołoziemskiej), widma, Układu Słonecznego i projektu konstelacji, synchronizacji sieciowej i kampanii, wraz z modułami zapisu raportów, animacji i interoperacyjności, z których może korzystać każdy przebieg (§1d). We wszystkich z nich silnik nie wie nic o „kwantowym” i „klasycznym”: steruje modelami błędów czujników przez scenariusz utraty GNSS, uruchamia estymator i ocenia wynik. Urządzenie kwantowe i klasyczne porównuje się więc na tym samym scenariuszu, a różnią się one tylko (opublikowanymi, cytowanymi) parametrami błędów i niezależnymi ziarnami szumu.
Ten dokument zbiera diagramy strukturalne i behawioralne. §1 to rdzeń pakietów czujników; §1a mapuje warstwy astrodynamiki, fuzji i alt-PNT dodane od tego czasu; §1b–§1d to warstwy badań, dziedzin i wyników. Zasady użycia znajdziesz w README; to, co jest, a co nie jest sprawdzone, w VALIDATION; tabelę dojrzałości każdej możliwości w CAPABILITY.
Skróty użyte na diagramach i nierozwinięte w miejscach ich występowania: ADEV, odchylenie Allana; BW, szerokość pasma; CAI, interferometr z zimnych atomów; CZML, Cesium Language; Δ-DOR, delta differential one-way ranging; DO-229E, norma RTCA (Radio Technical Commission for Aeronautics) dla odbiorników SBAS; EKF, rozszerzony filtr Kalmana; FM, modulacja częstotliwości; GSE, sprzęt wsparcia naziemnego; HPL/VPL, poziomy/pionowy poziom ochrony; IMU, inercyjna jednostka pomiarowa; IOAG, Interagency Operations Advisory Group; IQ, próbki synfazowe/kwadraturowe; ISL, łącze międzysatelitarne; ITU-T, Sektor Normalizacji Telekomunikacji Międzynarodowego Związku Telekomunikacyjnego; J2–J6, strefowe harmoniczne pola grawitacyjnego Ziemi stopnia 2 do 6; KIF, Kshana Interchange Format; KML, Keyhole Markup Language; KPI, kluczowy wskaźnik efektywności; L1/L5, pasma nośne GNSS (L2 orbit halo CR3BP to natomiast punkt libracyjny Ziemia–Księżyc 2); LEO, niska orbita okołoziemska; LOO, leave-one-out (wyłączenie jednego elementu); LTC, Coordinated Lunar Time; MEO, średnia orbita okołoziemska; MTIE, maksymalny błąd przedziału czasu; N2, liczba różnorodności Hilla rzędu 2; NED, północ-wschód-dół; NTN, sieć nieziemska; OD, wyznaczanie orbity; OPS-SAT, satelita Europejskiej Agencji Kosmicznej będący laboratorium oprogramowania na orbicie; PPP, precyzyjne pozycjonowanie punktowe; PSD, gęstość widmowa mocy; PVT, pozycja, prędkość i czas; RINEX, Receiver Independent Exchange Format; RK4 / RK5(4), całkowniki Rungego–Kutty czwartego rzędu oraz wbudowany piątego (czwartego) rzędu; SH, harmoniki sferyczne; SigMF, Signal Metadata Format; SIR, ponowne próbkowanie z ważnością; SRIF, pierwiastkowy filtr informacyjny; SRP, ciśnienie promieniowania słonecznego; SSC, współczynnik separacji widmowej; STK, Systems Tool Kit; SVG, Scalable Vector Graphics; TDEV, odchylenie czasu; TDM, Tracking Data Message CCSDS (Consultative Committee for Space Data Systems); TLE, dwuwierszowy zestaw elementów orbity; TPL, poziom ochrony czasu; UBX, protokół binarny u-blox; UHF, ultrawysoka częstotliwość; VLBI, interferometria z bardzo długą bazą; VRW / ARW, błądzenie losowe prędkości / kąta; WASM, WebAssembly.
1. Struktura modułów#
flowchart TD
main["main.rs<br/>CLI (thin wrapper)"]
py["python.rs<br/>PyO3 (feature)"]
wasm["wasm.rs<br/>wasm-bindgen (feature)"]
api["api.rs<br/>run_toml: parse · dispatch by kind · json+svg+summary"]
subgraph shared["Shared core"]
types["types.rs<br/>Seconds · TimeGrid · ModelSpec"]
scenario["scenario.rs<br/>GnssState · GnssTimeline · ClockCfg · Scenario"]
allan["allan.rs<br/>overlapping Allan deviation"]
end
subgraph pack1["Pack 1 · Clock holdover"]
models["models.rs<br/>ErrorModel · ClockModel (incl. flicker FM)"]
estimator["estimator.rs<br/>HoldoverEstimator"]
kalman["kalman.rs<br/>KalmanClock → Integrity bound"]
security["security.rs<br/>clock-aided spoof detection → Security"]
fom["fom.rs<br/>Sample · FoMScores · score · worst_case_holdover"]
report["report.rs<br/>RunResult · hash · to_svg"]
run["run.rs<br/>run / run_clock / run_orbit_clock"]
end
inertial["inertial/<br/>Pack 2 · AccelModel (accel + gyro + bias instability/RW) · run_inertial · quantum_imu CAI + QuantumNavBudget dead-reckoning-over-holdover"]
timetransfer["timetransfer.rs<br/>Pack 3 · TimeTransferLink · run_timetransfer"]
hybrid["hybrid.rs<br/>Pack 4 · run_suite · score_hybrid · run_hybrid (+ integrity/security)"]
fusion["fusion/<br/>joint Kalman PNT estimator · run_fusion"]
orbit["orbit.rs<br/>Propagator (Kepler | SGP4) · Walker / TLE / multi-constellation · visibility · DOP"]
tle["tle.rs<br/>two-line element parsing (line 2 → Kepler, full TLE → SGP4)"]
sgp4mod["sgp4.rs<br/>SGP4 / SDP4 propagator (deep-space + resonance)"]
ensemble["ensemble.rs<br/>Monte Carlo confidence bands"]
sweep["sweep.rs<br/>trade-study parameter sweeps"]
spoof["spoof.rs<br/>active spoofing-attack demonstrator"]
jamming["jamming.rs<br/>link-budget anti-jam C/N₀ (J/S · processing gain · Q)"]
navsignal["navsignal.rs<br/>signal level: BPSK-R / BOC PSD · SSC κ · Gabor BW · DLL jitter · multipath · ranging-code (m-seq/Gold) design-trade"]
holdover["holdover.rs<br/>GNSS-denied clock holdover: van-Loan coast → holdover-to-threshold · quantum-clock classes"]
verification["verification.rs<br/>machine-checked requirement→module→test→oracle→status matrix"]
main --> api
py --> api
wasm --> api
api --> run
api --> inertial
api --> timetransfer
api --> hybrid
api --> ensemble
api --> sweep
api --> fusion
api --> spoof
spoof --> security
api --> jamming
api --> holdover
api --> verification
navsignal -. derives anti-jam Q (κ → Q=1/(R_c·κ)) .-> jamming
jamming -. uses PSD / SSC .-> navsignal
holdover -. coast-variance vs van-Loan recursion .-> kalman
ensemble --> run
sweep --> run
orbit --> tle
tle --> sgp4mod
orbit -. SGP4 propagator .-> sgp4mod
fusion -. composes .-> models
fusion -. composes .-> inertial
fusion --> kalman
run --> models
run --> estimator
run --> kalman
run --> security
run --> fom
run --> report
run --> orbit
models --> types
scenario --> types
inertial --> scenario
timetransfer --> types
orbit --> scenario
hybrid -. composes .-> models
hybrid -. composes .-> estimator
hybrid -. composes .-> inertial
hybrid -. composes .-> timetransfer
pack1 --> shared
inertial --> allan
CLI (interfejs wiersza poleceń) i oba wiązania przechodzą przez jeden punkt wejścia api::run_toml, więc nigdy się nie rozjeżdżają. Pakiety korzystają ze wspólnego rdzenia (types, scenario, allan); Pack 4 (hybrid) składa modele i estymatory Packs 1–3, zamiast je implementować od nowa; orbit wyprowadza oś czasu GNSS z geometrii, która następnie zasila przebieg Pack 1. Moduł navsignal leży na poziomie sygnału, między bilansem łącza a dziedziną pomiarów: wyprowadza współczynnik separacji widmowej κ z rzeczywistych widm mocy sygnału i zagłuszacza, z którego jamming oblicza teraz swoje Q = 1/(R_c·κ) odporności na zagłuszanie, zamiast przyjmować reprezentatywną stałą (sprawdzone krzyżowo w CI (ciągłej integracji)); niesie także kompromis projektowy kodu dalmierczego (m-sekwencja/Gold).
Trzy dalsze moduły tworzą trzon odporności bez GNSS. holdover odpowiada wprost na pytanie operacyjne — jak długo ten zegar może pracować swobodnie, zanim jego błąd czasu przekroczy budżet? — udostępniając zamkniętą postać van Loana dla błędu dryfu jako odwrócenie holdover do progu, sprawdzone krzyżowo względem wielokrokowej rekursji kowariancji clock_state. Jego inercyjny bliźniak mieszka w inertial::quantum_imu (QuantumNavBudget), który składa dryf szumu białego interferometru z zimnych atomów z błędem odchylenia zera i współczynnika skali w budżet dryfu pozycji w czasie holdover (człon odchylenia zera sprawdzony krzyżowo względem niezależnego integratora AccelModel). verification renderuje macierz wymagania, modułu, testu, wyroczni i statusu całego silnika, z testowanymi jednostkowo niezmiennikami, które zabraniają etykiety „sprawdzone względem niezależnego wzorca zewnętrznego” bez niezależnej wyroczni zewnętrznej — więc twierdzenie o poziomie pewności nie może rozminąć się z kodem.
1a. Warstwy astrodynamiki, fuzji i alt-PNT#
Poza rdzeniem pakietów czujników trzy podsystemy dzielą ten sam wspólny rdzeń i zasilają orbit (lub są przez nie zasilane). Warstwa astrodynamiki / numeryczna dodaje nieanalityczny propagator Cowella obok analitycznej ścieżki SGP4/SDP4; warstwa fuzji niesie estymatory GNSS/INS; a warstwa alt-PNT to dopasowanie do map grawitacji bez GPS (GPS: Global Positioning System). Są to możliwości biblioteki/scenariusza (zob. CAPABILITY, które z nich są podłączone do scenariusza kind, a które osiągalne jako API (application programming interface) Rusta).
flowchart TD
subgraph astro["Astrodynamics & numerical"]
orbit2["orbit · sgp4 · tle · walker<br/>analytic SGP4/SDP4 · Walker design"]
prop["propagator<br/>Cowell driver (accel_at / accel_rv)"]
forces["forces<br/>two-body · J2–J6 · EGM2008 d/o-70 · 3rd-body · SRP · drag · Schwarzschild + Lense–Thirring · tides"]
integ["integrator<br/>RK4 step-doubling · Dormand–Prince RK5(4)"]
ephem["ephem<br/>low-precision Sun & Moon"]
man["maneuver<br/>impulsive/finite burns · Izzo Lambert · porkchop"]
od["orbit_determination<br/>Gauss–Newton batch (batch_ls) · sequential UKF"]
end
subgraph fusion["Fusion (GNSS/INS)"]
ekf["fusion/gnss_ins_ekf · closed_loop · pack<br/>15-state loosely-coupled EKF"]
tc["fusion/tightly_coupled (8-state)<br/>fusion/tightly_coupled17 (17-state, quantum-CAI)"]
ukf["fusion/ukf — sigma-point core"]
coup["fusion/coupled — clock+position cross-covariance"]
end
subgraph alt["Alt-PNT (GPS-denied)"]
grav["gravimeter<br/>cold-atom model + SH anomaly field + mascons"]
pf["particle_filter — SIR"]
mm["mapmatch — field-match likelihood"]
end
prop --> forces
prop --> integ
forces --> ephem
man --> integ
od --> forces
od --> integ
od --> ukf
tc --> ukf
tc -. coasts on .-> forces
grav --> pf
mm --> pf
grav --> mm
ekf -. drives .-> strap["inertial/ strapdown (quaternion · NED · IMU errors)"]
tc -. drives .-> strap
grav -. CAI floor .-> strap
Człony sił propagatora numerycznego są domyślnie wyłączone, więc ich włączenie nigdy nie zaburza wydanych wzorców (goldens). 17-stanowy ściśle sprzężony UKF (unscented Kalman filter) przeprowadza utratę GNSS na wyprowadzonym błądzeniu losowym prędkości akcelerometru kwantowego CAI; wyznaczanie orbity używa tych samych forces/integrator do propagacji stanu kandydującego przez łuk śledzenia.
Ten sam wspólny rdzeń niesie też cztery dalsze podsystemy, nienarysowane powyżej (ich pakiety pojawiają się w rozdzielniku w §4): warstwę czasu i układów odniesienia (timescales, jd2, precession, nutation, cio, frames, eop) redukującą TEME↔GCRS↔ITRS (TEME: true equator, mean equinox) i zasilającą pakiet ephemeris/śladu na powierzchni; warstwę integralności (raim, sbas) dla RAIM/ARAIM/SBAS; warstwę odporności (jamming, spoof, spoof_detect, spoof_monitors, detection) dla zagłuszania i wielowarstwowej detekcji spoofingu, z warstwą sygnału nawigacyjnego (navsignal) na poziomie sygnału — gęstości widmowe mocy BPSK-R (BPSK: binary phase-shift keying) / sine-BOC (BOC: binary offset carrier), współczynnik separacji widmowej κ, który teraz wyprowadza odporność na zagłuszanie Q modułu jamming, szerokość pasma dalmierczego RMS (Gabora), jitter śledzenia kodu przez koherentną pętlę DLL (delay-locked loop) wczesny–późny oraz obwiednię błędu wielodrogowości (analiza parametrów sygnału, nie projekt ładunku RF (RF: częstotliwość radiowa) / sprzętu antenowego — to rola partnera od ładunku); oraz warstwę księżycową / cislunarną (lunar, lunar_frame, lunar_od, cr3bp) dla dynamiki CR3BP (ograniczony kołowy problem trzech ciał) — łącznie z macierzą przejścia stanu 6×6 i jednostrzałowym korektorem różnicowym (cr3bp_jacobian, propagate_state_stm, differential_correct_halo), który wytwarza naprawdę okresowe orbity halo/NRHO (NRHO: near-rectilinear halo orbit), odtwarzając opublikowaną południową orbitę NRHO L2 9:2 (orbitę Gateway) przy okresie ≈ 6,57 d / perylunium ≈ 3 250 km (opublikowane ≈ 6,56 d / ≈ 3 370 km); selenocentryczna transformacja MCI/MCMF (MCI: inercyjny względem środka Księżyca; MCMF: związany z Księżycem i jego środkiem) skorygowanej orbity oraz kontynuacja rodziny pozostają dalszymi pracami, a NRHO jest rozwiązaniem CR3BP (kołowym, bez Słońca), niesprawdzonym względem rzeczywistych efemeryd LANS/Gateway (LANS: Lunar Augmented Navigation Service) — oraz integralność LunaNet. Dopasowanie modelu sił do efemeryd agencji (precise_od, lunar_od, tides, gravity_sh) i pełny zestaw pól alt-PNT (igrf, altpnt/terrain, gravimeter) uzupełniają listę modułów; dojrzałość poszczególnych modułów zob. CAPABILITY.
1b. Badania odporności, ocena uczenia maszynowego i odtwarzalne artefakty#
Pięć dalszych grup modułów tworzy otwartą, odtwarzalną warstwę badań stojącą za artykułami badawczymi projektu. W odróżnieniu od kind scenariuszy dostęp do nich odbywa się przez generatory cargo run --example / --bin, które zapisują artefakty deterministyczne co do bajta (stałe ziarna, zapisana wersja silnika i skrót konfiguracji). Wszystkie są MODELLED (kalibracja syntetyczna lub na publicznych zbiorach danych) i niosą uczciwe etykiety walidacji — żadna nie jest certyfikacją.
flowchart TD
gen["study generators<br/>examples/ · bin/ (cargo run) → byte-deterministic artifacts"]
subgraph timing["Timing integrity"]
tplm["tpl<br/>conditional Timing Protection Level: k-σ floor · van-Loan coast · CUSUM"]
end
subgraph resilm["Resilience scoring & decision-instability"]
arch["resilience/arch · score<br/>architecture model + RPCF-aligned scoring"]
stats["resilience/stats<br/>Dirichlet · Kendall-τ · flip-rate · bootstrap"]
div["resilience/diversity · timeline<br/>Hill-N2 common-mode collapse · KPIs"]
study["resilience/study · report · panel<br/>instability study + integrity-hashed assurance report"]
end
subgraph aiml["RF-impairment optimism-gap (Machine learning)"]
ie["impairment_eval<br/>labelled synthetic corpus · ROC/AUC harness"]
is["impairment_study<br/>13-detector panel · scaling laws · LOO predictor"]
ml["impairment_ml<br/>logistic-regression + one-hidden-layer MLP"]
es["eval_stats<br/>bootstrap CI · DeLong · Spearman · ridge"]
sdrm["sdr · realdata<br/>IQ/IF → E/P/L taps → SQM + ingest adapters"]
end
subgraph trade["Quantum-vs-classical"]
cross["crossover<br/>resilience crossover map under parameter uncertainty"]
qt["quantum_trade<br/>measured-ADEV holdover benefit vs classical"]
end
gen --> timing
gen --> resilm
gen --> aiml
gen --> trade
tplm -. cross-checked vs .-> recursion["holdover · clock_state · allan"]
is --> ie
is --> ml
is --> es
ie -. real recordings via .-> sdrm
cross -. composes .-> packs2["clock · inertial packs"]
tpl— warunkowy poziom ochrony czasu (TPL): ograniczony przez holdover bezwarunkowy względem wykrycia próg dla niewykrytego błędu czasu przy spoofingu, składający próg monitora k-σ, wariancję dryfu van Loana w opóźnieniu detekcji i czas do alarmu CUSUM (cumulative sum); skalibrowany na rzeczywistym zarejestrowanym spoofingu (JammerTest 2024). Nie istnieje skończona granica bezwarunkowa — TPL jest warunkowy względem tego, że niezależna kontrola krzyżowa wykryje atak.resilience/— silnik oceny odporności PNT zgodny z ramami (kategorie DHS (Department of Homeland Security) RPCF (Resilient PNT Conformance Framework)) oraz badanie niestabilności decyzji: sympleks wag Dirichleta, niestabilność rang Kendalla-τ, częstość zmiany zwycięzcy top-1 i zapaść różnorodności wspólnego trybu (Hill-N2), ze skrótem integralności raportu zapewnienia i 35 ręcznie wyprowadzonymi testami wyroczni. Zob. RESILIENCE-CROSSWALK. Syntetyczne architektury dostosowane do RPCF v2.0 — samoocena, a nie certyfikacja.impairment_eval/impairment_study/impairment_ml/eval_stats— badanie luki optymizmu przy zaburzeniach RF: oznaczony syntetyczny korpus i niezależny od detektora zestaw ROC/AUC (ROC: charakterystyka operacyjna odbiornika; AUC: pole pod krzywą), 13-detektorowy panel (energia/AGC/SQM/parzystość (AGC: automatyczna regulacja wzmocnienia; SQM: monitorowanie jakości sygnału) oraz detektory regresji logistycznej z ziarnem i MLP (MLP: perceptron wielowarstwowy) z jedną warstwą ukrytą), prawa skalowania w rozkładzie i poza nim z hipotezą zerową permutacyjną oraz predyktor leave-one-out degradacji poza rozkładem. Metryki oceny są sprawdzone co do bitu względem scikit-learn.sdr/realdata— tor wejściowy odbiornika programowego (surowe IQ/IF (IQ: synfazowe/kwadraturowe; IF: częstotliwość pośrednia) → odczepy korelatora wczesny/bieżący/późny → SQM) oraz adaptery wczytywania (RINEX, u-blox UBX, GnssLogger, JammerTest, Yunnan, SatGrid), które pozwalają tym samym detektorom działać na nagraniach dostarczonych lokalnie; do repozytorium nie są zatwierdzane żadne zbiory danych.crossover/quantum_trade— mapa przecięcia odporności kwantowej i klasycznej przy niepewności parametrów oraz kompromis korzyści z holdover według zmierzonego ADEV; numeryczne jądra kompromisu są sprawdzone względem scipy.
1c. Warstwy integralności, GNSS, głębokiego kosmosu, Księżyca i misji#
Pozostałe dziedziny podłączają się do tego samego rozdzielnika api i ponownie używają wspólnego rdzenia, układów odniesienia i geometrii. Wszystko tutaj jest MODELLED, chyba że wiersz macierzy verification powołuje się na zewnętrzną wyrocznię (jądro RAIM względem SciPy, SBAS względem forka RTKLIB (otwartoźródłowej biblioteki pozycjonowania kinematycznego w czasie rzeczywistym), jądro DOP (rozmycie dokładności) z gnss_lib_py, ocena OPS-SAT, jądro poziomu ochrony księżycowego ARAIM, spójność efemeryd księżycowych między dostawcami) — reszta zestawu księżycowego i demonstrator kwantowy są modelowane, ilustracyjne, oparte na źródłach publicznych i nie niosą żadnego twierdzenia o TRL (poziomie gotowości technologicznej) / dziedzictwie / poparciu agencji.
flowchart TD
api["api.rs — run_toml / run_scenario · 92 kinds"]
subgraph gnss["Integrity & GNSS measurement"]
raim["raim — RAIM/ARAIM · HPL/VPL (kernel vs SciPy)"]
sbas["sbas — DO-229E PL · L1/L5 (vs RTKLIB fork)"]
meas["gnss_sim · ionex · pvt · glonass — pseudorange · iono maps · single-point PVT"]
imp["integrity_impact · frugal — miss→integrity · cost-per-coverage"]
end
subgraph deep["Deep-space & Mars"]
core2["body · ephem_provider · clock_state — multi-body · ephemeris seam · onboard clock"]
radio["radiometric · ccsds_tdm — light-time · Doppler/range · Δ-DOR · TDM"]
mars["deepspace_od · mars_frame · mars_atmos · mars_pnt · linkbudget · gse_sim — SRIF OD · Mars frame · relay-PNT · GSE sim"]
end
subgraph lunar["Lunar PNT suite (evidence tier per piece in the matrix · illustrative public-source)"]
cis["cr3bp · lunar · lunar_frame · lunar_od — CR3BP · halo/NRHO · cislunar ARAIM · MCI↔MCMF"]
suite["lunar_time · lunar_vlbi · lunar_combination · lunar_frame_realise — LTC time · VLBI · joint OD+clock · frame realisation"]
suite2["lunar_service · lunar_dpnt · lunar_interop — Moonlight service-volume · differential PNT · LunaNet/IOAG interop"]
end
subgraph quantum["Quantum-Enabled PNT demonstrator (MODELLED)"]
qd["quantum_devices · quantum_faults · quantum_nav_od — device error models · fault catalogue · GNSS-free OD"]
qt["qtrade · timetransfer_chain · representativeness — unified trade · time-transfer chain · gaps-to-flight ledger"]
end
subgraph mission["Mission analysis, environment & interop"]
ma["launch · reentry · eo_payload · attitude_budget · passes · linkbudget — first-order budgets"]
env["space_weather — Jacchia-71 density"]
iop["rinex · rinex_obs · sp3 · oem · omm · ccsds_tdm · space_packet · interchange · permalink — interop formats + KIF"]
ver["verification — requirement→module→test→oracle→status matrix"]
end
api --> gnss & deep & lunar & quantum & mission
raim -. reuses .-> meas
suite -. reuses validated DOP / SBAS kernels .-> gnss
qt -. rides validated kernels (scipy / sklearn) .-> quantum
1d. LEO PNT, widmo, Układ Słoneczny, synchronizacja sieciowa, kampanie i wyniki#
Najnowsze warstwy mają ten sam wzorzec: każda to jeden lub więcej scenariuszy kind rozsyłanych z api, zbudowanych na wspólnym rdzeniu i MODELLED, chyba że wiersz macierzy wskazuje zewnętrzną wyrocznię.
flowchart TD
api["api.rs — run_toml / run_scenario"]
subgraph leo["LEO PNT (low Earth orbit positioning, navigation and timing)"]
lsig["leo_signal — signal design: acquisition, code tracking, GNSS compatibility, band trade"]
lpass["leo_pass · leo_link (geometry · antenna · itu · iono · energy · spoof · presets) — pass and per-band link budget"]
lnav["leo_navmsg (elements · fit · codec · sisre · services · text) — broadcast ephemeris and clock message"]
lfus["leo_fusion (doppler · joint_pvt · ppp · ntn · timing · polar · presets) — fused MEO+LEO PVT · PPP · 5G NTN"]
lchain["leo_pnt_chain — one system end to end, each stage handing its output to the next"]
end
subgraph rf["Spectrum"]
spec["spectrum · navsignal — L-band (and UHF/S/C) PSD waterfall under a jammer timeline"]
sig["sigmf — SigMF recording read/write · Welch PSD of complex IQ"]
end
subgraph sky["Solar system & constellations"]
ss["solar_system · body · ephem · ephem_provider — bodies, constants, light time at one epoch"]
bp["body_pnt — positioning around any body with a local constellation"]
cd["constellation · walker — Walker delta/star, multi-shell, published GNSS slots, coverage/DOP maps"]
end
subgraph net["Network timing"]
tel["telecom_timing — time error, MTIE, TDEV vs ITU-T masks"]
slot["slot_timing — seconds until a free-running clock leaves a slot guard"]
end
subgraph comp["Composition & outputs"]
camp["campaign · study · suite — chained phases, sweeps, Monte Carlo, shared conditions"]
rep["advanced_report — report.html + report.json with a reproducibility record"]
anim["animation — SVG / HTML / frame animations"]
iop["interop (czml · kml · geojson · stk) · sigmf — exchange files for --export"]
end
api --> leo & rf & sky & net & comp
lchain -. composes .-> lsig & lpass & lnav & lfus
lsig -. SSC chain .-> spec
lfus -. GNSS presets .-> cd
bp -. reuses .-> ss
camp -. runs other kinds through .-> api
Szczegóły każdego rodzaju są w LEO-PNT, LEO-SIGNAL, LEO-PASS, LEO-NAVMSG, LEO-PNT-FUSION, SPECTRUM, CONSTELLATION-DESIGN, TELECOM-TIMING, SLOT-TIMING, CAMPAIGNS, REPORTS, ANIMATION i INTEROP.
1e. Warstwy zaufania do odbiornika, dowodów, telemetrii, szkolenia i compliance (0,35)#
Te warstwy czytają własny dziennik odbiornika lub zapisują pliki dla innych narzędzi; żadna z nich nie syntezuje ani nie nadaje sygnału radiowego. Leżą obok api, a nie pod rodzajami scenariuszy, z wyjątkiem samego receiver-trust, który jest rodzajem scenariusza. Wszystkie są MODELLED, chyba że wiersz macierzy wskazuje zewnętrzną wyrocznię, a wyniki morskie są wyłącznie doradcze, nie jest to sprzęt nawigacyjny z zatwierdzeniem typu.
| Moduł | Co robi | Opisany w |
|---|---|---|
receiver_trust |
ocenia dziennik odbiornika epoka po epoce monitorami zaufania; platforma statku dodaje monitory morskie i wskaźnik 0-100 z uzasadnieniami | RECEIVER-TRUST, MARITIME-TRUST |
receiver_trust::live |
ta sama ocena na strumieniu w miarę jego nadchodzenia (stdin, dopisywany plik, TCP lub UDP), zdanie $PKSHT i opcjonalna bramka; LiveEngine to całość tego bez wejścia i wyjścia |
MARITIME-TRUST |
evidence |
podpisany, powiązany łańcuchem skrótów pakiet okna dziennika, jego konfiguracji i wyniku silnika, weryfikowalny offline; opcjonalny token znacznika czasu RFC 3161 | EVIDENCE-PACKS |
telemetry |
strumień zaufania jako metryki Prometheus, zdarzenia syslog (CEF lub LEEF) i opcjonalnie OpenTelemetry (funkcja otlp, domyślnie wyłączona) |
TRUST-TELEMETRY |
nmea_synth |
syntetyczny most NMEA 0183 ze skryptowanymi zdarzeniami zagłuszania (jamming), odciągania (drag-off), spoofingu czasu i odtwarzania oraz dziennikiem instruktora, do szkolenia załóg (wyłącznie tekst) | NMEA-TRAINING |
interference_map |
zbiorcze mapy pogorszonej nawigacji na podstawie otwarcie licencjonowanych raportów statków powietrznych i okrętów oraz narażenie trasy na nie; wyłącznie pliki lokalne | INTERFERENCE-MAP |
osnma |
weryfikator po stronie odbiornika dla Galileo OSNMA: odczytuje strony I/NAV (zwykłe strony, wektorowy CSV, strumień UBX), sprawdza podpisany klucz, łańcuch TESLA i kody MAC oraz zgłasza dla każdego satelity, czy dane nawigacyjne są uwierzytelnione; osnma::cli::verify_report to jedna ścieżka wspólna dla wiersza poleceń, Pythona i WebAssembly; wyłącznie status uwierzytelnienia, nie usługa integralności |
OSNMA |
compliance |
odwzorowuje wyniki Kshana na publiczne ramy odporności i wypełnia to odwzorowanie na podstawie dokumentów wyników; run_from_text i assess_texts przyjmują teksty, nie ścieżki |
compliance/ |
interop::testbench |
ruch pojazdu i zdarzenia scenariusza jako CSV ruchu, NMEA, tekst punktów trasy i pliki zdarzeń dla laboratoryjnego symulatora GNSS; żaden sygnał nie jest zapisywany | TEST-BENCH |
Integracje dla łodzi (wtyczka Signal K, tryb bramki OpenCPN i kompilacja referencyjna) wywołują narzędzie wiersza poleceń; zob. MARINE-INTEGRATIONS.
2. Potok silnika (dla każdego przebiegu)#
Każdy przebieg przeprowadza pojedynczy model czujnika przez siatkę czasu, dyscyplinując go, gdy GNSS jest nominalny, i pozwalając mu swobodnie dryfować (holdover / nawigacja zliczeniowa) podczas przerwy.
flowchart TD
A["for each time step t"] --> B{"i > 0 ?"}
B -- yes --> C["model.step(dt, rng)<br/>evolve noise state"]
B -- no --> D
C --> D{"GNSS state at t ?"}
D -- "Nominal" --> E["discipline to truth<br/>(estimator sync / dead-reckoning reset)<br/>error = 0"]
D -- "Denied/Degraded" --> F["estimator predicts;<br/>error = truth − prediction"]
E --> G["record Sample(t, error, gnss)"]
F --> G
G --> A
A -. after loop .-> H["score(series, spec)<br/>→ figures of merit"]
H --> I["assemble Result<br/>(specs · series · FoM · scenario hash)"]
Scenariusz uruchamia ten potok dwukrotnie — raz dla czujnika kwantowego, raz dla klasycznego — z niezależnymi ziarnami (seed) (classical_seed = seed + 0x9e3779b97f4a7c15), tak aby obie realizacje szumu były nieskorelowane.
3. Interfejs modelu błędu (punkt rozszerzenia)#
Każdy czujnik implementuje ten sam pomysł: obiekt ze stanem, którego step() przesuwa jego wewnętrzny błąd stochastyczny, a skumulowany stan jest odczytywany w każdym takcie. Zegary udostępniają skumulowaną fazę; akcelerometry — dwukrotnie scałkowaną pozycję; łącza — fluktuację dla każdego pomiaru.
classDiagram
class ErrorModel {
<<trait>>
+step(dt, rng)
+spec() ModelSpec
}
class ClockModel {
+y0, q_wf, q_rw, drift, flicker
+phase() s
+det_freq() +drift_rate()
}
class AccelModel {
+bias, q_va, gyro_bias, q_arw
+pos() m +theta() rad
+reset()
}
class TimeTransferLink {
+sigma_j
+sample(rng) s
}
ErrorModel <|.. ClockModel
ClockModel : white FM + random-walk FM + flicker FM + aging
AccelModel : accel bias + VRW + gyro bias + ARW (gravity-tilt)
TimeTransferLink : white timing jitter
ModelSpec { id, kind, provenance, params } trafia do wyniku, dzięki czemu każda wartość w wynikach jest możliwa do prześledzenia do opublikowanego źródła wskazanego w provenance.
Obok analitycznego HoldoverEstimator pakiet zegara uruchamia dwustanowy (faza, częstotliwość) filtr Kalmana (KalmanClock), którego szum procesu odpowiada modelowi prawdziwemu. Podczas dryfu w czasie przerwy wariancja jego błędu fazy rośnie dokładnie do q_wf·T + q_rw·T³/3 — analitycznej zależności holdover — a jego bieżąca granica 1-σ służy do wyznaczenia wskaźnika jakości Integralność (odsetek próbek z przerwy, dla których błąd mieści się w granicy k-σ).
4. Dyspozytor (CLI i wiązania)#
api::run_toml(src) jest jedynym punktem wejścia: odczytuje najwyższego poziomu kind, deserializuje pasujący scenariusz, uruchamia pakiet i zwraca { json, svg, summary, csv } (csv występuje tylko dla rodzajów, które publikują tabelę odtwarzalności). CLI zapisuje je do plików, wraz z raportem (report.html, report.json) i wszelkimi wynikami --export / --animate; wiązania Pythona i WebAssembly zwracają je hostowi. Jeden dyspozytor, bez rozjazdów.
flowchart TD
F["api::run_toml(src) · run_scenario(src)"] --> K{"ScenarioKind::classify<br/>typed · exhaustive · 92 kinds<br/>(absent kind → clock; unknown kind → InvalidInput)"}
K --> G1["Timing<br/>clock · timetransfer · quantum-time-transfer · telecom-timing · slot-timing"]
K --> G2["Inertial & fusion<br/>inertial · hybrid · hybrid-ukf · fusion · gnss-ins · quantum-gnss-free-nav · ins-trn-coast · hybrid-optical-rf"]
K --> G3["Orbit, geometry & positioning<br/>orbit · ephemeris · constellation-design · gnss-sim · pvt"]
K --> G4["Integrity<br/>integrity · lunar-integrity · araim-reference-check"]
K --> G5["Resilience & spectrum<br/>jamming · spoof · spoof-detect · quantum-anomaly-detect · tracking-loop · spectrum · conflict-resilience"]
K --> G6["Alt-PNT (GPS-denied)<br/>gravity-map · terrain-nav · terrain-slam · combined-altpnt"]
K --> G7["LEO PNT<br/>leo-signal · leo-pass · leo-navmsg · leo-pvt · leo-ppp · ntn-positioning · leo-pnt-chain"]
K --> G8["Lunar / cislunar suite (MODELLED)<br/>lunar-time-offset · lunar-time-budget · lunar-vlbi · lunar-vlbi-fim · lunar-joint-od-clock<br/>lunar-frame-realisation · lunar-frame-campaign · lunar-llr-datum · realtime-frame-eop<br/>moonlight-service-volume · lunar-differential-pnt · lunar-interop-export · lunar-beacon<br/>lunar-jamming · lunar-attack-surface · earth-gnss-lunar · cislunar-observability · cislunar-arc-recovery"]
K --> G9["Deep space & solar system<br/>mars-pnt · solar-system · body-pnt"]
K --> G10["Machine learning & trade<br/>impairment-eval · quantum-trade"]
K --> G11["Mission analysis & environment<br/>launch-window · reentry · eo-coverage · attitude-budget · aperture-duty-cycle<br/>passes · link-budget · space-packet · space-weather"]
K --> G12["Trade studies, campaigns & interop<br/>sweep · sweep-nd · campaign · oem-interop"]
G1 & G2 & G3 & G4 & G5 & G6 & G7 & G8 & G9 & G10 & G11 & G12 --> W["RunOutput { json, svg, summary, csv }<br/>+ SHA-256 scenario_hash"]
Dyspozytor działa na typowanym enum ScenarioKind, dopasowywanym wyczerpująco (zob. następny podrozdział), więc dodanie pakietu jest zmianą sprawdzaną w czasie kompilacji. Brak kind powoduje przejście do pakietu clock, dzięki czemu istniejące scenariusze jednego rodzaju deserializują się bez zmian (serde ignoruje pole kind w każdej strukturze scenariusza). Nierozpoznany kind zostaje odrzucony z KshanaError::InvalidInput, który wskazuje najbliższy wbudowany rodzaj, gdy nazwa wygląda na literówkę.
Typowane wywoływanie i uporządkowane API#
Dyspozytor działa na typowanym enum ScenarioKind, a nie na dopasowywaniu surowego łańcucha: ScenarioKind::classify(src) rozstrzyga pole kind do wariantu, a dyspozytor dopasowuje go wyczerpująco — dodanie pakietu jest zmianą sprawdzaną w czasie kompilacji, a nie literówką w łańcuchu. Obok zwracającego łańcuch run_toml (zachowanego dla CLI i istniejących wiązań) działają dwie typowane powierzchnie:
run_scenario(src) -> Result<RunOutput, KshanaError>— typowane wejście z uporządkowaną taksonomią błędów (InvalidInput,NonConvergence,Unsupported,IoError). Każdy błąd niesie stabilnykind_tag(), dzięki czemu wywołujący może rozgałęziać się według kategorii niepowodzenia zamiast analizować komunikat. Wiązania udostępniają to jakoerror_kind(toml).list_scenario_kinds() -> Vec<ScenarioMeta>(orazlist_scenario_kinds_json(), udostępniane we wiązaniach jakolist_kinds()) — introspekcja programowa: nazwa, opis oraz pola wymagane i opcjonalne każdego rodzaju, dla UI (interfejsu użytkownika) i autouzupełniania w notebookach.
Rozszerzanie Kshana o zewnętrzny pakiet#
Pakiet zewnętrzny implementuje dwa niewielkie, stabilne semantycznie (semver) traity z api:
use kshana::api::{ExternalPack, KshanaError, RunOutput, Scenario, ScenarioMeta};
struct MyPack {
threshold: f64, // the deserialized scenario fields
}
impl Scenario for MyPack {
fn run(&self) -> Result<RunOutput, KshanaError> {
// Run the model, then build the unified output envelope.
Ok(RunOutput {
json: format!("{{\"threshold\": {}}}", self.threshold),
svg: String::from("<svg xmlns=\"http://www.w3.org/2000/svg\"/>"),
summary: format!("my-pack | threshold {}", self.threshold),
csv: None,
})
}
}
impl ExternalPack for MyPack {
fn kind_name(&self) -> &'static str {
"my-pack"
}
fn meta(&self) -> ScenarioMeta {
ScenarioMeta {
name: "my-pack",
description: "An out-of-tree example pack.",
required_fields: &["threshold"],
optional_fields: &[],
}
}
}
ExternalPack ma też domyślną metodę register_into(&mut PackRegistry), która nic nie robi, chyba że pakiet włączy się w punkt dyspozycji rejestru w src/registry.rs. Wbudowany pakiet jamming jest podłączony przez Scenario jako przykład roboczy; pakiety spoza drzewa stosują ten sam kontrakt bez rozwidlania rdzenia (odzwierciedlając punkt rozszerzenia ErrorModel z §3, z którego korzysta prywatna nakładka odporności).
Kshana ma zatem dwa stabilne punkty rozszerzenia — dodanie czujnika przez implementację ErrorModel (§3) albo dodanie całego rodzaju scenariusza przez implementację Scenario + ExternalPack — oba stabilne semantycznie (semver), żaden nie wymaga rozwidlenia rdzenia:
classDiagram
class ErrorModel {
<<trait — sensor seam>>
+step(dt, rng)
+spec() ModelSpec
}
class Scenario {
<<trait — pack seam>>
+run() RunOutput
}
class ExternalPack {
<<trait : Scenario>>
+kind_name() str
+meta() ScenarioMeta
}
ErrorModel <|.. ClockModel
ErrorModel <|.. AccelModel
ErrorModel <|.. TimeTransferLink
Scenario <|.. ExternalPack
Scenario <|.. JammingPack : worked example
ExternalPack <|.. ThirdPartyPack : out-of-tree, no core fork
5. Hybrydowy kamień węgielny#
Pakiet hybrydowy uruchamia zestaw (jeden zegar i jeden czujnik inercyjny) i wymaga, aby zarówno czas, jak i pozycja pozostawały w specyfikacji; pnt_holdover to czas do przekroczenia przez którekolwiek z nich. Opcjonalnie optyczne łącze międzysatelitarne resynchronizuje zegar w czasie przerwy — wyłącznie wspomaganie czasu; pozycja nie jest resynchronizowana, ponieważ transfer czasu daje czas, a nie pozycję. To właśnie wyodrębnia czujnik inercyjny jako czynnik ograniczający.
flowchart LR
subgraph suite["PNT suite (per technology)"]
clk["clock → timing error"]
acc["inertial sensor → position error"]
isl["optical ISL<br/>re-sync clock at interval"] -. aids .-> clk
end
clk --> J["both within spec ?"]
acc --> J
J --> P["pnt_holdover = first breach<br/>(timing OR position)"]
6. Dostępność GNSS wyprowadzona z geometrii#
orbit.rs to deterministyczna warstwa geometrii bez zależności. Propagator to albo analityczna keplerowska Orbit (dwa ciała, opcjonalnie wiekowe J2), albo pełny propagator Sgp4 zbudowany z kompletnego zestawu elementów dwuwierszowych; generator Walker-delta tworzy syntetyczne konstelacje, a widoczność w linii prostej = przesłonięcie przez Ziemię + maska elewacji. Liczba widocznych satelitów odpowiada stanowi GNSS (≥4 = nominalny, 1–3 = pogorszony, 0 = odmówiony), a build_timeline zamienia to na oś czasu dostępności, która napędza standardowy przebieg holdover zegara. Dostępność jest więc wyprowadzona z geometrii, a nie tworzona ręcznie, podczas gdy przebieg, estymator i ocena pozostają bez zmian.
Konstelacja podana jako pełne TLE jest propagowana modelem SGP4/SDP4 w sgp4.rs (sprawdzonym względem wektorów AIAA (American Institute of Aeronautics and Astronautics) 2006-6753); elementy tylko z linii 2 zachowują analityczną ścieżkę dwóch ciał. Oba rodzaje można mieszać w jednym bloku konstelacji.
flowchart LR
U["user orbit"] --> V
C["Walker constellation"] --> V["visible_count(t)<br/>occultation + mask"]
V --> S["gnss_state: ≥4 / 1–3 / 0"]
S --> T["build_timeline → GnssTimeline"]
T --> R["run_orbit_clock → clock holdover"]
7. Wiązania#
Rdzeń kompiluje się bez zmian do kodu natywnego, rozszerzenia Pythona i WebAssembly. Moduły Python (python.rs, PyO3 abi3) i WebAssembly (wasm.rs, wasm-bindgen) są opcjonalnymi zależnościami włączanymi funkcjami (--features python / --features wasm): domyślna kompilacja i zestaw testów nigdy ich nie kompilują, natomiast bramka audytu zależności (cargo deny --all-features) sprawdza ich drzewa zależności, ponieważ te biblioteki trafiają do pakietu wheel i pakietu npm. Oba wywołują api::run_toml, więc każda powierzchnia zwraca identyczne wyniki. Moduł WebAssembly obsługuje przeglądarkowy plac zabaw w web/ i eksportuje trzynaście funkcji: run, run_all (jeden przebieg silnika zwracający razem wynik, wykres, podsumowanie i tabelę), chart_svg, summary, table_csv, list_kinds, error_kind, version, kodek udostępnialnych adresów URL (URL: adres internetowy) encode_permalink / decode_permalink oraz trzy eksportery export_sp3 / export_omm / export_oem, które obsługują menu eksportu placu zabaw. Dwa dalsze punkty wejścia docierają do tego samego api: serwer MCP (Model Context Protocol) (mcp/kshana-mcp, wyłączona z przestrzeni roboczej biblioteka rmcp udostępniająca piętnaście narzędzi — run_scenario, list_scenario_kinds, validate_scenario, list_example_scenarios, get_example_scenario, report_scenario, animate_scenario, list_export_formats, export_interop, import_route, export_sp3, export_omm, export_oem, export_table_csv, assess_receiver_log; oba narzędzia przykładowe odczytują dołączone scenariusze przez domyślnie wyłączoną funkcję biblioteki bundled-scenarios, którą włącza tylko ten serwer) oraz wtyczka do JetBrains IDE (zintegrowane środowisko programistyczne) (ide/jetbrains, projekt w Kotlinie, który wywołuje CLI kshana zamiast linkować bibliotekę).
flowchart LR
cli["CLI · main.rs<br/>native binary"] --> api
py["Python · python.rs (PyO3 abi3)<br/>RunOutput class + run · run_full · run_typed · scenario_kinds · list_kinds · validate_toml · error_kind · version"] --> api
wasm["WebAssembly · wasm.rs (wasm-bindgen)<br/>run · run_all · chart_svg · summary · table_csv · list_kinds · error_kind · version · encode/decode_permalink<br/>export_sp3 · export_omm · export_oem"] --> api
mcp["MCP server · mcp/kshana-mcp (rmcp)<br/>tools: run_scenario · list_scenario_kinds · validate_scenario<br/>list_example_scenarios · get_example_scenario<br/>report_scenario · animate_scenario<br/>list_export_formats · export_interop · import_route<br/>export_sp3 · export_omm · export_oem · export_table_csv"] --> api
ide["JetBrains plugin · ide/jetbrains (Kotlin)"] -- spawns process --> cli
api["api::run_toml / run_scenario / list_scenario_kinds"] --> out["identical { json, svg, summary } on every surface"]
Włączanie funkcjami: Python i WASM to --features python / --features wasm; dołączona tabela scenariuszy to --features bundled-scenarios (jedyne jej użycie przez serwer MCP); serwer MCP i kontrole krzyżowe xval/* to biblioteki WYŁĄCZONE z przestrzeni roboczej; wtyczka IDE niczego nie linkuje — uruchamia CLI.
8. Determinizm i odtwarzalność#
- Cała losowość przepływa przez jeden zasiany
ChaCha8Rngna przebieg; kolejność kroków jest stała, więc(scenario, seed, engine version) → identical bits. - Wynik zawiera
scenario_hashSHA-256 (SHA: Secure Hash Algorithm);scripts/check-reproducible.shuruchamia scenariusz referencyjny dwukrotnie i stwierdza, że wynik jest identyczny co do bajta. - Ten sam silnik kompiluje się do kodu natywnego, rozszerzenia Pythona i
wasm32-unknown-unknownna potrzeby przebiegów w przeglądarce, dających te same liczby.
9. Struktura odroczona / przyszła#
Warstwy astrodynamiki, fuzji i alt-PNT z §1a — pełny propagator SGP4/SDP4, numeryczny propagator Cowella z siedmioma zaburzeniami w modelu sił i dwoma adaptacyjnymi integratorami, projektowanie manewrów i trajektorii, wyznaczanie orbity, estymatory GNSS/INS o 15, 8 i 17 stanach, sprzężony filtr zegara i pozycji oraz dopasowanie do map grawitacyjnych — zostały dostarczone, wraz ze wskaźnikiem jakości bezpieczeństwa z aktywnym demonstratorem spoofingu, rzeczywistą geometrią TLE/wielu konstelacji, pasmami Monte Carlo, przeglądami badań kompromisowych, drukowalnym raportem HTML (HyperText Markup Language) z jego maszynowo czytelnym bliźniakiem oraz przepływami pracy wydań, publikacji, wheels i pages.
Kilka możliwości wymienianych tu kiedyś jako przyszłe prace zostało od tego czasu dostarczonych i jest opisanych powyżej lub w VALIDATION: pełna nutacja IAU 2000A i wolna od równonocy redukcja CIO GCRS↔ITRS / ITRF (International Terrestrial Reference Frame) (sprawdzona co do bitu względem SOFA/ERFA (SOFA: Standards of Fundamental Astronomy; ERFA: Essential Routines for Fundamental Astronomy)), geopotencjał EGM2008 (Earth Gravitational Model 2008) do stopnia i rzędu 70, składnik Lense’a–Thirringa (unoszenie układu inercjalnego), pływy stałe, oceaniczne i atmosferyczne, walidacja krzyżowa efemeryd klasy DE (DE440/ANISE (DE440: Development Ephemeris 440; ANISE: Attitude, Navigation, Instrument, Spacecraft, Ephemeris — czysto rustowy zestaw narzędzi geometrii planetarnej)), zewnętrzna walidacja krzyżowa Orekit 12,2 numerycznego propagatora Cowella (0,08 m w ciągu 24 h) oraz wsadowego i sekwencyjnego wyznaczania orbity, a także 17-stanowy ściśle sprzężony nawigator udostępniony jako rodzaj scenariusza hybrid-ukf.
Pozostałe prace następcze są śledzone w CHANGELOG [Unreleased], a plan dla poszczególnych możliwości w CAPABILITY: zewnętrzna wartość wyroczni dla ewaluatora wysokiego stopnia EGM (Earth Gravitational Model) dokładnie na osi biegunowej oraz czyste względem pyshtools porównanie w pobliżu bieguna (ewaluator do stopnia 2190 i jego ładowarka .gfc w czasie działania są dostarczone, MODELLED; zob. xval/high-degree-gravity/), zmienny w czasie czynnik pogody kosmicznej dla opcjonalnego poziomu gęstości oporu NRLMSISE-00 (NRLMSISE: Naval Research Laboratory Mass Spectrometer and Incoherent Scatter Radar Extended atmosphere model) (domyślną gęstością oporu jest statyczny model wykładniczy, a gęstość Jacchia-71 rodzaju space-weather jest scharakteryzowana względem NRLMSISE-00, ale przez niego nie zastąpiona), zewnętrzna kontrola opcjonalnego cienia z pociemnieniem brzegowym tarczy Słońca, ścisłe sprzężenie GNSS/INS z fazą nośnej oraz rzeczywista mapa grawitacyjna EGM2008/EIGEN (EIGEN: European Improved Gravity model of the Earth by New techniques) dla dopasowania alt-PNT.
Prywatne repozytorium nakładki zawiera głębię odporności objętą ograniczeniami eksportowymi; podłącza się przez ten sam interfejs ErrorModel (i kontrakt ExternalPack z §4) bez zmiany publicznego silnika.