Machinevertaling, niet beoordeeld door een moedertaalspreker. Engels is de referentie.

ProjectBewerken op GitHubBron: CHANGELOG.md

Changelog

Alle belangrijke wijzigingen in Kshana worden hier gedocumenteerd.

Het formaat is gebaseerd op Keep a Changelog en dit project houdt zich aan Semantic Versioning. Zolang het project nog onder 1.0 zit, kan het openbare schema voor scenario's en resultaten nog veranderen; ingrijpende wijzigingen worden expliciet vermeld.

Niet uitgebracht#

[0.40.0] - 2026-10-29#

0,40 voegt de missieketen in Artemis-klasse en het maansegment ervan toe, een bewijslabel bij elk cijfer en elke tabel die een run schrijft, het inlezen en fitten van gemeten klokken, een controle van inzendingen van datapartners, een geschat zendergebied uit ADS-B- of AIS-meldingen, de herhaalcampagne van de benchmark van 0,40, en de opdrachtregel, de rapporten en Studio in zeventien talen naast het Engels (machinedocumenten blijven Engels). De verificatiematrix groeit van 388 naar 401 rijen: 176 VALIDATED (ongewijzigd), 221 MODELLED (was 208) en 4 PARTNER. Geen enkele rij is bevorderd naar VALIDATED. De scenariosoorten groeien van 87 naar 92. Elke drempel die een vooraf vastgelegde vergelijking miste, wordt hieronder vermeld en blijft vastgezet; geen enkele is versoepeld. De adviserende verklaring is ongewijzigd: Kshana is adviserende software, geen typegoedgekeurde navigatieapparatuur en geen certificering; de exploitant blijft verantwoordelijk.

Bekende beperkingen#

  • Runs in een andere taal dan het Engels duren ongeveer twee keer zo lang, omdat het scenario twee keer wordt uitgevoerd (eenmaal in het Engels voor de machinebestanden, eenmaal in de gekozen taal voor de gebruiker).
  • Sommige zinnen in Studio worden uit fragmenten samengesteld en kunnen lidwoorden missen in talen met grammaticaal geslacht.
  • De vertalingen zijn machinevertalingen die geen moedertaalspreker heeft beoordeeld; het Engels is de referentie.

Toegevoegd#

  • Zeventien talen naast het Engels voor de menselijk leesbare tekst van de engine en voor de site en Studio: nl, pl, pt-BR, pt-PT, fi, sv, da, nb, cs, uk, ru, de, fr, es, et, ja, zh-Hans (--lang, KSHANA_LANG, de omgevingsvariabelen voor de taal; lang bij aanroepen van de bibliotheek, Python, WebAssembly en MCP). Berichten en fouten van de opdrachtregel, samenvattingen van runs, grafiektekst, report.html, beschrijvingen van soorten en de adviezen zijn vertaald; machinedocumenten (JSON, CSV, foutcodes, de verificatiematrix) blijven Engels, en een run in een andere taal voert het scenario eenmaal uit in het Engels voor de machinebestanden en eenmaal in de gekozen taal voor de gebruiker (docs/i18n.md). De vertalingen zijn machinevertalingen, niet beoordeeld door moedertaalsprekers; het Engels is de referentie; de REVIEW.md van elke taal vermeldt wat een beoordelaar eerst moet nakijken, en de sitepagina's dragen een melding die dat zegt. Oordeelwoorden, bewijsniveaus en de reikwijdte van het advies ("niet typegoedgekeurd", "geen certificering", "de exploitant blijft verantwoordelijk") blijven in elke taal behouden.
  • kshana interference-map locate: een geschat zendergebied uit ADS-B- of AIS-meldingen. Een posterior over waar een bron van verslechterde positiemeldingen zich kan bevinden (radiolijnzicht op een 4/3-aardstraal, antennehoogte en vermogen van de zender gemarginaliseerd, getroffen vliegtuigen die trekken en niet getroffen vliegtuigen met lijnzicht die tegenduwen), weergegeven als gebieden van 50, 90 en 95%, een zwaartepunt met zijn onzekerheidsellips (nooit een kaal punt), sessies in de tijd (begin, einde, duur, getroffen oppervlak, onderscheiden vliegtuigen boven het publicatieminimum), een profiel per tijdstip van de dag en uren per dag, met optionele fusie van een TDOA-positiebepaling uit geolocation. Uitvoer: GeoJSON, JSON-samenvatting, sessies-CSV en een SVG-figuur, elk met de licentie, de bronvermelding, de methode-id, de aannames, de beperkingen en zijn bewijslabel. Bibliotheek interference_map::api::emitter_regions_from_*, Python en WebAssembly interference_emitter_regions. MODELLED (registerrij VM-bc70cb57; de matrix telt nu 401 rijen, 176 VALIDATED, 221 MODELLED, 4 PARTNER); alleen op synthetische data gekalibreerd, met de vergelijking tegen de zenderlocaties van Jammertest 2025 vooraf vastgelegd en eenmaal uitgevoerd: ADS-B en AIS beide NOT ASSESSABLE (te weinig geplande sessies in de open data), dus de rij blijft MODELLED (docs/emitter-region/RESULTS.md). Neutrale formulering, alleen geaggregeerd; het publiceren van zendergebieden in het openbare observatorium blijft uitgeschakeld. Een synthetisch voorbeeld staat in examples/emitter-region/ (docs/INTERFERENCE-MAP.md).
  • Gemeten klokloggen. src/clock_log.rs leest een gemeten kloklog in tot één fasereeks: acht formaten (RINEX clock, TimeLab, TICC, linuxptp ptp4l, phc2sys en ts2phc, chrony-tracking en -statistieken), elk een gedocumenteerde subset; alles daarbuiten wordt geweigerd met een foutmelding die noemt wat is aangetroffen. Het wordt gebruikt door telecom-timing ([series.clock_log]) en de soort klok ([clock_log], die een blok measured toevoegt met de SHA-256 van de log en de overlappende ADEV, TDEV en MTIE), met het meegeleverde scenario clock-measured-log (docs/CLOCK-LOG-FORMATS.md). Vergeleken met allantools op echte openbare data tegen vooraf vastgelegde drempels: de eerste run miste B1 (5 van 11 gevallen, alle TICC-tijdstempels als f64 bewaard), B2, B3 (7 van 24 gevallen) en B4 (de headerversie werd niet gecontroleerd); na de herstellingen zijn B1, B3 en B4 gehaald en is B2 gehaald op één MTIE-paar na, dat is vastgezet en geen fout van de engine is (allantools 2024,6 verwijdert de gemiddelde frequentie voordat het integreert; tegen zijn MTIE in fasemodus komt de engine binnen 1e-10 overeen). De rij blijft MODELLED (tests/fixtures/clock_log_real/RESULTS.md).
  • Een holdover aangestuurd door een gefitte gemeten reeks: de [clock_fit] van de soort klok fit de ruis van een gemeten reeks en stuurt de holdover daarmee aan (src/clock_fit.rs, meegeleverd scenario clock-fitted-log). Vooraf vastgelegde vergelijking: F1(b), F3 en F4 gehaald; F1(a) (het terugvinden van de geregistreerde random-walk-FM) NOT MET op de C3-records (per constructie niet identificeerbaar) en op twee van de drie C4-records (random-walk-FM opgenomen door flicker-FM en drift); F2 (ruisidentificatie tegen allantools) gehaald op elf van de twaalf records en D3 en NOT MET op D2 zoals vastgelegd (gehaald bij een gelijkwaardige vergelijking). Alle missers zijn vastgezet (tests/clock_fit_known_noise.rs); het blok fitted en de holdover die ermee wordt aangestuurd blijven MODELLED (tests/fixtures/clock_fit/RESULTS.md).
  • De herhaalcampagne van de benchmark van 0,40, vooraf vastgelegd met akkoord van de eigenaar vóór elke run: A3 (EXPLORATORY, de AUC van agc_k_sigma met bootstrap per map, 2,5 %-kwantiel 0,8502 tegen 0,80), D3 (EXPLORATORY, drie van de vijf detectoren overschrijden een optimismekloof van 0,05 bij schaal 0,25), R3 (AUC 1,0) en R4 (P_fa 0,0, P_d 1,0): alle MET, alle MODELLED. A2, D1 en R1 zijn onaangeroerd en blijven NOT MET; niets hier sluit ze (xval/bench/RESULTS-0.40.md, Bench).
  • kshana partner check <submission.toml>: controleert het formaat en de metadata van een inzending van een datapartner (kshana.partner-submission/1: apparaat, databestand en SHA-256, hoe het is vastgelegd, de MODELLED-rijen waartegen het wordt aangeboden, licentie, verklaringen) en leest de data met de eigen klokloglezers of IMU-lezers van de engine. Het scoort niets en valideert niets. Een synthetisch voorbeeld staat in examples/partner-submission/.
  • docs/PARTNER-DATA.md: welke MODELLED registerrijen gemeten data zou kunnen bevorderen, welke formaten worden geaccepteerd, hoe een inzending wordt gecontroleerd, gescoord tegen een vooraf vastgelegde drempel en toegekend, en wat PARTNER en VALIDATED elk betekenen; een concept van een benaderingsbericht voor de eigenaar in docs/drafts/PARTNER-OUTREACH.md (er wordt niets verzonden).
  • Tweede campagnes voor de drempels van gnss-ssv en lunar-infrastructure die niet zijn gehaald, uitgevoerd zoals vooraf vastgelegd (xval/gnss-ssv/PREREGISTRATION-v2.md, xval/lunar-infra/PREREGISTRATION-v2.md; akkoord vóór elke run). Elke oorspronkelijke misser blijft NOT MET en vastgezet. gnss-ssv: de controle reproduceert run 1 cel voor cel; vijf ablaties met één enkele lezing brengen 2 van de 78 gemiste cellen binnen de tolerantie (EXPLORATORY, geen drempel); de nieuwe drempel S7b (een zendvorm met afrol en bodem, gefit op Classic IIR-panelen) is NOT MET op de IIR-M-panelen bij 3,83 tot 3,95 dB tegen 3 dB; de campagne met achtergehouden gepubliceerde ontvangst is niet uitgevoerd (geen bron vastgezet) (xval/gnss-ssv/RESULTS-v2.md). lunar-infrastructure: de nieuwe drempels C3a, C3b (een detectiegrens van ongeveer 3e-9 m/s2), Q3a, Q3b (een nauwkeurige normale verdelingsfunctie verwijdert het verschil van 1.7e-6) en G3'' zijn als eigen drempels gehaald, en G3' met illustratieve priors is gehaald en gelabeld als EXPLORATORY (xval/lunar-infra/RESULTS-v2.md). Alles blijft MODELLED. Nieuwe openbare onderdelen: kshana::lambda::{erfc_accurate, normal_cdf_accurate, bootstrap_success_rate_accurate}.
  • Een bewijslabel bij elk cijfer en elke tabel die een run schrijft. Het resultaat-JSON heeft een sleutel evidence, de grafiek-SVG een metadata-element en een regel onder de plot, en de CSV-tabel # evidence:-commentaarregels: het niveau (VALIDATED, MODELLED of PARTNER, het zwakste van de rijen) en de id's van de rijen van de verificatiematrix waarop de run berust. Rijen en statussen worden uit de matrix gelezen, niet getypt; de id's zijn stabiel (VM- en acht hexadecimale cijfers, een nieuwe kolom ID in docs/VERIFICATION-MATRIX.md, een vaste lijst in tests/fixtures/evidence_ids.txt). Ook bij receiver-trust, jammertest score, iq acquire/sweep/track/monitor, het rapport over routeblootstelling en, binnen de ondertekende config.json, elk bewijspakket (config_version 1,1; kshana evidence verify meldt het niveau; pakketten van vóór 0,40 worden ongewijzigd geverifieerd). tests/evidence_labels_doc_sync.rs faalt als een figuur geen label heeft, een label afwijkt van de matrix of een nieuwe bestandsschrijver noch een label heeft noch met een reden is vermeld. Uitvoer die er geen draagt staat vermeld in docs/SURFACES.md. De drie demonstratiegrafieken in de README zijn opnieuw getekend met het label (door het te verwijderen komen de oude bytes terug; docs/revisions/STUDIO15-evidence-label-0.40.md). Geen enkele bewering is gewijzigd.
  • De scenariosoort mission-thread (scenarios/mission-thread-artemis-class.toml, docs/MISSION-THREAD.md): het foutenbudget voor navigatie en tijdsynchronisatie van een keten van fasen van lancering tot terugkeer, elk getal MODELLED en elke invoer vermeld. Acht fasesoorten: launch-ascent, leo-rendezvous (relatieve Clohessy-Wiltshire-covariantie over sensortrajecten, koppelvenster), tli-and-cruise (Cowell-voortplanting met een toestandsovergangsmatrix met eindige differenties, brandfout, gnss-ssv- en grondtrackingupdates, de maan uit een optionele DE440-kernelsnede), entry (sigma van de baanhoek, corridorkans, piekvertraging aan de corridorranden, landingsvoetafdruk) en de vier maansoorten. Overdrachtsregels (carry, inflate, reacquire), omzettingen van referentiestelsel en tijdschaal als eigen budgetrijen, een optionele overlay van het grondnetwerk die de trackingbezetting van elke fase bepaalt, de marge ten opzichte van vermelde eisen en de zwakste schakel. Het voorbeeld volgt de volgorde van een openbare NASA-presentatie over het operatieconcept met ILLUSTRATIVE getallen: een doorlopend voorbeeld in Artemis-klasse over 11 fasen, aarde- en maansegmenten. De cislunaire voortplanting is vergeleken met het openbare traject van Artemis I over een boog van 72 uur tegen een drempel die vóór de run in xval/mission-thread/PREREGISTRATION.md is vastgezet: NOT MET (45,3 km en 0,25 m/s tegen 5 km en 0,05 m/s). De diagnose plaatst de misser in vijf kleine impulsieve gebeurtenissen in de referentie; ertussen reproduceert het krachtenmodel de uurtoestanden tot een mediaan van 0,4 m. De rij blijft MODELLED (xval/mission-thread/RESULTS.md).
  • Het maansegment van de missieketen in Artemis-klasse: vier scenariosoorten, elk ook een fasesoort van de interface van mission-thread (src/mission_thread/lunar/), elk MODELLED.
    • lunar-orbit-rendezvous: relatieve navigatie tot koppeling in een cirkelvormige poolbaan van 100 km of een elliptische poolbaan van 100 km bij 3000 km (scenarios/lunar-orbit-rendezvous.toml, ...-elfo.toml). Een batch-Gauss-Newton-schatting over de boog voegt een absolute positiebepaling per voertuig uit een illustratieve relaisset van LCNS-klasse, een blijvende fout in het signaal in de ruimte (gemeenschappelijk voor beide voertuigen en onafhankelijk) en een crosslink-afstand samen, onder het maankrachtenmodel van de crate. Het rapporteert de relatieve positie en snelheid in de lokale assen van het doel, de beschikbaarheid van de positiebepaling, de gemiddelde genormaliseerde gekwadrateerde schattingsfout tegenover de verwachte waarde, de kosten van het negeren van de zwaartekrachtharmonischen, de modellen van de relatieve eindsensoren naast het cijfer met alleen signalen, en de doorgegeven 6x6-covariantie.
    • lunar-descent: het budget voor de landingsspreiding bij een locatie bij de zuidpool (scenarios/lunar-descent.toml; lunar-descent-lola.toml leest de LOLA-DEM uit een checkout): een traagheidsfoutenmodel met vijf toestanden per as, een AFS-positiebepaling (zelfstandig of differentieel, met het residu van de correctieverbinding van lunar-differential-pnt), een terreinrelatieve positiebepaling (de matcher terrain-nav op zijn synthetische reliëf, of de Cramér-Rao-grens van het matchen met de LOLA-DEM) en maantijd via de voertuigklok (lunar-time-offset). Het rapporteert de 3-sigma-landingsellips, elke combinatie van hulpmiddelen en een Monte Carlo-kalibratie van de ellips.
    • lunar-surface: beschikbaarheid van positiebepaling en tijdsynchronisatie per locatie en seizoen (scenarios/lunar-surface.toml; lunar-surface-terrain.toml voegt de met ray-marching bepaalde LOLA-horizon toe): het cijfer voor positiebepaling op één locatie is bitgelijk aan dat van moonlight-service-volume; het zicht op aarde en zon uit de analytische efemeriden is wat met het seizoen verandert.
    • lunar-ascent: de opstijging naar de rendez-vousbaan en de covariantie van positie en snelheid die terug naar de baan wordt meegenomen (scenarios/lunar-ascent.toml), met de spreiding bij motoruitschakeling ernaast gerapporteerd.
    • docs/MISSION-THREAD-LUNAR.md; de preregistratie, de amendementen en elk resultaat, missers inbegrepen, in xval/mission-thread-lunar/.

Bewijs#

  • Vooraf vastgelegd in xval/mission-thread-lunar/PREREGISTRATION.md vóór elke run, met zes gedateerde amendementen (elk gemaakt voordat de data werd opgehaald, behalve Amendement 6, dat na het ophalen en vóór enig A2-resultaat een rekenfout in een toestandstelling corrigeert; elk amendement staat in het bestand vermeld). Geen enkele drempel is versoepeld.
  • A1 (de propagator tegen het gereconstrueerde traject van LRO uit JPL Horizons, 24 uur): MET, een maximaal 3D-verschil van 33 m tegen een drempel van 500 m en een radiaal RMS-verschil van 2,4 m tegen 60 m.
  • A2 (dezelfde propagator tegen de CAPSTONE-NRHO over één omloop van 6.5 dagen): NOT MET, een eindpositieverschil van 136,8 km tegen een drempel van 25 km en een verschil in osculerende periapsisstraal van 28,4 km tegen 10 km. De rij blijft MODELLED, en de misser is vastgezet door tests/mission_thread_lunar_oracles.rs.
  • B1 (de consistentie van de rendez-vousschatting met haar eigen model) is MET bij het vierde schatterontwerp, gemiddelde NEES 5,85 tot 5,93 tegen een band van [5,2, 6,8]; de drie eerdere ontwerpen, een extended Kalman-filter in drie varianten, misten haar. Een vijfde wijziging, aangebracht nadat bleek dat het meegeleverde scenario van 2 uur 4 van de 50 pogingen naar een lokaal minimum stuurde (gemiddelde NEES 1e9), laat de Gauss-Newton-fit op een groeiende boog met staphalvering lopen; B1 is er niet door veranderd en de meegeleverde scenario's geven 6,51 en 6,33. De geschiedenis staat in xval/mission-thread-lunar/RESULTS.md.
  • Niets hiervan is VALIDATED: de rijen met een onafhankelijke referentie testen de gedeelde propagator, geen navigatiefilter, signaal of budget.

[0.39.0] - 2026-10-22#

Geen nieuwe functies: één reparatie van de opdrachtregel, afhankelijkheidsupdates in de tooling voor kruiscontrole en documentatie. De resultaten van de engine zijn ongewijzigd ten opzichte van 0.38.0.

Opgelost#

  • De opdrachtregel sluit stil af met status 141 wanneer de standaarduitvoer wordt gesloten (kshana kinds | head), in plaats van te crashen met "failed printing to stdout: Broken pipe". 141 is 128 plus SIGPIPE, de status die een shell meldt voor yes | head. Alleen een gesloten pipe wordt afgehandeld: een volle schijf of een andere schrijffout meldt zichzelf nog steeds, en een live feed die naar een gesloten socket schrijft, krijgt nog steeds zijn schrijffout. tests/cli_closed_pipe.rs sluit de lezer voordat het programma start, zodat de eerste schrijfactie bij elke run mislukt.

Beveiliging#

Eén afhankelijkheidsupdate in de meegeleverde bibliotheek (het eerste item), de rest in de tooling voor kruisvalidatie (xval/).

  • p256, p384 en p521 0,13 naar 0,14 (met elliptic-curve 0.14.3, ecdsa 0.17.0 en crypto-bigint 0.5.5 naar 0.7.10; ook de directe afhankelijkheid crypto-bigint, nu 0,7) verhelpen RUSTSEC-2026-0387, variatie in de uitvoeringstijd in crypto-bigint 0.5.5. Kshana gebruikt deze crates alleen om openbare handtekeningen te verifiëren (de Galileo OSNMA-rootsleutel en RFC 3161-tijdstempeltokens) en ondertekent alleen in tests met wegwerpsleutels, dus de praktische blootstelling was nihil; de upgrade verwijdert de RUSTSEC-melding zonder ignore-regel. De lockbestanden van de bibliotheek en van MCP verschuiven allebei; geen verificatieresultaat verandert (de OSNMA- en tijdstempelvectortests slagen ongewijzigd).
  • Minimaal ondersteunde Rust is nu 1,88 (vereist door de fix voor RUSTSEC-2026-0387).
  • memmap2 0.9.10 naar 0.9.11 (RUSTSEC-2026-0186) in de locks van de ANISE-kruiscontrole (xval/anise-lunar-od, xval/anise-mars-od); de locks synchroniseren ook opnieuw de padafhankelijkheid kshana in de repository.
  • pillow 12.3.0 naar 13.0.0 en certifi 2026.7.22 naar 2026.10.19 in de pins van de oracle-omgeving (xval/oracles/requirements.lock, requirements.frozen.txt): de gepatchte releases voor acht pillow-advisories en één certifi-advisory.

Documentatie#

  • docs/BENCH.md, de README en dit bestand vermelden elke kshana-bench-drempel die NOT MET is, zoals vastgelegd in xval/bench/RESULTS-v2.md: A2 (agc_k_sigma AUC 0,766 tegenover minstens 0,80 op de testsplit), D1 (grootste kloof 0,0301) en taak (b) R1 (overgenomen, niet opnieuw uitgevoerd). Er is geen enkele drempel versoepeld.
  • Volledigheidsronde van de README: een inhoudsopgave; de scenariotypen ingedeeld in families, elk met een pagina onder docs/kinds/by-kind/ (de beschrijving en velden van de engine, de invoer en resultaten van een voorbeeldrun, de registerrijen en onafhankelijke referenties, de beperkingen die het rapport van de run vermeldt en de grafiek die de engine schrijft), een contactvel per familie, alles geïndexeerd door docs/KINDS.md; elke opdracht in docs/COMMANDS.md; elk oppervlak, elke plug-in-opdracht, skill en Studio-pagina in docs/ALL-SURFACES.md; elk mogelijkhedendomein in docs/CAPABILITY-DOMAINS.md; ingebedde Mermaid-diagrammen (systeemoverzicht, oppervlakken, binnenste lus, ontvangervertrouwen, laboratorium-roundtrip, Studio, test- en releaseflow, modulekaart, distributie). Geschreven door tools/gen_kinds_index.py, tools/gen_readme_blocks.py en tools/gen_figures_038.py; gecontroleerd door tools/readme_audit.py; bewaakt door tests/readme_completeness_doc_sync.rs, dat ook van elk item de beschrijving en velden vastpint aan de engine.
  • tools/render-diagram-chromium.sh: rendert een Mermaid-diagram naar SVG en PNG op Linux en werkt het renderrecord bij.
  • README: de figuren voor ruimtegebruikers en maan gebruikten paden relatief ten opzichte van docs/, waardoor ze niet laadden vanuit de README; één link wees naar ../../docs/JAMMERTEST.md.
  • Twee verouderde, met de hand gekopieerde grafiekbestanden (docs/assets/clock-ensemble-band.svg, sweep-clock-stability.svg) verwijderd, die geen enkele pagina gebruikte en die niet meer overeenkwamen met de engine; docs/KINDS.md bevat de actuele grafieken.

[0.38.0] - 2026-10-19#

Toegevoegd#

  • GNSS voorbij de constellatie (gnss-ssv). Een nieuw scenariotype voor ruimtevaartuigen boven, rond en voorbij de GNSS-banen (docs/SSV.md): beschikbaarheid van één en vier signalen, duur van uitval, C/N0, DOP en hoofdlob tegenover zijlobverbindingen voor GPS, GLONASS, Galileo, BDS, QZSS en NavIC op een schil of langs LEO-, MEO-, GEO-, HEO- en maantransfertrajecten; booklet-, parametrische of door de gebruiker aangeleverde zendpatronen; een model voor ionosfeer, plasmasfeer en atmosfeer met stralen langs de aardrand; een ontwerp voor een zwaksignaalontvanger; een GNSS-extended-Kalmanfilter aan boord voor HEO en maantransfer; en relatieve navigatie in formatie. Vergeleken met het ICG Space Service Volume-booklet onder een preregistratie die vóór de run is vastgelegd: de constanten voor minimaal uitgestraald vermogen en de maandrempel komen overeen, de overige drempels worden onder de vooraf vastgelegde lezing niet gehaald (bijna allemaal door de inconsistente GLONASS-bundelhoek van het booklet), en de parametrische zijlobbenvervanger reproduceert de gemeten GPS-paneelpatronen niet. Alles blijft MODELLED (xval/gnss-ssv/RESULTS.md).
  • Maanbaan en maanoppervlak als navigatie- en geodetische infrastructuur (lunar-infrastructure). Een nieuw scenariotype met vijf studies, gekozen met study (docs/LUNAR-INFRASTRUCTURE.md): consistentie van een baanbepaling aan boord met Aarde-GNSS in een bijna-rechtlijnige halobaan tegenover een onafhankelijke grondbepaling van afstand en afstandssnelheid; gezamenlijke dubbelgedifferentieerde draaggolffase van oppervlaktestation en orbiter met LAMBDA-geheeltallige oplossing; Fisher-informatie van het zevenparametrige maandatum met en zonder afstandsmetingen tussen orbiter en oppervlak; offsets tussen GNSS-, VLBI- en laserafstandsmetingtechnieken ten opzichte van de lokale koppeling; en gevoeligheid voor h2, k2, l2 en de fysieke libratie. MODELLED, met ILLUSTRATIVE invoer: de numerieke methoden zijn gecontroleerd aan de hand van onafhankelijke numpy- en scipy-programma's, en niets wordt vergeleken met een meting van een maangrootheid. Drempels zijn vastgelegd in xval/lunar-infra/PREREGISTRATION.md en twee bekendgemaakte wijzigingen. Drie zijn NOT MET en elk is vastgepind door een test die de misser vaststelt: C3 (een geïnjecteerde krachtfout wordt niet gedetecteerd met de vooraf vastgelegde frequentie), Q3 (het bootstrapped slagingspercentage wijkt 1.7e-6 af van de numpy-referentie tegenover een drempel van 1e-9, door de normale-CDF-benadering van LAMBDA) en de sporenhelft van G3 (het toevoegen van een afstandsmetingsfamilie verlaagt het spoor van de pseudo-inverse niet altijd). De rest wordt gehaald (xval/lunar-infra/RESULTS.md).
  • Een zesde artikel in de Research-tabel. "Cislunar navigation is an observability problem: arc-length thresholds, Gramian conditioning, and the Doppler lever" (arXiv:2610,23871, eess.SP) toont aan dat dilution of precision niet is gedefinieerd voor cislunaire tracking met alleen afstand en gebruikt in plaats daarvan de observeerbaarheidsgramiaan op vier vlakke verre retrograde banen: alleen afstand heeft rang 2 van 4 op een momentopname en vraagt een boog van ongeveer 2,09 uur, afstandssnelheid (Doppler) geeft onmiddellijk rang 4, en het gezamenlijk schatten van een station met satelliettoestanden en klokken blijft met één rang-deficiënt zonder een externe interferometrische waarneembare. De getallen worden opnieuw gegenereerd door het type cislunar-observability (kshana scenarios/cislunar-observability.toml); cislunar-arc-recovery test de drempel met een onafhankelijke schatter. De README-onderzoekskaart, de README's van crates, npm en PyPI en de generator nemen het over.
  • De neutrale scheidsrechter, meetbaar gemaakt. kshana jammertest import leest de gepubliceerde NPRA Jammertest-catalogus en het zendplan als geplande referentie (catalogus-id's behouden) en kshana jammertest score beoordeelt een ontvangerlog daaraan per test (detectielatentie, gemiste alarmen, valse alarmen, hersteltijd), optioneel als ondertekend bewijspakket (docs/JAMMERTEST.md). De beoordelingsdrempels zijn vóór enige beoordeelde run vastgelegd (xval/jammertest-score/). Op de JammerTest-dataset van 2024 (opgehaald, nooit meegeleverd) mislukte de vooraf vastgelegde regel voor minimale data zowel in de eerste run als in de herziening van de gegevensverwerking, dus geen enkele drempel is te beoordelen en er wordt niets beweerd; beide runs zijn vastgelegd en vastgepind. MODELLED: het schema bestaat uit de gelogde vensters van de dataset, niet uit vastgelegde uitzendtijden. De NMEA-set van SimulaMet uit 2025 is niet aangepast (op de pagina staat geen licentie vermeld).
  • De eigen vlaggen van de ontvanger, naast die van Kshana. UBX-NAV-STATUS spoofDetState en UBX-SEC-SIG worden bij elk epoch ingelezen in self_report, en de vergelijking receiver_self_report in het resultaat zet ze af tegen de monitors van Kshana (beide, alleen ontvanger, alleen Kshana, geen van beide); het geeft geen alarm en wijzigt geen score. Een Septentrio SBF-lezer (PVTGeodetic, MeasEpoch, RFStatus, alleen-lezen, op de crate sbf-tools met MIT-licentie) en receiver-trust live --serial (een seriële of USB-NMEA-feed, alleen-lezen; er wordt nooit naar een ontvanger geschreven) komen erbij.
  • Tijdsynchronisatie en hardwareveiligheid (docs/TIMING-HIL.md, docs/HARDWARE-SAFETY.md). Het scenariotype holdover-test beoordeelt een holdovertest van een tijdsynchronisatiesysteem (GNSS door de operator verwijderd, holdover, herstel) aan de hand van een gemeten tijdfoutrecord, gemeten ten opzichte van de ITU-T-maskers uit openbare tabellen. clock_log leest logs van linuxptp (ptp4l, phc2sys, ts2phc) en chrony (tracking, statistics). iq scene --format sdrx schrijft ION GNSS SDR-metadata en iq monitor --follow bewaakt een SigMF-opname terwijl die groeit (alleen ontvangen). compliance-report krijgt het NIST IR 8323r1 Foundational PNT Profile (15 geparafraseerde rijen, levert bewijs voor). Een bewijspakket kan de lab-attestation van de operator vastleggen in zijn ondertekende manifest, nooit geverifieerd; de hardwarefasen 0 tot 4 en de juridische kanttekeningen staan in HARDWARE-SAFETY.md (wacht op juridische toetsing). Er is geen enkel zendpad.
  • kshana-bench v1 (kshana bench, bench/SPEC.md, docs/BENCH.md): vaste taken, splits en metrieken voor detectie van GNSS-interferentie op ontvangerlogs (JammerTest 2024) en IQ, voorspelling van tijdsynchronisatie-holdover (IGS-klokken) en de optimismekloof buiten de verdeling; splitmanifesten met vastgepinde hashes en ophaalscripts (geen data meegeleverd), een achtergehouden set via commit en onthulling, een schema voor resultaatbestanden en een statische ranglijstpagina. Basislijnen onder drempels die zijn vastgelegd in xval/bench/PREREGISTRATION.md: scorerdrempels gehaald, C1 tot en met C3 gehaald, D2 gehaald; A2 NOT MET (agc_k_sigma AUC 0,766 tegenover minstens 0,80 op de testsplit), D1 NOT MET (grootste kloof 0,0301) en taak (b) R1 NOT MET (overgenomen, niet opnieuw uitgevoerd), elk vastgepind (xval/bench/RESULTS-v2.md). Elke score is MODELLED. Python bench_score, bench_leaderboard; WebAssembly hetzelfde; MCP score_benchmark, render_leaderboard.
  • Interferentieobservatorium (kshana interference-map daily, sensitivity, docs/observatory/METHOD.md): een reproduceerbare dagelijkse GeoJSON, PNG en incidentrapport-JSON met drie toestanden (degraded, niet degraded, niet waargenomen), een minimale vertraging van 24 uur, cellen van 0,5 graad of grover, geen oorzaak toegekend en OpenSky-data geweigerd; een gevoeligheidsstudie van de vooraf vastgelegde parameters; een Baltische back-catalogus van 30 dagen uit adsb.lol.
  • Machine- en sensorinvoer voor receiver-trust (docs/MACHINE-INPUTS.md). Nieuwe waarden voor [log] format, allemaal alleen-lezen, MODELLED, met zelfgeschreven fixtures en zonder meegeleverde data: rtklib-pos (RTKLIB .pos-oplossingsbestanden), novatel (OEM7 ASCII en binair BESTPOS, RANGE C/No en RXSTATUS; de jammervlag van de ontvanger wordt de self_report van het epoch, afgezet tegen de alarmen van Kshana door de vergelijking receiver-self-report), rtcm3 (MSM4 en MSM7 C/N0 voor GPS, GLONASS, Galileo, SBAS, QZSS, BeiDou en NavIC; indelingen uit de pyrtcm-tabellen met BSD-licentie, waarvan de vermelding in NOTICE staat, niet uit de RTCM-standaard) en gnss-sdr (GNSS-SDR Monitor- en PVT-monitorberichten als JSON-regels, doorgegeven door integrations/gnss-sdr/relay.py).
  • IMU-logs als tweede sensor. [log.imu] (csv of euroc) integreert de gierdraaisnelheid van de gyro tot de heading die de monitor heading-course leest; inline op elk oppervlak en meegedragen door bewijspakketten. kshana imu-fit (Python imu_fit, WebAssembly imu_fit, MCP fit_imu_log, plug-in /kshana-fit-imu, een JetBrains-actie) fit de accelerometer- en gyroparameters van de scenario's hybrid en fusion uit een stilstaand log met Allan-deviatie en drukt een tabel [accel_classical] af met de SHA-256 van het log in de herkomst.
  • Integraties: een ROS-2-pakket (integrations/ros2/kshana_trust: NavSatFix en ublox_ubx_msgs erin, vertrouwenstopics eruit; zijn ROS-vrije brug is getest tegen de echte engine, de node zelf is niet uitgevoerd op een live ROS-graaf), een gnss_lib_py-brug (integrations/gnss_lib_py, afhankelijkheid met MIT-licentie, optioneel) en een GNSS-SDR-relay.
  • Home Assistant MQTT-exporter voor vertrouwenstelemetrie: kshana trust-telemetry --print-mqtt en --mqtt-tcp <host:port> (discoveryberichten en een JSON-statusdocument; alleen publiceren, geen inloggegevens of TLS), en format = "mqtt" als tekst in Python, WebAssembly en MCP.
  • Zeven MODELLED registerrijen voor het bovenstaande. Niets hiervan is VALIDATED: er is geen opname van een echte ontvanger, een basisstation, een IMU, een GNSS-SDR-run, een ROS-graaf of een MQTT-broker gelezen.
  • Optische linkmarge in de tijd. Het type optical-atmosphere neemt een opt-in tabel [timeseries] (duration_h, step_s, seed) en schrijft dan ook, per locatie, één gezaaide realisatie van het vermelde locatiemodel door de tijd: wolkenepisoden, een vloeibaarwaterkolom per episode, één gamma-gamma-scintillatiesample per stap, en daaruit de linkmarge, de wolken- en scintillatiefades en de link-up-vlag, met de gerealiseerde beschikbaarheid, wolkenfractie, aantal uitvallen en langste uitval. MODELLED (één trekking uit het model, niet het klimaat; geen externe onafhankelijke referentie). Zonder de tabel is het resultaat het 0,37-document. De twee meegeleverde optische scenario's bevatten de tabel (336 uur, 600 s, seed 37). Drempels vastgelegd in xval/optical-atmosphere/PREREGISTRATION-timeseries.md vóór de eerste run.
  • Specificatie voor testcondities en de laboratorium-roundtrip. kshana.test-conditions/1 wordt gepubliceerd als docs/spec/TEST-CONDITIONS.md met een JSON Schema en krijgt recording.kind = "receiver-log". kshana bench-export schrijft ook <base>.conditions.json. kshana evidence round-trip bouwt een ondertekend pakket dat de scenariohash, de hash van de vermelde condities, de hash van het ontvangerlog en de score ten opzichte van de vermelde gebeurtenissen koppelt, en weigert condities die niet overeenstemmen met de beoordelingsgebeurtenissen. Uitgewerkt voorbeeld met gps-sdr-sim dat alleen een bestand schrijft; afspelen is de verantwoordelijkheid van de operator en wordt nooit geautomatiseerd. Python evidence_round_trip, MCP create_round_trip_pack, plug-in /kshana-evidence-pack.
  • Standaardenpakketten (kshana standards-pack, standards/): de testprofielen van het DHS Resilient PNT-kader voor niveaus 1 tot 4, de nauwkeurigheidsniveaus en integriteitsevaluatie van IMO MSC.1/Circ.1575 en monitoren, beoordelen en mitigeren van ICAO Doc 9849 Appendix F, elk een set scenario's beoordeeld aan de hand van drempels die vóór de run zijn vastgelegd, met de rijen van compliance-report waarvoor ze bewijs leveren. Missers zijn vastgelegd en vastgepind: DHS L4-T1 en de vier IMO-nauwkeurigheidstests. Doc 9849 zelf is niet gelezen (betaald); het ICAO-pakket volgt de eigen presentatie van ICAO over het RFI Mitigation Plan. compliance-report krijgt een sectie voor standaardenpakketten. Alles MODELLED.
  • LunaNet Augmented Forward Signal (docs/LUNANET-AFS.md): AFS-I Gold- en AFS-Q Weil-codes voor PRN 1 tot 210, signalen lunanet-afs-i en lunanet-afs-q in kshana iq, de SB1 BCH-code, CRC-24Q en interleaver, en kshana lunanet-afs-check (spec, symbols, generate), vastgepind op LNIS V5 Applicable Document 1 Volume A (LSIS-AFS V1.0, 29 januari 2025). Codes VALIDATED aan de hand van de gedrukte tabellen van het document (die het als TBC markeert); één gedrukte tertiaire kolom (PRN 147) is waarschijnlijk een drukfout en de misser is vastgepind. De LDPC-codering van subframes 2 tot 4 is niet geïmplementeerd.
  • Cursusnotebooks (notebooks/course/): jamming, spoofing, holdover, integriteit, OSNMA en interferentiekaart, elk met oefeningen.
  • Studie naar de maximale URA voor EU-US WG-C ARAIM Milestone 3 (xval/araim-m3/, src/bin/gen_araim_m3_study.rs), ter vervanging van het ingetrokken plan "Table A-3"; MODELLED onder vermelde afwijkingen.
  • Concepten ter goedkeuring door de eigenaar onder docs/drafts/: JOSS-artikel, wijziging van het TSC-charter, proces voor het oracle-register en een voorstel voor een splitsing van LICENSES/. Niets daarvan is aangenomen.
  • Studio-weergaven voor de functies van 0,38 (kshana.dev/studio/). Bridge replay (twee synthetische runs op één klok: spoor, vertrouwensscore, de satellieten die het log hoort en het oordeel, met de eigen vlaggen van de ontvanger naast de alarmen van Kshana); Optical PNT (de twee optical-atmosphere-scenario's, met een opt-in gezaaide realisatie van [timeseries], MODELLED); Holdover test (het resultaat van holdover-test gemeten tegen de ITU-T-maskers, getekend uit de eigen record.series van het resultaat); een viewer voor het interferentieobservatorium die de bestanden opent die u hebt geproduceerd en er geen meelevert; op de pagina Tools een Jammertest-scorer, een IMU-fit en MQTT als telemetrieformaat; en in Trust een keuzelijst voor logformaat (RTKLIB .pos, NovAtel OEM7, RTCM 3, GNSS-SDR, Septentrio SBF) met een optioneel IMU-bestand. Elke weergave leest bestanden in de browser en uploadt niets; elk cijfer behoudt het label dat het register ervoor bevat en elk draagt de adviserende verklaring. De sitepagina /benchmark toont het fragment kshana bench leaderboard.

Opgelost#

  • Issue #36: byte-exacte pinlagen. Byte-exacte pinlagen draaien alleen op een host die als basislijn is aangemerkt (KSHANA_EXACT_PINS=1, ingesteld door scripts/gate.sh), niet op elke Mac met Apple-silicon, omdat de wiskundebibliotheek van Apple tussen macOS-releases verschilt; de portable laag draait overal, en tests/exact_pin_gate_guard.rs voorkomt dat een byte-exacte laag opnieuw alleen op platform wordt afgeschermd. De vergelijkingen met de onafhankelijke referenties zelf slagen op macOS. Er is geen enkele literal opnieuw genomen en geen enkele tolerantie gewijzigd. scripts/oracle-triage.sh en docs/LOCAL-ORACLE-TESTS.md beschrijven hoe u een verschil triageert; .github/workflows/oracle-macos.yml is een handmatige en wekelijkse diagnose, geen gate.
  • CodeQL: een niet-verankerd patroon in de trust-open-helper van Studio komt nu overeen met de hele header (web/studio/lib/trust-open.mjs).
  • CI: schijfruimte van de runner. De job check bouwt de dev- en testprofielen zonder debuginformatie, zodat het linken de schijf niet meer vult.
  • Bronbewaking. Elk bronbestand dat testfixtures met pins bevat, verklaart zijn pinbereik, en de tests die tijdelijke bestanden schrijven gebruiken per aanroep een uniek pad, zodat parallelle runs niet kunnen botsen.
  • docs/SCENARIOS.md is opnieuw gegenereerd voor het optionele veld timeseries van optical-atmosphere.
  • JetBrains-plug-in: geen gebruik van verouderde platform-API of API die voor verwijdering is gepland. De IntelliJ Plugin Verifier (verifyPlugin) tegen IntelliJ IDEA-build 263 (2026,3: 263.6800.24 en 263.7031.23) vond één verouderde aanroep, FileEditorManager.openFile, in Insert Example; die opent het nieuwe bestand nu met OpenFileDescriptor. De plug-in is compatibel met en schoon op 2024,3 (de since-build, ongewijzigd) en beide 263-builds. CI draait nu verifyPlugin en faalt bij compatibiliteitsproblemen en bij elk gebruik van API die voor verwijdering is gepland.

[0.37.0] - 2026-10-17#

Toegevoegd#

  • Optische PNT door de atmosfeer (scenariotype optical-atmosphere, docs/OPTICAL-ATMOSPHERE.md, ontwerpnotitie docs/design/optical-atmosphere-0.37.md). Voor een optische link en een set grondlocaties rapporteert het het golflengte- en elevatieafhankelijke verlies in heldere lucht, de Hufnagel-Valley-turbulentietoestand (Rytov-variantie, scintillatie-index, gamma-gamma-fades, aperture averaging), de beschikbaarheid ten opzichte van de linkmarge uit een vermeld wolkenklimaat, de marge die nodig is voor beschikbaarheidsdoelen en het plafond dat geen marge verhoogt, de verdeling van de uitvalduur, de tijds- en afstandsmetingsfout per uitval via het klok-holdovermodel, afstandsgecorreleerde locatiediversiteit, en what-if-winsten voor een golflengtewijziging, een grotere apertuur, scintillatievermindering met adaptieve optiek en extra marge. optical_linkbudget krijgt een atmosfeerbewust budget; zonder dat is de uitvoer bitidentiek aan 0,36 (drempel A5). Twee meegeleverde scenario's bevatten ILLUSTRATIVE wolkenklimaten. MODELLED: drie registerrijen. De numerieke methoden halen de drempels A1 tot en met A6 die in xval/optical-atmosphere/PREREGISTRATION.md zijn vastgelegd tegen een onafhankelijk mpmath-programma; dat controleert de implementatie van de vermelde formules, niet de atmosfeer, en er is geen gemeten beschikbaarheidsrecord vergeleken, dus geen enkele rij is VALIDATED. De drempel A4 werd eerst met 3e-9 gemist omdat de gebruikte normale CDF een benadering van 1.5e-7 was; de CDF is vervangen en de drempel is gelaten zoals vastgelegd. De native build en de WebAssembly-build geven byte-identieke documenten voor beide meegeleverde scenario's (A7, uitgevoerd op de integratiecommit van 0.37.0).

[0.36.0] - 2026-10-16#

Toegevoegd#

  • Detectie-ROC van de IQ-monitors (PRO-32, docs/design/DETECTION-ROC.md). Een campagne met monitors bewaart van elke toetsstatistiek het maximum over vensters met vermelde gebeurtenissen (positief) en over getegelde vensters buiten de gebeurtenissen (negatief, roc_window_s). Het rapport voegt ze per alarmsoort samen tot een ROC met zijn AUC en het werkpunt bij de ingestelde drempel, als roc.json en een rapportsectie. Op synthetische campagnes wordt de controle op kansniveau gehaald. De AUC-drempel voor C/N0 (0,95) wordt niet gehaald (0,79), omdat de negatieve vensters direct na een gebeurtenis het verval van de CUSUM van de detectie erven; dit is vastgelegd. MODELLED.

  • IQ-monitors in de lab-replay-campagne (PRO-31, docs/design/MONITORS-IN-CAMPAIGN.md). Een optionele tabel [monitors] in een campagnebestand laat de IQ-monitors in de enkele doorgang van de runner draaien: vermogen en spectraal na elke front-endketen, en C/N0, SQM en lock per getrackt kanaal. Hun alarmen worden beoordeeld ten opzichte van de vermelde gebeurtenissen: gedetecteerd of gemist, tijd tot detectie en valse alarmen per blootstellingsuur. Van elke test is het valsalarmcijfer in gesloten vorm vermeld, waaronder een nieuw tweezijdig Gaussiaans cijfer voor de SQM-tests (2Q(k)). Zonder de tabel verandert er niets. Op synthetische campagnes worden de valsalarmdrempels voor vermogen en SQM en de valsalarmdrempel voor C/N0 gehaald; 18 van 18 verzwakkingen worden gedetecteerd, maar de grens voor de tijd tot detectie, die per constructie onder één detectorsample ligt, wordt niet gehaald en is vastgelegd. MODELLED; registerrij "IQ monitors scored in lab-replay campaigns".

  • Lab fit uit IQ-campagnes, vervolg (tests/iq_labfit_followup.rs, CI-job labfit-iq-followup). Het toetst de twee hypothesen die §13,6 van docs/design/LABFIT-FROM-IQ.md openliet, aan de hand van drempels die in 1e532f84 zijn vastgelegd. Het voegt twee synthetische campagnes toe: S, met een J/S in stappen (seed 2026_1014), en R, een nieuwe ramp (seed 2026_1015). De resultaten staan in docs/design/evidence/labfit-followup/RESULTS.md.

    • S1 gehaald: met elk J/S-niveau vastgehouden wordt δ_eff teruggevonden binnen +0,185 dB. De fout van −1,1 dB van de rampcampagnes is schatterlag.
    • S2 niet gehaald, vastgepind door een test die de misser vaststelt: (d) zoals geschreven op de campagne in stappen geldt voor het trackinglusmodel (0,45 dB) maar niet voor het empirische (6,42 dB).
    • R1 gehaald: op de nieuwe rampcampagne ligt (d) met de gefitte dropverblijftijden plus de ramphelling van elke gebeurtenis binnen 1 dB voor beide modellen.
    • De missers van (a′) en (d) herhalen zich op R.
    • Een campagne mag haar J/S nu vermelden als een profiel step in de testharnas.
    • Geen enkel oordeel in §13 verandert en de registerrij blijft MODELLED.
  • Begrensde FLL-pull-in, opt-in (DS-LOOP-05): een nieuwe lusontwerpsleutel [design.carrier] fll_pull_in_max_s (s), Rust LoopConfig::fll_pull_in_max_s. Onder fll_assist = "pull-in" dwingt hij de overdracht van FLL naar PLL af na zo lang, wat de PLI ook is. Standaard niet ingesteld, en dan buiten de ontwerphash; het standaardontwerp en zijn hash zijn ongewijzigd.

    • Gecontroleerd aan de hand van drempels die zijn vastgelegd bij 58789af0, op geïnjecteerde referentie. De controle wordt gehaald: de standaard draagt in 9 van 10 zaden bij 33 dB-Hz nooit over.
    • Niet gehaald: met een begrenzing van 1,0 s houden 16 van 20 runs de lock vast bij 33 dB-Hz en 8 van 20 bij 31 dB-Hz; de overige wisselen tussen geforceerde overdrachten en de terugkeer van de FLL. De fasejitter is 1,8× die van de PLL alleen bij 33 dB-Hz.
    • De pull-in-ondergrens van ~35 dB-Hz blijft de gedocumenteerde limiet van de standaard.
    • MODELLED; registerrij "Begrensde FLL-pull-in onder de FLL-naar-PLL-overdrachtsondergrens van het standaardontwerp (opt-in)".
  • Acquisitiehysterese en de quantiser van de front-end in het jamming-type (CAP-06c): twee optionele secties voor een jamming-scenario.

    • [acquisition]: acquisition_threshold_dbhz (dB-Hz, op of boven de trackingdrempel) en reacquisition_delay_s (s, standaard 0). Een satelliet wordt geacquireerd op of boven de acquisitiedrempel, zodra hij zo lang als de vertraging niet geacquireerd is geweest. Hij wordt vastgehouden zolang hij op of boven de trackingdrempel ligt. Uitvoer: epochs[].sats[].acquired (true/false), epochs[].acquired (aantal) en fom.availability_acquired (1).
    • [front_end]: adc_bits (1 tot 16) en bandwidth_mhz (MHz, standaard tweemaal de chipsnelheid). Geeft een blok front_end: agc_gain_reduction_db (dB, 10·log10(1 + J/N)), quantiser_loss_db (dB, van de effectieve C/N0 van elke link afgetrokken) en loss_model. Het verlies is dat bij Gaussiaanse invoer, gemarkeerd als niet geldig voor CW-, smalband- en gezwiepte jammers.
    • Zonder de secties is elke uitvoer byte-identiek.
    • Gecontroleerd aan de hand van drempels die zijn vastgelegd bij 70c72fcc. Het quantiseringsverlies ligt binnen 0,0007 dB van een onafhankelijke Monte Carlo en de AGC-aflezing binnen 0,012 dB van de AGC-lus van de IQ-laag.
    • De geregistreerde hysteresis-runs waren niet informatief (elke link verloren), dus die drempel is NOT MET. Een aanvullende runset, vastgelegd bij 37793290, haalt hem wel: elke vlag is gelijk aan een onafhankelijke herberekening en 732 van 1824 links tonen de hysterese.
    • Bevinding: met een CW-jammer verliest een 1-bit-ADC ongeveer 5 dB meer dan het Gaussiaanse cijfer.
    • MODELLED; registerrij "Acquisitiehysterese en de quantiser van de front-end in het jamming-type tegen onafhankelijke herberekeningen".
  • Terreinafscherming van de jammer in het jamming-type (CAP-06b): een optionele sectie [terrain] in een jamming-scenario met een jammer. Velden:

    • dem_hgt: een SRTM-.hgt-tegel, relatief ten opzichte van de werkmap;
    • samples_per_side, ll_lat_deg en ll_lon_deg (deg): de grootte en de hoek van de tegel;
    • geoid_undulation_m (m, standaard 0), k_factor (standaard 4/3) en profile_step_m (m, standaard 30).

    De engine bemonstert het grootcirkelterreinprofiel tussen jammer en ontvanger en vindt de dominante messcherpe rand. Het ontvangen vermogen van de jammer, en dus elke J/S, wordt verlaagd met het verlies van één messcherpe rand volgens ITU-R P.526-15 §4,1.

    • Het resultaat krijgt een blok jammer_terrain: nu_max (1), diffraction_loss_db (dB), obstacle_distance_m (m), obstacle_terrain_m (m), path_length_m (m) en profile_points (aantal).
    • Zonder de sectie is elke uitvoer byte-identiek.
    • Gecontroleerd aan de hand van drempels en tien plaatsingen die zijn vastgelegd bij 92cd2bfd, op de vastgelegde echte SRTM-tegel van Death Valley, tegen een onafhankelijke numpy-herberekening. Alles gehaald: ongunstigste verschil 1.6e-10 op ν en op het verlies (drempel 1e-9), het verlies monotoon in jammerhoogte, en het verlies dat J/S exact bereikt.
    • MODELLED; registerrij "Terreinafscherming van de jammer in het jamming-type tegen een onafhankelijke numpy-herberekening op een echte SRTM-tegel".
  • CRPA-antennewinsten in het jamming-type (CAP-06a): een optionele sectie [crpa] in een jamming-scenario. Velden: elements_enu_m (elementposities in lokaal oost-noord-omhoog, m), weighting ("null-steering" of "mvdr") en bandwidth_mhz (MVDR-ruisbandbreedte, MHz, standaard tweemaal de chipsnelheid).

    • Elk kanaal vormt een vervormingsvrije bundel naar zijn satelliet. De ruis van de link wordt geschaald met ‖w‖² en de jammer met |wᴴa_j|² vóór de bestaande anti-jam-C/N0-vergelijking.
    • Elke link krijgt een blok crpa: array_noise_gain_db (dB) en jammer_gain_db (dB).
    • Zonder de sectie is elke uitvoer byte-identiek.
    • Een ongeldige sectie (een lege elementenlijst, een onbekende weging, een niet-positieve bandbreedte) is een fout, via kshana en api::run_toml evengoed als via jamming::run_jamming.
    • Gecontroleerd aan de hand van drempels die zijn vastgelegd bij 08d83b4d. Gehaald: additiviteit (na een correctie: de eerste build voegde de nieuwe eenheden toe aan de eenhedentabel van elke jamming-run); één element is geen array; ruiswinst en effectieve C/N0 tegen een onafhankelijke numpy-herberekening binnen 1e-9 dB; MVDR nadert de null bij hoge JNR.
    • Niet gehaald: de jammerwinst van MVDR op 194 van 456 links op de portable wiskunde van 0,36 (202 op host-wiskunde; docs/revisions/STUDIO15-batch4-rebaseline.md) (ongunstigste 1.7e-6 dB). De residuen van −100 tot −188 dB liggen onder de resolutie van float64 bij die drempel, en numpy wijkt van zichzelf af in dezelfde orde van grootte.
    • MODELLED; registerrij "CRPA antenna gains in the jamming kind against an independent numpy recomputation".
  • IQ-trackingengine tegen GNSS-SDR 0.0.19 (PRO-33): kshana iq track en GNSS-SDR tracken dezelfde onafhankelijke numpy-opnames van GPS L1 C/A bij 30 tot 45 dB-Hz.

    • Drempels vastgelegd bij 48edd4a5. De geregistreerde kalibratie mislukte door een onjuiste overdracht van GNSS-SDR (F3), dus Amendement 1 (1e4288c4) voegt een FLL alleen voor pull-in toe aan beide ontvangers, vastgelegd vóór enige testopname.
    • Gehaald: draaggolf- en codejitter en Doppler komen binnen 5 % overeen bij elke C/N0.
    • Niet gehaald: de NWPR-C/N0 van de engine leest 2,3–7,1 dB lager dan de SNV van GNSS-SDR (F4, een bekende schatterlimiet; M2M4 ligt binnen 0,06 dB van de referentie); de lock-indicatoren verschillen per definitie (F5); één meningsverschil over een slip bij 30 dB-Hz (F6).
    • MODELLED; registerrij "IQ tracking engine against GNSS-SDR 0.0.19 on independent recordings".
  • Twee VALIDATED rijen voor codes van de IQ-laag (DS-GIQ-06b, PRO-39).

    • BeiDou B1I. Alle 63 primaire B1I-codes komen chip voor chip overeen met de onafhankelijke generator van GNSS-SDR v0.0.19 (drempel vastgelegd bij 911106d1). Alleen de uitvoer van dat programma is vastgelegd: de B1I PRN-codes die de openbare ICD definieert, als prefix en hash.
    • GPS L1C. Alle 126 L1CP/L1CD-codes en 63 L1CO-overlays komen overeen met de controlekolommen die IS-GPS-800J afdrukt, en de berekende Legendre-reeks komt overeen met zijn Tabel 6.2-1 (drempels vastgelegd bij fe372e26).
    • Rijen: "BeiDou B1I primary ranging codes against an independent generator" en "GPS L1C ranging and overlay codes against the IS-GPS-800J printed check columns".
  • GLONASS-, BeiDou- en Galileo E6-banden in het spectrummodel (CAP-12, signalen): nieuwe bandnamen glonass-l1of en glonass-l2of (elk FDMA-kanaal als glonass-l1of-k<K>, K = −7 tot 6), beidou-b1i, beidou-b1c, beidou-b2a, beidou-b3i en galileo-e6. Elk draagt zijn ICD-draaggolf, modulatie en minimaal ontvangen vermogen. Ze zijn opt-in op naam: de standaardbandenset en elke bestaande uitvoer zijn ongewijzigd.

    • Gecontroleerd aan de hand van drempels die zijn vastgelegd bij 5806f28b: de ICD-waarden, nulpunten, het B1C-samenstel en het C/N0-pad worden gehaald.
    • Twee drempels werden niet gehaald. De drempel voor eenheidsoppervlak was zoals geschreven onhaalbaar (F1). De B1I- en B1C-golfvormen van de IQ-laag komen alleen gemiddeld over de band met het model overeen, vanwege de ongelijke lijnspectra van hun codes (F2).
    • MODELLED; registerrij "Spectrum model: GLONASS, BeiDou and Galileo E6 bands (opt-in)".
  • Cell-averaging CFAR-optie in IQ-acquisitie (PRO-37): iq::acq::ca_cfar en ca_cfar_cells beslissen op een acquisitieraster door elke cel te vergelijken met het gemiddelde van referentiecellen in zijn Dopplerrij. De drempelwaarde komt uit de gesloten-vormkans op vals alarm van CA-CFAR voor M niet-coherente blokken (ca_cfar_pfa, ca_cfar_alpha), zodat de beslissing niet afhangt van de normalisatie van het samplevermogen. Het is opt-in; de standaarddetector en elke bestaande uitvoer zijn ongewijzigd.

    • Gecontroleerd aan de hand van drempels die zijn vastgelegd bij 3724aefa: de gesloten vorm tegen Monte Carlo (18 van 18 gevallen), en een ontwerpfrequentie van 1 % die is gemeten als 0,97–1,01 % op Gaussiaanse en 2-bit gekwantiseerde ruis.
    • Eén drempel werd niet gehaald: op een ruisvrij 2-bit-signaal overschrijdt 1,28 % van de cellen naast de piek de drempelwaarde, bij de correlatiezijlobben van de code (bevinding F1).
    • MODELLED; registerrij "Cell-averaging CFAR option in IQ acquisition".
  • Scintillatiemodel tegen gemeten data (PRO-34): het Cornell-scintillatiemodel van het IQ-kanaal is vergeleken met gemeten 50 Hz GPS L1-intensiteit en -fase van een equatoriale scintillatienacht (Zenodo-record 16941224, INGV, Malindi, CC BY 4,0), onder drempels die zijn vastgelegd bij b6ccb499. Gehaald: de intensiteitsverdeling en de aan S4 gekoppelde fasescintillatie. Niet gehaald: het model fadet 2,4 keer zo vaak onder −10 dB en 3,5 keer zo lang (bevinding F1). De geregistreerde verwerking leest de omwikkelde fase van het model (bevinding F2); het faseresultaat blijft gelden met de fase uitgewikkeld. scripts/fetch_scint_malindi.sh haalt de data op. De rij blijft MODELLED: "IQ ionospheric scintillation channel (Cornell model) against measured 50 Hz GPS L1 scintillation".

  • Gecorrigeerde LuGRE-samplelezer (MR-09): realdata::lugre::parse_iqs_sdrx leest een LuGRE-IQ-batch met I in de hoge nibble en de mid-rise-niveaus 2v + 1 (SdrLayout::mid_rise), die het gemiddelde van −½ wegnemen dat de kale two's-complement-gehele getallen op I en Q hebben. run_acq.py --corrected geeft GNSS-SDR dezelfde lezing. De generieke ION-lezer en elke bestaande uitvoer zijn ongewijzigd: 149 scenarioresultaten en een studie zijn voor en na byte-identiek, en de vastgepinde LuGRE-bevindingen lezen zoals geregistreerd (xval/lugre-reader/RESULTS.md). Er verandert geen enkele registerrij.

  • Opt-in BOC(1.1)-tracking (CAP-07 (a)): LoopConfig::boc herschaalt de DLL-discriminatoren voor de hoofdpiek van de sinus-BOC(1.1) en voegt een bump-jump-monitor toe (zeer vroege en zeer late correlatoren op ±0,5 chip, op/neer-tellers, N = 8) die de code-NCO van een zijpiek afhaalt; Channel::bump_jumps vermeldt de sprongen. Standaard uit, en elke bestaande uitvoer is ongewijzigd. Gecontroleerd aan de hand van drempels die zijn vastgelegd bij 6b68f6cc op een synthetisch BeiDou B1C-signaal: een start op een zijpiek die zonder de optie 0,55 chip ernaast blijft, wordt met de optie door één sprong bij 0,08 s op de hoofdpiek getrokken, en er is geen valse sprong vanaf de hoofdpiek gezien. Eén drempel werd niet gehaald: het unittestraster voor de schaling reikt buiten het lineaire bereik van de discriminatoren (bevinding F1 in docs/design/evidence/boc-bump-jump/RESULTS.md). MODELLED; registerrij "BOC(1.1) tracking: DLL scaling and bump-jump ambiguity resolution (opt-in)".

  • Lab fit uit IQ-campagnes (B7.1, docs/design/LABFIT-FROM-IQ.md). De [input] campaign = "<out-dir>" van een labfit-scenario fit een uitvoermap van kshana iq campaign op de CLI (kshana iq labfit), in Python (kshana.iq_labfit) en in de MCP-labfit-tool (alleen mappen binnen de eigen werkmap). Het fit één eenheid per signaal, lusontwerp, front-endketen en jammertype:

    • het C/N0-model tegen vermelde J/S, met censurering;
    • de trackingdrempel, rechtstreeks en in gesloten vorm;
    • de trackinglus- en empirische lockmodellen, gekoppeld via het C/N0-model, met hun verblijftijden;
    • een gezaaide clusterbootstrap over opnames, voorspellingsintervallen van 90 % en achtergehouden sets waarbij telkens één opname wordt weggelaten;
    • een vooraf vastgelegde, gehashte tabel [validation], met PASS/FAIL per drempel.

    Het rapport is kshana.labfit-iq/1 als JSON, CSV en Markdown, met een eenhedenblok. Q_eff is niet identificeerbaar uit C/N0-data zonder een onafhankelijke vermogensmeting. Het wordt vermeld, nooit gefit, en de gefitte parameter is delta_eff = delta - 10 log10 Q (ontwerpamendement 2026-10-12). Een onbekend jammertype neemt de meest schadelijke vermelde Q (cw, 1). Op synthetische campagnes uit de eigen scènes van Kshana wordt de drempel voor hold-out-dekking (c) gehaald. De delta_eff-drempels (a') en (b') (0 van 50 campagnes gedekt) en de drempel voor de drempelwaarde in gesloten vorm (d) worden niet gehaald: ze zijn met hun waarden vastgelegd. MODELLED; registerrij "Calibration of the open receiver's C/N0 and lock models to IQ campaign results, with stated prediction error". Het labfit-pad voor ontvangerlogs en de uitvoer ervan zijn ongewijzigd.

  • solar-system op een JPL-kernel (CAP-31): planetary_kernel_path neemt elk lichaam dat de SPK bevat (met de440s: Mercurius, Venus, de Aarde, de Maan) uit de kernel, label KERNEL, en voegt alleen een blok kernel toe wanneer ingesteld. Nieuwe rij, VALIDATED tegen SPICE (vastgelegd f8e946ea; ongunstigste 3.3e-5 m, 1.0e-11 m/s). Het standaardrapport is ongewijzigd.

  • Porkchop op de DE440-efemeride (CAP-20b): maneuver::porkchop_kernel doorloopt C3 en aankomst-V∞ op heliocentrische toestanden uit een DE440-SPK. Nieuwe rij, VALIDATED tegen SPICE-toestanden

    • pykep 3.0.1 (vastgelegd 2d857fb1; Aarde naar Mars 2026-2028, 304 cellen, ongunstigste 2.6e-14, dezelfde cel met minimale C3).
  • Niet-gravitationeel macromodel van LRO: NOT MET (DS-LRO-10, vastgelegd e82047e2). lunar_od::LunarMacroModel (opt-in via LunarForceModel::macro_model): directe zonnestraling op platte platen met de schaduw van de Maan, een zon-volgend paneel, en maanalbedo en thermische IR; LunarMacroModel::lro_generic is een als zodanig gelabelde generieke LRO-benadering uit gepubliceerde feiten (geen buisplaten: de plaattabel was niet te verkrijgen). Op de LRO-boog van 4 uur laat het de reduced-dynamic-rms op 6,668 m en de dynamische op 11,94 m, met een onwaarschijnlijke stralingsfactor (ongeveer +21 / −22), dus alle drie de drempels worden gemist. De bevinding is vastgepind door een test en er verandert geen standaarduitvoer (docs/design/evidence/ds-lro-10-macro-model/RESULTS.md). De opt-in maan-kogel-SRP gebruikt nu de conische schaduw van de Maan in plaats van die van de Aarde (forces::conical_shadow_body).

  • Maan-OD: optionele k2-vaste getij en seleno-centrische relativiteit (DS-LRO-11), standaard uit (LunarForceModel::lunar_tide, ::relativity); een schakelaar KSHANA_LRO_DEGREE voor de ANISE-kruiscontrole (DS-LRO-04); een fixture met een LRO-boog van 24 uur en een louter informatieve fit over een lange boog (DS-LRO-09). Informatieruns zijn vastgelegd in docs/design/evidence/ds-lro-09-11-longer-arc/RESULTS.md; er verandert geen gepubliceerd getal.

  • CR3BP 9:2 NRHO tegen CAPSTONE (CAP-29d): nieuwe MODELLED rij die de circulair-beperkte NRHO van de engine meet tegen de gevlogen baan van CAPSTONE (JPL Horizons, maart 2023; vastgelegd 4e868170): periode 1,07 %, apolune 0,05 %, perilune 4,1 % ten opzichte van de gemiddelden van CAPSTONE, binnen de vastgelegde drempels van 3 / 5 / 20 %. Een meting, geen toetsing aan een onafhankelijke externe referentie.

  • CR3BP-roterende toestanden naar maangecentreerde ICRF (RM-34, FUT-06): cr3bp::to_moon_centred_icrf / from_moon_centred_icrf / to_moon_centred_icrf_de440 zetten een dimensieloze roterende Aarde-Maan-toestand om naar de ogenblikkelijke DE440 Aarde-Maan-lijn, inclusief de buitenvlakse snelheid van het stelsel. Nieuwe rij, VALIDATED tegen een SPICE-tweevectorstelsel (vastgelegd 2313eb1b, gewijzigd vóór enige run d5ef79b3; 72 gevallen, ongunstigste 1.8e-7 m en 1.2e-9 m/s).

  • CR3BP-familieleden tegen de Three-Body Periodic Orbits API van JPL: NOT MET (RM-35, vooraf vastgelegd a9074f65). cr3bp_family (halo-, NRHO- en DRO-correctie, stabiliteitsindex van de monodromie, pseudo-booglengtecontinuering) komt bij 54 van de 58 API-leden overeen op elke drempel (toestand, periode en Jacobi overal binnen 1e-10). Eén stabiliteitsindex van een L1-halo (9.5e-2) en drie sluitingen van kleine DRO's (1.5e-8 tot 3.3e-8 tegen 1e-8) halen de drempel niet, dus de module is #[doc(hidden)] en geen enkele rij claimt haar. Resultaten: docs/design/evidence/cr3bp-families/RESULTS.md.

  • Optionele DE440-maanoriëntatie en -omgeving (FUT-05, DS-LRO-08; standaardwaarden ongewijzigd): lunar_frame::try_icrf_to_moon_pa_de440, lunar::try_mci_to_mcmf_de440 / try_mcmf_to_mci_de440 (aan de epoche verankerd, DE440-hoofdassen) en lunar_od::De440LunarEnvironment (ingebedde DE440 PA-oriëntatie plus de geocentrische Zon en Maan uit een door de gebruiker aangeleverde DE440 SPK). Tegen ANISE (vooraf vastgelegd ea537710): oriëntatie binnen 3.5e-7 rad en LRO-fits binnen 1 mm, maar het efemeridedeel haalde zijn drempel niet (Zon 30,7 m, Maan 1,1 m, een tijdsverschuiving van ~1 ms aan de kant van ANISE), dus het is geen getoetste rij. Resultaten: docs/design/evidence/fut05-de440-lunar-env/RESULTS.md.

  • Datum van de maanstelselcampagne, naar conditie geschaalde NumPy-drempel: NOT MET (vooraf vastgelegd b887eb05; blijft MODELLED). Stap 0 sluit de pseudo-inverse-terugval uit als oorzaak van het verschil van 0,30 in geschatte stations; NumPy komt bij zes van de acht scenario's binnen de drempel overeen, maar stations_estimated haalt hem niet (6.8e-6 tegen 5.9e-7), en op de nieuwe datum 2026-12-01 maakt een niet-waargenomen bakenpunt op de zuidpool de bakeninformatie rangdeficiënt, wat de ongewijzigde onafhankelijke referentie niet kan evalueren. Resultaten: docs/design/evidence/mr05-lunar-datum-cond/RESULTS.md.

  • Maanstelseldatum uit een echte waarnemingscampagne (analytische Maan) VALIDATED op nieuwe EDC-normaalpunten van 2025 (vooraf vastgelegd 31f5283 voordat er een was opgehaald): de ongewijzigde SPICE- en NumPy-referentie komt overeen op boekhouding, rangen en nulkoppeling, en binnen 1.11e-3 op sigma's (drempel 1e-2), 8.95e-4 op de conditie en 1.79e-3 op de verhoudingen dwars/langs (drempel 2e-2). Alleen een bibliotheekcontrole van de covariantieberekening; de drempels maken geen onderscheid tussen maanmodellen. Resultaten: docs/design/evidence/mr06-llr-analytic-fresh/RESULTS.md.

  • IAU-lichaamsoriëntatie en GM van de veertien toegevoegde lichamen van het zonnestelsel, afgesplitst van de rij "Fysische constanten van elk lichaam van het zonnestelsel" tot een VALIDATED rij (vooraf vastgelegd 154bc54): Body::iau_rotation_et komt overeen met SPICE pxform op pck00011 binnen 1e-9 rad op 574 matrices op de oorspronkelijke epochen en op 574 op 41 nieuwe epochen die nooit eerder zijn vergeleken (slechtste Phobos 1.38e-10 rad), en Body::mu is gelijk aan gm_de440 voor alle veertien lichamen. De rest van de oorspronkelijke rij (J2, gemiddelde straal, het rapport) blijft MODELLED. Resultaten: docs/design/evidence/mr08-body-orientation/RESULTS.md.

  • Lambert met meerdere omwentelingen (maneuver::lambert_multirev): elke oplossing met maximaal drie omwentelingen, beide takken. Nieuwe registerrij, VALIDATED tegen pykep 3.0.1 (vooraf vastgelegd a75de851; 382 gevallen, 1058 oplossingen, grootste snelheidsverschil 1.6e-13 tegen 1e-8). De interne Kepler-landingsbewaking vond één beperking van maneuver::kepler_universal op een boog met e = 0,994; die is vastgelegd in docs/design/evidence/lambert-multirev/RESULTS.md.

  • Box-wing- en ECOM2-zonnestralingsdruk (DS-PA-14), optioneel. srp_boxwing: een box-wing-model met platte panelen met de Galileo FOC/IOV-tabellen uit de GSC-satellietmetadata, bij nominale GNSS-yawsturing, met stralingsfactor en partiële afgeleiden per paneel, en het empirische ECOM2-model met zijn partiële afgeleiden. Te kiezen met ForceModel::box_wing_srp / PreciseForceModel::box_wing_srp (velden srp_boxwing, standaard None: het kanonskogelpad en elke golden blijven ongewijzigd); bij een box-wing-set is cr de stralingsfactor ervan. Vergeleken met Orekit 12,2 onder een preregistratie (xval/srp-boxwing-orekit/): elke drempel gehaald, ongeveer 1e-15 relatief; VALIDATED als modelevaluatie, de Galileo-SRP-voorspelling blijft MODELLED.

  • SRP-schaduw van de afgeplatte Aarde en zonnerandverduistering (FUT-09, RM-11). Nieuwe module srp_shadow: oblate_conical_shadow (occulterende WGS-84-ellipsoïde), limb_darkened_shadow (wet van Eddington) en ShadowModel, te kiezen met ForceModel::srp_shadow (standaard: de bestaande bolvormige kegelschaduw, ongewijzigd); forces::srp_accel_with_lit_fraction. De schaduw van de afgeplatte Aarde komt overeen met de verlichtingsverhouding van Orekit 12,2 binnen 7.4e-9 over 2400 geometrieën (VALIDATED, xval/srp-oblate-shadow-orekit/); zonnerandverduistering heeft geen externe onafhankelijke referentie (MODELLED).

  • NRLMSISE-00-thermosfeer (FUT-08, RM-10, DS-PA-13). nrlmsise00: een port van gtd7 en gtd7d (schakelaars, modi met dagelijkse Ap en 3-uurlijkse ap-array) uit de publiekedomeinversie in C van de NRL-Fortran. Hij is bitgelijk aan die C-port en ligt binnen 1.9e-6 relatief van pymsis 0.13.0 (NRL-Fortran, enkele precisie) op een raster van 720 punten, en hij reproduceert de 17 gepubliceerde testgevallen (VALIDATED; xval/nrlmsise00-pymsis/). Dit toetst de port, niet de nauwkeurigheid van het model ten opzichte van gemeten dichtheid.

  • Optioneel NRLMSISE-00-niveau voor weerstandsdichtheid. forces::DensityModel::{Exponential, Nrlmsise00 { f107a, f107, ap }}, forces::drag_accel_with_density, density_at en propagator::ForceModel::drag_density. Het statische exponentiële model blijft de standaard, bit voor bit. Het ruimteweer is constant per model. VALIDATED op baanniveau tegen de eigen NRLMSISE-00-weerstand van Orekit 12,2 over 24 h (slechtste 0,03 m tegen tot 142 km weerstandsverplaatsing; xval/drag-tier-orekit/).

  • Optionele DE440-Zon en -Maan in de Cowell-propagator (RM-33, FUT-10). propagator::ForceModel::with_ephemeris neemt elke EphemerisProvider (bijv. een DE440 KernelEphemeris) voor de termen van derde lichamen en SRP; hij weigert een provider die de epoche niet kan bedienen, telt terugvallen op de analytische reeks en staat standaard uit. EphemerisProvider::relative_position_jd2 behoudt tweedelige precisie. Tegen Orekit 12,2 op zijn eigen DE440-lezer komen banen van 24 h overeen tot 0,017 m; de vooraf vastgelegde drempel voor de positie van Zon/Maan werd niet gehaald (6,4 m / 0,24 m; SPICE toont hetzelfde verschil), dus MODELLED (xval/propagator-de440-orekit/).

  • Optioneel atmosferisch S1-getij (DS-PA-03). tides::atmospheric_tide_s1 en s1_air_tide_acceleration (Biancale & Bode 2006, GFZ STR06/01 Tabel 1 model N1, graden 2–6), ingeschakeld met air_tide_s1() op propagator::ForceModel en precise_od::PreciseForceModel; standaard uit. MODELLED (coëfficiënten opnieuw gecontroleerd aan de gepubliceerde tabel; geen externe onafhankelijke referentie voor het krachteffect).

  • Batchbaanbepaling met afstandssnelheid en azimut/elevatie met een elevatiemasker (RM-36, FUT-13). orbit_determination::determine_orbit_batch_tracking, simulate_tracking, predict_tracking, propagate_with_stm (variationele STM met analytische tweelichamen- en J2-partiële afgeleiden), is_visible, measurement_with_partials; batch_ls::gauss_newton_analytic. Het pad met alleen afstand is ongewijzigd. Vergeleken met de kleinstekwadratenbatch van Orekit 12,2 over 8 vooraf vastgelegde scenario's: elke drempel gehaald behalve de overeenstemming van de ruisloze toestand (≤ 1 cm), die bij 2 van de 4 scenario's werd gemist met 1,46 en 1,74 cm, waarbij kshana binnen 1e-8 m van de referentie lag; vastgelegd, MODELLED.

  • SP3-nauwkeurigheidsweging (DS-PA-06). sp3::parse_sp3_accuracy en Sp3Accuracy::position_sigma_m koppelen de nauwkeurigheidscodes uit de header en per record aan sigma's van waarnemingen; een met SP3 gewogen Galileo-fitvariant (Tier-2 3D-RMS 0,035 m tegen 0,070 m ongewogen) is toegevoegd naast de ongewijzigde vastgelegde runs. MODELLED.

  • Dispatchjob voor de volledige Swarm-A-boog (DS-PA-08) in .github/workflows/agency-od-validation.yml.

  • Planetaire zwaartekracht uit PDS SHADR-tabellen (CAP-30, deel van CAP-31). SphericalHarmonicField::from_shadr (src/gravity_pds.rs) leest Mars GMM-3 (d/o 120) en GRAIL GL0660B (d/o 660); Body::with_gravity_field koppelt elk geladen veld (standaardwaarden ongewijzigd). Uitsneden tot graad 20 zijn meegeleverd (NASA PDS, publiek domein; tests/fixtures/planetary_gravity/NOTICE.md); de volledige bestanden worden opgehaald door xval/planetary-gravity-pyshtools/fetch_data.sh. VALIDATED tegen pyshtools 4.14.1 (binnen 4e-15 van de totale zwaartekracht bij d/o 120 over de hele bol, 5e-14 bij d/o 660 voor |lat| ≤ 60°); de koppeling aan het lichaamsstelsel blijft MODELLED (het eigen stelsel van elk veld is niet het gebruikte IAU-stelsel).

  • Zwaartekracht van hoge graad tot graad 2190 (RM-14, FUT-07). SphericalHarmonicField::acceleration_hf / potential_hf (gemodificeerde voorwaartse kolom van Holmes–Featherstone, geen underflow, geen polaire singulariteit), prepare_high_degree, een streamende ICGEM-lader from_gfc_file / from_gfc_reader (controles op normering en maximale graad, getijsysteem vastgelegd, tijdvariabele termen geweigerd) en scripts/fetch_egm2008.sh (volledige EGM2008, met SHA-256 vastgepind, niet meegeleverd; tests afhankelijk van KSHANA_EGM2008_GFC). propagator::FieldEvaluator kiest het op de optionele Geopotential. Komt overeen met Orekit 12,2 tot 7.3e-17 m/s² tot en met graad 2190, en een baan van 24 h 200×200 komt overeen tot 0,13 m. MODELLED: pyshtools haalde de vooraf vastgelegde drempel nabij de pool niet (herleid tot pyshtools) en de gevoeligheidscontrole van de baan op graad 70 haalde de drempel niet (0,73 m < 1 m); beide zijn vastgelegd in xval/.

  • DOP853-integrator (FUT-11). integrator::integrate_dop853, integrate_dop853_checked, integrate_dop853_dense (dense output van de 7e orde), dop853_step, dop853_initial_step, met een stapbewaking die bij fouten sluit; propagator::Integrator::Dop853, propagate_dop853, propagate_dop853_checked. De standaarddriver is ongewijzigd. VALIDATED tegen SciPy 1.18.1 solve_ivp(method="DOP853"): enkele stappen binnen 5.6e-15, overeenkomende staprijen, eindtoestanden binnen 1.6e-12 (xval/dop853-scipy/).

  • Robuuste Kepler-oplosser (FUT-12). Nieuwe module kepler: solve_kepler_markley (starter van Markley 1995, residu zonder cancellation) voor alle 0 ≤ e < 1, omhuld door propagator::solve_kepler_robust. VALIDATED tegen wortels van mpmath met 50 cijfers tot 0,9 ε·|E| tot e = 0,999999 (xval/kepler-mpmath/).

  • Optionele tesserale aardzwaartekracht in de Cowell-propagator (RM-09). propagator::ForceModel krijgt geopotential: Option<Geopotential> (with_geopotential, with_egm2008(nmax)). Het evalueert een SphericalHarmonicField (meegeleverde EGM2008 tot graad/orde 70, of elk ICGEM-.gfc) in een aardvast stelsel dat wordt bereikt via de aardrotatiehoek (EarthFixedFrame::Era) of via de CIO GCRS-naar-ITRS-keten (EarthFixedFrame::Cio). Standaard None: geen bestaande uitvoer verandert. VALIDATED tegen Orekit 12,2 Holmes–Featherstone over 24 h (6 gevallen, slechtste 0,036 m), met de drempels vooraf vastgelegd in xval/cowell-tesseral-orekit/PREREGISTRATION.md.

  • Tweedelige juliaanse datums door de aardrotatie op het baanpad: jd2::gmst82, cio::gcrs_to_itrs_matrix_jd2, frames::teme_to_itrf_jd2 / itrf_to_teme_jd2, orbit::Propagator::position_in_frame_jd2 en own_jd2_utc, From-conversies tussen jd2::Jd2 en timescales::TwoPartJd, en een optionele two_part_jd = true voor het scenario ephemeris (ECEF, grondspoor en stationsweergave; standaard uit en ongewijzigd, en de sleutel wordt bij uitgeschakelde stand weggelaten uit de scenariohash). Nieuwe registerrij, VALIDATED tegen pyerfa gmst82/c2t06a (vooraf vastgelegd b10475ee; 40 datums: GMST bitgelijk, matrix binnen 2.7e-14, rotatie over stappen van 1 µs binnen 1.1e-14 rad, waar het pad met één f64 ze niet haalt). De Cowell-krachtmodelepoche blijft met één f64; de reden staat in de bijbehorende documentatie.

  • EOP-voorspelling voorbij de tabel (EopSeries::with_ls_ar_prediction, EopSeries::last_mjd): een optionele uitbreiding van een IERS-reeks voor aardoriëntatie met de LS+AR-voorspeller, uitgegeven op de laatste rij ervan, zodat de stelselargumenten van een latere epoche de voorspelling volgen in plaats van op de laatste rij vast te klemmen. Antwoorden binnen de tabel zijn bitgelijk (getest); de reeks klemt nog steeds vast tenzij dit wordt aangeroepen. De nauwkeurigheid van de voorspelling blijft de bestaande LS+AR-bevinding ten opzichte van Bulletin A (MODELLED).

  • Hemelpooloffsets dX, dY op de CIO-keten (cio::gcrs_to_cirs_matrix_with_offsets), en directe ERFA-vectorcontroles van precession_matrix, teme_to_gcrs_matrix en de nieuwe functie. Nieuwe registerrij, VALIDATED tegen pyerfa (vooraf vastgelegd 979c1e39; 40 epochen 1950–2100: precessie en CIO bitgelijk, TEME→GCRS binnen 1.1e-10 rad, het voorspelde effect van de reeks met twee termen voor de equation of the equinoxes). Bestaande functies zijn ongewijzigd.

  • UTC van vóór 1972 op het tweedelige tijdpad (timescales::tai_minus_utc_on_date, en Jd2::from_utc_calendar, jd2::utc_to_tai en jd2::tai_to_utc vanaf 1960-01-01): het tijdperk met driftende snelheid ("rubber-second"), met de drifttabel van SOFA, fractionele stappen aan het einde van de dag en de schaling van UTC naar SI van de dagfractie. Nieuwe registerrij, VALIDATED tegen pyerfa dtf2d/utctai/taiutc (vooraf vastgelegd 23c40661; 117 momenten 1960–1971, slechtste 2.9e-11 s tegen een drempel van 1 µs). Elk resultaat van 1972+ is bitgelijk (checksum vastgepind vóór de wijziging). Vóór 1960 is TAI − UTC gelijk aan 0, zoals in SOFA. De timescales::tai_minus_utc met één f64 is ongewijzigd.

  • GLONASS-uitgezonden satellietklok (GlonassEphemeris::sv_clock_bias_s): −τn + γn·(t − tb) uit het RINEX-record, op een tijd afgelezen op de satellietklok (twee iteraties met vast punt, de RTKLIB-conventie). De ingelezen −τn en γn werden voorheen niet gebruikt. Nieuwe registerrij "GLONASS-uitgezonden satellietklok en propagatie van de uitgezonden baan", VALIDATED tegen RTKLIB 2.4.2-p13 geph2clk/geph2pos (vooraf vastgelegd e099c42a; 292 gevallen op een echt uitgezonden bestand van 2013: klokverschil 0 s, slechtste positie 1,1 mm tegen een drempel van 1 cm). Bibliotheekfunctie; geen scenariouitvoer verandert. Er wordt geen PZ-90.11 → ITRF-transformatie toegepast, en de module zegt dat.

  • PPP-tijdoplossing tegen de IGS-stationsklok (0,36, FUT-19): de ontvangerklok van het float-PPP-filter op WTZR komt overeen met de definitieve gecombineerde IGS-klok voor het station tot 0,075 ns (standaardafwijking) met een constante offset van −0,66 ns over de geconvergeerde twee uur. De drempels werden vooraf vastgelegd in xval/ppp-time/. VALIDATED (nieuwe registerrij). Nieuwe fixture igs_2025055_WTZR_05m_0006.clk, de stationsklokrecords van het definitieve IGS-klokbestand dat al voor de satellietklokken wordt gebruikt.

  • PPP-pariteit met gLAB (0,36, WP-07, RM-31): gLAB 6.0.0 werd als afzonderlijk hulpmiddel uitgevoerd op dezelfde WTZR-invoer (Apache-2.0-kern; downloadchecksum geverifieerd aan de gepubliceerde lijst), met de opdrachtregel van een procedureel amendement dat vóór de run was vastgelegd. Bij de eerste geregistreerde run komen het float-PPP van Kshana en dat van gLAB binnen 0,05 m overeen bij 240 van de 240 epochen en tot 5,0 mm bij de laatste. De SPP-drempel werd niet gehaald (mediaan 1,187 m tegen 0,50 m) en is als bevinding vastgelegd: de eigen SPP-oplossingen van gLAB en RTKLIB verschillen 0,852 m van elkaar. De geregistreerde regel laat daarom de delen van beide hulpmiddelen als geheel niet gehaald, terwijl de PPP-pariteit standhoudt.

  • Lezen van RINEX-4-navigatiebestanden (0,36, WP-07, PRO-41): rinex::parse_nav leest RINEX 4.00-4.02-navigatiebestanden (> EPH GPS LNAV, Galileo I/NAV en F/NAV, BeiDou D1/D2, QZSS LNAV; andere records overgeslagen tot de volgende recordheader), en parse_nav_with neemt opties. VALIDATED tegen het samengevoegde RINEX-3-bestand van IGS van dezelfde dag: elk gedecodeerd veld identiek en 0 m in positie. Het lezen van RINEX 2/3 is ongewijzigd.

  • Uitgezonden GEO-posities van BeiDou (optioneel): NavParseOptions::include_beidou_geo en RinexEphemeris::sv_position_ecef_bds_geo (BDS ICD, helling van −5 graden). parse_nav slaat GEO's nog steeds over. MODELLED: de vooraf vastgelegde vergelijking met een nauwkeurige baan hangt af van data en is nog niet uitgevoerd.

  • RINEX-4-waarnemingsbestanden: een echt RINEX-4,00-MGEX-waarnemingsbestand wordt in tests gelezen (MODELLED, formaatcontrole).

  • RTK met LAMBDA op echt RINEX (0,36, WP-07 ★): rtk_real::run_rtk, dubbele verschillen over een korte basislijn van GPS-code en -fase op twee frequenties met een float-Kalmanfilter en LAMBDA-fixering van geheeltallige waarden (ratiotest). VALIDATED op de IGS-stations WTZR en WTZZ (1,4 m uit elkaar) tegen hun ITRF2020-basislijn onder vooraf vastgelegde drempels: gefixeerd op elke epoche na de eerste tien minuten, mediane basislijnfout 4,5 mm en 95e percentiel 5,5 mm.

  • RTKLIB-pariteit van de PPP met echte data (RM-31): xval/ppp-parity/run.sh en tests/ppp_parity_glab_rtklib.rs met vooraf vastgelegde drempels. PPP van RTKLIB v2.4.2-p13 op dezelfde WTZR-invoer komt bij de derde registratie overeen met Kshana binnen 5 cm op elke epoche van de laatste twee uur (9,7 mm aan het einde); de eerste twee runs, als bevindingen vastgelegd, hadden het vaste getij uit staan en de ontvangerantenne op de basisslot van RTKLIB. De pariteitsdrempel voor enkelvoudige positiebepaling werd niet gehaald (1,09 m mediaan tegen 0,5 m). Het deel met gLAB is niet uitgevoerd (hangt af van data).

  • Navigatieberichtcoders voorbij LNAV (0,36, WP-07, PRO-40): gnss_navmsg codeert GPS CNAV (berichttypen 10, 11, 30; CRC-24Q; continue codering met rate 1/2 K=7), Galileo I/NAV (woordtypen 1-5 in even/oneven nominale pagina's; 30x8-interleaver; sync 0101100000) en Galileo F/NAV (paginatypen 1-4; 61x8-interleaver; sync 101101110000), met testdecoders. MODELLED: rondgangen en bekende antwoorden uit de ICD; een vooraf vastgelegde controle dat uitgezonden Galileo-efemeriden op het LSB-raster van de coder liggen hield stand (slechtste 3.6e-3 LSB) maar haalde de drempel voor het aantal satellieten niet (15 van 20), vastgelegd. De coders zijn bibliotheekfuncties; koppeling aan de scène maakt geen deel uit van deze wijziging.

  • IONEX-bestandslezer (0,36, WP-07): ionex::parse_ionex_file met IonexFile, IonexHeader, IonexEpoch, IonexFileMap en IonexTimeInterp: een strikte IONEX-1,0-lezer met vaste kolommen, met epochen geteld vanaf de dag van de eerste kaart, 9999 gelezen als ontbrekend, RMS-kaarten en de tijdinterpolaties van het formaat naar de dichtstbijzijnde, opeenvolgende en geroteerde kaart; schuine TEC op de schaalhoogte uit de header. Gecontroleerd op een vastgelegde synthetische kaart en, afhankelijk van data (bij de test opgehaald met een vastgepinde SHA-256, niet meegeleverd), op een uitsnede van een echte CODE-GIM: elk knooppunt exact; interpolatie komt overeen met een formulereferentie tot 4e-13 TECU. iontec van RTKLIB komt overeen tot 3.6e-13 TECU bij 6885 punten (vooraf vastgelegd B6). VALIDATED op bewijs dat van data afhangt (besluit van de eigenaar, 2026-10-13): de test faalt bij elke andere kaart dan de met SHA vastgepinde.

  • Hatch-draaggolfafvlakking (0,36, WP-07): hatch::HatchFilter en pvt::assemble_epoch_precise_smoothed, de divergentievrije (ionosfeervrije) vorm in de nauwkeurige enkelvoudige-positieopbouw. MODELLED met een vastgelegde bevinding: op het IGS-station WTZR verlaagt het de mediane fout van enkelvoudige positiebepaling van 1,55 m naar 1,12 m en het 95e percentiel van 3,47 m naar 3,21 m, minder dan de vooraf vastgelegde reductie van 40 % (de resterende fout is biasachtig, geen ruis).

  • Float-PPP op echt RINEX (0,36, WP-07): ppp_real::run_ppp, een statisch float-filter voor nauwkeurige puntpositiebepaling op echte GPS-code en -fase op twee frequenties met definitieve IGS-producten (antenne-offsets en -variaties, vaste-aardegetij, phase wind-up, Shapiro-vertraging, geschatte natte vertraging, detectie van cycle slips), met parse_antex_receiver. VALIDATED op het achtergehouden IGS-station WTZR tegen zijn ITRF2020-coördinaat onder vooraf vastgelegde drempels: na 6 h is de fout 1,5 mm horizontaal en 2,9 cm verticaal, en elke epoche van de laatste twee uur ligt binnen 10 cm.

  • Interpolatie van nauwkeurige SP3-klokken (0,36, WP-07): Sp3File::clock_s en clock_nodes interpoleren de getabelleerde SP3-satellietklokken lineair tussen de twee omsluitende geldige knooppunten (sentinel voor slechte klok overgeslagen), en ClockRinex::from_sp3 voert ze aan PreciseProducts, zodat de nauwkeurige keten vanuit alleen een SP3 draait. VALIDATED tegen de definitieve IGS-klokken van 30 s van 2025-02-24 onder vooraf vastgelegde drempels: 32 GPS-satellieten, RMS in het midden 0,121 ns (drempel 0,15 ns), 95e percentiel 0,265 ns (drempel 0,30 ns).

  • RAIM naast de kwaliteitsmaten van clock-holdover (CAP-05b): een optionele sectie [integrity] bij het kloktype rapporteert een afzonderlijk blok integrity_fom (snapshot-RAIM op een voorgeïnstelde hemel vanaf een opgegeven locatie: oordeel per epoche en beschermingsniveaus, beschikbaarheid; niet beschikbaar zolang GNSS wordt geweigerd, nooit geëxtrapoleerd). De holdover-cijfers zijn ongewijzigd; zonder de sectie is de uitvoer byte-identiek. MODELLED.

  • Ontvangervertrouwensdrempels gekalibreerd op JammerTest 2024 (CAP-13): een vooraf vastgelegde kalibratie van de monitoren voor C/N0-daling, AGC en jamming-indicator op de openbare dataset JammerTest 2024 (tijdens de run opgehaald, nooit meegeleverd; examples/jammertest_trust_calibration.rs), alleen geleverd als de optionele [monitors] profile = "jammertest-2024-calibrated" (1,5 dB, 3,5 sigma, 29). Achtergehouden: de drempels voor AGC, jamming-indicator en de unie worden gehaald; de drempel voor valse alarmen van C/N0 niet (0,023 tegen 0,02), dus de rij is MODELLED (xval/jammertest-trust/RESULTS.md). Standaardwaarden en uitvoer zonder het profiel zijn ongewijzigd.

  • ARAIM-foutehypothesen met meerdere satellieten (CAP-05a): de subsetregel van ADD v4.2 gegeneraliseerd voorbij paren (add_v42_subset_plan, add_v42_protection_levels_to_order; orde 2 is precies het bestaande door MAAST gecontroleerde pad) en een optionele geavanceerde RAIM over die hypothesen (araim_subset_raim), die de subset met de grootste scheiding rapporteert wanneer een fout wordt gedetecteerd. Priors die diepere subsets vereisen worden geweigerd, nooit afgekapt. MODELLED.

  • Skyline in ontvangervertrouwen (FUT-01): een ontvangervertrouwenssessie kan een [skyline] opgeven; satellieten erachter gaan voor de hemel verloren (sky-blocked, behind_skyline, open_fraction) en hun verliezen worden als geometry ingedeeld, nooit als environment; zonder skyline zijn de terugval op azimutgaten en elke uitvoer als voorheen. De trainingsgenerator voor bemanningen krijgt een gebeurtenis natural-degradation (een geblokkeerde hemel, geen interferentie) en het scenario scenarios/training/fjord-natural-degradation.toml. De UERE x DOP Monte Carlo krijgt de twee gemaskeerde skyline-geometrieën uit de ontwerpnotitie, alleen vooraf vastgelegd: alle 26 controles slagen.

  • Verificatie van RFC-3161-tijdstempels (CAP-14): kshana::evidence::tsa::verify_token controleert de handtekening van een tijdstempeltoken (RSA PKCS#1 v1.5, RSA-PSS, ECDSA P-256 en P-384), de ESS-binding van het ondertekeningscertificaat, het timeStamping-gebruik van de ondertekenaar en zijn keten naar een vertrouwd anker op de genTime van het token, offline; kshana evidence verify --tsa-ca <anchors.pem> past dat toe op de timestamp.tsr van een pakket (optioneel; zonder dit is het rapport ongewijzigd). VALIDATED, in beperkte zin: alle 27 zelf gegenereerde gevallen komen overeen met OpenSSL 3.0.13 over het oordeel en de genTime, onder een vergelijking die is vastgelegd voordat de verificator werd geschreven. Intrekking wordt niet gecontroleerd.

  • Verificatieniveaus per cijfer voor elk type (RM-04): het resultaat van elk scenariotype eindigt nu met een blok figure_tiers dat de kerncijfers noemt, de rij van de verificatiematrix die elk ervan bezit en het niveau dat uit die rij wordt gelezen (cijfers die geen rij bezit worden als zonder niveau vermeld). Het blok wordt na de run toegevoegd en valt byte voor byte terug op het vorige document (api::without_figure_tiers). lunar-station-coverage heeft geen figure_tiers totdat een nieuwe gedateerde voorspelling de bevroren voorspelling vervangt; leo-ppp, solar-system, sweep en sweep-nd hebben geen scalair kerncijfer, en lunar-attack-surface schrijft compacte JSON. Campagneleden behouden hun documenten zonder niveau.

  • Quantumvoorinstelling quantum-cai-coast (CAP-08c): een meegeleverd inertiaalscenario waarin een accelerometer met koude-atoominterferometer, gespecificeerd door zijn interferometerfysica ([accel_quantum.cai] met een vermeld trillingsniveau van het platform), gedurende een GNSS-uitval van 110 minuten meeloopt naast een kwartsaccelerometer van navigatiekwaliteit. MODELLED.

  • Exacte equivalente vrijheidsgraden van Greenhall (CAP-03): allan::edf_greenhall, het volledige algoritme van Greenhall en Riley (2003) (verschilordes 1 tot 3, ruisexponenten +2 tot -4, overlappend en niet-overlappend, gemodificeerd en ongemodificeerd, met de grote-J-tabellen), met ADEV-, MDEV- en HDEV-wrappers. VALIDATED in een vooraf vastgelegde vergelijking met allantools 2024,6: 4.876 rasterpunten binnen 6.0e-13 relatief; allantools faalt bij 32 verdere punten, die zonder waarde van een onafhankelijke referentie zijn vastgelegd. De betrouwbaarheidsintervallen van assurance::uncertainty zijn bit voor bit ongewijzigd.

  • Foutermen van de koude-atoominterferometer (RM-26/27/28): Raman-laserfaseruis (met de term voor de vertraging van de retroreflectie), de bias door golffrontkromming van een thermische wolk (zuivere defocus, met een detectiestraal) en de oplossing van de franje-ambiguïteit (klassiek ondersteund en met twee interrogatietijden), als bibliotheekfuncties in src/inertial/cai_error_terms.rs, elk in gesloten vorm gecontroleerd met kwadratuur of Monte Carlo. MODELLED; nog niet bereikbaar vanuit een scenariosoort (docs/QUANTUM-MODELS.md).

  • Klok-logformaten (RM-03): src/clock_log.rs leest RINEX-klokbestanden, ASCII-fase- of frequentielogs in TimeLab-stijl en TAPR TICC-tellerlogs in één genormaliseerde faserij (tau0 opgegeven of gevonden, hiaten geteld, een hiatenbeleid). Op aanvraag: een telecom-tijdsynchronisatiereeks kan een log noemen ([series.clock_log]), en de tabel [clock_log] van een klokscenario voegt een blok measured toe (ADEV, TDEV, MTIE). Zonder de tabel zijn beide soorten byte-identiek (docs/CLOCK-LOG-FORMATS.md). Een vooraf vastgelegde vergelijking op drie synthetische logs haalde haar fase- en bedradingsdrempels; de schatters komen overeen met allantools binnen 2.5e-14 overal waar die evalueert, en allantools evalueert het MTIE-punt over het hele record niet (vastgelegd). MODELLED.

  • Maskers voor wander bij frequentiesynchronisatie (RM-01): de soort telecom-timing krijgt zeven MTIE- en TDEV-maskers voor wandergeneratie bij constante temperatuur, ITU-T G.811 PRC, G.812 Types I tot III, G.8262 EEC Options 1 en 2 en G.8262.1 eEEC, met de machtswetstukken die de tabellen opgeven, en het referentiescenario scenarios/telecom-synce-eec.toml (een vrijlopende OCXO tegen de EEC-maskers: het faalt bij 1.000 s, waar een lus het werk moet doen). Elke rij is opnieuw gelezen tegen de tekst op itu.int; G.812 (06/2004) is vervangen door een vooraf gepubliceerde editie van 08/2026 die niet kon worden gelezen. MODELLED (een transcriptie); bestaande maskers en uitvoer zijn ongewijzigd.

  • Richtlijn voor de filter-prior van de soort gnss-ins (0,36, WP-09, bevinding RM-21): de standaard filter-prior van het pakket past bij een IMU van tactische kwaliteit. Met een IMU van navigatiekwaliteit kan de standaardwaarde de gefuseerde meeloop slechter maken dan vrije INS: 52 m tegen 11 m op een vliegtuigprofiel van 70 m/s. Stel [imu_*.filter_prior] in op de kwaliteit van de sensor, zoals de nieuwe pakketten voor maritiem, spoor en luchtvaart doen. Geen enkel meegeleverd scenario koppelt een IMU van navigatiekwaliteit aan de standaard prior: elk scenario dat de standaardwaarde gebruikt, heeft resterende accelerometerbiases van ten minste 0,015 m/s². Alleen documentatie; geen uitvoer verandert.

  • Test-bench-export gecontroleerd met de eigen lezers van een simulator (0,36, WP-09, CAP-16): de bewegingsbestanden van kshana bench-export voor 8 meegeleverde scenario's zijn teruggelezen door de NMEA-, breedtegraad/lengtegraad/hoogte- en aardvaste bewegingslezers van gps-sdr-sim (MIT, commit 28ca29a6, gebruikt als afzonderlijk hulpmiddel via xval/testbench-gpssdrsim/; er wordt geen signaalfunctie aangeroepen). Ze geven het geëxporteerde traject terug tot op 1,2 mm, 0,15 mm en exact. BEVINDING: de aardvaste lezer van die simulator kan de CSV met volledige breedte niet verwerken, omdat zijn regelbuffer van 100 tekens elke rij splitst. docs/TEST-BENCH.md geeft nu de te gebruiken kolomsneden en de limiet van 300 s van de simulator. VALIDATED (nieuwe registerrij); de bytes van de export zijn ongewijzigd.

  • GNSS/INS op de KF-GINS-dataset (0,36, WP-09, FUT-17): fusion::kfgins-loaders en -runner en het meetmodel voor de hefboomarm in de gesloten-lus-EKF. Op de KF-GINS-demodataset (op testmoment opgehaald, niet meegeleverd) is de horizontale RMS van Kshana ten opzichte van het referentietraject 1,09 cm, tegen de eigen 1,11 cm van KF-GINS, en elke vooraf vastgelegde drempel is gehaald. VALIDATED op bewijs dat aan data is gebonden (besluit van de eigenaar, 2026-10-13): de dataset wordt opgehaald met SHA-256-pins en het reproductiepad staat in xval/kfgins/PREREGISTRATION.md.

  • Gekoppeld PNT-filter in het fusiepakket (0,36, WP-09, FUT-16): de soort fusion accepteert een optionele tabel [coupled] die één gestapeld filter op pseudoranges laat draaien met een accelerometerbiastoestand (fusion::coupled::CoupledPntBiasFilter), en fusion::coupled::CoupledPnt3d is de 3D-versie met 8 toestanden. Nieuw meegeleverd scenario fusion-pnt-coupled: met bevooroordeelde accelerometers houdt de gekoppelde modus de positie van de quantumsuite op 18,7 m (95e percentiel) met volledige integriteit, waar de ontkoppelde filters 430 m halen. Zonder de tabel zijn fusion en hybrid ongewijzigd (vastgepind); hybrid weigert de tabel. MODELLED.

  • GNSS/INS-pakketten voor maritiem, spoor en luchtvaart (0,36, WP-09, RM-21): meegeleverde scenario's gnss-ins-maritime, gnss-ins-rail en gnss-ins-aviation op de trajectbibliotheek, en een optionele tabel [tight] voor de soort gnss-ins die pseudoranges fuseert van een SGP4-Walkerconstellatie (alle satellieten bij nominaal bedrijf, de hoogste paar bij degradatie). Bij het spoorpakket houdt strakke koppeling de oplossing van navigatiekwaliteit op 5,3 m door een insnijding en tunnel, tegen 12,9 m bij losse koppeling. Zonder [tight] is het pakket ongewijzigd (vastgepind). MODELLED.

  • Strakke koppeling met draaggolffase (0,36, WP-09, RM-25 / FUT-17): fusion::carrier_tc, een foutentoestands-EKF met een expliciete klok van de ontvanger met twee toestanden en float-draaggolfambiguïteiten, aangedreven door een SGP4-Walkerconstellatie met Klobuchar- en Saastamoinen-correcties in de meetlus, slipdetectie op basis van tijdsverschillen van de draaggolf en herinitialisatie van ambiguïteiten, en een run met alleen code op dezelfde metingen ter vergelijking. MODELLED: bij een rit in een figuur-8 is de draaggolfoplossing 2,5 cm tegen 47 cm met alleen code, en NIS/NEES zijn consistent over seeds.

  • GNSS/INS-trajectbibliotheek (0,36, WP-09, RM-24): de soort gnss-ins accepteert een optionele tabel [trajectory] met profile = "straight" | "figure8" | "stop_go" | "aircraft" | "uas" | "csv". De profielen sturen Eulerhoeksnelheden en versnelling langs het spoor aan vanuit de referentietoestand en leiden de ware IMU af uit starrelichaamkinematica (gecoördineerde bochten, klimmen, Coriolis); csv importeert een referentietraject (t, lat, lon, alt, vn, ve, vd, roll, pitch, yaw) en lost de IMU op die het reproduceert. Zonder de tabel vliegt het pakket zijn historische rit, bit voor bit (vastgepind). MODELLED.

  • DEM-tegels met breedte- en lengtegraad voor de maanhorizon: [terrain] dem_tile_path leest een tekstbestand realdata::lola_dem (hoogten boven de gemiddelde bol op een raster van breedte- en lengtegraad) in plaats van de poolstereografische dem_path, voor zowel lunar-station-coverage als moonlight-service-volume; het rapport toont de tegel (terrain.dem_tile, met zijn SHA-256). realdata::lola_dem is nu aangesloten op de horizon-raymarch. Een tegel die is geherbemonsterd uit de meegeleverde uitsnede geeft het station de horizon van de uitsnede tot op 0,22 graad. MODELLED.

  • Terrein op de exportlocatie van het dekkingsvolume: met een sectie terrain bevat elke rij van de geometrie-export per satelliet van moonlight-service-volume de waarde clears_terrain (de satelliet komt vrij van het vlakke masker en van de horizon van de exportlocatie op zijn azimut), bevat het rapport de horizon van de locatie (export_site_terrain) en krijgt de runtime-CSV de kolom erbij. Zonder terrein is de export ongewijzigd. MODELLED.

  • Kopvelden uit de engine (0,36, STUDIO-06): kshana::api::HEADLINE_FIELDS, field_importance_json() en de WebAssembly-functie field_importance() geven, voor twaalf soorten, aan welke velden van een scenario zijn vraag beantwoorden, de beste eerst, als punt-paden (jammers[].eirp_dbw). De Studio leest ze vóór haar eigen rangschikking. Alleen weergavemetadata: de engine leest ze nooit, geen scenariobestand heeft ze nodig, geen resultaat hangt ervan af. tests/field_importance.rs faalt als een soort niet kan worden aangestuurd of als een pad in geen enkel meegeleverd scenario van de soort voorkomt (de test ving twee paden op die de afgevlakte id's van de Studio zonder de arrayhaken hadden geschreven).

  • Tabel van soort naar module uit de engine (0,36, STUDIO-05): kshana::api::KIND_MODULES, kind_modules_json() en de WebAssembly-functie kind_modules() geven, voor elke scenariosoort waarvan de rijen van de verificatiematrix een andere module noemen dan de eigen, de modulenamen. De mogelijkhedenkaart van de Studio gebruikte een eigen met de hand geschreven kopie; tests/kind_modules.rs faalt als een soort in de tabel niet kan worden aangestuurd of als een module in geen enkele matrixrij voorkomt. Er is geen uitvoer veranderd.

  • Korte IQ-run in de browserbuild (0,36): iq_signals() en iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed) in de WebAssembly-module bouwen een synthetische scène op, acquireren elke satelliet en tracken de geacquireerde, alles in het geheugen, begrensd tot 0,25 s, 1.000.000 samples en 8 satellieten. De scènebouwer en het opzoeken van een signaal op naam zijn verhuisd uit het alleen-native iq::cli (naar iq::scene::synthetic en iq::signals::by_name) zodat beide builds ze delen; de uitvoer van de opdrachtregel is ongewijzigd. De native test en web/smoke.mjs vergelijken hetzelfde verzoek met één golden (tests/fixtures/iq_short_golden.json), byte voor byte: sinds de wijziging naar draagbare wiskunde (STUDIO-15, hieronder) geven de browserbuild en de native build dezelfde bits.

  • Getypeerde Python- en TypeScript-API's (CAP-34): kshana.pyi typeert de gesloten vocabulaires (ScenarioKind, elke soortnaam; ErrorKind; ProvenanceClass) en de woordenboeken KindMeta en FieldUnit; scenario_kinds() en error_kind() geven ze terug. Het WebAssembly-pakket voegt run_typed toe (één run als getypeerd RunOutput-object met het geparseerde document als data) en scenario_kinds (de geparseerde KindMeta[]), en zijn kshana.d.ts bevat hetzelfde vocabulaire; error_kind is getypeerd als ErrorKind | "". tests/typed_api_sync.rs houdt beide lijsten gelijk aan die van de engine.

  • Eenheden voor elke sweep-nd-kolom (FUT-28): een resultaat van sweep-nd bevat nu key_units en metric_units, de eenheid van elke gesweepte sleutel en elke vastgelegde metriek, gelezen uit de eigen eenhedentabel van het gesweepte pakket. Een as mag unit declareren voor een sleutel die het pakket niet teruggeeft; een gedeclareerde eenheid die die van het pakket tegenspreekt wordt geweigerd, en een eenheid die geen van beide opgeeft is null, nooit geraden. points[].coords[] en points[].metrics[] worden beschreven, zodat elk van de 76 soorten nu volledig wordt gedekt door de poort voor veldeenheden (plafond voor niet-gedekte soorten 1 -> 0).

  • NumPy-arrays uit RunOutput (FUT-26): het Python-object RunOutput krijgt array(path), columns(path) en series(), die numpy.ndarrays teruggeven voor een numerieke lijst, de numerieke kolommen van een lijst van records, of elke recordreeks in het document. Elke array is gelijk aan numpy.asarray van dezelfde waarden uit data() (dtype en bits). NumPy wordt alleen geïmporteerd wanneer een van deze wordt aangeroepen en blijft buiten de runtimevereisten. Getypeerd in kshana.pyi en gecontroleerd met stubtest.

  • Campagne-optimaliseerder (CAP-32): de nieuwe, optionele sectie [optimize] van de soort campaign zoekt binnen opgegeven grenzen één tot drie scenariosleutels voor de beste waarde van één metriek: minimaliseren, maximaliseren of een doelwaarde treffen. Hij zoekt uitputtend op een raster, of met een deterministische begrensde Nelder-Mead-simplex. Elke evaluatie is een echte run van de genoemde soort en staat in de trace van het resultaat. Voorbeeld: scenarios/campaign-optimize-link-budget.toml. De drempels zijn vooraf vastgelegd (docs/design/evidence/cap32-optimize/):

    • de Rosenbrock-functie is gehaald (f* = 1.7e-20);
    • een 1D-doeloplossing in gesloten vorm is gehaald (6e-15 relatief);
    • het raster is bit-gelijk aan een onafhankelijke brute-force-berekening;
    • de simplex doet het minstens zo goed als een raster van 41 × 41 in 177 runs.

    De 1D-drempel van ronde 1 is vastgelegd als NOT MET, omdat de vooraf vastgelegde box de oplossing uitsloot. MODELLED; registerrij "Bounded optimisation of one metric over campaign parameters". Additief: campagnes zonder de sectie zijn ongewijzigd.

  • Kalibratie-ensembles (CAP-10): drie controles met één seed, opnieuw uitgevoerd over 200 onafhankelijke seeds tegen vooraf vastgelegde drempels, in docs/CALIBRATION-ENSEMBLES.md (gegenereerd door gen_calibration_ensembles; waarden per seed in docs/data/calibration-ensembles.csv).

    • Het bootstrap-interval van 95 % van de campagne-Monte-Carlo dekt het ware gemiddelde bij 192 van 200 ensembles, en zijn chikwadraatcontrole slaagt bij 196.
    • De percentieltolerantie met één seed slaagt slechts bij 183 van 200: NOT MET, zoals voorspeld. Het is een drempel van ongeveer 2 sigma, vastgelegd en niet versoepeld.
    • De ADEV-kalibraties voor witte FM slagen bij elke seed, met hun slechtste fout ver binnen de tolerantie.

    MODELLED.

  • Ingebouwde soorten via de trait Scenario (FUT-27, in uitvoering): de trait BuiltinKind (api::BuiltinKind, met een tierhaak per cijfer en append_figure_tiers), en de eerste soorten die erop zijn overgezet (inertial, spoof, passes, link-budget, jamming). De uitvoer is ongewijzigd: een manifest van de hele catalogus met de SHA-256 van elke uitvoer is voor en na identiek (tests/scenario_output_manifest.rs).

  • Playground-controle zonder ophalen (RM-07): tests/playground_no_fetch.rs controleert drie dingen:

    • elk bibliotheekscenario van de Studio zit in de browserbundel;
    • de bundel is byte-identiek aan scenarios/;
    • elk browserscenario draait vanuit een lege werkmap.
  • Alt-PNT-kaarten: echt zwaartekrachtveld, Monte Carlo van kaartfouten, SRTM op volledige resolutie (0,36, WP-10). De soort gravity-map accepteert een optionele [reference]: een zwaartekrachtanomalie gesynthetiseerd uit de meegeleverde EGM2008-coëfficiënten (of uit een ICGEM-bestand .gfc via gfc_path, alleen native builds). Die synthese komt overeen met de ICGEM Calculation Service tot ongeveer 1e-8 mGal over 794 knooppunten in twee regio's, tegen vooraf vastgelegde drempels van 0,005 mGal RMS en 0,02 mGal max (VALIDATED; registerrij "Gravity-anomaly synthesis from a spherical-harmonic model"). Het nieuwe meegeleverde scenario gps-denied-gravity-nav-egm2008 draait de benchmark van 60 minuten op dat echte veld van graad 70. Vooraf vastgelegde uitkomst: gematchte fout 3106 m, dus de drempel < 500 m is NOT MET, zoals voorspeld (graad 70 is te glad), en de tienvoudige vermindering van de drift is MET (MODELLED). Een optionele [map_error_mc] draait de benchmark opnieuw over geseede, Gauss-gecorreleerde kaartfouten en rapporteert de verdeling van de gematchte fout (meegeleverd scenario gravity-map-error-mc). Verkennend en niet vooraf vastgelegd: met een kaartfout van 2 mGal, gecorreleerd over 0,2 graad (de grootte die de eigen sigma van de matcher begroot), blijft 1 van 20 realisaties binnen 500 m (mediaan 2,9 km, p95 14,7 km), tegen 144 m met een perfecte kaart. De positiebepaling onder 500 m van de synthetische benchmark gaat ervan uit dat de kaart exact is. Zonder een van beide opties is het document byte-identiek aan eerdere releases. combined-altpnt accepteert een optionele [magnetic_grid] (csv_path, column) die het magnetische kanaal uit een CSV in EMAG2v3-formaat leest. EMAG2 wordt niet meegeleverd omdat de voorwaarden niet expliciet zijn: tools/fetch_emag2_tile.py haalt het op met een vastgepinde SHA-256 en snijdt een vak uit. Op het echte EMAG2-raster wordt geen navigatieresultaat beweerd. Gezamenlijke kaartschatting (terrain SLAM, RM-18): altpnt::sequential::run_sequential_trn_on_map laat de sequentiële terreinnavigator vliegen over een opgeslagen kaart die van de referentie afwijkt, door haar te vertrouwen of door per cel een kaartcorrectie te schatten met een Rao-Blackwell-filter in FastSLAM-stijl. Vooraf vastgelegd tegen SITAN met bekende kaart bij een gecorreleerde kaartfout van 15 m over 20 seeds: een gemiddelde winst van 1,5 %, beter in 10 van 20, dus beide verbeteringsdrempels zijn NOT MET (10 % en 12 van 20), zonder schade bij een perfecte kaart (MET). Eén enkele passage zonder herbezoeken laat de kaart niet leren (xval/terrain-slam-rbpf/, MODELLED). Documenten van terrain-slam zijn byte-identiek. De SRTM-tests met echte data draaien nu in CI op twee vastgelegde uitsneden op volledige resolutie; alle vooraf vastgelegde drempels zijn gehaald, waarbij het dichtstbijzijnde knooppunt gelijk is aan GDAL 3.8.4 in 8 van 8 punten (xval/srtm-ungate/).

  • Interoperabiliteit, WP-08 (0,36; elk onderdeel vooraf vastgelegd en afzonderlijk gecommit vóór zijn run met een onafhankelijke referentie, elk een nieuwe VALIDATED registerrij behalve het telemetrie-onderdeel, dat een bestaande rij verbreedt):

    • CCSDS Orbit Data Messages (src/odm.rs): OPM 3.0/2.0, OMM 3.0/2.0 en OCM 3,0 (blokken TRAJ, PHYS, COV, MAN, USER) geschreven en gelezen in KVN en NDM/XML, en een OMM met volledige precisie uit een SGP4-elementenset (OmmMessage::from_omm_file); de uitvoer van OmmFile::to_omm_kvn is ongewijzigd. Tegen Orekit 13.1.8 in beide richtingen: 27 van 30 Kshana-berichten worden door Orekit geparseerd en Kshana leest elk door Orekit geschreven bericht, waarden binnen 1e-14 relatief en epochs binnen 1e-9 s; vier bevindingen vastgepind (Orekit vereist ELEMENT_SET_NO, weigert COMMENT in door de gebruiker gedefinieerde XML-parameters, schrijft geen BTERM zonder BSTAR, en leest relatieve OCM-epochs onder TDB in SI-seconden). De META_START van de oudere OMM-schrijver wordt door Orekit geweigerd (vastgelegd). Rij "CCSDS Orbit Data Messages (OPM, OMM, OCM)".
    • CCSDS Attitude Data Messages (src/adm.rs, src/ndm_xml.rs): AEM 2.0/1.0 en APM 2,0 in KVN en XML tegen Orekit 13.1.8, elke drempel gehaald; de APM-schrijver van Orekit weigert een manoeuvre zonder MAN_DELTA_MASS (vastgepind). Rij "CCSDS Attitude Data Messages (AEM, APM)".
    • SPICE SPK-export (src/spk_writer.rs): schrijver en lezer voor SPK-types 9 en 13 en OEM-naar-SPK-export; tegen CSPICE N0067 zijn de kernels byte-identiek aan die van SPICE en evalueren ze bit-identiek. Rij "SPICE SPK export (types 9 and 13)".
    • SPICE SPK-types 3 en 21 (src/spk_writer.rs): segmenten van type 3 (Chebyshev) en type 21 (uitgebreide verschillijnen) geschreven uit gegeven records en geëvalueerd zoals SPICE dat doet; tegen CSPICE N0067 zijn de kernels byte-identiek aan die van SPICE en komt elke evaluatie in beide richtingen bit voor bit overeen. Rij "SPICE SPK types 3 and 21 (Chebyshev, extended difference lines)".
    • Uitbreidingen van Space Packet (src/space_packet.rs): secundaire header met CUC/CDS-tijdcodes, packetfoutcontrole, segmentatie en streamcontroles, tegen ccsdspy 2.0.1, spacepackets-rs 0.18.0, spacepackets-py 0.32.0 en CPython crc_hqx, nul afwijkingen. Rij "CCSDS Space Packet secondary header, packet error control and segmentation".
    • Telemetrieschema 1,3 via echte consumenten: de Prometheus-exposition en OTLP/HTTP-JSON van een synthetische schema-1.3-stroom, inclusief de geometriereeks en het label class, exact gelezen door prometheus_client en de OTLP-proto, geaccepteerd door promtool 3.5.0 check metrics zonder lintprobleem, en ongewijzigd doorgegeven door de OpenTelemetry Collector contrib 0.135.0 (aan data gebonden: hulpmiddelen opgehaald met vastgepinde SHA-256, uitvoer vastgelegd).
  • Baanbepaling van Mars, run 2 (0,36, WP-14, CAP-30): mars_od::fit_damped schaalt de normaalmatrix met haar diagonaal en dempt de stap (Levenberg-Marquardt), nadat de geregistreerde Gauss-Newton-fit faalde op een matrix waarvan de ruwe diagonaal acht ordes van grootte beslaat. Afzonderlijk geregistreerd (xval/mro-od/PREREGISTRATION-RUN2.md, dezelfde boog, drempels en bewerking). Op de gescoorde MRO-passages ligt de baan binnen 0,36 km RMS (0,53 km maximum) van de navigatiereconstructie van MRO, drempels gehaald. De post-fit-Doppler is 48,6 mHz tegen de drempel van 30 mHz, niet gehaald (bevinding vastgepind). Een amendement dat alleen de scoring betreft, R2-A1, is openbaar gemaakt in docs/revisions. De rij blijft MODELLED.

  • Gerampt 2-weg-Dopplermodel van Mars en baanbepaling (0,36, WP-14, CAP-30 deel, fase 2): mars_od voorspelt de gerampte X-band-2-weg-Doppler van DSN uit ODF-ramptabellen (lichttijd, Shapiro, troposfeer, stationstijd, DSN-stations via de CIO-keten en IERS EOP) en past een Marsorbiter aan (GMM-3, derde lichamen, SRP, drag). naif_kernel leest SPK-type 1 (gecontroleerd tegen CSPICE) en gravity_sh::from_shadr leest PDS SHADR-velden. Vooraf vastgelegd tegen de navigatiereconstructie van MRO op echte MRO-passages (aan data gebonden, scripts/fetch_mro_od.sh, maandelijkse CI): de voorspelde Doppler komt met de waarnemingen overeen tot 12,5 mHz (drempel 30 mHz, gehaald); de geregistreerde baanfit faalde op de gescoorde boog en leverde geen baan op (bevinding vastgepind). De rij blijft MODELLED.

  • Lezer voor DSN Orbit Data File (0,36, WP-14, CAP-30 deel): odf::parse_odf leest TRK-2-18-ODF's. Op een echte ODF van de Mars Reconnaissance Orbiter (NASA PDS, meegeleverd) komt de lezer overeen met het aantal records, de groepsposities, stations en tijden van het PDS-label, en zijn alle datatypen bekend. De tabel aan het einde van het bestand in het label is één rij korter dan het bestand, een inconsistentie van het label die als bevinding is vastgelegd. MODELLED. Baanbepaling op deze data is nog niet gedaan.

  • TWSTFT-budget en stabiliteit van tijdoverdracht: de soort time-transfer-budget (0,36, WP-14, FUT-19).

    • Tweewegvergelijking: twstft_budget lost haar op voor T_A − T_B met apparatuurvertragingen van de stations, de Ku-band-ionosferische op/neer-asymmetrie, het verschil in transponder-vertraging en de Sagnac-termen, en herstelt het voorwaartse model tot 1e-15 s.
    • Onzekerheidsbudget: kwadratisch gecombineerd, met de link-TDEV als type-A-term.
    • Linkruis: de tweewegreeks krijgt een flicker-faseruisvloer, een dagelijkse niet-reciprociteit en een constant reciprociteitsresidu. Het pakket timetransfer met witte jitter is ongewijzigd.
    • Echte reeks: de stabiliteit van aangeleverde reeksen uit BIPM Circular T, MJD,ns-CSV of IGS-stationsklokken.

    MODELLED. Nieuw meegeleverd scenario time-transfer-budget. De PPP-tijdoplossing is afzonderlijk VALIDATED tegen de IGS-stationsklok op de GNSS-tak met echte data.

  • Intredeverhitting, EO-radiometrie en opstijgverliezen (0,36, WP-14, CAP-28): drie nieuwe soorten.

    • entry-heating: een puntmassa-intrede met 3 vrijheidsgraden over een roterende Aarde of Mars met stuwpuntverhitting volgens Sutton-Graves.
    • eo-radiometry: SNR van de imager, MTF bij Nyquist, relatieve randrespons en GIQE 4 NIIRS.
    • ascent-losses: een opstijging met meerdere trappen en zwaartekrachtbocht, met verliezen door zwaartekracht, drag, sturing en tegendruk, gecontroleerd met de exacte identiteit ideale dv minus verliezen.

    De piekvertraging van de intrede is gecontroleerd tegen de gepubliceerde nominale waarde van Stardust onder een vooraf vastgelegde drempel: 35,44 g tegen 33,4 g (+6,1 %, drempel 10 %). Die rij is VALIDATED. Verhitting, radiometrie en opstijging zijn MODELLED. Ook nieuw: reentry::us76_pressure, meegeleverde scenario's entry-heating-stardust, eo-radiometry en ascent-losses, en docs/ENTRY-EO-ASCENT.md.

  • Standregeling met reactiewielen: de soort aocs (0,36, WP-14, CAP-21). Een inertiaal richtende slew van een star lichaam met drie of meer gebalanceerde reactiewielen onder MRP-terugkoppeling, met wieldraaimomenten van minimale norm, begrensd tot de limiet van elke motor (aocs). Het kan de lus ook sluiten op een multiplicatieve EKF vanuit een gesimuleerde gyro en sterrenzoeker (aocs_mekf). De lus met ware toestand is vergeleken met Basilisk 2.9.1 op drie gevallen die vastgelegd waren voordat de code bestond (drie orthogonale wielen, een vierwielige piramide, een verzadigend geval). Elke MRP-component, lichaamssnelheid, wielsnelheid en motordraaimoment kwam bij elke sample overeen, met als slechtste 2.4e-14 in sigma en 2.9e-11 rad/s in wielsnelheid. Deze rij is VALIDATED; de MEKF is MODELLED (NEES-consistentie). Nieuwe meegeleverde scenario's aocs-slew en aocs-slew-mekf, en docs/AOCS.md.

  • Planning van grondcontacten en DVB-S2 ACM (0,36, WP-14, CAP-22/23): twee nieuwe scenariosoorten. acm-link geeft, voor één satelliet boven één station, de Es/N0 van elke passage en de DVB-S2-MODCOD die daarlangs wordt gekozen (drempels uit ETSI EN 302 307-1 Table 13 plus een marge). Het geeft ook het datavolume dat ACM verplaatst ten opzichte van de basislijn met constante codering. contact-schedule doet hetzelfde voor meerdere satellieten boven meerdere stations en bouwt een conflictvrij contactplan (antenne-omlooptijd, één station per satelliet, prioriteitsgewogen aflevering begrensd door elke backlog). Het rapporteert een greedy plan met marginale waarde, een basislijn op volgorde van binnenkomst en het exacte optimum op kleine verzamelingen, met de optimaliteitskloof van het greedy plan. Toegangsvensters komen van de VALIDATED voorspeller van schijnbare passages. Nieuwe meegeleverde scenario's acm-link en contact-schedule (illustratieve invoer) en docs/CONTACT-SCHEDULING.md. MODELLED (twee nieuwe registerrijen).

  • Starlink-Doppler-positiebepaling tegen een gepubliceerd experiment (0,36, WP-14, CAP-11 deel, MODELLED). Dit is een vooraf vastgelegde proxyvergelijking van de Dopplermodus van leo-pvt met de voorinstelling starlink-sop tegen de percentielen van dataset 3 uit "Unveiling Starlink for PNT" (NAVIGATION 72(1), 2025, doi:10.33012/navi.685). Het model gebruikte 3 satellieten (een masker van 47 graad gekozen volgens een vaste regel), geen hoogtehulp en een Doppler-sigma van 30 Hz, over 200 seeds. De 3D-fout op het 90e percentiel is 92,2 m bij 20 s en 870 m bij 8 s, tegen de gepubliceerde 2 m en 10 m, dus beide drempels van factor twee zijn NOT MET. Het model is pessimistisch, niet optimistisch zoals voorspeld: drie vaste satellieten geven veel minder geometrische diversiteit dan de 63 satellieten van het experiment over 10 minuten met kanaalwisseling elke 15 s. Beide missers worden geassereerd (tests/starlink_doppler_published_proxy.rs).

  • Optimaliseerder voor impulsieve transfers op DE440 (0,36, WP-14, CAP-20c/d): maneuver::optimise_transfer_kernel vindt de vertrek- en aankomstdata van een ballistische transfer met twee impulsen en één omloop die de vertrek-C3 of de aankomst-V-infinity minimaliseren binnen Type I of Type II. Het zoekt op een raster van 2 dagen en verfijnt daarna met 2D-Nelder-Mead, op heliocentrische toestanden uit de DE440-kernel; het bouwt voort op porkchop_kernel. De vergelijking is vooraf vastgelegd (bf0439e8) tegen een onafhankelijke optimaliseerder met SPICE + pykep 3.0.1 + SciPy 1.18.1 op de Aarde-naar-Mars-gelegenheid van 2026: alle vier de optimalisaties komen overeen tot 8.7e-13 relatief, met data binnen 1e-5 dag (VALIDATED, nieuwe registerrij). Als secundaire gepubliceerde referentie komt NASA/TM-2010-216764 (het Aarde-naar-Mars-handboek 2026-2045) overeen voor de minimale C3 van Type II (9,182 tegen 9,144) en de minimale aankomst-V-infinity van Type II (2,564 tegen 2,565). De minimale C3 van Type I komt niet overeen: 10,535 tegen 11,11 (-5.18 %), waar de referentie uit de bibliotheek met Kshana overeenkomt. Die misser is vastgelegd en geassereerd.

  • Studie naar een maanreferentiestation (0,36, aangezet door gepubliceerd materiaal over een geplande referentiestation aan de maanzuidpool; bronnen in docs/LUNAR-REFERENCE-STATION.md): de soort lunar-station-coverage, een Monte Carlo-sweep van het maan-differentieel-PNT-model over een gebruikersraster rond de zuidpool en een dag aan epochs, die per punt en over de regio het percentiel van de gecorrigeerde en ongecorrigeerde fout geeft, beschikbaarheid met redenen, dekking tegen een vermelde drempel, beschermingsniveaus, de dekkingsstraal per azimut en het budget van de correctielink. Het reduceert exact tot lunar-differential-pnt bij één punt, één epoch en één trial; de rekenkunde is opnieuw berekend met numpy onder een vooraf vastgelegde drempel (posities en percentielen gehaald; de stationscorrecties misten de hunne door afronding in dubbele precisie, vastgelegd). MODELLED; registerrij "Lunar reference-station coverage and accuracy map". Niet verbonden aan of onderschreven door enig agentschap; geen uitspraak over de prestaties van enig echt systeem.

  • Vooraf vastgelegde voorspelling: dekking van een maanreferentiestation (geen validatie; MODELLED). docs/predictions/lunar-reference-station.md bevriest, bij commit c05dac1d, de resultaten van lunar-station-coverage onder de openbaar vermelde aannemingen, met SHA-256-hashes van de invoer en de resultaten en een nu vastgelegd scoringsprotocol (factor 2 voor nauwkeurigheden en beschermingsniveaus, 10 procentpunten voor beschikbaarheid en dekking; een gewijzigde aanname krijgt een nieuwe gedateerde voorspelling, nooit een bewerking; een misser wordt even nadrukkelijk gepubliceerd als een treffer). Elk cijfer wordt gedomineerd door de niet-gepubliceerde elementenset van de constellatie van vier satellieten, die ILLUSTRATIVE is en dat ook zegt. tests/prediction_frozen.rs bewaakt haar; docs/VALIDATION.md krijgt een sectie "Pre-registered predictions". Geen registerrij.

  • Uitbreidingen voor het maanreferentiestation (0,36; beperkingen 2 en 3 van de stationsstudie en de oplossingsstijl van de bronnen), elk op aanvraag bij lunar-station-coverage en standaard afwezig, zodat elk bestaand document, de bevroren voorspelling inbegrepen, ongewijzigd is: [receiver] (multipath a + b exp(-el / el0) bij de gebruiker en het station, dat van het station optioneel Gauss-Markov over epochs, DLL-coderuis uit C/N0, interkanaalbiases; waarden ILLUSTRATIVE op de Maan); orbit_err_growth_m_per_s (lineaire groei van de fout in de uitgezonden baan over de latentie van de correctie, ILLUSTRATIVE); [solution] (hoogtebeperking, een minimum van drie satellieten daarmee, een venster voor een stilstaande gebruiker over epochs). Twee addenda bij de vergelijking met gepubliceerde beweringen, elk vooraf vastgelegd en alleen vóór zijn run, staan naast de onbewerkte vastgelegde run: K5 met groei faalt bij elke snelheid; met de oplossingsstijl van de bronnen falen K1 tot K5 en slaagt K6 (1 van 6), waarbij de gecorrigeerde p95 3D-fout van R300 daalt van 280,6 m naar 2,11 m. MODELLED; drie registerrijen.

  • Maskers voor de maanterreinhorizon (0,36; de eerste beperking van de studie naar het maanreferentiestation): een optionele sectie [terrain] bij lunar-station-coverage (het station en elk gebruikerspunt) en moonlight-service-volume (elk rasterpunt) geeft elke locatie een van het azimut afhankelijke horizon in het skylinetabelformaat van 0,36, uit een vermeld profiel met zijn bron (station_horizon, user_horizon) en/of een raymarch over een polaire DEM (dem_path) langs grootcirkels van de maanbol met exacte kromming. Levert een uitsnede van 0,98 MB van de DEM van de zuidpool LRO LOLA LDEM_75S_240M in het publieke domein mee, geresampled met blokgemiddelden van 5 x 5 naar 1200 m (data/lunar-dem/, met zijn NOTICE, SHA-256 en scripts/make_lola_south_polar_crop.py), en het scenario scenarios/lunar-station-coverage-terrain.toml dat alleen in de repository staat. Gecontroleerd tegen horizonten in gesloten vorm (kale bol, krater in een plateau, gerasterde kegel); MODELLED, registerrij "Lunar terrain horizon masks from a stated profile or a polar DEM". Zonder de sectie is elk document, het eenhedenblok inbegrepen, byte-identiek.

  • Geometriebewuste vertrouwensscore (geometrieontwerpnotitie van 0,36, sectie 4). Elke epoch van receiver-trust, statisch of vaartuig, batch of live, draagt zijn satellietgeometrie: good, degraded (redenen few-satellites, high-pdop, high-hdop en informatief sky-blocked) of unknown waar de log geen satellietgeometrie geeft, met HDOP, PDOP, VDOP en de gebruikte satellieten. Ze wordt afgeleid uit de elevaties en azimuts die de ontvanger rapporteert (NMEA GSV, UBX NAV-SAT) via de bestaande kernel orbit::dop, of overgenomen uit NMEA GSA. Elke epoch draagt ook een label, good, fair of poor, altijd gerapporteerd en nooit gescoord, en een notitie met de HDOP, PDOP, VDOP, het aantal satellieten en het signaalverlies in woorden. De score van een vaartuig krijgt een monitor geometry die niets aftrekt tenzij de geometrie slecht is (HDOP boven 4, PDOP boven 6 of minder dan 5 gebruikte satellieten), en dan oploopt tot een plafond van 15 punten; geometrie alleen bereikt hooguit de band degraded, nooit die van de niet-vertrouwde ontvanger (geen alarm). Elke aftrek krijgt een klasse, geometry, environment of inconsistency, zodat een slechte hemel niet als aanval wordt gelezen. loss-of-lock is geometry wanneer de verloren satellieten bij hun laatste rapport allemaal onder 15 graden stonden; een aftrek voor slechte geometrie is inconsistency wanneer de door de ontvanger opgegeven HDOP met meer dan max(1,0, 25 % van de afgeleide HDOP) afwijkt van zijn opgegeven hemel, zodat een vervalste slechte hemel het label niet kan kopen. Een nieuwe tabel [geometry] geeft elke drempel met zijn herkomst (HDOP 4, PDOP 6, ten minste 5 gebruikt, sigma_UERE 1,5 m, een HDOP-tolerantie van max(1,0, 25 % van de afgeleide HDOP) met de 25 % als representatieve keuze voor ontvangers met klokken per constellatie of subsetoplossingen, 15 graden; de cijfers van IEC 61108-1 en GPS SPS zoals geciteerd, te controleren tegen de tekst van de normen). Totaal signaalverlies wordt niet als hemel gelabeld: wanneer satellieten in zicht niet worden getrackt en de DOP van de satellieten in zicht goed is (en de niet-getrackte niet tot één helft van de horizon beperkt zijn), draagt de epoch signal_loss en is de geometrieaftrek environment. Een opgegeven HDOP of PDOP van 99 of meer, GGA-kwaliteit 0 en GSA-modus 1 worden gelezen als geen positiebepaling, niet als DOP. Het plafond (cap_points 15), het einde van de helling (full_ratio 1,5) en de ondergrens (floor, standaard de degraded_min van de score) staan in [geometry], net als de goede niveaus van het label (HDOP 2, PDOP 3, 6 satellieten, representatief); het geldende plafond is min(cap_points, 100 - floor), zodat een tabel [score] die degraded_min verhoogt (ook een van 0,35) het plafond verlaagt in plaats van te worden geweigerd, en een ondergrens onder degraded_min wordt geweigerd. MODELLED; adviserende software, geen typegoedgekeurde navigatieapparatuur (IEC 61108, IEC 61162): de gezagvoerder of exploitant blijft verantwoordelijk voor de navigatie van het vaartuig.

  • De geometrie bereikt elk oppervlak: de resultaat-JSON (epochs[].geometry, class bij elke aftrek, geometry_model, geometry_summary), de live JSON-regels (schema 1,3), de Python- en WebAssembly-functies receiver_trust, assess_vessel_log en receiver_trust_replay, de MCP-tools assess_*, bewijspakketten (epochs.json, config.json, een geometriebaan op de samenvattingspagina) en trust-telemetry (Prometheus kshana_trust_geometry* en een label class op kshana_trust_reason_active, OTLP kshana.geometry.*, CEF-aangepaste velden cs6 (geometriestatus en klassen), cfp3 (HDOP) en cfp4 (PDOP), gecontroleerd tegen beide CEF-referentieparsers, en LEEF geoStatus, geoHdop, geoClass). Het geometrielabel wordt ook geëxporteerd, achter elke eerdere reeks en elk eerder veld toegevoegd en alleen voor invoer die het draagt: Prometheus kshana_trust_geometry_label{label} en kshana_trust_geometry_vdop, OTLP kshana.geometry.label en kshana.geometry.vdop, LEEF geoLabel, geoPdop, geoVdop, geoUsed, en bij CEF een derde veld cs6 (het label) en cn1 (gebruikte satellieten); de VDOP staat niet in CEF (de aangepaste velden met drijvende komma zijn bezet). Beide CEF-referentieparsers lezen de labelgevallen terug zoals geschreven (amendement 5: 176 regels, 172 geparseerd door pycef, 176 door Logstash). Een opgegeven HDOP die de opgegeven hemel niet verklaart wordt bij elke epoch gemarkeerd en geteld (geometry_summary.hdop_mismatch, een regel op de samenvattingspagina van het bewijs), en alleen gescoord wanneer de geometrie slecht is. Signaalverlies wordt apart geëxporteerd, omdat de geometriestatus degraded blijft zolang het duurt: Prometheus kshana_trust_geometry_signal_loss, OTLP kshana.geometry.signal_loss, LEEF geoSignalLoss=1; in CEF verschijnt het als de klasse environment in cs6.

  • orbit::dop_cofactor: de covariantiefactor (HᵀH)⁻¹ achter orbit::dop, eruit afgesplitst met dezelfde rekenkunde.

  • Registerrij "Position error from geometry: RMS error = sigma_UERE x DOP" (MODELLED, interne consistentie): een geseede Monte Carlo van de kleinstekwadratenpositiebepaling van de engine op de 8 met gnss_lib_py overeenkomende DOP-geometrieën tegen de covariantiefactor van de kernel voor DOP die aan een onafhankelijke referentie is getoetst, met tolerantiegrenzen die vóór de eerste run zijn vastgelegd en twee negatieve controles die zoals vereist falen; daarnaast een eerdere controle op vier met de hand gekozen hemels met chikwadraatbetrouwbaarheidsintervallen, gerapporteerd als uitgevoerd vóór de preregistratie.

  • Van het azimut afhankelijke skylinemaskers (src/skyline.rs, docs/SKYLINE.md, onderdeel 1 van de ontwerpnotitie): een elevatiegrens die van het azimut afhangt, het puntsgewijze maximum van tabellen (elk afzonderlijk geïnterpoleerd, omgeslagen bij 360°), een straatcanyon in gesloten vorm (met optionele open uiteinden), scherprandige sectoren en een terreinprofiel met de kromming van de Aarde; de effectieve grens is max(mask_deg, skyline). Vier REPRESENTATIVE voorinstellingen met vermelde herkomst (city-street, harbour-approach, fjord, container-terminal), veld voor veld te overschrijven. Een optionele sectie [skyline] in gnss-sim, jamming, leo-pvt (elke modus, de polaire sweep inbegrepen), leo-pass- en nmea-scenario-trainingsbestanden, en in orbit en integrity via een nieuwe gebruiker op een grondlocatie, user_site = { lat_deg, lon_deg, height_m } (geodetische kijkhoeken op de roterende Aarde, met de geodetische omhoogrichting voor de horizontale en verticale splitsing van ARAIM; elke sample is één absoluut ogenblik, epoch + t, waartoe elementensets, uitgezonden efemeriden en SP3-bestanden vanaf hun eigen epochs worden doorgevoerd, gedateerd vanaf de nieuwste satellietepoch wanneer geen epoch is opgegeven; een in een baan draaiende user weigert een skyline). Resultaten krijgen skyline { source, open_fraction, provenance } en per sample masked_by_skyline. Zonder de sectie is elk scenario byte-identiek aan 0.35.0, gecontroleerd tegen digests van de releasecommit. Zes meegeleverde voorbeelden: orbit-urban-canyon-skyline, integrity-harbour-approach, gnss-sim-container-terminal-skyline, jamming-harbour-approach-skyline, leo-pvt-fjord-skyline en de campagne leo-vertical-autonomous-vehicle-skyline (de canyon voor het autonome voertuig als vlakke grens en als straat; de bestaande campagne is ongewijzigd). MODELLED.

  • Functies voor hemelgeometrie (src/geometry.rs, onderdeel 2 van de ontwerpnotitie): sky_geometry (zichtbare en gemaskeerde satellieten vanaf een locatie, een tijdstip en constellatievoorinstellingen, two-line element sets (tle, hoogstens 4 MiB, door de SGP4 van de engine gepropageerd naar een UTC-epoch) of gegeven satellieten; sky_source en sky_statement zeggen of de hemel representatief is of de hemel die de elementensets op die epoch geven, geen meting; tle_skipped noemt elke ongebruikte regel met zijn reden; invoerlimieten van 2000 satellieten boven de horizon, gecontroleerd voordat een systeemtabel wordt gebouwd, en 16 ontvangerklokken; de vijf DOP's; de ENU-cofactor en -covariantie met één klok per systeem of één gemeenschappelijke; de horizontale foutellips op één sigma en op een opgegeven betrouwbaarheid), sky_monte_carlo (geseede kleinstekwadratenfouten, hoogstens 5000), skyline_presets, skyline_profile en skyplot_svg. orbit::dop_cov maakt de covariantie achter orbit::dop toegankelijk, dat nu haar reductie is (de scalars die aan een onafhankelijke referentie zijn getoetst blijven ongewijzigd). Oppervlakken: kshana sky en kshana skyline, Python- en WASM-functies met dezelfde namen, en de MCP-tool sky_geometry (40 tools), en het notebook notebooks/geometry.ipynb (met zijn spiegel .md; uitgevoerd door tests/python/test_notebooks.py). Elk resultaat draagt het label MODELLED, de verklaring over het foutmodel en het advies.

  • Register: vijf rijen voor skyline en hemelgeometrie. VALIDATED, elk in een vergelijking die is vastgelegd voordat de onafhankelijke referentie draaide: Azimuth-dependent skyline mask: visible set, azimuth and elevation, and DOP under the mask tegen Orekit 12,2 (TopocentricFrame, ElevationMask) en gnss_lib_py 1.0.4 (get_dop), grootste verschillen in kijkhoek en masker 1.1e-12° tegen 1e-9°, identieke zichtbare verzamelingen, DOP 3.3e-13 relatief (xval/orekit-skyline/); Horizontal error ellipse and per-system cofactor from the geometry covariance tegen numpy linalg.inv en linalg.eigh (standaard P2), 270 gevallen, assen 5.1e-13 relatief (xval/numpy-ellipse/). MODELLED: de reducties voor canyon, sector en terrein; de voorinstellingen; de samenstelling van de hemelgeometrie (voorinstellingshemel, Monte Carlo-wolk).

  • Met de rijen voor geometrievertrouwen, skyline en het maanreferentiestation heeft het register 274 rijen: 134 aan een onafhankelijke referentie getoetst, 136 uit een model berekend, 4 van de partner.

  • Maanreferentiestation: tijdlaboratorium van het station (MODELLED). Een optioneel blok [time_lab] bij lunar-time-budget (src/lunar_time_lab.rs). Het modelleert een stationsklok (standaard de miniRAFS-klasse, elke genoemde klasse, of een apparaatkaart die is gefit op opgegeven stabiliteitspunten) die op LTC is gestuurd en daarna vrij loopt of elke N seconden opnieuw wordt bijgestuurd. Het geeft de tijdfoutcurve x(t), de tijd tot 1, 10 en 100 ns (bisectie naast de gesloten vorm) en de dominante term per horizon, alles met eenheden. Het stuurresidu is ILLUSTRATIVE. De LTC-snelheid wordt niet opnieuw afgeleid en houdt haar eigen VALIDATED rij. Het doel op nanosecondeniveau uit het openbare Lunar PNT-materiaal van ICG WG-B (juni 2024) wordt aangehaald als bronverklaring, niet als bewering. De klokvolgorde optisch < PHM < RAFS < miniRAFS geldt van 1 s tot 7e5 s, en de test pint het kruispunt van de curven van PHM en RAFS vast bij 7.5e5 s. Dat kruispunt is een eigenschap van de klokmodellen met één ruistype (zuivere flicker-FM tegen zuivere witte FM), geen fysisch resultaat. Zonder het blok zijn het rapport, zijn tabel en zijn samenvatting ongewijzigd. Voorbeeld: scenarios/lunar-station-time-lab.toml. Voegt één registerrij toe, gelabeld MODELLED.

  • Maanreferentiestation: geodesie van het station (MODELLED). Optionele invoer extra_reflectors en extra_beacons bij lunar-llr-datum voegt een blok station_geodesy toe. De datuminformatie met vijf arrays uit de gearchiveerde laserafstandsmeting wordt gecombineerd met wat een toegevoegde retroreflector en een toegevoegde VLBI-baken op opgegeven locaties zouden bijdragen. De reflector wordt gemeten op de gearchiveerde epochs die hij kan zien, met hun gearchiveerde gewichten. Het baken gebruikt het netwerk en de planning van lunar-frame-campaign, met vaste stations. Het blok geeft elke Helmert-1-sigma ervoor en erna, en hun verhouding. Dit zijn Cramér-Rao-grenzen voor een gereduceerde parameterset, op een ILLUSTRATIVE planning en locatie. Afwezige of lege invoer laat het rapport byte-identiek. Voorbeelden: scenarios/lunar-station-geodesy-baseline.toml en -with-station.toml. Voegt één registerrij toe, gelabeld MODELLED.

  • Maanreferentiestation: vergelijking met gepubliceerde beweringen (MODELLED). Elke numerieke bewering in vijf openbare bronnen is opgesomd met haar exacte formulering, pagina en vermelde aannames, en ingedeeld als vergelijkbaar, gedeeltelijk vergelijkbaar of niet vergelijkbaar (tests/fixtures/lunar_station_published/CLAIMS.md; bronnen met URL, ophaaldatum, SHA-256 en licentie in tests/fixtures/lunar_station/SOURCES.md). De gedeeltelijk vergelijkbare beweringen zijn gescoord onder zes eenzijdige drempels die vóór de run zijn vastgelegd (PREREGISTRATION.md, revisie 2, 05bf9a19): 1 van 6 beweringen binnen de vooraf vastgelegde drempel (vooraf vastgelegd 05bf9a19). De dekking is 0,00 tegen >= 0,95 op beide zuidpoolcirkels, en de gecorrigeerde p95 is 280,6 m tegen <= 1,5 m. De oorzaak zijn de baanelementen van de satellieten, die geen enkele bron publiceert: op de ILLUSTRATIVE elementen in de boom zijn vier satellieten in 8 % van de epochs in gezamenlijk zicht, bij bijna-singuliere geometrie. De run reproduceert de beweringen op die elementen niet en is geen bewijs dat de beweringen onjuist zijn. Vastgepind in tests/lunar_station_published_oracle.rs. Eén registerrij, gelabeld MODELLED met de bevinding.

  • Maanreferentiestation: gereedheid van klokbestandsdata. realdata::clk::rinex_clock_series vermeldt nu het tijdsysteem van zijn epochs. Dat is de waarde van TIME SYSTEM ID, of, wanneer die niet is opgegeven, de standaardwaarde van het satellietsysteem van de header. Het resultaat zegt ook of het systeem is opgegeven. De functie weigert een onbekend tijdsysteem (bijvoorbeeld een maantijdschaal), een bestand met gemengde systemen zonder opgave, en bestanden die elkaar tegenspreken, in plaats van ze als GPS-tijd te lezen. Ze levert een synthetische fixture van een stationsklok mee. Er is geen formaat voor een correctiebestand gedefinieerd, omdat er geen openbaar formaat bestaat.

Gewijzigd#

  • De moduledocs van fusion::ukf, fusion::tightly_coupled en fusion::gnss_ins_ekf noemen de UKF-navigator met 17 toestanden, de strakke koppeling met volledige INS en de expliciete klokstoestand niet langer toekomstig werk; ze verwijzen naar hybrid_ukf, tightly_coupled17 en carrier_tc.

  • RINEX 4 wordt niet langer geweigerd (0,36, WP-07): een RINEX-4-navigatiebestand werd vroeger bewust afgewezen; het wordt nu gelezen (zie Toegevoegd). Bij observatiebestanden van versie 4 en later worden headerlabels alleen in kolommen 61-80 vergeleken, zodat de nieuwe vrije-tekstrecords niet voor labels kunnen doorgaan.

  • ionex::parse_ionex leest echte IONEX-bestanden (0,36, WP-07): een volledig record van 16 waarden vult kolommen 61-80, die de lezer voor een label hield, zodat hij bij elk echt IONEX-bestand None teruggaf. Hij leest nu een record waarvan het labelveld numeriek is als waarden. Geen meegeleverde uitvoer gebruikte het.

  • Ontvangen vermogens van Galileo E1 en E5a volgens OS SIS ICD Issue 2,1 (revisie, 2026-10-14). De spectrumbanden galileo-e1 en galileo-e5a, en de GNSS-slachtoffers met LEO-signaal die hun vermogen daarvan nemen, gebruiken nu de minimale ontvangen vermogens uit Table 12 van de Galileo OS SIS ICD Issue 2,1: −157,25 dBW (was −157,0) en −155,25 dBW (was −155,0).

    • Negen scenarioresultaten verschuiven: de spectrumvoorbeelden, de spectrumcampagne, drie LEO-veerkrachtverticals en drie LEO-signaalontwerpen. De effectieve C/N0 verschuift −0,25 dB en J/S +0,25 dB op deze banden.
    • Elke verschoven waarde (1766, oud → nieuw) staat in docs/revisions/CAP12-galileo-icd21-power-changes.md en de bijbehorende CSV, met de doctabellen die zijn verschoven. Geen registerrij verandert van status.
    • Tweede deel, dezelfde dag: de LEO-signaalslachtoffers galileo-e5b (−155,0 → −155,25 dBW, Table 12 E5b) en galileo-e5-altboc (−152,0 → −152,24 dBW). De ICD heeft geen rij voor de volledige E5-band, dus de AltBOC-waarde is de vermogenssom van de totalen van E5a en E5b uit Table 12, opgebouwd zoals de oude waarde was. Drie resultaten van LEO-signaalontwerpen verschuiven (64 waarden: deze ontvangen vermogens en de C/N0-degradatie van LEO naar GNSS bij de twee slachtoffers), opgesomd in dezelfde revisie (§5) en CSV. Niets anders verschuift.
  • Correctie van het atmosferische S2-getij (tides::atmospheric_tide). De S2-luchtdrukharmonischen van Ray (2001) zijn coëfficiënten van ongenormaliseerde P_nm met cosinusfasevertragingen; ze werden gebruikt als volledig genormaliseerd en met de vertraging als de sinusvoorsprong van IERS. Ze gaan nu gedeeld door N_nm met ε = 90° − ψ erin; de nieuwe tides::s2_air_waves reproduceert model A2 van GFZ STR06/01 Table 5 voor alle 21 golven (slechtst 0,0005 cm, 0,05°; VALIDATED). Alleen uitvoer met getijden aan verschuift: de Galileo-CI-fit 0,132 → 0,133 m, Swarm-A-componenten met 1–2 mm (vooraf vastgelegd in xval/s2-air-tide-fix/).

  • Alleen docs: propagator::solve_kepler_checked, orbit::solve_kepler en ephem::solve_kepler zijn gedocumenteerd als legacy-oplossers, numeriek ongewijzigd, met een verwijzing naar kepler::solve_kepler_markley.

  • Status van D9 ronde 3 (utck_bound). BIPM Circular T 465 verscheen op 2026-10-12. De vooraf vastgelegde prospectieve score is nog niet gedraaid: uitgave 465 bevat ongeveer 285 testwaarden, en de stopregel vereist er 1000, dus ongeveer de uitgaven 465–468. De run heeft ook de gearchiveerde bestanden per laboratorium van 2026-09-30 nodig, omdat BIPM er inmiddels 87 van de 113 heeft herschreven. De registerrij en de testheader zeggen dat; de test, zijn drempels en zijn splitsing zijn ongewijzigd.

  • Docs-waarheidsronde (0,36). Roadmap, mogelijkhedenrijen, statusregels van ontwerpdocs en modulecommentaar in lijn gebracht met de code; geen uitvoer verandert. Onderdelen die al gebouwd zijn maar nog als open stonden, zijn nu als gedaan gemarkeerd: de ITU-T-maskercontroles, het holdover-scenario van 24 uur en de inname van klok-logs (telecom-tijdsynchronisatie), de quickstarts voor de eerste minuut, Lense–Thirring en de kruiscontrole van de Orekit-propagator, de precieze ITRF-GCRS-keten, golden- en platformoverschrijdende hashes, herkomst, ARAIM met meerdere fouten (ADD v4.2), FDE met één satelliet, de CRPA-bibliotheek, de grens voor CAI-franje-ambiguïteit, de dimensionering van streets-of-coverage en de 3D-baanweergave, de dynamica van de stand van een star lichaam, de OMM-schrijver en NAIF-kernellezer, de maanlibratie van DE440, de zin over de betekenis van de run in de playground, PositioningFom, de strak gekoppelde navigator met 17 toestanden en de soort gravity-map. De rijen vermelden ook precies wat nog open is (bijvoorbeeld JD in twee delen in orbit::Propagator, de lezer src/ionex.rs tegen een echt product en uitsluiting van meerdere satellieten in raim). Het ontbrekende docs/design/evidence/cn0-m2m4/RESULTS.md is geschreven uit een verse run van zijn tests (M1–M4 slagen), en het IQ-validatieconcept voor partners heeft actuele registertellingen.

  • De geheugencodes van Galileo E1 worden niet langer meegeleverd. data/galileo-os-sis-icd/C7_E1B.txt en C8_E1C.txt (ICD Annex C.7/C.8) zijn uit de repository en de pakketten verwijderd. De voorwaarden van de ICD (geciteerd in LICENSING.md) staan een gebruiker toe de codes op te slaan met bronvermelding en in een product te gebruiken, maar staan herdistributie alleen toe voor niet-commerciële doeleinden, en Kshana wordt ook onder een commerciële licentie aangeboden. galileo::e1b_table / e1c_table geven nu een Result terug en lezen het eigen exemplaar van de gebruiker uit KSHANA_GALILEO_E1B / KSHANA_GALILEO_E1C, of, in een source checkout, uit data/galileo-os-sis-icd/, waar het nieuwe scripts/fetch_galileo_e1_codes.sh ze uit de ICD-PDF haalt (met hashcontrole). galileo::E1B_TABLE_TEXT / E1C_TABLE_TEXT zijn verwijderd. Zonder de tabellen geven de Galileo E1-signalen (galileo-e1b, galileo-e1c) een fout terug die uitlegt hoe ze moeten worden aangeleverd, en slaan de E1-tests zichzelf over met een melding. Met de tabellen aanwezig is elke E1-uitvoer ongewijzigd. Geen enkel scenario, golden of spectrumuitvoer gebruikt de codetabellen. De testfixtures van E5a Annex C.3/C.4 (de LFSR-referentie in tests/iq_signals.rs) worden op dezelfde manier behandeld: opgehaald met hetzelfde script, door git genegeerd, en de test slaat zichzelf over zonder ze.

  • Draagbare wiskunde overal (0,36, STUDIO-15): elke transcendente f64-functie in de bibliotheek, en de normale, gamma- en exponentiële samplers van rand_distr, rekenen nu via de pure-Rust-bibliotheek libm (portable_math::PortableFloat, portable_distr), zodat een native build en de WebAssembly-build byte-identieke resultaat-JSON geven voor alle 141 meegeleverde scenario's en voor de korte IQ-run. De prijs is dat de laatste bits van resultaten die met de wiskundebibliotheek van de host werden berekend zijn verschoven: 98 van de 141 meegeleverde scenario's zijn veranderd, 43 niet; 5 veranderden met meer dan 1e-3 in hun grootste veld, en de rest met minder. Elke verschoven waarde staat oud -> nieuw in docs/revisions/STUDIO15-portable-math-rebaseline.md (met een CSV van alle 136.127 verschoven getallen); geen drempel, tolerantie of grenswaarde is veranderd. Gepubliceerde getallen die zijn veranderd: beschikbaarheid van europa-surface-pnt met het bereik van de Aarde 0,719 -> 0,713 en RMS-fout 86,147 -> 86,499 m (één epoch op de rand van de beschikbaarheid wordt nu overal op dezelfde manier beslist; hij gaf 0,725 / 85,800 m op macOS arm64); stationsfout van lunar-joint-od-clock 3,541350 -> 3,536885 m met VLBI en 2183,558 -> 2184,021 m zonder; paper/crossover/inertial.json, acht waarden van vibration_psd met 3 eenheden in de laatste plaats (erratum in het technisch rapport); het vrijgegeven document cislunar-observability in grootheden op de afrondingsvloer (acht waarden voorbij zes significante cijfers, tot 6.8e-5 relatief; geen rang of drempel verschoof). De vastgepinde hashes van de byte-identiteitsbewakers (skyline_scenarios, geometry_corpus_identity, geometry_trust_no_change) zijn opnieuw gebaseerd op een benoemde basislijn "0,36 portable", waarbij de waarden van 0.35.0 als historisch record worden bewaard; de bevroren voorspelling voor het maanreferentiestation is onaangeroerd en haar draagbare herrun is ernaast opgeslagen (docs/predictions/*.portable-0.36.json). tests/lunar_joint_od_numpy_oracle.rs (de rij voor gezamenlijke maan-OD die aan een onafhankelijke referentie is getoetst): fixtures opnieuw geëxporteerd en de numpy-vergelijking opnieuw gedraaid met numpy 2.4.6, de geregistreerde versie, waarbij script en drempel ongewijzigd zijn; alle zes netwerken slagen (docs/revisions/STUDIO15-lunar-joint-od-oracle-rerecord.md). Het werk van batch 2-3 dat na STUDIO-15 is samengevoegd, gebruikt ook draagbare wiskunde (457 aanroeppunten in 62 bestanden); wat dat heeft verschoven staat in docs/revisions/STUDIO15-batch4-rebaseline.md: 12 meegeleverde scenario's (grootste relatieve verandering 5.2e-8, geen afgedrukt cijfer verschuift), 28 bewakingsrijen voor skylines opnieuw goedgekeurd, de M2M4-digest van iq_campaign, de legacy truth-hashes van gnss-ins, de datumsigma van het niet-waargenomen baken (632,3769 -> 632,3772 m), en twee vastgelegde bevindingen (DRO-sluitingen van CR3BP; CRPA A3, 194 van 456 links). De exacte edf van Greenhall behoudt zijn drempel waarop aan een onafhankelijke referentie is getoetst met een double-double-logaritme in zijn kernel (docs/revisions/STUDIO15-greenhall-edf-portable.md), en de gps-sdr-sim-test-bench-referentie is opnieuw gedraaid op de verschoven NMEA-exports, waarbij elke drempel standhoudt (docs/revisions/STUDIO15-testbench-gpssdrsim-rerun.md).

  • README: de rij voor de maansuite vermeldt het bewijsniveau van elk onderdeel (er stond dat alle MODELLED waren).

  • realdata::clk::rinex_clock_series geeft RinexClockSeries terug (reeks, griddinglog, tijdsysteem, of het is opgegeven, recordtype) in plaats van een tuple (PhaseSeries, GriddingLog). Het valt nu terug van satellietrecords (AS) op ontvanger-/stationsrecords (AR) met de gevraagde naam.

  • Geen score verandert tenzij de geometrie slecht is; het label wordt altijd gerapporteerd. Bij goede of redelijke geometrie (een GPS-only open hemel van 8 satellieten inbegrepen) of onbekende geometrie (de monitor draait niet) is elke score als in 0,35: tests/geometry_trust_no_change.rs houdt de uitvoer van beide voorbeeldsessies en tests/geometry_corpus_identity.rs elk vastgelegd NMEA-corpus van vaartuigen (ook als GPS-only open hemel) en de bemanningstrainingsscenario's vast op de bytes van 0.35.0 zodra de toegevoegde sleutels zijn verwijderd; in de twee trainingsscenario's waarvan de jamming de geometrie slecht maakt, verschillen de slechte epochs alleen door de geometrieaftrek. Een log met slechte geometrie verliest tot 15 punten die hij in 0,35 niet verloor. Verder zijn de bedoelde wijzigingen allemaal toevoegingen: de bovenstaande sleutels in de resultaat-JSON en de bewijspakketten (score_model.weights is ongewijzigd); het schema van de live JSON-regels gaat van 1,2 naar 1,3 (geometry toegevoegd, class in elke aftrek); de samenvatting van het uittreksel krijgt geometry; telemetrie krijgt geometriereeksen, velden en het label class alleen voor invoer die ze draagt, zodat een stroom of resultaat van 0,35 byte voor byte als voorheen wordt weergegeven. geometry is de 17e monitornaam; hij staat als laatste in monitors_run wanneer hij heeft beslist (een vaartuig waarvan de log de geometrie geeft; een lijst van 0,35 behoudt haar volgorde en het aantal monitoren in de samenvatting gaat met één omhoog) en heeft geen vermelding in [score.weights] (er een instellen wordt geweigerd: zijn aftrek wordt ingesteld in [geometry]).

  • tests/fixtures/dop/NOTICE noemde de licentie van gnss_lib_py Apache-2.0; de release 1.0.4 is MIT.

  • De NMEA-lezer leest nu GSA (een korte GSA wordt genegeerd, niet als overgeslagen geteld) en bewaart GSV-elevaties en -azimuts, ook voor satellieten die zonder signaal worden vermeld; de UBX-lezer bewaart de elevatie en het azimut van NAV-SAT. C/N0 wordt precies zo gelezen als voorheen.

  • Resultaatwijziging: breedband- en gesweepte jammers gebruiken nu Q = 2. De anti-jamvergelijking gebruikt voor deze jammers de leerboekcorrectie Q voor spreidspectrum, waar zij 1 gebruikte. Q = 2 is witte ruis over de hoofdlob met genormaliseerd signaalvermogen in de band; het is in de tests vastgepind op de gesloten vorm uit navsignal.

    • Ongewijzigd: CW- en smalbandige jammers (Q = 1), een niet-herkend jammertype (Q = 1, de meest schadelijke waarde) en q_override.
    • Effect: waar een breedband- of gesweepte jammer werkt, stijgt de effectieve C/N0 met maximaal 3,0103 dB, stijgen afgeleide J/S-drempels met 3,0103 dB, en krimpen de vrije-ruimte-weigeringsstralen met 0,7071.
    • Gewijzigde meegeleverde scenario's: 12 van 144 veranderen, allemaal zoals vooraf vastgelegd (xval/jammer-q/PREREGISTRATION.md, resultaten in xval/jammer-q/RESULTS.md):
      • jamming-demo: C/N0 +3,01 dB;
      • jamming-harbour-approach-skyline: min_tracking 6 → 7;
      • lunar-jamming: verloren satellieten 26 → 0, mediane standoff voor loss-of-lock 27,4 → 19,4 km;
      • tracking-loop: weigeringsstraal voor lusdynamica 75,2 → 53,2 km;
      • en de campagnes en spectrumkruiscontroles die deze bevatten.
    • Getroffen consumenten: de soorten jamming, lunar-jamming, tracking-loop en impairment-eval, de jamming_kind_cross_check van de spectrumsoorten, de MODELLED referentiecurve van de IQ-campagne en de standaard-Q van labfit, en de export van interop-scènes.
  • JetBrains-plug-in: geen verouderde of voor verwijdering geplande platform-API. De vijf keuzedialogen gebruiken een kleine DialogWrapper met een keuzelijst in plaats van de verouderde Messages.showChooseDialog; kiezers voor één bestand gebruiken de constructor FileChooserDescriptor in plaats van de verouderde FileChooserDescriptorFactory.createSingleFileDescriptor(); de animatie opent met BrowserUtil.browse(Path) in plaats van browse(File), dat het platform 2026,3 voor verwijdering plant. Since-build blijft 243. De IntelliJ Plugin Verifier meldt Compatible zonder gebruik van verouderde of voor verwijdering geplande onderdelen tegen 2024,3 (IC-243.21565.193), 2025,2 (IC-252.23892.409), 2026.2.3 (IU-262.10968.63) en 2026,3 EAP (IU-263.6259.32); verifyPlugin controleert standaard 2024,3 en elke lijst die in KSHANA_VERIFY_IDES wordt gegeven.

  • gnss_sim::run_gnss_sim en jamming::run_jamming geven Result terug: een ongeldige sectie [skyline] is een fout bij rechtstreekse aanroep, zoals zij al was via api::run_toml, in plaats van een stille terugval op het vlakke masker. Brekende wijziging voor Rust-aanroepers van deze twee functies.

Opgelost#

  • Campagnescorer: een echte false lock van de tracker werd nooit geteld (iq::campaign). De false-lock-controle van de tracker verplaatst een kanaal van LOCKED naar LOST op het moment dat zij afgaat. De scorer markeerde in plaats daarvan de volgende update van het kanaal, die dan ontgrendeld was en dus nooit werd geteld. Een gebeurtenis false-lock die vanuit LOCKED wordt gemeld, is nu één episode op haar tijdstip, in de run en in elke vermelde gebeurtenis die haar bevat. Een die tijdens de pull-in wordt gevonden, of die wordt herhaald door een kanaal dat al LOST is, is geen nieuwe episode. Een nieuwe test drijft een echte false lock aan: een legitieme GPS L1 C/A-draaggolf die tijdens de lock met 1/(2T) stapt (tests/iq_campaign_false_lock.rs).

    • In de referentiecampagne van tests/iq_campaign.rs verandert alleen PRN 11 van ramp/agc-3bit (false-lock-episodes 0 → 1, 426 en 437 per vergrendeld uur).
    • De cel-DIGESTs zijn opnieuw vastgepind.
    • De vooraf vastgelegde pin voor gescoorde resultaten blijft actief en reproduceert nog steeds exact: in zijn hash worden alleen die zes velden, veranderd door deze fix die na de registratie is gemaakt, teruggezet naar hun waarden van vóór de fix. De gecorrigeerde waarden zijn afzonderlijk vastgepind.
    • Er is geen drempel gewijzigd, en geen VALIDATED rij, cijfer of webgetal is verschoven.
  • lunar-frame-campaign: een baken zonder waarneming wordt nu gerapporteerd (gevonden door MR-05). Het rapport krijgt unobserved_beacons en warning alleen wanneer een baken geen waarneming heeft, en dan komen de sigma's van de waargenomen bakens uit hun eigen informatie in plaats van allemaal null te zijn. Het datum is ongewijzigd, en geen standaard, meegeleverde of gepubliceerde uitvoer verschuift (docs/revisions/BEACON-unobserved-cell-changes.md).

  • Hoofdassenstelsel van de Maan (lunar_frame::icrf_to_moon_pa, gebruikt door lunar_od en de LRO-fit): de offset van het gemiddelde-Aarde- naar het hoofdassenstelsel van DE421 uit moon_080317.tf werd in de verkeerde richting en met de verkeerde Eulervolgorde toegepast, zodat het analytische PA-stelsel ongeveer 208″ van PA af stond in plaats van erop. Het is nu getranscribeerd zoals Frames Required Reading van SPICE het definieert en komt tot 2.6e-16 rad overeen met SPICE pxform('MOON_ME','MOON_PA'); het analytische PA-stelsel ligt 6″ tot 8″ van de PA van DE440 (vooraf vastgelegd e1ead19b, opnieuw vastgelegd be33382e nadat de eerste voorgestelde wijziging de drempel van 1e-12 miste; docs/design/evidence/fut05b-me-pa-offset-sign/). Gepubliceerde getallen die verschuiven: de LRO-fit (tests/agency_lro.rs) ruwe overlap 53,8 → 39,9 m, dynamisch 12,6 → 12,05 m, gereduceerd-dynamisch 6,65 → 6,67 m (drempels ongewijzigd). De analytische stack komt nu op beide niveaus overeen met de kruisvalidatie van ANISE op DE-niveau (12,0 / 6,67 m); het eerdere gat op het dynamische niveau was deze fout.

  • De MCP-server weigert [terrain] dem_hgt (follow-up van CAP-06b). Het pad van de terreintegel van de jammingsoort staat nu in inline_only::FILE_SOURCE_KEYS. Een inline-oppervlak weigert een scenario dat er een noemt, met een melding die noch het pad noch een fout van het besturingssysteem bevat. De test voor de bestandsbronbewaking markeert nu ook velden die eindigen op _hgt.

  • Jd2::from_parts met een gebroken dagdeel liet de breuk vallen in de conversies van UTC, TAI, UT1 en Aardrotatie (één uur dagdeel zette de Aarde 15° fout); het dagdeel wordt nu genormaliseerd tot een geheel getal. Geen aanroeper in de engine werd getroffen: elk geeft een hele dag door, en elke meegeleverde uitvoer is bit-identiek.

Gepland#

  • De geometrie uit een opgegeven skyline (0,36 onderdeel 1, nu in de engine als src/skyline.rs): sky-blocked en open_fraction uit de skyline waar de invoer er een geeft (de azimutkloof als terugval), een gebeurtenis van natuurlijke degradatie (fjord of terminal) in nmea-scenario, en de twee gemaskeerde geometrieën van de ontwerpnotitie in de rij sigma_UERE x DOP, vooraf vastgelegd als addendum.
  • Geometrie voor RINEX-logs met navigatie (uit de eigen positiebepaling van de engine) en Android-logs (uit de rijen Status); beide lezen vandaag unknown. Geometrie in $PKSHT (versie 1 ongewijzigd in 0,36) en de integraties met Signal K en OpenCPN.
  • Een bestaand gat, niet geïntroduceerd in 0,36: zodra het SNR-veld van elke satelliet leeg is, vuurt geen aftrek voor loss-of-lock of C/N0; totaal signaalverlies is alleen zichtbaar via signal_loss van de geometriemonitor (ingedeeld als environment). Een aftrek ervoor is gepland.
  • Een schema-1,3-stroom in de externe telemetriereferenties (de tekstformaatparser van Prometheus en de OTLP-collector), die vandaag alleen 1,2-stromen dekken.
  • Een tweezijdige obstructie (een canyon of smalle fjord) wordt gelezen als signaalverlies in plaats van als geblokkeerde hemel totdat de skyline is geïntegreerd.

[0.35.0] - 2026-10-12#

Een passage die AI-clients van derden noemt is hier weggelaten; ze staat in CHANGELOG.md op GitHub.

Galileo OSNMA-verifier#

  • Nieuwe module kshana::osnma en kshana osnma verify <input>: een open verifier in pure Rust aan de ontvangerzijde voor Galileo OSNMA. Hij leest I/NAV-pagina's en meldt, per satelliet en epoch, of de navigatiedata is geauthenticeerd, met een reden voor elke mislukking of vertraging: parsing van HKROOT en MACK, hermontage van DSM-KROOT en DSM-PKR, Merkle-verificatie van de publieke sleutel, verificatie van de TESLA-sleutelketen, MACSEQ- en tagverificatie voor ADKD 0, 4 en 12 inclusief kruisauthenticatie, en een resultaat in de vorm van $PKSOS voor de ontvangervertrouwensmonitor. De uitvoer draagt een advies dat de status geen integriteitsdienst voor navigatie is. docs/OSNMA.md vermeldt wat wel en niet wordt geverifieerd, de tijdsvereiste, en dat Kshana geen rechten verleent onder de IPR's van de OSNMA-ICD van de EU (gebruikers vertrouwen op de autorisatie in Annex E van de ICD). Geïmplementeerd tegen de SIS ICD Issue 1,1 en de Receiver Guidelines Issue 1,3. Pagina's worden op CRC gecontroleerd en een bytestroom UBX-RXM-SFRBX van u-blox kan rechtstreeks worden gelezen (--format ubx). Standaardtests gebruiken synthetische data en gepubliceerde known-answer-tests van primitieven; een test op aanvraag leest een lokaal gedownload exemplaar van de officiële vectoren. Na onafhankelijke beoordeling neemt de verifier zijn tijd alleen uit geverifieerde TESLA-sleutels (een vervalst subframe ver in de toekomst kan een mislukking niet meer wissen), laat hij een authenticatie verlopen en de gebruikte IODnav volgen, eerbiedigt hij geverifieerde alarmberichten (waarvan het Merkle-blad nu het willekeurige NPK-veld bevat) en de NMA-status "don't use", houdt hij dummytags buiten de satellietstatus, houdt hij ketens per CID bij met intrekking en vernieuwing, controleert hij de paddinghash van KROOT, en begrenst hij UBX-framelengten en het TESLA-verificatiewerk. Een satelliet wordt alleen als geauthenticeerd gelezen zolang de nieuwste efemeride- en klokdata die hij verzendt bit voor bit de data is die is geauthenticeerd (niet slechts onder dezelfde IODnav), een status of intrekking uit de niet-geauthenticeerde NMA-header telt alleen wanneer twee satellieten het eens zijn of een geverifieerde KROOT haar draagt, een herhaalde oudere KROOT kan een keten niet vervangen, en een vastgelopen sleutelstroom wordt gemeld.

Toegevoegd (MCP-serverkanalen)#

    Een passage die AI-clients van derden noemt is hier weggelaten; ze staat in CHANGELOG.md op GitHub.

  • kshana-mcp --http <addr>, streambare HTTP, zelf gehost. Standaard loopback; een niet-loopbackadres vereist --allow-remote en een bearer-token in KSHANA_MCP_HTTP_TOKEN; geen tool leest of schrijft een pad (de IQ-bestandstools staan uit); limieten voor aanvraaggrootte, tijd en gelijktijdigheid; geen CORS-header; Host- en Origin-controles. Kshana host geen endpoint (docs/deploy/mcp-http.md, met sjablonen voor Docker, Fly.io en Cloud Run).

Toegevoegd (oppervlakken)#

  • osnma_verify in Python en WebAssembly. De verifier achter kshana osnma verify op bytes in het geheugen, die de JSON teruggeeft die --json afdrukt (advies in zijn veld advisory; alleen authenticatiestatus, geen integriteitsdienst voor navigatie). Dezelfde weigeringen als de opdrachtregel. Niet in MCP: de invoer is een lange ruwe ontvangerstroom die beter door de CLI en Python wordt bediend. docs/SURFACES.md en docs/OSNMA.md zeggen dat.

  • trust_telemetry in WebAssembly, Python en MCP, met een plug-in-opdracht en een JetBrains-actie. Rendert een vertrouwensstroom of een resultaat van receiver-trust als Prometheus-tekst, syslog-regels in CEF of LEEF, of een OTLP-JSON-payload, met de encoders die kshana trust-telemetry gebruikt (kshana::surface::trust_telemetry); geen socket en geen klok. Plug-in: /kshana-trust-telemetry en de skill trust-telemetry. JetBrains: Render Trust Telemetry. De features wasm en python en de MCP-server schakelen nu ook otlp in, wat geen crate toevoegt.

  • Pariteitssweep. JetBrains-acties Validate Scenario, List Scenario Kinds en Assess Receiver Stream; kshana --help noemt nu receiver-trust evidence, evidence, trust-telemetry en nmea-scenario; het notebook compliance-and-test-bench (compliance mapping en test-bench-export); en elke resterende JetBrains-cel "CLI only" in docs/SURFACES.md is nu een expliciete N/A met zijn reden.

  • Een passage die AI-clients van derden noemt is hier weggelaten; ze staat in CHANGELOG.md op GitHub.

Toegevoegd (bewijspakketten)#

  • kshana receiver-trust evidence en kshana evidence verify: ondertekende, verifieerbare bewijspakketten voor een GNSS-vertrouwensgebeurtenis. Een pakket bundelt de ruwe logfragmenten en de SHA-256 van de volledige log, de configuratie met elke drempel, de resultaten en redenen per epoch, de engineversie, een hashgeketend manifest en een zelfstandige HTML-samenvatting, ondertekend met Ed25519 (een sleutel uit kshana evidence keygen of uw eigen bestand; sleutels worden nooit in een pakket opgeslagen en *.evidence-key wordt door git genegeerd). verify controleert elke hash, de keten en de handtekening en noemt precies wat faalt; met --pubkey pint het de ondertekenaar vast. Een RFC-3161-token kan worden bijgevoegd en wordt gelezen en aan het manifest gebonden (de eigen handtekening van de autoriteit wordt door deze build niet gecontroleerd; openssl ts -verify doet dat wel). Het logfragment bestaat uit de exacte bytes van het venster waar de lezer bronbereiken meldt (NMEA, UBX, RINEX 3, Android), anders uit de hele log, en het manifest zegt welke. Aanmaken en verifiëren zijn pure publieke functies (kshana::evidence) die voor wasm32 worden gebouwd. De pakketten stellen dat zij een technisch record zijn, geen juridisch oordeel. De nieuwe afhankelijkheden zijn de boom van ed25519-dalek (BSD-3-Clause en Apache-2.0/MIT, minimale features) en een directe zeroize (al in die boom) om sleutelmateriaal te wissen. Zie docs/EVIDENCE-PACKS.md.

Toegevoegd (vertrouwenstelemetrie)#

  • kshana trust-telemetry: GNSS-vertrouwen als bron van beveiligingstelemetrie. Leest de vertrouwensstroom per epoch (JSON-regels: score 0-100, band, redenen) of een batchresultaat van receiver-trust en voedt een Prometheus-endpoint /metrics (standaard localhost), syslog-gebeurtenissen in CEF of LEEF binnen een RFC-5424-envelop (UDP of TCP) en, achter de standaard uitgeschakelde feature otlp, OTLP/HTTP-JSON-export. Aflevering draait op workerthreads met tijdslimieten voor verbinden en schrijven, begrensde reconnect-backoff en een teller kshana_trust_syslog_send_failures_total, zodat een dode of vastgelopen collector de live beoordeling niet kan stilleggen of /metrics niet kan bevriezen; redenlabels zijn begrensd op 64 reeksen. Geen nieuwe afhankelijkheden. Een voorbeelddashboard voor Grafana staat in deploy/grafana/. Metricnamen, labels en de veldtoewijzing voor CEF/LEEF staan in docs/TRUST-TELEMETRY.md. Het streamformaat is geïsoleerd in src/telemetry/sample.rs.

Toegevoegd#

  • Vertrouwen op zee: een live vertrouwensscore van 0-100 voor de positiebepaling van een varend vaartuig, uit de NMEA 0183 die de ontvanger al uitvoert, met een poort op aanvraag. kshana receiver-trust accepteert een tabel [platform] (kind = "static" of "vessel", de maximumsnelheid, versnelling en draaisnelheid van het vaartuig, de hoogte van de antenne boven de waterlijn en een optionele koerssensor; elke standaardwaarde gedocumenteerd met haar reden). Voor een vaartuig wordt de monitor voor statische positiesprongen, die de afstand tot het kalibratiegemiddelde meet en op een varend schip onjuist is, vervangen door causale monitoren voor bewegende platforms: kinematische consistentie van de positie met de gerapporteerde snelheid en koers en met de limieten van het vaartuig, gyrokoers tegen koers over de grond, snelheidslog tegen snelheid over de grond, antennehoogte tegen de opgegeven hoogte boven de waterlijn, C/N0-spreiding die instort en samen stijgt tegen de kalibratiebasislijn, en tijdconsistentie (in de live-modus ook tegen de klok van deze computer). Het leest ook een gerapporteerde authenticatiestatus, in totaal of per satelliet (alleen een gerapporteerde status: geen OSNMA-cryptografie). Elke drempel wordt vóór de run vermeld in een tabel [maritime]. Elke epoch krijgt dan een score van 0 tot 100 via een deterministische, vooraf vastgelegde afbeelding (geen leren, niets gefit op gebeurtenissen; gewichten, bandgrenzen en het bewijs staan in een tabel [score]), afgebeeld op de bestaande vertrouwenstoestanden, met de monitoren die hebben afgetrokken en hun punten. Statische scenario's zijn ongewijzigd en hashen als voorheen. kshana receiver-trust live <session.toml> leest stdin, een bestand dat wordt aangevuld, TCP of UDP en schrijft één JSON-regel per epoch en een eigen zin $PKSHT; met --gate geeft het de stroom ongewijzigd door zolang de positiebepaling wordt vertrouwd en markeert het de positiebepaling als ongeldig (GGA-kwaliteit 0, RMC- en GLL-status V, GNS- en VTG-modus N) zolang dat niet zo is. De poort staat uit tenzij erom wordt gevraagd; --listen tcp:<port> levert de gepoorte stroom aan een willekeurig aantal TCP-clients (standaard loopback, een trage client wordt losgekoppeld in plaats van de anderen te blokkeren). Dit is adviserende software, geen typegoedgekeurde navigatieapparatuur (IEC 61108, IEC 61162); de exploitant blijft verantwoordelijk. examples/maritime-trust/ is een synthetisch log van Tallinn naar Helsinki, alleen als tekst geschreven, met halverwege een weglopen van de positie waarbij de ontvanger een geldige positiebepaling blijft melden; de verwachte uitvoer is door een test vastgepind. Gids: docs/MARITIME-TRUST.md. De controles kunnen een spoofer niet zien wiens positiebepaling consistent is met alles op de bus; de gids zegt dat.

Interferentiekaart#

  • kshana interference-map en kshana route-exposure: een openbaar beeld van waar vliegtuigen en schepen verslechterde navigatiedata meldden, en hoeveel van een route het raakt. Invoer zijn lokale CSV-bestanden gemaakt van openlijk gelicentieerde data van ADS-B (adsb.lol, ODbL 1,0) en AIS (NOAA MarineCadastre, Kystverket onder NLOD 2,0); elk uitvoerbestand is één bron en één UTC-dag aan GeoJSON met de methode, haar drempels, de datalicentie, de naamsvermelding en de dekkingsbias van de bron. De ADS-B-methode aggregeert NIC en NACp op een vast raster en noemt een cel degraded op grond van het aandeel verschillende vliegtuigen, met bewakingen voor apparatuur die nooit nauwkeurigheid meldt, lage hoogte en oorzaken over een groot gebied. De AIS-methode draait vijf detectoren: posities op land (tegen een door de gebruiker aangeleverde kustlijn), cirkelvormige sporen, onwaarschijnlijke sprongen, onwaarschijnlijke snelheden en veel vaartuigen op één positie. Drempels zijn vooraf vastgelegde constanten van een benoemde methodeversie. Alleen aggregaten: identificatoren worden in het geheugen gehasht en nooit weggeschreven, en cellen met minder dan 5 verschillende vliegtuigen of vaartuigen worden niet gepubliceerd. Een degraded cel is geen vaststelling van interferentie. De standaardopdrachten gebruiken geen netwerk; een hulpprogramma fetch-land --allow-network op aanvraag downloadt landpolygonen van Natural Earth van een aan een commit vastgepind adres en bewaart het bestand alleen als zijn SHA-256 overeenkomt. ADS-B-invoer is een CSV of rechtstreeks de readsb-geschiedenisbestanden van adsb.lol (nieuwe afhankelijkheid: flate2 met zijn pure-Rust-backend, voor gzip). Beide methoden zijn versie 2: een degraded of afwijkende aanduiding vereist ten minste 5 vliegtuigen of vaartuigen (het publicatieminimum), elke telling per cel onder 5 wordt achtergehouden als null, en een dag waarvan de achtergrond niet kan worden geschat, houdt zijn aanduidingen achter. Uitvoerbestanden heten <source>-<dataset>-<date>.geojson en worden nooit overschreven; invoer wordt regel voor regel gestreamd; routeblootstelling verwerkt de antimeridiaan. Tests gebruiken alleen synthetische data. Zie docs/INTERFERENCE-MAP.md en de licentiebeoordeling in docs/data/INTERFERENCE-DATA-SOURCES.md.

Toegevoegd (trainingsstreams)#

  • kshana nmea-scenario: synthetische brug-NMEA 0183 voor bemanningstraining in het herkennen van GNSS-jamming en -spoofing. Uit een scenario-TOML schrijft het een bestand of streamt het via TCP of UDP (unicast of broadcast; in real time, versneld of zo snel mogelijk) de volledige brugset GGA, RMC, VTG, GSV, GSA, GNS, ZDA, HDT en VBW voor een vaartuigspoor met limieten voor draaisnelheid, versnelling en stroming, met satellietgeometrie uit de eigen nominale constellaties van de engine. Gescripte gebeurtenissen op een tijdlijn: jamming, wegslepen van de positie (een geldige positiebepaling die wegloopt), tijdspoof en een replay-vertraging, elk met oplopende en aflopende hellingen voor begin en herstel. Een instructeurslogboek (JSON en tekst) legt vast wat wanneer is geïnjecteerd, met het ware spoor naast het gerapporteerde. Een bibliotheek in scenarios/training/ (jamming op open zee, wegslepen aan de kust, tijdspoof bij havenanadering, gecombineerd) bevat trainersnotities. De uitvoer heeft geldige checksums en is deterministisch per seed; tests leggen per scenario een golden uittreksel vast en lezen elke zin met de NMEA-lezer van receiver-trust. Alleen tekst: geen RF-, IQ- of golfvormuitvoer; de streams zijn voor training en tests en mogen nooit worden toegevoerd aan de live navigatiesystemen van een vaartuig. Zie docs/NMEA-TRAINING.md.

Maritieme integraties (0.35.0, werkstroom B)#

  • Signal K-plugin (integrations/signalk/, niet op npm gepubliceerd): draait of verbindt met kshana receiver-trust live (de eigen NMEA-invoer van de server, aangepaste invoerargumenten, een JSON-lines-TCP-feed of de $PKSHT-zinnen van een gate-stream), publiceert de vertrouwensscore, de band, de redenen, de alarmen en de gate-status onder navigation.gnss.kshana.* (inclusief de door de ontvanger gerapporteerde positie als context, nooit navigation.position), en geeft een Signal K-melding (warn bij degraded, alarm bij untrusted, met drempels voor vasthouden, wissen en veroudering, allemaal in het configuratieschema). Geen npm-afhankelijkheden. Getest op vastgelegde synthetische uitvoer.
  • OpenCPN: NMEA in gate-modus wordt rechtstreeks geleverd door kshana receiver-trust live --gate --listen tcp:10110 (aanbevolen); een TCP-relay zonder afhankelijkheden (integrations/opencpn/nmea-tcp-relay.mjs) is het optionele alternatief. In beide gevallen ziet OpenCPN een ongeldige positiebepaling wanneer het vertrouwen instort en $PKSHT in zijn NMEA-debugvenster; tests spelen de synthetische gated stream opnieuw af via een echte TCP-socket en controleren wat een afnemer ontvangt. Een native score-paneelplugin (integrations/opencpn/plugin/, plugin-API 1,18, CMake) leest $PKSHT uit de eigen NMEA-stream van OpenCPN en waarschuwt bij de untrusted band; hij wordt gebouwd, zijn logica is met unittests getest en hij is binnen OpenCPN 5.8.4 onder een virtueel scherm uitgevoerd (bewijs en een reproductiescript in integrations/opencpn/evidence/); hij is niet verpakt voor de pluginmanager.
  • Referentiebuild (deploy/reference-build/): generieke onderdelenlijst, OS-inrichting, systemd-units voor de adviserende monitor en de optionele gate (gecontroleerd met systemd-analyze verify door check-units.sh), een containeroptie, Signal K-bedrading.
  • De Signal K-plugin accepteert het live JSON-schema 1,2 (een position en daarna een toegevoegde sleutel advisory; onbekende toegevoegde sleutels worden genegeerd), gecontroleerd op echte uitvoer van 1,2 en tegen een echte signalk-server.
  • Reviewcorrecties: de systemd-units herstarten altijd en draaien in een sandbox (geen shell, geen netwerk waar dat niet nodig is), een logrotate-snippet, check-units.sh faalt bij elke bevinding; de container draait de gate vanuit omgevingsvariabelen met een healthcheck en basisimages die met een digest zijn vastgepind; Signal K-scoremetadata, de verouderde melding wordt vervangen wanneer er weer data komt, fouten van kindprocessen blijven behouden en kills escaleren, onveilige inputArgs worden geweigerd en de melding staat op notifications.navigation.gnss.kshana.trust; de relay begrenst een vastgehouden onvolledige regel; de $PKSHT-parsers weigeren scores buiten 0 tot 100; een controle van documentatielinks; een CI-workflow (marine-integrations.yml) die dit alles uitvoert, inclusief de echte binary end-to-end.
  • docs/MARINE-INTEGRATIONS.md. Adviserende software, geen typegoedgekeurde apparatuur; de exploitant blijft verantwoordelijk. Alleen software: er wordt niets uitgezonden en er wordt geen detectie- of valsealarmcijfer geclaimd.

Toegevoegd: compliance-mapping en test-bench-export#

  • docs/compliance/ en kshana compliance-report. Een mapping van Kshana-uitvoer naar vijf raamwerken en normen voor veerkracht (het Resilient PNT Conformance Framework v2.0 van het Amerikaanse DHS, IMO-richtsnoeren voor schepen, EASA-richtsnoeren voor de luchtvaart, NIS2 artikel 21, EN 16803, een betaalde norm die wordt aangehaald per deel en met de enkele clausulenummers die in de catalogustekst zichtbaar zijn), één tabel per raamwerk: de verwijzing, wat het in onze parafrase vraagt, de uitvoer die er bewijs voor levert en het gat. Bronversies, URL's en wat wel en niet is gelezen worden vastgelegd. kshana compliance-report <result.json>... vult de mapping vanuit de opgegeven runs en markeert elke rij als evidenced, partly-evidenced, not-evidenced of out-of-scope, als Markdown en JSON, met het gat op elke rij bewaard. De formulering is "levert bewijs voor"; er wordt niets beoordeeld of goedgekeurd. Tests gebruiken synthetische runs en falen wanneer een vastgelegde tabel afwijkt van de code.
  • kshana bench-export <scenario.toml>. Schrijft de voertuigbeweging en gebeurtenissen van een scenario gnss-ins, jamming of gnss-sim voor een GNSS-simulator in het laboratorium: een CSV met gebruikersbeweging met gedocumenteerde stelsels en een metadata-sidecar, NMEA 0183 GGA/RMC, waypointtekst en de gebeurtenissen als CSV en als receiver-trust-blokken [[events]] (src/interop/testbench.rs). Alleen beweging en gebeurtenissen: er wordt geen signaal geschreven. Elk bestand wordt teruggelezen in tests/interop_testbench.rs en vergeleken binnen zijn opgegeven tolerantie. docs/TEST-BENCH.md beschrijft de methode om de export via een simulator opnieuw af te spelen en het log van de ontvanger te beoordelen met kshana receiver-trust.
  • Wat als bewijs telt. Een resultaat telt voor een mogelijkheid alleen wanneer het de velden bevat die zijn type schrijft; een typelabel alleen telt voor niets. Onbekende typen, een resultaat dat afwijkt van zijn zusterscenario, niet-hexadecimale hashes en onjuiste tellingen van ontvangervertrouwen worden met de reden als niet gebruikt vermeld. Het rapport escapet Markdown-cellen en kan niet in paniek raken bij een niet-ASCII-hash. compliance::run_from_text en assess_texts nemen teksten, geen paden.
  • Test-bench-export. --epoch wordt op bereik gecontroleerd (UtcEpoch::parse_iso); het waypointbestand controleert elk interval en de opdracht zegt waarom wanneer er een wordt weggelaten; de documentatie vermeldt dat de koers van gnss-ins de gier van het lichaam is en niet de koers over de grond, de plaatshaldervelden van GGA en de eigen hoogteverandering van het scenario. bench-export en compliance-report staan in de gebruikstekst.
  • fusion::pack::truth_trajectory maakt de ware toestandshistorie van het rijprofiel van gnss-ins beschikbaar (dezelfde stapgrootte die de eigen referentie van het type gebruikt), en UtcEpoch krijgt NMEA-datum- en tijdvelden.

Validatie van de interferentiekaart#

  • De decoderingssemantiek en de geometrie van de interferentiekaart worden op synthetische invoer getoetst aan onafhankelijke implementaties. NIC- en NACp-codebetekenissen tegen pyModeS-decodering van synthetische ADS-B-frames, de niet-beschikbaar-waarden van AIS tegen pyais-decodering van synthetische AIVDM-zinnen, celtoewijzing in het raster tegen shapely, routelengte per celstatus tegen shapely en GeographicLib, en maskering van het binnenland tegen shapely en pyproj, elk met een tolerantie die vóór de eerste vergelijking is vastgelegd (tests/fixtures/interference_map_ref/PREREGISTRATION.md). Dit toetst hoe codes en veldwaarden worden gelezen en de geometrie, niet dat een gemarkeerde cel interferentie is. De lezer van landpolygonen sluit nu een ring die zijn eerste hoekpunt niet herhaalt, die hij voorheen zonder de laatste rand las. De documentatie vermeldt de drempels voor lage nauwkeurigheid van NACp en NIC als de grens die elke code vertegenwoordigt (NACp 6 is een EPU-grens van 556 m, NIC 5 een insluitingsgrens van 1 NM).

Toegevoegd (validatie van de telemetrieformaten en bewijspakketten)#

  • Externe controles van de cryptografie van het bewijspakket, de pakketverificator en de telemetrie-wireformaten. De Ed25519-testvectoren uit RFC 8032 sectie 7,1 (1, 2, 3 en 1024) en de SHA-256-voorbeelden uit FIPS 180-4 lopen door de eigen functies van het pakket voor ondertekenen, verifiëren en hashen, tot exacte gelijkheid. Een in Python geschreven verificator, alleen op basis van de normatieve sectie van docs/EVIDENCE-PACKS.md (hashlib en cryptography), komt overeen met de Rust-verificator op 71 intacte en gemanipuleerde pakketten: oordeel, foutenverzameling, handtekeningoordeel en beide ketenkoppen. Onze Prometheus-weergave wordt gelezen door de parser van de officiële Python-client en onze OTLP-JSON door het officiële bericht opentelemetry-proto, strikt, en beide komen overeen met de toestand waaruit ze zijn gemaakt. CEF en LEEF hebben geen onafhankelijke open validator en blijven gemodelleerd. docs/EVIDENCE-PACKS.md kreeg het normatieve pakketformaat en de verificatieprocedure waaruit de clean-room-verificator is geschreven; VerifyReport kreeg signature_valid. Onafhankelijke referenties en fixtures: scripts/gen_ed25519_rfc8032_ref.py, scripts/gen_evidence_pack_ref.py met scripts/evidence_verify_cleanroom.py, scripts/gen_telemetry_formats_ref.py; tests evidence_crypto_reference, evidence_pack_reference en telemetry_formats_reference. CI heeft geen Python nodig.

Toegevoegd (validatie van de CEF-gebeurtenissen)#

  • De CEF-telemetriegebeurtenissen worden door twee onafhankelijke opensource-parsers correct teruggelezen. pycef 1,11 en de Logstash-CEF-codec (logstash-codec-cef 6.2.7 in Logstash 8.15.3) parsen 157 CEF-regels (elke bandwisseling en elke epoche van de vastgelegde telemetriestream, plus tegenstrijdige tekst met =, backslashes, pipes, regeleinden, tabs en tekst met meerdere bytes) en herstellen elk headerveld, de ernst, de exacte verzameling extensiesleutels en elke waarde exact. De Logstash-codec leest ook vier regels waarvan de headertekst escaping nodig heeft, wat pycef niet kan. De drempel werd vastgelegd voordat een van beide parsers werd uitgevoerd (tests/cef_reference.rs); fixtures in tests/fixtures/cef/, scripts voor de onafhankelijke referentie scripts/gen_cef_ref.py en scripts/gen_cef_logstash_ref.py; CI heeft noch Python noch Logstash nodig. LEEF heeft geen onderhouden open parser en blijft gemodelleerd. De CEF-gebeurtenissen dragen nu de vertrouwensscore en de epocheoffset in de aangepaste kommagetalvelden van het CEF-woordenboek (cfp1, cfp2) in plaats van de gehele-getalvelden cn1 en cn2, die voor geen van beide waarden pasten; CEF is nieuw in deze release, dus er verandert niets aan wat al is geleverd.

Gewijzigd#

  • MCP: assess_receiver_log accepteert het log als text of base64; toolinvoer is begrensd op 4 MiB.
  • De jamminggrafiek haalt haar kleuren ook uit het palet. src/jamming.rs was de ene module die de herziening van het Observatory-palet op haar eigen kleuren liet staan terwijl het werk aan jammer-Q landde; haar *.chart.svg (de jamming, maritime-strait-jamming en andere scenario's van het type jamming) leest nu src/palette.rs, en de allowlist in tests/palette_sync.rs is leeg. Alleen kleuren en lettertype: de grafieken jamming-demo en maritime-strait-jamming zijn gelijk aan hun eerder vastgelegde renders zodra kleur, font-family en de versievoettekst zijn genormaliseerd. Er is geen geplotte waarde verschoven. De vastgelegde Studio-kopieën onder web/studio/recorded/ zijn opnieuw vastgelegd bij de re-ports van 0.33.0 en 0.34.0 (alleen versiestempel): ze dragen nog de oude kleuren van de jamminggrafiek en nemen het palet over bij de volgende re-port.

Opgelost#

  • De 3-sigmagrens van het klokensemble dekt nu de flickervloer, en de filtergezondheidscontrole ziet die. Met een flicker_floor droeg de ware klok flicker-FM, maar het filter met twee toestanden dat de integriteitsgrens levert deed dat niet, dus de 3-sigmadekking van het meegeleverde scenario clock-ensemble was 0,41 (klassiek) en 0,33 (kwantum), en de NIS/NEES-controle, die haar eigen waarheid uit het model van het filter trok, meldde identieke waarden met en zonder de vloer. De grens is nu de variantie van twee toestanden plus de exacte variantie van de flickerfase die sinds de laatste synchronisatie is opgebouwd, berekend uit dezelfde bank die de ware klok gebruikt; de NIS/NEES-controle trekt haar waarheid uit het uitgebreide model met die bank en draait het bijpassende uitgebreide filter (en het filter met twee toestanden tegen flickerwaarheid meldt consistent = false). Uitvoerwijziging, alleen voor klokken met een flicker_floor ongelijk aan nul: integrity op clock-ensemble gaat van 0,40866 / 0,33026 naar 0,99970 / 1,0 (klassiek / kwantum) en de NIS/NEES van filter_health bevatten nu de flicker; de tijdfout, holdover_s en timing_p95_ns zijn ongewijzigd, en scenario's zonder vloer zijn byte-identiek. scenarios/orbit-gnss-challenged.toml (baantype, seed 7, vloeren 1e-16 / 2e-11) verschuift ook: fom.integrity klassiek 0,7734 naar 1,0 en kwantum 0,9796 naar 1,0, en de NIS/NEES van filter_health en hun banden veranderen. Het kwantum-filter_health.consistent slaat om van true naar false: een steekproefgebeurtenis van het flickerensemble van 16 seeds bij 60 stappen (NIS 0,8815 tegen een band van [0,9125, 1,0914]), geen defect. De band is een band van 95 %, dus ongeveer 5 % van de seeds markeert van nature een bijpassend filter (40 nieuwe seeds van dit scenario: kwantum 1 en klassiek 2 gemarkeerd); bij 64 bij 200 ligt dezelfde seed voor beide klokken binnen de band (NIS 0,990 en 1,001). Bekend vervolg: het type fusion heeft hetzelfde gat (klassieke integriteit 0,80 met een vloer); het type hybrid blijft boven 0,99.

[0.34.1] - 2026-10-10#

Beveiliging#

  • Invoer van de MCP-server verscherpt. De scenariotools van de MCP-server accepteren nu alleen inline inhoud en weigeren bronvelden die naar bestanden verwijzen; de invoergrootte is begrensd. Beveiligingsadvies: GHSA-8wpf-hqg5-6xjr.

[0.34.0] - 2026-10-09#

Lab replay: een trackingengine, detectiemonitoren en een campagnerunner voor GNSS-IQ-opnamen, met de bijbehorende lusontwerpen, C/N0-schatters en scores. Bewijsklasse: alles hieronder is MODELLED of gecontroleerd op interne consistentie tegen gesloten vormen en geseede simulatie; niets ervan voegt een VALIDATED rij toe, en het verificatieregister is ongewijzigd (251 rijen: 124 getoetst, 123 gemodelleerd, 4 partner). Het is een softwareanalyselaag: niets hiervan synthetiseert een golfvorm van een jammer of spoofer, en er wordt niets uitgezonden.

Toegevoegd#

  • Lab replay: testcondities, campagnerunner en beoordeling (0.34.0). kshana iq campaign <campaign.toml> speelt opnamen × front-endketens × lusontwerpen (kshana.loop-design/1) opnieuw af en beoordeelt elke cel aan de hand van een testconditiebestand per opname (kshana.test-conditions/1, TOML of JSON). Dat bestand vermeldt wat een lab over de opname weet: de verwachte satellieten en, per gebeurtenis, het typelabel, begin en einde, getroffen satellieten en het opgegeven J/S- of jammervermogensprofiel. Het zijn alleen metadata. De scores per satelliet, voor de hele run en per gebeurtenis, zijn:

    • beschikbaarheid, tijd tot verlies van lock en de opgegeven J/S bij het verlies;
    • herverwervingstijd, vanaf het einde van de gebeurtenis en vanaf het verlies;
    • gemeten C/N0-degradatie per opgegeven J/S-bin;
    • false-lock-episodes per locked uur (de vlag van de tracker, of Doppler tegen een waarheidssidecar);
    • jitter van de PLL- en DLL-discriminator.

    Naast elke gemeten degradatiecurve wordt een analytische referentie voor spectrale scheiding (jamming::effective_cn0_dbhz met de Q van het type) getekend en overal waar ze voorkomt gelabeld als MODELLED.

    Cellen draaien parallel door de lock-toestandsmachine van de trackingsessie, en elke wordt atomair geschreven onder een sleutel met inhoudshash. De sleutel omvat de SHA-256 van de opname, de hashes van conditie, front-end, ontwerp, run en beoordeling, de vereiste data_class (synthetic | client-confidential) en de engineversie. Met run.epochs ingesteld worden van elke cel ook de stream kshana.track-epoch/1 en de lock-gebeurtenissen bewaard, benoemd naar celsleutel en in de cel gehasht. cell_key en report::digest zijn openbaar, zodat een afnemer elke sleutel en de digest opnieuw kan afleiden. Een herhaalde run slaat dus voltooide cellen over, en de uitvoer hangt nooit van het aantal workers af. De run schrijft scorecard.csv/.json, een op zichzelf staande report.html en een DIGEST. Drempels voor pass/fail ([scoring.bars], per opname te overschrijven) worden toegepast wanneer het rapport wordt opgebouwd.

    • [scoring] cn0_estimator = "m2m4" | "nwpr" (standaard "m2m4", deel van de beoordelingshash) kiest de C/N0 achter de gerapporteerde C/N0 en de degradatiecurve. Beide schattingen worden altijd beoordeeld en gerapporteerd (mediaan over de hele run en over de basislijn, en per J/S-bin), en de cel en de scorecard leggen de schatter vast. NWPR leest ongeveer 8 dB × Bn·T te laag onder de eigen jitter van de lus; M2M4 niet.

    Ook nieuw:

    • kshana iq campaign report <dir> bouwt de scorecards, het rapport en de digest opnieuw op uit de cellen;
    • kshana iq conditions <file> controleert een testconditiebestand tegen zijn schema;
    • events_from_sigmf = true importeert de annotaties kshana:test_event van een SigMF-opname als gebeurtenissen;
    • Python krijgt iq_test_conditions, iq_campaign en iq_campaign_report;
    • kshana-mcp krijgt iq_campaign, dat incrementeel is en hervatbaar onder het samplebudget per aanroep, met elk bestand beperkt tot de werkmap, en iq_campaign_status.

    Tests: tests/iq_campaign.rs draait een synthetische campagne van 3 opnamen × 2 front-ends × 2 ontwerpen. De scènes bevatten opgegeven C/N0-profielen, en de test dekt:

    • elke metriek gecontroleerd tegen de geïnjecteerde waarheid;
    • hervatten na een gedeeltelijke run met één worker met een corrupte cel, byte-identiek aan een ononderbroken run met vier workers;
    • epochebestanden per cel;
    • een regressietest van 20 s met herverwerving van drie satellieten: met reacquire aan is elk kanaal binnen 2 s na een onderbreking van 2 s terug; de uitkomst met reacquire uit is vastgepind;
    • drempels opnieuw beoordeeld zonder opnieuw te draaien;
    • de CLI;
    • genegeerde doorvoer- en geheugencontroles in release-modus, waaronder een opname van 4 GB (5,45× real time, piekgeheugen 2 MB boven de begin-RSS; metingen op één machine, geen drempels).

    Alleen software: er wordt niets uitgezonden en er wordt geen interferentie- of spoofinggolfvorm gesynthetiseerd. Ontwerp- en as-built-notities: docs/design/LAB-CAMPAIGN.md.

  • Trackingengine voor lab replay (0.34.0: B3.1, B3.2, B3.3, B6.1).

    • Lusontwerpbestanden: kshana.loop-design/1-TOML (docs/design/LOOP-DESIGN-TOML.md; parser iq::track::design). Een of meer benoemde ontwerpen stellen elk lusveld in:

      • draaggolftype (PLL, FLL of FLL-ondersteunde PLL), ordes en bandbreedtes;
      • PLL/FLL/DLL-discriminatoren en draaggolfondersteuning;
      • spacing en integratie;
      • lockdrempels en C/N0-vensters, en bitsynchronisatie;
      • de lock-toestandsmachine;
      • de overdrachtsacquisitie ("auto" of expliciet).

      Ontwerpen kunnen elkaar extends. Onbekende sleutels worden geweigerd. Elk opgelost ontwerp heeft een SHA-256-hash over een canonieke JSON-vorm (sleutels op elk niveau gesorteerd, vaste getalopmaak), zodat de hash niet van de veldvolgorde afhangt; elke uitvoer legt hem vast. Oppervlakken:

      • kshana iq track --design <file> [--design-name], waarbij expliciete vlaggen het ontwerp overschrijven en worden vastgelegd;
      • kshana iq sweep --design <file>, dat elk ontwerp in het bestand draait;
      • Python iq_track(design=, design_name=, reacquire=), iq_loop_designs;
      • MCP iq_track design/design_name.
    • M2M4 C/N0 (EpochOutput.cn0_m2m4_dbhz, de track-epochekolom cn0_m2m4_dbhz na cn0_beaulieu_dbhz; Python-epochedicts). De schatting uit het tweede en vierde moment over dezelfde vensters als NWPR, alleen uit prompt-vermogen: NWPR leest te laag onder de eigen draaggolfjitter van de lus (ongeveer 8 dB × Bn_PLL·T) en M2M4 niet. Op GPS L2C CM (20 ms, nominaal 40 dB-Hz, PLL 1 tot 10 Hz) leest hij bij elke bandbreedte 39,93 dB-Hz terwijl NWPR daalt van 39,55 naar 38,22; op L1 C/A bij 45 dB-Hz leest hij 45,34. NWPR en elke andere uitvoer zijn ongewijzigd (een bit-voor-bit-pin). Het binaire record blijft 184 bytes (de waarde neemt de gereserveerde float en vlagbit 6 in).

    • Extra correlatortaps (multicorrelator / SQM). [design.integration] extra_taps_chips = [..] (offsets in chips vanaf de prompt, positief vroeg; hoogstens 16, elk binnen ±2) correleert extra replica's naast E/P/L en geeft ze terug als EpochOutput.extra ((offset, value) in ontwerpvolgorde). De lussen gebruiken ze nooit. De sleutel wordt uit de canonieke JSON weggelaten wanneer hij leeg is, zodat de hash van het standaardontwerp en elke uitvoer zonder taps ongewijzigd zijn (kshana.track-epoch/1 blijft; de CSV/JSONL/binaire uitvoer zonder taps is bitgelijk). Met taps: CSV/JSONL-kolommen en een binair record van 184 + 16 × taps bytes waarvan de header extra_taps_chips draagt, zodat een oude lezer het bestand weigert in plaats van het verkeerd te parsen. --extra-taps (CLI), extra_taps (Python) en extra_taps_chips (MCP iq_track). De ontwerpen van één run moeten het over de taps eens zijn.

    • Parallelle kanalen (iq track / iq sweep --threads <N|auto>; Rust TrackSession::with_threads). De kanalen van elke chunk draaien op maximaal N threads (std::thread::scope; wasm32 blijft serieel). De correlatie en lock-toestandsmachine van een kanaal raken alleen dat kanaal; de epochen en gebeurtenissen ervan worden gebufferd en in kanaalvolgorde naar de sinks geschreven, zodat de uitvoer (CSV, JSONL, binair, gebeurtenissen, samenvatting) voor elke N byte-identiek is aan de seriële run. De standaard blijft 1 thread. Gemeten op een opname van 12 kanalen, 4 s, 4,092 MHz op 4 cores: 19,5 s serieel, 11,5 s bij 2 threads, 6,3 s bij 4 (3,1×; de eerste acquisitie is serieel).

    • Export van het acquisitieoppervlak (kshana.acq-surface/1; iq::acq_surface, docs/design/ACQ-SURFACE.md). iq acquire --surface <path> (één PRN; CSV, JSON of binair), Python iq_acq_surface en MCP iq_acquire surface_out schrijven het hele correlatievermogensoppervlak Doppler × codefase dat de zoekactie berekent (de cellen zijn die van acquire, bit voor bit) met de piek en twee verfijningen van fijne Doppler: een parabolische schatting en een fijne zoekactie met 1/16-bin (≈5 Hz bij 4 ms coherent, tegen bins van 167 Hz). acquire zelf en elke standaardwaarde zijn ongewijzigd.

    • Streaming epocheuitvoer (kshana.track-epoch/1; iq::track::sink). Elke lusupdate bevat:

      • de early/prompt/late-correlatoren;
      • alle drie de discriminatoruitgangen;
      • de NCO-toestanden van PLL/FLL/DLL en de draaggolffase;
      • de PLI- en lockvlaggen;
      • beide C/N0-schattingen en de bits;
      • de lock-toestand.

      Hij wordt geschreven terwijl het gebeurt, als CSV, JSON Lines of een versiegebonden binaire vorm met lezers in Rust (BinaryEpochReader) en Python (iq_read_epochs).

      • iq track krijgt --epochs, --events en --summary (kshana.track-summary/1), en iq sweep krijgt --epochs en --events. MCP iq_track krijgt epochs_out/events_out en bouwt zijn antwoord op uit de samenvatting met begrensd geheugen.
      • De heap van een run groeit niet meer met de lengte van de opname: tests/iq_track_memory.rs meet dat met een tellende allocator (6× de lengte, dezelfde piek binnen 64 KiB), met een controle die laat zien dat het pad in het geheugen wel groeit.
      • De gestreamde uitvoer is bit voor bit identiek aan de replay in het geheugen.
    • Toestandsmachine voor lock (iq::track::lock, TrackSession): pull-in → locked → lost → heracquisitie → pull-in, of buiten dienst gesteld zodra een verlies langer duurt dan reacq_window_s (standaard 30 s). Mislukte zoekpogingen worden elke reacq_interval_s (0,1 s) herhaald, gelijkmatig verdeeld, zodat het herhalingsschema hooguit 0,1 s toevoegt aan een gemeten heracquisitietijd. Een optionele back-off (reacq_max_interval_s boven reacq_interval_s) staat standaard uit, en max_reacq_attempts is een optionele limiet (0, geen, standaard). Een uitval van 2 s op drie PRN's bij 4,092 MS/s eindigt nu met alle kanalen opnieuw verworven en gelockt. Bij een budget van 3 pogingen was elk kanaal binnen 0,2 s na het verlies buiten dienst gesteld.

      • De drempels (loss_dwell_s, pull_in_max_s, het Dopplervenster voor heracquisitie) komen uit het ontwerp. Elke overgang is een gebeurtenis met zijn reden.
      • De controle op valse lock zoekt de getrackte Doppler af tegen de ±1/(2T) FLL/PLL-alias. Ze vangt de valse lock die PR #38 mat (−2400 Hz getrackt, 500 Hz ernaast). Met heracquisitie aan eindigt het kanaal gelockt op de geïnjecteerde Doppler.
      • Een signaalonderbreking van 0,8 s wordt als lost gemeld en binnen 0,3 s na terugkeer van het signaal opnieuw verworven.
      • --summary final_state (en de kolom van de tabel) is de toestand na de laatste overgang, zodat een kanaal dat na zijn laatste lusupdate buiten dienst is gesteld RETIRED vermeldt.
      • FLL-ondersteuning alleen tijdens pull-in ([design.carrier] fll_assist = "pull-in", de standaard; "always" behoudt het eerdere gedrag bit voor bit). De FLL draagt over aan de PLL zodra de afgevlakte PLI minstens fll_off_pli (0,8) heeft gehouden gedurende fll_gate_dwell_s (0,1 s), en keert terug onder fll_on_pli (0,6). Wanneer hij aan bleef, verbrak het 10 Hz FLL-pad de fasevergrendeling onder ongeveer 38 dB-Hz op schone signalen: bij 35 dB-Hz was de fractie met fasevergrendeling 10–16 %, met een werkelijke faseafwijking van 38–41°. Met gating houdt de standaard 100 % bij 35 dB-Hz met 4,5°, hetzelfde als een PLL alleen. Pull-in vanaf een overdrachtsfout van 100 Hz is ongewijzigd. Bewijs met vooraf vastgelegde drempels: docs/design/evidence/carrier-lock/. De standaardlussen zijn daarom niet bit voor bit gelijk aan eerdere runs van het standaardontwerp. Gebruik fll_assist = "always" om ze te reproduceren. Bekende beperking: bij 35 dB-Hz volgt de overdracht 1,9–2,6 s na het begin van de track, en bij 33 dB-Hz houdt de 10 Hz FLL de PLI onder de overdrachtsdrempel, zodat pull-in nooit voltooid wordt.
      • Nieuwe sleutels voor het lusontwerp en nieuwe API, opgesomd:
        • [design.carrier]: fll_assist, fll_off_pli, fll_on_pli, fll_gate_dwell_s;
        • [design.lock]: reacq_window_s, reacq_interval_s, reacq_max_interval_s, waarbij max_reacq_attempts is gewijzigd van een standaard van 3 naar een optionele limiet (standaard 0);
        • Rust: LoopConfig.fll_assist (FllAssist, FllGate), LoopCore::set_fll_enabled, EpochOutput.fll_active, ChannelSummary.final_state.
      • De ontwerphash wordt berekend over een canonieke JSON-vorm, en de hash van de ingebouwde standaard is 33261cd171a53803a6c262686e878e01f37d902a93d5918c20a44297b8ef8e80 (vastgezet door een test).
      • Opmerkingen over uitvoercompatibiliteit:
        • de tabel van iq track heeft een afsluitende kolom final_state;
        • de CSV van iq sweep heeft een afsluitende kolom design_hash, en de JSON heeft design_hash en warnings;
        • de mean_cn0_dbhz van de sweep is nu het gemiddelde over elke update met een NWPR-schatting (samenvatting met begrensd geheugen), niet langer over de tweede helft van de run.
      • Heracquisitie staat uit in de ingebouwde standaard, waar de toestandsmachine alleen observeert en de lussen bit voor bit draaien zoals zonder haar. (De standaardlussen zelf zijn echter gewijzigd: zie FLL-ondersteuning hierboven.) Schakel haar in per ontwerp ([design.lock] reacquire = true), met --reacquire of met reacquire=True.
      • Een waarschuwing commensurate_sampling: wanneer fs binnen 1e-6 ligt van een veelvoud van de helft van de chipsnelheid (iq::track::commensurate_samples_per_chip), waarschuwen iq track/iq sweep (uitvoer, --summary, sweep-JSON), het MCP-antwoord van iq_track en het Python-resultaat van iq_track dat de jitter en bias van de codelus niet representatief zijn. De hoofdoorzaak is gedocumenteerd met vooraf vastgelegde drempels in docs/design/evidence/dll-jitter/. Bij precies 2 samples per chip met een afstand van 0.5 chip is de DLL-S-curve één enkele stap en dithert de lus: ≈ 0,09 chip RMS-codefout (≈ 26 m) bij 45 dB-Hz, tegenover ≈ 0,004 chip bij een incommensurabele snelheid. De ~2 dB te lage NWPR C/N0 bij die snelheid heeft dezelfde oorzaak. Bij precies 0 Hz codeDoppler en 4 samples per chip passeert de code nooit de dode zone van ±0.21 chip, zodat een codefasebias tot ongeveer 0,2 chip kan blijven bestaan zonder in de jitter zichtbaar te zijn (gemeten: een afstand van 0.5 chip geeft 2,0× de codefout van de controle met een gemiddelde van +0,011 chip; een afstand van 0.25 chip geeft +0,125 chip); de waarschuwing omvat de snelheid.
      • Bekende beperking: het standaardontwerp draagt FLL→PLL niet over onder ongeveer 35 dB-Hz (een pull-in-ondergrens van ~35 dB-Hz; zie FLL-ondersteuning hierboven en docs/design/evidence/carrier-lock/).
      • Een zoekpoging naar valse lock of heracquisitie die niet kan draaien (een snelheid zonder geheel aantal samples per codeperiode) stopt het tracken niet langer.
      • Tests: tests/iq_track_engine.rs, tests/iq_cli.rs, iq::track::design::tests, tests/python en de MCP-IQ-round-trip.
  • C/N0-profielen in synthetische scènes (0.34.0). iq::channel::cn0_profile plant in Kshana's eigen scènes een in de tijd variërende C/N0 per satelliet in, als dB-offsets ten opzichte van de C/N0 van de scène. Vormen: stap, helling, stuksgewijs lineair en geseedde scintillatie-achtige Rice-fades met een opgegeven S4 en decorrelatietijd. Ze worden toegepast via de bestaande kanaalhook van de scène (Cn0ProfileChannel, samen te stellen met de effecten van ionosfeer, troposfeer, scintillatie en multipath), zonder wijziging van de scènekern. De cn0_dbhz in het truth-sidecarbestand volgt het profiel.

    • Oppervlakken: kshana iq scene … --cn0-profile <toml> en kshana.iq_scene(…, cn0_profile="<toml>").
    • Waarvoor het dient: lussen, monitors en campagnescoring kunnen worden stresstest worden tegen een bekende referentie. Het wijzigt alleen de sterkte van de legitieme signalen.
    • Controles (tests/iq_cn0_profile.rs). Drempels: gemiddelde fade-intensiteit binnen 5 % van 1, S4 binnen 8 % van het doel (bij S4 = 0,3, 0,7 en 1), intensiteitscorrelatie boven 0,9 bij 0,05 τ en onder 0,05 bij 5 τ; referentie exact de opgegeven C/N0 plus het profiel; een getrackte daling van de NWPR C/N0 binnen 0,7 dB van een stap van 6 dB. Gemeten: S4 binnen 1,3 % van het doel, en een getrackte daling van 6,26 dB.
  • Detectiemonitors voor het IQ-pad (0.34.0 "Lab replay"). Nieuwe module iq::monitor, opdracht kshana iq monitor en binding kshana.iq_monitor(path, ...). Ze observeren een opname en rapporteren tijdreeksen plus gemarkeerde gebeurtenissen (start-, alarm- en eindtijden, piek, drempel). Ze detecteren en meten alleen; niets hier genereert een signaal.

    • Totaal vermogen / AGC: blokvermogen en de versterking die een ideale AGC zou toepassen; markeert stijgingen en dalingen.
    • Spectrum vóór correlatie: Welch-PSD per blok tegenover een aangeleerde basislijn. De drempel voor het overschot komt uit een doel voor valse alarmen. Ook complexe kurtosis en een pulsdetector. De pulsdetector telt de samples boven een drempel in elk blok en geeft een gebeurtenis wanneer de exacte binomiale bovenstaart van die telling onder pulse_pfa ligt (standaard 1e-4 per blok), niet wanneer een z-score een limiet passeert: bij de kleine verwachte aantallen van korte blokken is één enkele sample al meerdere sigma.
    • C/N0 per kanaal: twee eenzijdige CUSUM-veranderingsdetectoren (daling en stijging), gevoed met onafhankelijke schattingen (de stride wordt bepaald door het C/N0-venster van de lus).
    • SQM uit de correlatoren: delta (I_E − I_L)/I_P en verhouding (I_E + I_L)/(2 I_P), plus asymmetrietests uit extra correlatoren wanneer een kanaal die levert.
    • Reeksen van de lock-indicator: PLI en een frequentie-lockindicator uit opeenvolgende prompts, als ruwe signalen. Beslissingen over lock en verlies van lock blijven bij de toestandsmachine voor lock van de trackingengine.

    Eén streamingronde (iq::monitor::run::run_monitors) draait alles, met een TOML/JSON-instellingenbestand (MonitorConfig); de campagnerunner gebruikt hetzelfde toegangspunt. Alles MODELLED. Elke statistiek wordt met geseedde simulatie getoetst aan haar gesloten vorm (tests/iq_monitor.rs):

    • overschrijdingen van het blokvermogen tegenover de Gamma-staart;
    • gemiddelde kurtosis 2 en spreiding 2/√N;
    • pulsfractie e^{−t};
    • looplengtes van CUSUM tegenover de benadering van Siegmund (gemeten 330 en 8,46 samples tegenover 338 en 8,34);
    • de fasevergrendelingsindicator tegenover het gemiddelde van de Rician-fase;
    • bij een getrackt C/A-signaal wijken de spreidingen van SQM-delta en -verhouding ongeveer 6 % af van de eerste-orde gesloten vormen (gemeten 5,97 %; testdrempel 12 %).

    De formule voor valse alarmen van het spectrale overschot is een benadering; de gemeten frequentie was 1,3× de formule. End-to-end markeren de monitors:

    • een C/N0-stap van 6 dB (wijzigingstijd binnen één schatting);
    • een gereflecteerd pad dat midden in de opname verschijnt (verhoudingstest);
    • een signaaluitval (PLI daalt tijdens de uitval van 0,999 naar −0,3 en FLI van 0,93 naar 0,03);
    • een smalbandige toon en schaarse samples met hoge amplitude (spectrale, puls- en kurtosistests). Dit zijn generieke DSP-testinvoeren, geen interferentiemodellen.

Gewijzigd#

  • iq track/iq sweep streamen via de nieuwe sessie (zie Added).
    • --csv behoudt zijn 0,32-kolommen maar wordt nu gestreamd, zodat rijen van meerdere kanalen in tijdvolgorde door elkaar lopen in plaats van per kanaal gegroepeerd te zijn. --json behoudt zijn 0,32-vorm en houdt nog steeds elke epoch in het geheugen: gebruik --epochs voor lange opnames.
    • iq sweep meet de jitter over de updates in de tweede helft van de looptijd van de run (voorheen de tweede helft van het aantal updates), en zijn CSV/JSON krijgen een kolom design_hash.
    • De tracktabel krijgt een kolom final_state.
    • De gebruikstekst beweert niet langer dat iq track de front-endvlaggen accepteert; alleen iq acquire past ze toe.
    • acq_noncoherent en doppler_max van Python iq_track krijgen nu standaard None (de waarden van het ontwerp, 1 en 5000 Hz in het ingebouwde ontwerp). De epochs krijgen de early/late-correlatoren, carrier_phase_cycles, bit_edge, bit en state, en het resultaat krijgt design en events.

Opgelost#

  • De standaard acquisitiestap geeft Galileo E1-tracking geen restfout meer mee die de FLL niet kan binnentrekken. De stap 2 / (3 · N · T_code) laat bij de overdracht tot 1 / (3 · N · T_code) Dopplerfout over, maar de standaard FLL met twee kwadranten trekt slechts 1 / (4 T_track) binnen. Voor elke code van 4 ms of langer (N = 1), waaronder Galileo E1-B en E1-C, lag de restfout (83,3 Hz bij 4 ms) buiten de pull-in van 62,5 Hz en vergrendelde het tracken vals op +125 Hz, met een fasevergrendelingsindicator van 0,97 die dit verborg. De standaardstap wordt nu ook begrensd op 0.2 / T_track (kshana::iq::acq::default_step_hz), 0,8 van de pull-in, zodat de overdracht binnen de pull-in blijft, ook wanneer de naburige bin wint. (0,4 werd eerst geprobeerd: dat gaf 1 valse lock in 42 runs op E1-B, en een coherente GPS L1 C/A-zoekactie van 1 ms koos een bin 350 Hz ernaast en vergrendelde op +500 Hz; 0,25 en 0,2 hadden er in dezelfde runs geen.) Kosten: Galileo E1-B/E1-C gaan van bins van 166,7 Hz naar 50 Hz, 201 bins over ±5 kHz in plaats van 61; de codes van 1 ms (166,7 Hz, N = 4) zijn ongewijzigd. "auto" in een lusontwerp betekent dit; een expliciete doppler_step_hz of --doppler-step wordt gebruikt zoals geschreven, en iq acquire (geen overdracht aan tracking) behoudt de leerboekstap. De epochkop en --summary leggen nu per kanaal de bepaalde stap en lusbandbreedtes vast (resolved). De hash van het standaardontwerp is ongewijzigd. Wijziging in de uitvoer: detecties op codes van 4 ms en langer kunnen op andere Dopplerbins terechtkomen.

  • GPS L2C CM (20 ms lusupdate) houdt lock met het standaardontwerp. De standaard PLL van 15 Hz en FLL van 10 Hz hebben Bn · T van 0,3 en 0,2 bij T = 20 ms, en de lus verloor lock zelfs vanuit een perfecte start (PLI −0,08, M2M4 15,8 dB-Hz). De nieuwe ontwerpsleutel carrier.bn_t_max (standaard 0,1) begrenst de ruisbandbreedtes van PLL en FLL op bn_t_max / T wanneer de lusupdatetijd langer is dan 4 ms (Design::loop_config_for): 5 Hz en 5 Hz bij 20 ms, 10 Hz en 10 Hz bij 10 ms van BeiDou B1C; de codes van 1 ms en 4 ms behouden 15 en 10 Hz. Het geldt ook voor expliciete bandbreedtes; bn_t_max = 0 schakelt het uit. De sleutel wordt bij zijn standaardwaarde weggelaten uit de canonieke vorm, zodat de standaardhash ongewijzigd is; een ontwerp dat een andere waarde instelt heeft een andere hash. Bij 45 dB-Hz geeft L2C CM nu PLI 0,996, Dopplerfout 0,00 Hz en M2M4 42,71 dB-Hz. Bekend openstaand punt: de NWPR C/N0 leest daar 1,76 dB te laag (en 2,45 dB te laag op B1C bij 10 ms), zodat T5 van de matrix voor L2C een genegeerde bevinding blijft.

  • docs/assets/clock-ensemble-band.svg opnieuw gegenereerd: de vastgelegde figuur was verouderd ten opzichte van haar eigen scenario (een gegevenswijziging, geen herschildering). De grafiek werd op 2026-06-02 getekend uit scenarios/clock-ensemble.toml; twee dagen later stelde 67fed19e de flicker-FM-ondergrenzen in dat scenario in (quantum flicker_floor = 1e-16, CSAC flicker_floor = 2e-11) en de figuur werd nooit opnieuw getekend. Ze toonde de run van vóór de ondergrenzen: y-as 0 tot 47 ns, CSAC-uitval per run p95 van 10,5 tot 47,6 ns (gemiddelde 25,2 ns), klassieke holdover gemiddeld 4050 s. Het scenario zoals geleverd (en zoals de tutorial en de CLI-samenvatting al vermelden) geeft y-as 0 tot 407 ns, CSAC per run p95 40,8 tot 374,0 ns (gemiddelde 167,0 ns), klassieke holdover 844 s [220 tot 2130 s]; de specificatielijn van 20 ns ligt op dezelfde 20 ns op een ruwweg negen keer hogere as. De engine is ongewijzigd: de huidige engine op het scenariobestand van juni reproduceert de as van de oude figuur exact. De figuur wordt niet vermeld in de README of de documentatie.

Bekende beperkingen#

  • De NWPR C/N0 leest te laag bij hoge C/N0·T per prompt, en BOC(1.1) bij 5 MS/s verliest ongeveer 1 dB. NWPR is zuiver op ideale prompts, maar de eigen PLL-jitter van de lus kost ongeveer een gefitte 8 dB × Bn·T (één scène, vier punten: −0.24/−0.44/−0.77/−1,58 dB bij 1/2.5/5/10 Hz en 20 ms; ongeveer −1 dB bij de standaard bn_t_max = 0.1); M2M4 is ongevoelig. BeiDou B1C-data bij 5 MS/s verliest ook ongeveer 1 dB promptvermogen door bandbeperking (gebruik 10 MS/s of meer). Geen van beide is een defect van de schatter; de T5-rijen van de signaalmatrix voor GPS L2C en BeiDou B1C blijven genegeerde bevindingen met deze oorzaken.

[0.33.1] - 2026-10-08#

Beveiliging#

  • Grafiektekst en overname van grafieken in Studio verhard. Tekst die een scenario in een gegenereerde grafiek meeneemt wordt nu consistent geëscaped door één gedeelde routine, en de Studio neemt uit een grafiek alleen tekenmarkup over. De adresparameters, opzoekingen op soort-sleutel en scenario-ophalingen van de Studio zijn beperkt tot bekende waarden. Meegeleverde grafieken, vastgelegde resultaten en gepubliceerde getallen zijn ongewijzigd. Upgraden wordt aanbevolen voor iedereen die scenariobestanden uit niet-vertrouwde bronnen in de Studio opent of gegenereerde grafieken in webpagina's inbedt. Beveiligingsadvies: GHSA-h25h-cg9f-v2cg.

[0.33.0] - 2026-10-08#

Documentatie#

  • Het bereik van interferentie en spoofing in de IQ-laag, nauwkeurig vermeld. De vermeldingen van 0.31.0 en 0.32.0 hieronder zeggen dat de IQ-laag "geen synthese van interferentie- of spoofingsignalen" toevoegt. Dat geldt voor de IQ-laag zelf (iq::scene genereert uitsluitend legitieme GNSS-signalen), maar het las als een uitspraak over de hele engine, en dat is het niet: sinds 0.29.0 schrijft de sectie [iq] van de soort spectrum een SigMF-snapshot van haar analytische model met de geconfigureerde jammers erin (ruisachtige jammers bin voor bin, tonen en chirps als golfvormen), en spoof_capture telt in het geheugen een authentiek en een spooferreplicasignaal op om lusovername te testen (het samengestelde signaal wordt nooit weggeschreven). De engine bevat sinds 0.20.0 ook een software-GNSS-ontvanger (sdr: acquisitie en tracking; sinds 0.31.0 ook iq::acq en iq::track). Niets in Kshana zendt uit of stuurt radiohardware aan. De statusregel in de README, docs/POSITIONING.md, docs/SPECTRUM.md en de ontwerpnotities van de IQ-laag zeggen dit nu; de gepubliceerde vermeldingen zijn gelaten zoals ze waren gepubliceerd. Er verandert geen gedrag.
  • Bekende beperking: commensurabele bemonstering. Bij een samplesnelheid die een geheel of half geheel veelvoud van de chipsnelheid is, liggen de samples in elke chip op dezelfde chipfasen, en wordt de codediscriminator een trap. Op een synthetisch GPS L1 C/A-signaal van 45 dB-Hz met een afstand van 0.5 chip geeft 2,046 MHz (2 samples/chip) ≈ 0,09 chip (≈ 26 m) RMS-codefout en een bias van −0,09 chip, tegenover ≈ 0,003 chip bij een incommensurabele snelheid. De NWPR C/N0 leest daar ≈ 2,4 dB te laag. Bij 4,092 MHz hangt het af van de afstand en de codeDoppler. Bij 0,5 chip is het onschuldig bij 1500 Hz Doppler maar 2× met een bias van 0,011 chip bij 0 Hz, en bij 0,25 of 0,1 chip is het 8–10× de codefout. Carriertracking is niet aangetast. docs/design/iq-notes/receiver.md bevat de metingen.

Toegevoegd#

  • GNSS-IQ-laag op de MCP-server (Phase B.1). kshana-mcp krijgt zes tools die de laag kshana iq vanuit een agent aansturen: iq_signals (de geaccepteerde signaalnamen en de IQ-opzet), iq_info (een opname beschrijven), iq_scene (een scène met opgegeven profiel of broadcast-efemeride genereren, met het optionele kanaal op signaalniveau), iq_acquire (FFT-acquisitie, optioneel achter front-endtrappen), iq_track (verwerven, dan de DLL/PLL/FLL-bank) en iq_frontend (bandpass, notch, blanking, excisie, AGC, kwantisator). IQ-samples passeren het protocol nooit: elke tool neemt bestandspaden binnen één werkmap die met KSHANA_MCP_IQ_DIR wordt ingesteld (niet ingesteld laat de IQ-bestandstools uit en tast alle andere tools niet aan), weigert paden die buiten die map uitkomen en uitvoer die al bestaat tenzij overwrite is ingesteld, dwingt vóór enig werk een samplebudget per aanroep af (KSHANA_MCP_IQ_MAX_SAMPLES, standaard 50.000.000), weigert onbekende argumenten en antwoordt met een compacte JSON-samenvatting (detecties, C/N0, lock-toestand en elk weggeschreven bestand met zijn aantal bytes). Uitvoer per epoch gaat alleen naar bestanden die de aanroeper noemt. De tools draaien hetzelfde codepad als de CLI via een nieuwe publieke naad, kshana::iq::cli::execute, die het bericht van de CLI teruggeeft in plaats van het af te drukken (stdout is het MCP JSON-RPC-kanaal); iq::cli::build_code en iq::cli::signal_names zijn nu ook publiek. Alleen software en additief: de IQ-laag voegt geen synthese van interferentie of spoofers toe, er wordt nooit iets uitgezonden en er zijn geen nieuwe afhankelijkheden. server.json declareert de twee omgevingsvariabelen. Round-trip-tests in mcp/kshana-mcp/tests/iq_round_trip.rs genereren een korte scène met twee satellieten en toetsen de acquisitie aan het eigen truth-sidecarbestand van de scène, trackinglock en C/N0, de front-end, SigMF-uitvoer, het budget, padbeperking en de uitgeschakelde toestand.

  • De GNSS-IQ-laag in het validatieregister. Een vooraf vastgelegde kruiscontrole met gps-sdr-sim (een onafhankelijke GPS L1 C/A-basisbandgenerator, MIT, commit 28ca29a6) maakt nu deel uit van de altijd actieve testsuite (tests/iq_gpssdrsim_cross_generator.rs). De vastgelegde referentie-uitvoer (tests/fixtures/iq_gpssdrsim_cross_generator/: 20 ms aan eigen 8-bit-I/Q van gps-sdr-sim, haar kanaallijst en de kanaaltoestand erachter uit een harnas dat tegen dezelfde build is gelinkt) wordt opnieuw gegenereerd door scripts/gen_iq_gpssdrsim_ref.sh. Op testtijd is geen netwerk of extern hulpmiddel nodig. Er worden twee registerrijen toegevoegd (251 rijen: 124 onafhankelijk getoetst, 123 berekend uit een model, 4 van de partner):

    • Signaalgeometrie van een GNSS-IQ-scène tegenover een onafhankelijke basisbandgenerator: Onafhankelijk getoetst. De referentie van de scène (zichtbare set, pseudorange, codefase, Doppler, kijkhoeken) voor een scène met broadcast-efemeride komt op alle 11 kanalen overeen met de kanaaltoestand van gps-sdr-sim: slechtste 1,6 mm, 5.5e-6 chip, 7.4e-5 Hz, 4e-9 graad, tegenover drempels van 0,05 m, 2e-4 chip, 0,02 Hz en 1e-4 graad die vóór de run zijn vastgelegd.
    • GNSS-IQ-acquisitie op onafhankelijk gegenereerde I/Q-samples: Berekend uit een model, met een bevinding. iq::acq vindt elke gesimuleerde satelliet in de samples van gps-sdr-sim binnen de vastgelegde drempels (codefase binnen 0,195 chip, Doppler binnen 72 Hz). De vastgelegde drempel "geen andere PRN gedetecteerd" faalt echter: op de ruisvrije uitvoer van gps-sdr-sim wordt de drempel voor Gaussische ruis door de kruiscorrelatie van de andere satellieten overschreden voor alle 21 afwezige PRN's. De strikte test wordt behouden, genegeerd met de bevinding, en een vastgezette test legt haar vast. Er verandert geen enginecode of publieke API. De I/Q van de samples wordt niet sample voor sample vergeleken: de gehele-getallen-sinustabel van gps-sdr-sim, de versterkingen, de beginfase nul van de draaggolf en de afgekapte LNAV-velden zijn geen grootheden waarover een ontvanger overeenstemming nodig heeft. De vergelijking wordt gemaakt op de waarnemingsgrootheden die een ontvanger meet.

Gewijzigd#

  • iq track draagt standaard over vanuit een acquisitie van ≈4 ms (gedragswijziging). De acquisitie die elk trackingkanaal initialiseert integreert nu ceil(4 ms / T_code) codeperiodes coherent in plaats van één, waarbij T_code de volledige periode van de code is (primaire maal secundaire lengte voor een gelaagde code, de eenheid waarover de acquisitie integreert). De ongelaagde codes van 1 ms (GPS L1 C/A, BeiDou B1I, GLONASS L1OF) zoeken nu 4 periodes (4 ms), zodat de standaard Dopplerstap 2 / (3 · N · T_code) ~167 Hz is in plaats van ~667 Hz. Elke code waarvan de volledige periode al 4 ms of langer is, houdt 1 periode: Galileo E1-B (4 ms), BeiDou B1C (10 ms), en de gelaagde GPS L5-I/L5-Q, Galileo E5a-I/E5a-Q en E1-C (10 tot 100 ms met hun overlaycodes), en GPS L2C. Elk signaal integreert daardoor minstens ~4 ms. Een zoekactie van één periode kon een kanaal tot ~333 Hz ernaast overdragen, buiten de pull-in van de FLL, waarna het een valse lock ~500 Hz verderop trackte terwijl het een schone track meldde. Op een geseede sweep van 180 GPS L1 C/A-kanalen (Doppler over ±5 kHz, 38 tot 47 dB-Hz, de helft met navigatiedata; docs/design/evidence/iq-track-acq-default/, opnieuw uitvoerbaar) dalen valse locks van 27 van 180 naar 1 van 180 en gemiste acquisities van 102 naar 11, voor ~40 ms extra zoektijd per PRN op GPS L1 (11 → 52 ms). De ene resterende valse lock zit op 38 dB-Hz, 36 Hz ernaast. Elk oppervlak komt overeen: kshana iq track en kshana iq sweep (--acq-coherent), Python kshana.iq_track (acq_coherent=None is nu auto; stub bijgewerkt) en de MCP-tool iq_track. Gebruikers die op de oude standaard vertrouwden kunnen acq_coherent=1 (--acq-coherent 1) opgeven. De eigen standaard van kshana iq acquire voor --coherent blijft 1. Nieuw publiek: iq::acq::auto_coherent_periods en iq::acq::AUTO_COHERENT_S; regressietest tests/iq_cli.rs::track_default_handoff_does_not_false_lock_where_one_period_did.
  • Elke gegenereerde afbeelding volgt nu het Observatory-thema van de site: de bytes van elke grafiek veranderen. Dit is een bewuste herziening van alleen de gepubliceerde figuren, kleuren en lettertypen; geen enkele uitgezette waarde, coördinaat of label is verschoven. De *.chart.svg van elk scenario (en dus de grafiekexports van de Studio en de demografieken in de README), de run-rapport-HTML (*.report.html), de tijdlijnanimatie (--animate), de HTML-pagina's voor scenarioresultaten en studies, de validatiesamenvatting en de figuren en diagrammen in de documentatie gebruikten het warm-donkere palet van juli (#0c0b08 ondergrond, #e0bd84 goud) en een warm-papieren rapportthema. Ze nemen nu elke kleur en elk lettertype uit één module, src/palette.rs, die web/theme.css weerspiegelt: grafieken worden instrument-donker getekend op de Observatory-ondergrond (#060A14) in de Geist-lettertypestack; het rapport, de animatiespeler en de resultaatpagina's volgen de voorkeur voor licht/donker van de kijker met de lichte en donkere tokens van Observatory. De zes faaldomeinen houden elk één kleur (interferentie koraal, spoofing magenta, tijdsynchronisatie blauw, banen cyaan, integriteit limoen, navigatie amber), en de bewijsniveaus lezen als onafhankelijk getoetst limoen, berekend uit een model amber, van de partner magenta. De waterfallverlopen behouden hun perceptuele (inferno-)volgorde, opnieuw verankerd op de nieuwe ondergrond.
    • tests/palette_sync.rs houdt de module in beide thema's gelijk aan web/theme.css, controleert dat docs/assets/palette.json en docs/diagrams/mermaid-config.json (beide gegenereerd uit de module, voor de Python-figuurhulpmiddelen en mermaid-cli) actueel zijn, en faalt als er een hex-kleurliteral in src/ buiten het palet voorkomt.
    • tests/published_figures_still_reproduce.rs krijgt een derde diagnose, "alleen kleuren en lettertypen zijn verschoven", zodat een palettenrevisie te onderscheiden is van een verschoven uitgezette waarde. Elke opnieuw gerenderde README-grafiek is onder die normaliseerder gelijk bevonden aan haar voorganger.
    • tools/gen_validation_figures.py leest het palet en genereert nu ook de drie resultaatfiguren van de README die geen vastgelegde generator hadden (domain-coverage-map, scenario-fom, sgp4-regime-bars), met echte tekstelementen, uit web/capabilities.json, het resultaat clock-holdover en tests/fixtures/sgp4_comparison.md. tools/gen_readme_assets.py leest hetzelfde palet, wat zijn afwijking van de site in het lichte thema corrigeert. De waarden van sgp4-regime-bars zijn de worstcasekolom kshana↔ref van die fixture (7.31e-9, 8.05e-9, 8.18e-9 en 4.12e-6 km), ongewijzigd ten opzichte van de Matplotlib-figuur, en tests/figures_doc_sync.rs faalt nu als de vastgelegde figuur en de fixture niet overeenkomen.
  • docs/assets/figures/domain-coverage-map bijgewerkt naar actuele gegevens (een gegevenswijziging, geen herschildering). De figuur vermeldde 28 mogelijkheden in 8 domeinen (11 onafhankelijk getoetst, 17 berekend uit een model), verouderd ten opzichte van haar eigen vermelde bron; nu getekend door haar nieuwe generator uit web/capabilities.json, toont ze 46 mogelijkheden in 8 domeinen (17 onafhankelijk getoetst, 29 berekend uit een model).

Opgelost#

  • De Q van CW/smalbandige jammers is nu 1,0, niet 1,5. De leerboekwaarde voor een toon op de draaggolf is 1 (een toon behoudt de spectrale piek van het signaal, κ = T_c, Q = 1/(R_c κ)); de oude 1,5 maakte een toon minder schadelijk dan breedbandruis bij gelijke J/S. Wijziging in de uitvoer: ongeveer −1,8 dB effectieve C/N0 onder CW/smalbandige jammers bij hoge J/S in de soorten jamming, lunar-jamming en interop (de toon van het meegeleverde voorbeeld spectrum: 17,98 dB-Hz uit de tabel, was 19,74). De Q van breedband blijft 1,0 (conservatief, ongeveer 3 dB onder het leerboek-~2) in afwachting van de beoordeling van 0,34. Stel q_override in om de oude 1,5 te behouden.

  • Integeruitvoer van kshana iq scene gebruikt het integerbereik. Met ruis van eenheidsvermogen en een schrijverschaal van 1 kwamen scènes in ci8/ci16 uit op ongeveer {-1, 0, 1} en lagen bij scènes met 2 bits de drempels op 2,8 sigma. Integerformaten worden nu zo geschaald dat de verwachte RMS per component een kwart van de volle schaal is (31,75 LSB in ci8, 8191,75 in ci16) of 2 LSB bij 2 bits. De schaal en het aantal afgekapte elementen worden afgedrukt en naar het sidecarbestand geschreven. Floatuitvoer is ongewijzigd.

  • Acht fixturepins in zeven testbestanden falen op macOS niet meer door verschillen in het laatste bit (onderdeel van issue #36). De pins die controleren dat de engine de vastgelegde invoer van een onafhankelijke referentie (Jacobianen, een toestandstabel, lanceerazimuts) nog steeds opbouwt, vergeleken bit voor bit en faalden op macOS arm64 met 2 tot enkele duizenden eenheden in de laatste plaats. Ze vergelijken nu binnen 1e-12 van een schaal uit de fixture; gehele getallen, sleutels en lengtes worden nog exact vergeleken, en een mutatietest toont dat een relatieve wijziging van 1e-6 nog steeds faalt. De pin voor het lanceerazimut vergelijkt sin az en de stijgende/dalende tak in plaats van het azimut zelf, omdat asin één ulp van zijn argument versterkt tot ongeveer 3e-9 rad waar een inclinatie gelijk is aan de colatitude van een locatie. Er is geen tolerantie van een onafhankelijke referentie of vooraf vastgelegde drempel gewijzigd. Twee tests (lunaire gezamenlijke baanbepaling, lunaire waarneembaarheid) vallen er niet onder: op macOS verschuiven hun vooraf vastgelegde vergelijkingen zelf, en dat wordt aan een vervolg overgelaten.

  • kshana iq track en kshana iq sweep passen de front-endvlaggen toe. De gebruikstekst adverteerde --bandpass/--notch/--blank/--excise/--agc/--bits bij track, maar track en sweep bouwden de keten nooit op: de vlaggen werden stilzwijgend genegeerd, en een vlag zonder waarde zoals --notch slikte de vlag erna in. Beide opdrachten verwerken ze nu zoals iq acquire dat doet en plaatsen een verse front-endketen vóór de acquisitieronde en de trackingronde. De uitvoer is gelijk aan het uitvoeren van de opdracht op het bestand dat iq frontend voor dezelfde vlaggen schrijft.

  • IQ-scènedata wordt per signaal geplaatst. kshana iq scene --data (en NavData::Seeded) zetten bits van 50 bit/s op elk signaal, pilots inbegrepen, en op Galileo en BeiDou met de GPS-LNAV-snelheid. Data volgt nu de eigen symbooltiming van elk signaal, vastgelegd door de nieuwe SpreadingCode::data_modulation() (DataModulation, ingesteld door elke constructor in iq::signals). Dat is 10 ms bij L5-I5, 4 ms bij E1-B, 2 ms bij BeiDou B1I GEO (D2), en bits van 20 ms met een meander van 10 ms bij GLONASS L1OF. Data wordt geweigerd op pilots, op GPS L2C als één CM/CL-stroom, en NavData::Lnav op alles behalve L1 C/A. Eigen codes behouden standaard de vorige timing van 20 ms. Een programmatische Scene die NavData::Lnav vroeg op een andere code dan L1 C/A, of NavData::Seeded op een pilot, genereerde vroeger stilzwijgend en geeft nu bij de eerste leesbewerking een fout.

  • GLONASS L1OF-kanalen worden verworven en getrackt op hun eigen FDMA-draaggolf. iq::acq::acquire en de trackingkanalen mixten elke code alleen vanaf if_hz naar beneden. In een GLONASS-opname met meerdere kanalen vond een zoekactie naar kanaal +3 daarom het signaal van kanaal 0 (alle kanalen delen één rangingcode) en keek nooit 1,6875 MHz hoger. Beide gebruiken nu SampleSpec::baseband_hz(carrier) = if_hz + (carrier − center_hz). De draaggolfterm is nul voor elke opname die op de eigen draaggolf van het signaal is gecentreerd en wordt weggelaten wanneer het midden onbekend is, zodat CDMA-verwerking ongewijzigd is. Als u het oude gedrag hebt omzeild door carrier − center in de if_hz van het sidecarbestand te verwerken, verwijder die term dan: de offset wordt nu toegepast vanuit de draaggolf en het midden, dus laten staan past hem tweemaal toe. Bekende beperking, hier ongewijzigd: een GLONASS-scène identificeert elke satelliet aan de hand van zijn frequentiekanaal k, en de satelliet-id van u32 laat een negatief kanaal omslaan. Het truth-sidecarbestand schrijft k = -7 als sat_id 4294967289 (k + 2^32). Lees het terug als k met een cast naar i32.

[0.32.0] - 2026-10-05#

Toegevoegd#

  • GNSS-IQ-laag op de CLI en in Python (0.32.0 Phase A). De bestaande module iq is nu bruikbaar zonder Rust te schrijven. Vijf nieuwe opdrachten van kshana iq voegen zich bij de groep voor gegevensverwerking: scene genereert een lange IQ-scène met meerdere satellieten naar een bestand met een truth-sidecarbestand; acquire voert FFT-acquisitie van een of meer PRN's uit over een opname en rapporteert elke detectie (PRN, Doppler, codefase, statistiek, drempel); track verwerft en laat dan de DLL/PLL/FLL-bank over een opname lopen en geeft tracking-uitvoer per epoch (CSV/JSON) met instelbare lusbandbreedtes, integratietijd en correlatorafstand; sweep speelt één opname af over meerdere lusontwerpen en rapporteert de resulterende jitter- en lockmaten per ontwerp; en labfit fit het model voor verlies van lock van de trackinglus aan een tijdlijn van ontvangervertrouwen. Dezelfde kern is beschikbaar in Python (kshana.iq_scene, iq_acquire, iq_track, iq_labfit, iq_signals), met NumPy-vriendelijke lijsten en dicts als resultaat. Alleen software en additief: geen nieuwe afhankelijkheden, geen zenden, geen synthese van interferentie- of spoofingsignalen; de engine, acquisitie, tracking en lusontwerpen zijn die van de crate zelf, zodat een CLI- of Python-aanroeper dezelfde bits krijgt als de Rust-tests. Nieuwe module iq::cli; het eigen truth-sidecarbestand van de scène is de onafhankelijke referentie in tests/iq_cli.rs (acquisitie herstelt elke geïnjecteerde codefase en Doppler, tracking convergeert naar de geïnjecteerde Doppler). Er verandert geen gepubliceerd aantal scenariosoorten of rij van de verificatiematrix.
  • Resterende mogelijkheden van de GNSS-IQ-bibliotheek op de CLI van iq en in Python (0.32.0 Phase A.2). Bouwt voort op Phase A en ontsluit de rest van de laag iq zonder Rust te schrijven:
    • Propagatiekanaal op iq scene (en de Python-functie iq_scene): een eerste-orde ionosfeer (--iono-stec/--iono-vtec of --iono-klobuchar), de Saastamoinen/Niell-troposfeer (--tropo), het Cornell-scintillatiemodel (--s4, --scint-tau0, --sigma-phi), spiegelend multipath via de grond (--multipath-height/--multipath-ground), het land-mobiele kanaal met drie toestanden (--land-mobile) en een blok zonder zichtlijn (--nlos) werken op elke satelliet via een nieuwe crate-interne brug (iq::channel::SceneChannelAdapter) die de absolute paden van de kanaalmodellen omzet naar de vorm van de scène, namelijk het overschot boven de geometrie.
    • SigMF-uitvoer op iq scene (--format sigmf): schrijft de samples als een paar .sigmf-data/.sigmf-meta met een capture en annotaties per satelliet; acquire/track lezen SigMF al, zodat een scène een round trip maakt.
    • Front-end-DSP: een nieuwe opdracht iq frontend <in> <out> en dezelfde vlaggen op acquire/track (--bandpass, --notch, --blank, --excise, --agc, --bits 1/2/3/8/14) draaien de trappen van iq::frontend (bandpass-FIR, adaptieve notch, pulsblanking, excisie in het frequentiedomein, AGC, kwantisator); in Python gespiegeld als iq_frontend.
    • Scènes met broadcast-efemeride: iq scene --nav <rinex_nav> --rx-pos lat,lon,alt (met --start/--window/--prn) plaatst elke gezonde GPS-satelliet op zijn ware broadcastgeometrie met de RINEX-lezer van de engine, zodat het truth-sidecarbestand de werkelijke afstand, Doppler en codefase per satelliet bevat; in Python gespiegeld als iq_scene_broadcast. Alleen software en additief: geen nieuwe afhankelijkheden, geen zenden, geen synthese van interferentie- of spoofingsignalen (kanaalpropagatie-effecten werken alleen op het legitieme signaal). Elke numerieke bewering wordt getoetst aan een onafhankelijke referentie (gesloten vorm of geïnjecteerde referentie) in de unittests van kanaal en front-end en in tests/iq_cli.rs.

[0.31.0] - 2026-10-04#

Toegevoegd#

  • GNSS-IQ-laag: simulatie op signaalniveau en softwareontvangerverwerking. Een nieuwe module iq tilt Kshana van een front-end voor één satelliet en korte blokken op L1 C/A naar een volledige laag op signaalniveau, bereikbaar via de opdrachtgroep kshana iq. Ze genereert lange ruwe IQ-scènes met meerdere satellieten met een truth-sidecarbestand per epoch (iq::scene); past propagatie toe op signaalniveau, namelijk ionosfeer met code-draaggolfdivergentie, troposfeer, amplitude- en fasescintillatie (Cornell-model), Fresnel-multipath en een land-mobiel kanaal met drie toestanden, met non-line-of-sight (iq::channel); verwerft en trackt met FFT-acquisitie en een DLL/PLL/FLL-bank met meerdere kanalen, waarbij één opname door veel lusontwerpen wordt afgespeeld (iq::acq, iq::track); modelleert de front-end, met FIR/IIR-filtering, kwantisering van 1 tot 14 bits, AGC, notch, pulsblanking en excisie in het frequentiedomein (iq::frontend); streamt grote opgenomen datasets met begrensd geheugen, met int8-, int16-, float32-, gepakte 2-bits- en echte-IF-formaten, SigMF met meerdere bestanden, resampling, een datasetinventaris met SHA-256 per bestand en een batchrunner (iq::io); voegt spreidingscodes toe voor GPS L5/L2C, Galileo E1 (CBOC, echte ICD-geheugencodes) en E5a, BeiDou B1C/B1I en GLONASS L1OF, elk getoetst aan zijn interface control document (iq::signals); en fit het model voor verlies van lock van de trackinglus aan het waargenomen gedrag van een echte ontvanger in labruns, met hold-outfout waarbij één run wordt weggelaten en extrapolatie gelabeld als voorspelling (iq::labfit). Elke numerieke bewering wordt getoetst aan een onafhankelijke referentie (een ICD-tabel, een gesloten vorm, of een onafhankelijke ontvanger die de geïnjecteerde referentie herstelt); de fysieke kanaal- en lusmodellen blijven MODELLED. Dit is alleen een softwarelaag: ze schrijft IQ-bestanden voor softwareontvangers en synthetiseert geen interferentie- of spoofingsignalen en stuurt geen radiohardware aan. Er verandert geen gepubliceerd aantal scenariosoorten of rij van de verificatiematrix. Ontwerp: docs/design/GNSS-IQ-PLAN.md.
  • Ontvangervertrouwen: een log van een echte GNSS-ontvanger beoordelen. kshana receiver-trust <scenario.toml> leest een u-blox-UBX-, RINEX 3- (met een optioneel broadcast-navigatiebestand), Android GnssLogger- of NMEA 0183-log in tot één tijdgetagde tijdlijn en laat er vertrouwensmonitors op draaien: daling van de draaggolf-ruisdichtheid (C/N0), verlies van lock, automatische versterkingsregeling (AGC), de jamming-indicator van u-blox, positiesprong en, met RINEX en navigatie, de eigen positiebepaling met één punt van de engine met parity-RAIM (receiver autonomous integrity monitoring) en de klokondersteunde monitor. Elke epoch is nominaal, degraded of untrusted, en het resultaat zegt wanneer en waarom. Gebeurtenissen en voorspelde C/N0-dalingen die in het scenario zijn vermeld, worden gescoord tegen toleranties die in hetzelfde bestand staan: gedetecteerd, te laat of gemist, en overeenkomend of afwijkend. De uitvoer bestaat uit de resultaat-JSON, een CSV per epoch en een grafiek; het resultaat bevat de SHA-256 van de log en elke drempel. Ook bereikbaar vanuit Python (kshana.receiver_trust), het WebAssembly-pakket (receiver_trust, logs inline) en de nieuwe tool assess_receiver_log van de Model Context Protocol-server (MCP). Gids: docs/RECEIVER-TRUST.md; voorbeeld: examples/receiver-trust/. Op de spoofinglogs van JammerTest 2024 reproduceert het enginepad het eerste alarm van de vooraf vastgelegde pijplijn van de onafhankelijke referentie bij elk gepubliceerd begin (tests/receiver_trust_jammertest.rs). De monitors blijven MODELLED; er verandert geen rij van de verificatiematrix.

0.30.0 - 2026-10-03#

Een minor release. Validatieronden 2 en wave-1-pakketten brengen de verificatiematrix van 223 rijen (93 VALIDATED) bij 0.29.3 naar 249 rijen (123 VALIDATED, 122 MODELLED, 4 PARTNER); elke promotie is getoetst aan een onafhankelijke referentie met een tolerantie die vóór de run is vastgelegd, en elke afwijking wordt als bevinding gepubliceerd. Nieuw: een native NAIF-kernellezer en DE440-pad, één onafhankelijk getoetst pad voor SGP4-naar-ITRS-propagatie en tijd, een gemeten klokbibliotheek, een LunaNet AFS-referentiegenerator, oplossers met uitgebreide precisie en square-root information, en echte lunaire IQ-verwerking op LuGRE-data. Gepubliceerde getallen die zijn verschoven staan hieronder als revisies.

Zevenentwintig rijen van de verificatiematrix worden VALIDATED nadat een onafhankelijke referentie overeenstemde binnen een tolerantie die vóór de eerste vergelijking was vastgelegd (de promotieregel in docs/VALIDATION.md): tien in een eerste validatieronde en zeventien in een tweede. Eenenvijftig MODELLED-rijen zijn in de eerste ronde aan een externe onafhankelijke referentie voorgelegd en de overige routeerbare rijen in de tweede; elke afwijking wordt hieronder als bevinding vastgelegd in plaats van weggeregeld. Drie rijen zijn gesplitst zodat een onafhankelijk getoetst deel geen niet-getoetste rest meedraagt, waardoor de matrix van 223 naar 226 rijen gaat; de sindsdien ingevoegde validatiepakketten brengen haar op 249. De aantallen zijn gelezen uit de gegenereerde docs/VERIFICATION-MATRIX.md.

0.29.0 na ronde 1 Niet uitgebracht
Rijen van de verificatiematrix 223 223 249
waarvan VALIDATED tegen een externe onafhankelijke referentie 83 93 123
waarvan MODELLED 136 126 122
waarvan PARTNER 4 4 4
Afkortingen in deze vermelding
Afkorting Betekenis
ADD, ARAIM, MAAST Airborne Design Document (van ARAIM); advanced receiver autonomous integrity monitoring; de Matlab Algorithm Availability Simulation Tool van Stanford University
ADEV, VRW, ARW Allan-deviatie; velocity random walk (snelheidsrandomwalk); angle random walk (hoekrandomwalk)
ANISE, SPICE, NAIF, PCK een opensource-toolkit voor astrodynamica (Nyx Space); de toolkit Spacecraft, Planet, Instrument, C-matrix, Events van NASA, afkomstig van de Navigation and Ancillary Information Facility; kernel met planetaire constanten
BCRS, TDB, TT Barycentric Celestial Reference System; Barycentric Dynamical Time; Terrestrial Time
BIPM, UTC(k) Internationaal Bureau voor Maten en Gewichten; de realisatie van gecoördineerde wereldtijd (UTC) door een laboratorium
CCSDS, OEM, LTC, TCL Consultative Committee for Space Data Systems; Orbit Ephemeris Message; lunaire tijdsystemen die in het veld TIME_SYSTEM van het bericht staan
CRLB Cramér–Rao-ondergrens
CW relatieve beweging volgens Clohessy–Wiltshire
DE440 Development Ephemeris 440 van het Jet Propulsion Laboratory
DOP, PDOP dilution of precision; position dilution of precision
EKF, UKF, INS, GNSS, IMU extended Kalman filter; unscented Kalman filter; inertiaal navigatiesysteem; globaal navigatiesatellietsysteem; inertiële meeteenheid
EMT, VPL, HPL effective monitor threshold; verticaal en horizontaal beschermingsniveau
EOP, IERS, PCC, MAE aardoriëntatieparameters; International Earth Rotation and Reference Systems Service; Prediction Comparison Campaign; gemiddelde absolute fout
ERFA, SOFA Essential Routines for Fundamental Astronomy; Standards of Fundamental Astronomy
GMAT de General Mission Analysis Tool van NASA
NTN, SSB niet-terrestrisch netwerk (3GPP); synchronisatiesignaalblok
IGS, ILRS, ITRF2020 International GNSS Service; International Laser Ranging Service; International Terrestrial Reference Frame 2020
ILS, LAMBDA geheeltallige kleinste kwadraten; Least-squares AMBiguity Decorrelation Adjustment
ISB bias tussen systemen
LEO lage aardbaan
MHSS, PL, TPL multiple-hypothesis solution separation; beschermingsniveau; beschermingsniveau voor tijdsynchronisatie
PSD, IQ, SigMF vermogensspectrale dichtheid; in-fase- en quadratuursamples; Signal Metadata Format
QPN quantumprojectieruis
RAIM receiver autonomous integrity monitoring
SBAS, WAAS, DFMC, GEO satellietgebaseerd augmentatiesysteem; het Amerikaanse Wide Area Augmentation System; dubbelfrequent met meerdere constellaties; een geostationaire SBAS-satelliet
RMS, SISRE kwadratisch gemiddelde; afstandsfout van het signaal in de ruimte
RTKLIB een opensource-bibliotheek voor GNSS-positiebepaling
TCXO temperatuurgecompenseerde kristaloscillator
VLBI interferometrie met zeer lange basislijn

Getoetst#

Elke rij hieronder noemt haar soort onafhankelijke referentie (Library: een onafhankelijke bibliotheek van derden die een eenduidig gedefinieerde grootheid berekent; Measured: echte gemeten data; P2: een onafhankelijke numerieke bibliotheek die een lineaire-algebragrootheid op vastgelegde invoer herberekent), de onafhankelijke referentie, de tolerantie die vóór de run is vastgelegd, en het resultaat. Elke promotie is opnieuw uitgevoerd door een tweede beoordelaar, die de fixture byte voor byte opnieuw genereerde en aantoonde dat een bewuste mutatie van de engine de test rood maakt.

  • GNSS/INS-sensorfusie (Library), beperkt tot het losgekoppelde EKF met 15 foutentoestanden: NaveGo v1.4 (LGPL-3.0, uitgevoerd onder GNU Octave) op zijn eigen echte Ekinox IMU/GNSS-rit. De RMS van Kshana voor horizontaal, verticaal en positie-innovatie is 0,912, 0,940 en 0,861 van die van NaveGo (drempel 1,2) en zijn gemiddelde genormaliseerde innovatie is 0,395 (drempel 1,5). GNSS is gedurende de hele rit aanwezig, zodat geen uitval is getest. Het strak gekoppelde UKF en het gekoppelde klokfilter vallen buiten de bewering.
  • 3-DOF-attitude en foutbudget voor richting (Library), beperkt tot de piek van het zwaartekrachtgradiënt-koppel: Basilisk 2.9.1 GravityGradientEffector, 40 gevallen, binnen 1e-12 relatief (slechtste 2.1e-15). Het RSS-richtbudget is een som van door de aanroeper geleverde getallen en valt erbuiten.
  • Lunaire gezamenlijke geometrie voor communicatie en navigatie (Library), beperkt tot locatieplaatsing, azimut, elevatie en afstand: ANISE 0.10.2, 768 samples, binnen 1e-6 graad en 1 mm (slechtste 2.2e-12 graad en 5.6e-9 m). De parameter voor rangingnauwkeurigheid is een ontwerpinvoer buiten de bewering.
  • Krachtvrije attitudedynamica van een star lichaam (Library): de Basilisk 2.9.1-ruimtevaartuighub, 1e4 s op twee algemene traagheden, quaternion en rates binnen 1e-9 (slechtste 3.3e-11 en 3.4e-12 rad/s).
  • Oplossing van geheeltallige ambiguïteit van de GNSS-draaggolffase (LAMBDA) (Library), beperkt tot de ILS-oplossing en haar twee beste normen: RTKLIB v2.4.2-p13 lambda(), 300 covarianties, 0 geheeltallige afwijkingen, normen binnen 1e-9 relatief (slechtste 5.6e-13). Het bootstrapped succespercentage blijft alleen intern gecontroleerd.
  • Samengesteld PL voor tijdsynchronisatie, scalaire MHSS (P2): numpy 2.3.5 en scipy 1.18.1 op 300 vastgelegde invoeren, PL binnen 1e-9 relatief (slechtste 1.2e-10), aandrijvende deelverzameling identiek.
  • GLS-whitening van common mode en de Mahalanobis-identiteit (P2): numpy 2.3.5 LAPACK op 201 vastgelegde covarianties, binnen 1e-12 relatief (slechtste 7.9e-16); conditiegetallen tot 19,3.
  • DE440-leverancier van de lunaire hoofdasoriëntatie (Library): SPICE pxform op de binaire PCK bij 2.000 epochs buiten de knooppunten, binnen 1.7e-5 rad (slechtste 1.7e-6 rad, ongeveer 3 m aan het oppervlak), na de fix die onder "Fixed" staat.
  • SigMF-opname als invoer en uitvoer, en Welch-spectra (Library), beperkt tot lezen en schrijven van SigMF en welch_psd: scipy 1.18.1 signal.welch binnen 1e-12 relatief per bin (slechtste 6.0e-14); sigmf-python 1.13.0-opnamen bit voor bit identiek gedecodeerd; de metadata van de crate geldig tegen het SigMF v1.2.6-schema. IQ-synthese en haar modelvergelijkingen vallen erbuiten.
  • LEO-fitter voor broadcast-efemeride en SISRE tegenover fitinterval (Measured), beperkt tot de Kepler-fit met 16 parameters en haar SISRE die alleen de baan omvat: precieze ITSG-banen van TU Graz van vier satellieten tegenover de statistieken van Liu et al. 2025, componenten binnen 1.5x (0,804 tot 1,087) en SISRE binnen 1.5x (0,716 tot 0,809).

Bevindingen#

De onafhankelijke referentie week af van deze rijen, dus ze blijven MODELLED. Elke bevinding is ook in de referentietekst van de rij geschreven (en dus in docs/MODELLED-RATIONALE.md), met een test die haar vastzet.

  • Schatting van de klokstaat aan boord: op achtergehouden IGS-klokken van 11 GPS Block IIF-satellieten is het filter met drie toestanden één stap vooruit consistent maar overmoedig na een uur bij 9 van 11 (periodieke en flickertermen zitten niet in het model).
  • Spoofingdetectie: bij JammerTest 2024 sloeg geen enkele monitor op waarnemingsniveau alarm binnen 10 s na een van de 8 gepubliceerde begintijden, en drie vensters vóór het begin bevatten valse alarmen.
  • Beschermingsniveau voor tijdsynchronisatie onder spoofing: de gemeten niet-gedetecteerde tijdfout overschrijdt het TPL bij 3 van 8 gedetecteerde begintijden (1.9x tot 5.3x); een klokkalibratie van 60 s dekt de wander van de TCXO van de ontvanger niet.
  • Geometrie van lanceervenster en stijgfase: tegenover Orekit 12,2 komt de geometrie op afrondingen overeen, maar de locatiesnelheid door aardrotatie mist 1e-6 relatief op 62,9 graden breedte (1.12e-6, de poolbeweging die het sferische model weglaat). Ronde 2: de snelheid met ware pool en een epoch komt overeen, de standaardsnelheid zonder epoch mist nog steeds (zie hieronder).
  • Ballistische reentry-corridor (Allen–Eggers): de voorspelde piekvertraging voor de Stardust-entry is 61,8 g tegenover de gereconstrueerde 32,89 g (+88 %, tolerantie 15 %).
  • Gezamenlijke fout in UT1 en poolbeweging: tegenover de nauwkeurigheidsformule die in 178 nummers van IERS Bulletin A is gedrukt, komt de pool binnen 1.5x overeen maar UT1 niet (0,48 bij 10 dagen, 1,59 bij 40 dagen). Achterhaald in ronde 2: de rij is nu VALIDATED (zie hieronder).
  • Offline standaardinvoer voor aardoriëntatie: astropy bevestigt de rijtelling, maar de 12 rijen die de crate Bulletin A-voorspellingen noemt, zijn gemarkeerd als gemeten (I), niet als voorspeld (P). De overeenstemmingscijfers van de rij met de operationele voorspeller waren dus tegen gemeten rijen. Achterhaald in ronde 2: de engine classificeert rijen op de vlag en de rij is VALIDATED.
  • Voorspellingsfout van aardoriëntatie in operationele stijl: de UT1-fout van de voorspeller is 2.4x tot 12.6x die van Bulletin A bij 1 tot 10 dagen en 5,32 ms bij 10 dagen, buiten het bereik van 0,36 tot 3,13 ms van de 2e EOP PCC.
  • Maangeodetische VLBI: tegen de lichttijden van ANISE via DE440 ligt geen enkele vertraging binnen 1 ps; het grootste verschil is 24 µs, grotendeels door het analytische maanmiddelpunt (ongeveer 200 km van DE440). Ronde 2: het kernelpad is VALIDATED in een eigen rij; dit analytische pad blijft MODELLED.
  • Interoperabiliteitsexport voor de Maan: Orekit 12,2 weigert de tijdsystemen LTC en TCL, dus de uitwisseling van de maan-OEM-bestanden met een tweede lezer is niet vastgesteld.
  • Relatieve beweging van Clohessy–Wiltshire: tegen de niet-lineaire beweging van Orekit op 100 m is het verschil 1,2 tot 6,3 mm, boven 1 mm; het schaalt als de weggelaten tweede-ordeterm, dus de vooraf vastgelegde tolerantie lag onder de linearisatiefout. Achterhaald in ronde 2: de tweede-ordecorrectie is VALIDATED tegen dezelfde drempel.
  • Foutgroei bij INS/TRN-coasting: tegen een vrij-inertiële Monte Carlo van NaveGo houden de groeiwetten stand binnen 5 % tot 600 s en overschatten ze daarbuiten (2.2x tot 8x na een uur), omdat ze de Schuler-terugkoppeling weglaten. Achterhaald in ronde 2: het Schuler-foutmodel is VALIDATED.
  • Maanservicevolume uit echte constellatiegeometrie: 4 van de 12 gepubliceerde beschikbaarheidsstatistieken wijken meer dan 2 procentpunten af (tot 22,5).
  • Overbound voor de traceerbaarheidsbias van heterogene UTC(k): op 105.024 BIPM-rijen wordt de overbound bij 50,8 % van de rijen overschreden; de gepubliceerde onzekerheid begrenst de meting van de offset door het BIPM, niet de offset.
  • Classificatie van de nulruimte van de maandatum: op de gepubliceerde geometrie met vijf reflectoren is de correlatie -0.78 tegen -0.97, en de CRLB van de oorsprong ligt 96 tot 98 % onder die van het artikel.
  • Substraat voor de geometrie van de LLR-datum van de Maan: tegen 192 ILRS-maannormaalpunten van 2024 was de RMS van het residu in één richting 96 m met de eerdere oriëntatie-interpolatie en is 22,7 m na de onderstaande correctie, nog steeds boven de drempel van 10 m (afgeronde stationscoördinaten, geen poolbeweging). De oriëntatiereeks klemt stilzwijgend buiten 2024-2025. Ronde 2: het model voor gemeten afstanden is VALIDATED in een eigen rij (2,81 m); de reeks dekt nu 2014-2030 en geeft buiten dat bereik fouten.
  • Koppeling van relativistische klokgang aan het stelsel: de zelfpotentiaalterm ligt 3.18e-4 boven de gepubliceerde waarde (tolerantie 1e-4); het artikel evalueert een andere potentiaal, dus er bestaat geen gepubliceerde waarde van deze gesloten vorm. Achterhaald in ronde 2: de equatoriale potentiaal van graad 2 is VALIDATED tegen hetzelfde artikel.
  • Fysische constanten van elk lichaam van het zonnestelsel: 12 van de 84 constanten van de toegevoegde lichamen wijken af van NAIF pck00011 en gm_de440 (oudere elementen van Marssatellieten; andere GM-oplossingen voor Uranus, Neptunus en Pluto). Ronde 2: de constanten volgen nu NAIF (een transcriptie, niet meegeteld), en de berekende oriëntatie komt overeen met SPICE; de rij blijft MODELLED.
  • Selecteerbare LEO-efemeridemodellen: de fit met 22 parameters laat 1.71x en 1.86x de gepubliceerde fout in de baanrichting over op bogen van 20 min, boven 1.5x. Achterhaald in ronde 2: het model met 22 parameters en de fit zijn VALIDATED in een eigen rij.
  • Gezamenlijke GNSS- en LEO-positiebepaling: de bias tussen systemen komt overeen met RTKLIB, maar 93,2 % van de epochen ligt binnen 3 m van ITRF2020 tegen 95 %; RTKLIB zelf haalt 88,2 % op de data (93,6 % na de correctie van de groepsvertraging in ronde 2).
  • Common-mode-integriteitsblindheid en dekkings- en DOP-kaarten: beide vergelijkingen slaagden maar zijn bij de beoordeling afgewezen omdat een opzettelijk foute engine ze ook doorstaat (de eerste controleert alleen een interne identiteit; de gepubliceerde ondergrenzen van de tweede kunnen een verdubbelde PDOP niet zien). Ronde 2: common-mode-integriteitsblindheid is VALIDATED op inputs met pariteit; de dekkingskaarten blijven een bevinding (zie hieronder).

Validatieronde 2#

De tweede ronde nam elke rij die de eerste ronde nog routeerbaar liet, met nieuwe preregistraties die zijn vastgelegd voordat een fixture werd opgehaald of een onafhankelijke referentie werd uitgevoerd, een tegenwerkende tweede reviewer die elke vergelijking opnieuw uitvoerde en een opzettelijke engine-mutatie die elke test rood moet laten worden. De eigenaar aanvaardde op 2026-10-02 de gecorrigeerde formulering van de rij voor de grens buiten Omega voordat die werd gepromoveerd (de oude tekst sprak de code tegen).

Gepromoveerd naar VALIDATED (17). Type onafhankelijke referentie tussen haakjes; tolerantie vastgelegd vóór de run.

  • Koppeling van relativistische klokgang aan het stelsel (Referentie): L_m van Ashby en Patla 2024 binnen 2.8e-6 (drempel 1e-4) uit de equatoriale potentiaal van graad 2 van de twee velden die het artikel aanhaalt; pyshtools-zwaartekracht van graad 350 voor de radiale ingang (8.3e-5); DE441-maansnelheid (2.5e-3).
  • Offline standaardinvoer voor aardoriëntatie (Bibliotheek): astropy 8.0.1 en IERS Bulletin A nr. 039 bevestigen de 30 definitieve, 54 snelle en 90 voorspelde rijen van het opnieuw gesneden uittreksel.
  • Gezamenlijke fout van UT1 en poolbeweging (Bibliotheek): volledige rotaties van astropy en pyerfa reproduceren de gezamenlijke tabel (UT1 en pool binnen 6e-16, de combinatie binnen 1.9e-7); de gerealiseerde fouten uit het IERS Annual Report 2019 geven verhoudingen 1,001 tot 1,100.
  • Footprint en dekking van een EO-payload (Bibliotheek): Orekit 12,2 en GeographicLib 2,1 op elke vooraf vastgelegde drempel, waarbij de nodale regressie door J2 nu in de knooppuntafstand zit.
  • Relatieve beweging van Clohessy–Wiltshire (Bibliotheek): met een tweede-ordecorrectie in gesloten vorm binnen 1.2e-7 m van de niet-lineaire beweging van Orekit tegen 1e-3 m; de lineaire matrix alleen blijft gekarakteriseerd (1,2 tot 6,3 mm).
  • B-vlakmikken en zwaartekrachtassist met patched conics (Bibliotheek): GMAT R2026a B-vlak, asymptoten, C3 en heliocentrische elementen; sbpy 0.6.0 en Kasuga en Jewitt 2019 voor de Tisserand-parameter.
  • Foutgroei bij INS/TRN-coasting (Bibliotheek): een Schuler-foutmodel met negen toestanden binnen 5 % van gecorrigeerde coastruns van NaveGo op alle 48 punten (slechtste 3,70 %).
  • Common-mode-integriteitsblindheid (P2): numpy lstsq op 1464 inputs met pariteit binnen 1e-12 (slechtste 1.06e-14).
  • Gezamenlijke multitechniek-OD en klok van de Maan (P2): numpy herberekent elke Gauss-Newton-stap, sigma en stationsfout op zes netwerken (binnen 2.4e-11) na een correctie van de QR-oplossing.
  • Covariantie van stationscoördinaten bij maan-VLBI (Bibliotheek): een met SPICE gebouwde Jacobiaan reproduceert het schema, het spectrum, de sigma's en de nulruimte binnen 1 % en 0,1 graad; numpy tot 2e-13.
  • Niet-detecteerbare common-mode-grens van residu buiten Omega (P2, formulering gecorrigeerd door besluit van de eigenaar): numpy LAPACK op 256 gevallen binnen 1e-12, zes exacte oneindigheden.
  • Basisinvariante classificatie van de nulruimte (P2): SciPy en NumPy snijden deelruimten op 72 geconstrueerde matrices, gehele getallen exact, projectornorm binnen 6.0e-15.
  • Ionosferische diensten op één frequentie en UTC-diensten van een LEO-navigatiebericht (Bibliotheek): GNSSTk 15.3.1 voor Klobuchar, Az en de UTC-drift; ERFA voor de drie schrikkelsecondegevallen.
  • Grens voor positiebepaling in niet-terrestrische 5G-netwerken (P1): grenzen voor één SSB van Bachl, Lei en Nabeel 2026 binnen een half afgedrukt cijfer; numpy voor de covarianties van de positiebepaling.
  • Model voor gemeten LLR-afstanden (Gemeten, nieuwe rij afgesplitst van het substraat van de LLR-datum): 192 ILRS-maannormaalpunten met 2,81 m RMS tegen een drempel van 10 m, met de barycentrische lichttijd van IERS 2010; de componenten onder de drempel worden niet een voor een opgelost, en de rij zegt dat.
  • Maangeodetische VLBI, kernelpad (Bibliotheek, nieuwe rij afgesplitst van de rij voor maan-VLBI): door SPICE geconvergeerde lichttijden binnen 1 ps en partiële afgeleiden binnen 1e-6 op epochen rond J2000; het analytische standaardpad blijft MODELLED.
  • Liu et al. 2025 LEO-efemeridemodel met 22 parameters en zijn fit (Gemeten, nieuwe rij afgesplitst van de rij met selecteerbare modellen): echte nauwkeurige banen binnen 1.5x van de gepubliceerde statistieken op artikeldagen en achtergehouden dagen (0,683 tot 1,186); de schaalconventie van n_dot is getranscribeerd en wordt door deze vergelijking niet getoetst, en de stopregel is de parameterconvergentieregel van Kshana, niet de RMS-veranderingsregel van het artikel. Het ATOMIC-polynoom en de tabel met vijf hoogtes blijven MODELLED.

Bestaande VALIDATED rijen opnieuw onderbouwd (geen verandering in aantal).

  • Planeetposities uit de JPL Standish-elementen en lichttijd tussen lichamen van het zonnestelsel: de achteraf bepaalde drempels van tweemaal nominaal worden vervangen door vooraf vastgelegde vergelijkingen met JPL Horizons DE441 (RMS hoogstens het cijfer uit Explanatory Supplement Tabel 8.10.1, slechtste 0,778, inclusief de splitsing van de Aarde en de ICRF-rotatie; lichttijden binnen 1e-6 s van Horizons op DE441-posities, slechtste 6.7e-9 s). Hun vlaggen "limiet vastgesteld na de vergelijking" zijn verwijderd.
  • Integriteit (RAIM/ARAIM/SBAS): de rij berust niet langer op plausibiliteitscontroles. Hij zegt nu: de ARAIM-solution-separation met meerdere hypothesen van ADD v4.2 komt overeen met Stanford MAAST voor ARAIM 2 op 270 echte gevallen (slechtste VPL-verschil 2.2e-3 m tegen 0,05 m); snapshot-RAIM-detectie en -uitsluiting komen overeen met RTKLIB raim_fde op 2016 van 2016 beslissingen, met het beschermingsniveau voor de helling binnen 2.7e-12 m; de SBAS DO-229E L1-beschermingsniveaus komen overeen met Stanford MAAST op echte WAAS-uitzendingen (2868 paren binnen 1.6e-5 m). Hij stelt duidelijk dat de functies met uniforme sigma raim::araim_raim en raim::araim_dual_raim NIET in overeenstemming zijn met ADD (verschillen bij gelijke invoer 0.75/4.04 m en 0.39/1.93 m VPL/HPL, een bevinding), dat de DFMC L5 SBAS-vergelijking een bevinding is (308 paren zonder GEO in zicht worden door Kshana beschermd en niet door MAAST) en dat raim::solution_separation_raim geen externe vergelijking heeft. Zijn zelfvlag is verwijderd.
  • Fitter voor LEO-uitgezonden efemeriden: de geïntegreerde referentiebaan is toegevoegd aan het getoetste deel (Orekit 12,2 binnen 4,55 mm over 6 h, drempel 2 cm); de correctiepolynomen, de klokfit en de afweging over de updateperiode blijven gemodelleerd.

Bevindingen en geblokkeerde rijen (blijven MODELLED). De tekst over de onafhankelijke referentie van elke rij bevat de bevinding en de bijbehorende vastgepinde test.

  • Modulatie van navigatiesignalen (Betz 2001, Hein 2006): spectra en correlaties komen overeen; de zijlobben van 24 MHz en elke multipathbias (11 tot 15 % te laag) niet, oorzaak onopgelost.
  • TDOA/FDOA-geolocatie: de grenzen komen overeen met Ho en Chan en Ho en Xu, en met de code van de auteurs tot 3e-12; de Ottawa-factoren uit een Monte Carlo afgedrukt wijken 1,3 % en 4,4 % af.
  • GNSS van de Aarde op maanafstand: GENESIS-zenitgemiddelden komen overeen met Montenbruck et al. 2023 bij 5 van de 6; nadirgemiddelden zijn 1,0 tot 2,4 satellieten te hoog.
  • Dekkings- en DOP-kaarten: ontwerpen voor de Aarde komen overeen met Orekit, gnss_lib_py en numpy op elke drempel; ontwerpen voor Maan en Mars overschrijden 1e-9 alleen op bijna singuliere cellen.
  • Gezamenlijke GNSS-positiebepaling: twee frequenties 79,9 % en nauwkeurige producten 94,2 % binnen 3 m tegen 95 % (RTKLIB 67,9 % en 94,1 %); het ISB-verschil bij nauwkeurige producten komt doordat RTKLIB antenne-offsets negeert.
  • Trackinglussen (GNSS-SDR 0.0.19): komen overeen bij 35 tot 45 dB-Hz; bij 30 dB-Hz PLL +21 %, DLL -32 %, drempels +1,5 dB; slip-tijden 0,5 tot 2 decaden korter.
  • Maanservicevolume (Orekit en Hipparchus): 155 van de 160 waarden komen overeen; de eis voor de slechtste steekproef faalt op bijna singuliere LNCSS B-geometrie.
  • Kwantuminertiaalsensor: de vloer met alleen QPN ligt 21 tot 31 % onder de gemeten ruis van Gauguet 2009 (drempel 30 %, met 0,5 punt gemist).
  • Oscillatorvoorinstellingen: gemeten exemplaren overschrijden de voorinstellingen voor rubidium-holdover, kortetermijn bij cesium en het slechtste exemplaar van CSAC; de OCXO-voorinstelling heeft geen gemeten record.
  • Dichtheid door ruimteweer: Jacchia 1971 ligt binnen een factor 2 van accelerometerdichtheden bij zonnemaximum maar is ongeveer 1.7x te dicht in het minimum van 2008.
  • Geometrievrije schuine TEC: 33 van de 36 bogen binnen 3 TECU van de CODE-kaart (slechtste 6,84).
  • Spoofingdetectie en TPL tegen het officiële JammerTest-log van 2024: 4 van de 10 beginmomenten tijdig gedetecteerd; de TPL wordt bij 4 van de 10 overschreden.
  • Klokfilter op nieuwe IGS-klokken: twee van de 11 satellieten falen op het criterium van de innovatiesom.
  • EOP-voorspeller met kleinste kwadraten plus autoregressie: UT1 1,73 tot 2.11x Bulletin A bij 2 tot 10 dagen.
  • Overbound van de gerealiseerde offset van UTC(k): gepoolde overschrijding 0,0333 tegen 1e-2.
  • Maanstelseldatum uit een campagne: het deel met SPICE komt overeen; het P2-deel met geschatte stations haalt 1e-9 niet bij een probleem met conditie 2.1e8.
  • Maanstelseldatum uit echte LLR: 15 van de 16 cijfers komen overeen met SPICE; de sigma van de z-translatie is 1,03 % hoog tegen 1 %.
  • Terugkeer in de atmosfeer (Allen-Eggers): de puntmassaoplossing komt overeen met reconstructies van ruimtevaartorganisaties (alleen een kruiscontrole); de vergelijking met de accelerometer is geblokkeerd op een leesbare bron van Hayabusa2.
  • ITU-T-maskers: de afgedrukte uitgewerkte waarden komen overeen; de klasselimieten van G.8273.2 hebben er geen (geblokkeerd).
  • Geometrie van lanceervensters: de snelheid van de locatie bij de ware pool met een epoche komt overeen met Orekit (4.9e-8); de standaardsnelheid zonder epoche haalt het nog steeds niet (1.12e-6). Niet gepromoveerd; opvolging volgt.
  • Fysische constanten van elk lichaam: nu wijken 0 van de 84 af van NAIF (een transcriptie), en de berekende oriëntatie komt tot 1.4e-10 rad overeen met SPICE. Niet gepromoveerd; opvolging volgt.
  • Geblokkeerd op een afbakeningsbesluit van de eigenaar, elk met de bijbehorende overeenstemmende vergelijking vastgelegd: absolute waarneembaarheid van maanstations, DOP van oppervlaktebakens, de export buiten de boresight, detectievermogen over modaliteiten heen, de consistentiestatistiek voor common-mode en polaire LEO-dekking.
  • Geblokkeerd op data: foutbudgettering van tijdoverdracht (vraagt een reductie op echte data), JammerTest C/N0 (antennepositie en vermogensverdeling niet gedocumenteerd).

Herzieningen (gepubliceerde getallen die zijn verschoven, oud -> nieuw).

  • De beschermingsniveaus van snapshot_raim liggen nu op het geodetische lokale niveau in plaats van op het radiale: tot 0,31 m HPL en 0,14 m VPL bij ABMF (16 graden N); geen golden is verschoven, maar de vastgelegde samenvatting van de tutorial gnss-sim gaat van gemiddelde HPL 22,1 m / VPL 40,0 m naar 22,2 m / 39,9 m (docs/tutorials/scenarios/gnss-sim.toml).
  • Standaardwaarden voor de koppeling van het maanstelsel aan de klokgang: d_alpha/d_scale 3.139807e-11 -> 3.138801e-11; d_alpha/d_radial 1.807187e-17 -> 1.806185e-17 per meter.
  • Offline standaard-EOP-run (realtime-frame-eop, cellen vermeld in docs/revisions/M035-default-eop-recut-cell-changes.md): predicted_rows 12 -> 90; poolvloer 0,06776 -> 0,05550 mas; eop_term_m 14,01601 -> 14,01583; total_m 20,09759 -> 20,09746; total_time_ns 67,03834 -> 67,03790; de rijen van Tabel 2 van tests/golden/realtime-frame-eop.csv; overeenstemming van de operationele voorspeller 0.256/0.695/1.252/3.885 ms -> 0.133/0.421/0.839/2.786 ms.
  • docs/LEO-NAVMSG.md liu22 SISRE baan/met klok: 60 s 0.011/0.046 -> 0.014/0.046 cm; 300 s 0.068/0.139 -> 0.074/0.142 cm; 600 s 0.269/0.299 -> 0.258/0.290 cm.
  • Liu-hoogtetabel, Kshana (verhouding): GRACE-A 5,40 (0,61) -> 4,25 (0,48); GRACE-C 4,12 (0,66) -> 2,87 (0,46); Sentinel-2A 2,95 (1,03) -> 2,20 (0,77); HY-2A 2,38 (1,13) -> 1,25 (0,59); Sentinel-6A 0,70 (0,94) -> 0,51 (0,67).
  • LEO-navigatiebericht nDot-schaal 2^-60 -> 2^-58 (niet vooraf vastgelegd, bekendgemaakt; buiten de fitvergelijking); de CRC van het liu22-voorbeeldframe 0x62373A -> 0xDED99C.
  • Verificatietabel van docs/LEO-NAVMSG.md: de rij Liu en ATOMIC is gesplitst in een VALIDATED rij met 22 parameters en een MODELLED rij met ATOMIC en vijf hoogtes.
  • Rijtekst voor de oriëntatie van de hoofdassen van de Maan in DE440: bereik 2024-2025 / 731 rijen -> 2014-2030 / 6.209 rijen; "klemt stilzwijgend" -> fouten buiten zijn bereik.
  • Scenario eo-coverage: equatorial_ground_track_spacing_km 2756,37 -> 2752,17 km; nieuwe velden inclination_deg (98,19) en nodal_period_min (98,893).
  • constellation-multi-gnss-coverage (de referentieklok voor TDOP/GDOP is nu de laagstgenummerde constellatie in zicht): globale GDOP max 2,2236 -> 2,1205, gemiddelde 1,122 -> 1,131, mediaan 1,115 -> 1,125, p90 1,255 -> 1,265, p95 1,305 -> 1,315, p99 1,41 -> 1,42, en de GDOP-kaart per cel; mean_visible_by_constellation opgeteld als gehele getallen (ongeveer 1e-12 relatief, onzichtbaar bij 4 decimalen).
  • Gezamenlijke GNSS-positiebepaling op één frequentie na de correctie van de uitgezonden groepsvertraging: 93,2 % -> 93,6 % binnen 3 m; mediaan van ISB -0.351 -> -0.114 ns.
  • tracking-loop jitter_table log10_mean_time_to_cycle_slip_s (Costas-lus SNR rho/4): bij de drempel van 25,47 dB-Hz 11,58 -> 2,10; bij 25 dB-Hz 9,55 -> 1,60; bij 22 dB-Hz 2,24 -> -0.14.
  • ins-trn-coast: elke uitvoer verschuift met het Schuler-foutmodel; de TRN-piek van het meegeleverde scenario 52,932679 -> 44,711834 m (tests/conflict_resilience_architecture_guard.rs).
  • Rapport lunar-vlbi: nieuwe sleutel geometry_path ("analytic" bij de standaardrun, geen numerieke waarde veranderd); nieuwe optionele velden planetary_kernel_path, earth_orientation_kernel_path en moon_orientation_kernel_path, met epoch_partials op het kernelpad; de beschrijving van het type is herschreven. De onafhankelijke referentie van het kernelpad in de verificatierij is SPICE (0,06 ps); ANISE (0,12 ps) wordt een kruiscontrole van de kernel-evaluatie.
  • Lichaamsconstanten: Phobos GM 7.087e5 -> 7.087546066894452e5; Deimos 9.62e4 -> 9.615569648120313e4; Uranus 5.7939506103e15 -> 5.793951256527211e15; Neptunus 6.83509997e15 -> 6.835103145462294e15; Pluto 8.69326e11 -> 8.696138177608748e11 (m^3/s^2); equatoriale straal van Phobos 13,1 -> 13,0 km; pool en nulmeridiaan van Phobos en Deimos uit pck00011; de prime_meridian_deg van het zonnestelsel bevat nu de kwadratische en periodieke termen.
  • europa-surface-pnt (body-pnt op Europa), uit de volledige pck00011-oriëntatie van Europa (7cfd66b4; de oriëntatie komt tot 1.4e-10 rad overeen met SPICE pxform), die de lander in de inertiële ruimte verschuift: beschikbaarheid alleen relais / met de afstand tot de Aarde 0,485 / 0,725 -> 0,480 / 0,719 (83 -> 82 van 171 epochen alleen relais), mediane PDOP 5,266 -> 5,360, RMS van de positiebepalingsfout 129,516 / 100,983 m -> 112,742 / 86,147 m, mediane formele sigma 5,266 / 4,272 m -> 5,360 / 4,239 m. De tabel in docs/SOLAR-SYSTEM.md en de pin in mcp/kshana-mcp/tests/round_trip.rs volgen; mars-orbit-pnt is ongewijzigd.
  • space-weather (f107 180, f107a 165, kp 4), de gekalibreerde factor vervangen door Jacchia 1971: activity_density_kg_m3 bij 300/400/500/600/800 km 2.602e-11 -> 3.608e-11, 4.176e-12 -> 6.929e-12, 8.136e-13 -> 1.618e-12, 1.769e-13 -> 4.189e-13, 1.544e-14 -> 3.781e-14; activity_factor 1.076/1.121/1.168/1.216/1.320 -> 1.492/1.860/2.322/2.881/3.232; reference_exospheric_temperature_k verwijderd, mean_exospheric_temperature_k toegevoegd (1186,7 K); tests/space_weather_reference.rs: de zonnecyclusschommeling op 800 km is nu 10.4x (NRLMSISE-00 13.6x) en de hoogtebewering volgt de stijging van NRLMSISE tot 500 km en de daling op 800 km.
  • ntn-5g-positioning toa_median_sigma_3d_m: NR 5 MHz 2,0903959 -> 2,0903962 m; NB 200 kHz 25,938613 -> 25,938839 m (samenvattingstekst ongewijzigd op 2,09 / 25,94 m).
  • lunar-joint-od-clock (QR-oplossing): with_vlbi.station_pos_err_m 3,541344 -> 3,541350 m; without_vlbi.station_pos_err_m 2183,119 -> 2183,558 m.
  • docs/field-units-schema.json opnieuw uitgegeven voor de nieuwe en verwijderde velden hierboven.

Validatiepakketten#

D12, uitgebreide precisie en een square-root-oplosser (twee nieuwe VALIDATED rijen: 226 -> 228 rijen, 110 -> 112 getoetst).

Deel 1, onafhankelijke referentie met uitgebreide precisie:

  • Maanstelseldatum met geschatte stations: een onafhankelijke referentie met mpmath en uitgebreide precisie van 50 cijfers (vooraf vastgelegd 804662d5, naar conditie geschaalde drempels uit een a-priori-formule voor de achterwaartse fout) komt overeen op een nieuwe campagnedatum (2026-03-18) en op het oorspronkelijke scenario van 2024-01-01; nieuwe VALIDATED rij onder P2. Het beslecht het eerdere geschil over dubbele precisie: de datumsigma's van de engine wijken tot 9.7e-6 af, de inverse- en eigenroutes van NumPy tot 6.2e-6, en zijn Cholesky- en QR-routes ongeveer 1e-8. De engine ligt binnen zijn foutgrens maar is ongeveer duizend keer minder nauwkeurig dan een factorisatieroute.
  • Omgeving van de onafhankelijke referentie: mpmath 1.3.0 toegevoegd.
  • Herzieningen: geen. Er verandert geen golden bestand of gepubliceerd cijfer; de rij "Maanstelseldatum uit een waarnemingscampagne" blijft MODELLED (besluit van de oprichter 2026-10-02, optie A: hij leent de status van de afzonderlijke rij niet); zijn testtekst noemt de nieuwe test en zijn bevinding.

Deel 2, datumoplosser met square-root-informatie:

  • Nieuwe optionele square-root-informatieoplosser (linalg_sr; solver = "srif" in het scenario lunar-frame-campaign): Householder-QR, marginalisatie via de driehoeksfactor, een Jacobi-SVD voor het spectrum en gecompenseerde producten uitsluitend uit correct afgeronde bewerkingen. Tegen de onafhankelijke referentie met 50 cijfers (vooraf vastgelegd b41908c9) komen zijn datumsigma's tot 3e-13 overeen op een nieuwe datum (2026-06-09); op de invoer van 2026-03-18 en 2024-01-01 wijkt de standaardoplosser tot 1e-5 af. Nieuwe VALIDATED rij onder P2. De standaardoplosser en zijn uitvoer zijn ongewijzigd. De vooraf vastgelegde drempels waarborgen alleen fouten boven ongeveer 2e-7 relatief: ze verwerpen de standaardoplosser maar niet een omgekeerd Householder-teken, een ongecompenseerd inproduct of een spectrale eindinverse, en de rij zegt dat.
  • Optionele square-root-paden naast de ongewijzigde standaardwaarden: fim::crlb_srif, batch_ls::gauss_newton_srif, orbit_determination::determine_orbit_batch_srif, lunar_combination::formal_covariance_srif, precise_od::fit_srif en cislunar_srif::srif_cross_validation_sqrt, op nieuwe linalg_sr::weighted_lstsq en covariance_from_sqrt_information. Elk komt overeen met zijn standaard waar beide nauwkeurig zijn (een interne controle, geen rij; er wordt geen validatie voor geclaimd). precise_od::fit delegeert nu aan een gedeelde routine; zijn uitvoer en de standaarduitvoer van elk scenario zijn ongewijzigd.
  • Rangbeslissingen van de maanstelselcampagne: een vooraf vastgelegde controle met uitgebreide precisie over 40 dagen bevestigt elke beslisbare beslissing over stationsblokken en Helmert met volle rang. De a-priori-grens kan de 20 rangdeficiënte Helmert-dagen niet waarborgen; in exacte rekenkunde is hun defect geometrisch, met de drempel van 1e-9 binnen het natuurlijke bereik van eigenwaardeverhoudingen van de campagne. Geen rij.
  • De bewering van de rij voor de campagne met uitgebreide precisie is beperkt tot "binnen de slechtste-gevalgrens", en haar controle van de zwakste richting met vaste stations meet nu een echte hoek (6.6e-16 rad; de vergelijker is van acos in een koorde veranderd, de drempel niet).
  • Herzieningen: geen. Er verandert geen golden bestand of gepubliceerd cijfer; de rij "Maanstelseldatum uit een waarnemingscampagne" is ongewijzigd en blijft MODELLED (besluit van de oprichter 2026-10-02, optie A).

D4, ruggengraat voor JPL-kernelefemeriden, fase 1 (vier nieuwe VALIDATED rijen: 228 -> 232 rijen, 112 -> 116 getoetst).

  • De NAIF-kernellezer heeft een eigen rij. naif_kernel (DAF-container, SPK-type 2, binaire PCK van type 2) komt overeen met de SPICE Toolkit (CSPICE N0067 via spiceypy 8.2.0) en met ANISE 0.10.6 op alle 600 DE440-toestanden en 200 maanoriëntatierotaties van een willekeurig raster dat is getrokken uit de eigen hash van de preregistratiecommit (abcd9133), binnen drempels die vooraf zijn afgeleid uit de evaluatie van Chebyshev-polynomen met dubbele precisie (slechtste 0,6 % van de drempel, 1.95e-3 m). De rij claimt dat de engine JPL-kernels correct leest, niet dat DE440 of de analytische reeks nauwkeurig is (tests/naif_reader_spice_oracle.rs).
  • ephem_provider::KernelEphemeris: DE440- (of elke type-2-SPK-)posities via de eigen lezer van de engine, met tweedelige TDB-epochen en de SHA-256 van de kernel bewaard voor rapporten; hij vervangt nooit het zwaartepunt van een systeem voor een planeet. LunisolarSource laat een geometriepad de analytische reeks (de standaard) of een kernel kiezen.
  • Optionele kernel-Maan voor lunar-llr-datum en lunar-vlbi-fim: een sleutel planetary_kernel_path leest het geocentrische maanmiddelpunt uit de kernel; verder verandert er niets, en het rapport krijgt een blok moon_ephemeris met de kernel en zijn SHA-256. Zonder de sleutel zijn beide rapporten byte-identiek aan voorheen.
  • Covariantie van een punt op het maanoppervlak op het kernelpad (nieuwe VALIDATED rij): met elk station vastgezet en het baken op de DE440-Maan komt de baken-covariantie overeen met een SPICE-lichttijd-Jacobiaan (slechtste 1.7e-3 tegen een drempel van 1 %) en een NumPy-inverse (4e-14 tegen 1e-9), vooraf vastgelegd 4a51256 (tests/lunar_vlbi_surface_point_spice_oracle.rs). De rij voor het analytische pad blijft MODELLED: op de analytische Maan ligt de kleinste bakensigma 3,9 % onder de onafhankelijke referentie.
  • Maanstelseldatum uit een echte campagne, kernel-maanmiddelpunt (nieuwe VALIDATED rij): op 447 ongeziene normaalpunten van 2019-Q2, vooraf vastgelegd 830d945a voordat er een werd opgehaald, komt de datumcovariantie op het kernelpad overeen met de ongewijzigde SPICE- en NumPy-referentie binnen 7.6e-5 tegen drempels van 1 % en 2 % (tests/validate_llr_datum_kernel_moon_fresh.rs). De oprichter besloot dat deze rij alleen op nieuwe punten promoveert; de diagnose op eerder geziene data (c51f8b2) is een bevinding, geen bewijs. De drempel maakt geen onderscheid tussen maanmodellen: de analytische Maan slaagt op dezelfde slice ook (slechtste 3.8e-3), de geplande mutatie (de kernel-Maan een uur te laat) werd niet gedetecteerd, en bij de vouw slaagde ook een maanmiddelpunt dat ongeveer 4.650 km fout zat (de Maan genomen om het zwaartepunt van Aarde en Maan). De rij claimt de covariantie op dat pad, niet het maanmiddelpunt, en zegt dat.
  • Posities van Zon, Maan, Mercurius en Venus uit DE440 op UTC-epochen (nieuwe VALIDATED rij): KernelEphemeris::relative_position_utc komt overeen met Skyfield 1,54 op 600 posities tussen 1973 en 2026, slechtste 2,96 m, binnen een vooraf vastgelegde drempel (0bfafe6d) die wordt bepaald door de reeks met twee termen voor TDB − TT (tests/kernel_ephemeris_skyfield_oracle.rs). Planeetposities krijgen nu deze nieuwe kernelrij; de rij van Standish en de rij van de planeetmanen zijn ongewijzigd, en de manen wachten op een scenario dat ze nodig heeft (besluit van de oprichter).
  • Bevindingen: de ene misser van de vergelijking van de LLR-datum (sigma van de z-translatie 1,025 % tegen 1 %) daalt naar 0,049 % wanneer alleen het maanmiddelpunt uit DE440 wordt gelezen, op eerder geziene data (tests/validate_llr_datum_kernel_moon.rs); op de nieuwe slice van 2019 slaagt de analytische Maan ook, dus de misser van 2015 lag aan de rand van de geometrie van dat kwartaal. De analytische rijen "Maanstelseldatum uit een ECHTE waarnemingscampagne" en "Coördinatencovariantie van een punt op het maanoppervlak … apart gehouden van die van het aardstation" blijven MODELLED; hun teksten over de onafhankelijke referentie wijzen nu naar de rijen voor het kernelpad.
  • lunar_ephemeris zegt niet langer dat de engine geen lezer voor binaire kernels heeft; het verwijst naar de rij van de lezer en legt uit waarom kernels van ruimtevaartuigen (typen 13 en 21) nog via Horizons binnenkomen.
  • Herzieningen: geen. Er verandert geen golden bestand, gepubliceerd cijfer of bestaande testwaarde; de analytische rapporten lunar-llr-datum, lunar-vlbi-fim en lunar-vlbi-fim met alle stations vastgezet zijn byte-identiek aan voorheen (SHA-256-prefixen van het resultaat 9927aac2, cf1d2671, 25c357e4).

D9, bibliotheek met gemeten klokken "Clock Atlas" (drie nieuwe rijen, een VALIDATED: 232 -> 235 rijen, 116 -> 117 getoetst).

  • Bibliotheek met gemeten klokken (clock_library). Apparaatkaarten (witte fase, witte, flicker- en random-walk-frequentiemodulatie, een lineaire frequentiedrift en, optioneel, fasetermen van eens tot viermaal per omwenteling) gefit op een benoemd gemeten klokrecord en beoordeeld op achtergehouden data; gatbewuste Allan- en Hadamard-varianties; een conditioneringsdetector die elk gat, elke faseafwijker, fasestap, burst en frequentiestap logt en niets weet van bestands- of daggrenzen; omzetting van een kaart naar het slot-timingruismodel, het uitgebreide Kalman-klokmodel en de ruisniveaus van de spoofingmonitor. Lezers voor RINEX- en IGS-klokbestanden, BIPM-bestanden per laboratorium en Circular T Sectie 1 (realdata::clk); een gepoolde, hiërarchische verouderingsgrens voor UTC(k) (utck_bound, nog niet beoordeeld).
  • Ruisidentificatie met lag-1-autocorrelatie (allan::lag1_noise_id, Riley en Greenhall 2004), nieuwe VALIDATED rij (Bibliotheek): komt overeen met allantools 2024,6 autocorr_noise_id op 140 gevallen, gehele getallen identiek, slechtste verschil 9.6e-13 tegen een drempel van 1e-9 (vooraf vastgelegd 2ec76864; tests/clock_library_lag1_noise_id_allantools.rs).
  • Gemeten apparaatkaarten met voorspelling op achtergehouden data, nieuwe MODELLED rij (een bevinding): fit op een derde, voorspel de Allan-deviatie van de andere twee derde binnen een factor 1,5 (vooraf vastgelegd 2ec76864). GPS Block IIF op een nieuw IGS-venster (2026-03-01 tot 14): 10 van 11; G27 is optimistisch op de schaal van twee uur (slechtste factor 1,510). Cesium (binnen, 1,070), OCXO (buiten, 2,348) en strontium (binnen) worden gerapporteerd, niet blind. De ontvangerkaart van JammerTest en de kaarten voor de Galileo-maser en de Deep Space Atomic Clock zijn geblokkeerd. Een modelklasse voor de TCXO van een ZED-F9P-ontvanger op 12 statische stations in Wroclaw (Zenodo 6488497) faalt: 1 van 11 blinde stations in een bekendgemaakte gecorrigeerde herhaalrun (tests/clock_library_device_cards_oracle.rs, tests/clock_library_f9p_cards_oracle.rs).
  • GPS Block IIF-kaarten met termen per omwenteling, nieuwe MODELLED rij (een bevinding): op een tweede nieuw venster (2026-04-01 tot 14) 9 van de 11 binnen de drempel; G03 (1,947) en G25 (1,581) zijn optimistisch omdat hun achtergehouden records ruiziger zijn dan hun fitdelen van een derde; het weglaten van de periodieke termen laat alle 11 falen (vooraf vastgelegd fb475550; tests/clock_library_periodic_cards_oracle.rs).
  • M002, schatting van de klokstatus aan boord, ronde 3 (een bevinding, blijft MODELLED): na de bevroren conditioneringsdetector halen het uitgebreide filter van ronde 2, de afstemming en de criteria, ongewijzigd, (a) en (c) voor het eerst op alle 11 satellieten; (b) faalt bij G09 (0,894) en G26 (0,876) (vooraf vastgelegd fb475550; tests/clock_state_ext_igs_conditioned_oracle.rs).
  • M010, spoofingdetectie, rondes 3 tot 4b (blijft MODELLED): ronde 3 geblokkeerd (167 trainingsepochen uit de andere sessies van het JammerTest-toestel tegen 3600); met een kaart voor de modelklasse ZED-F9P (rondes 4 en 4b) geeft de klokmonitor nul valse alarmen voor het begin bij alle 10 gelogde beginmomenten (ronde 2: 86) en worden 6 van de 10 beginmomenten binnen 10 s gedetecteerd (ronde 2: 4); dezelfde vier blijven te laat (tests/clock_library_tcxo_card_jammertest_oracle.rs).
  • M083, overbound voor UTC(k), ronde 3: prospectief vooraf vastgelegd (fb475550) op Circular T-uitgaven vanaf 465, nog niet uitgevoerd (tests/utck_bound_prospective_oracle.rs).
  • Omgeving van de onafhankelijke referentie: het ZED-F9P-record van Wroclaw hangt af van data onder $KSHANA_ORACLES/data/wroclaw_f9p (CC BY 4,0, ongeveer 1,5 GB); de IGS-klokfixtures zijn meegeleverd (IGS-producten, met bronvermelding).
  • Herzieningen: geen. Er verandert geen golden bestand, gepubliceerd cijfer of bestaande testwaarde; op M001 (herverankering van holdover) wordt niet gehandeld omdat geen klokklasse is gepromoveerd.

D8, een getoetst pad voor propagatie, stelsel en tijd (drie nieuwe VALIDATED rijen en M131 gepromoveerd: 235 -> 238 rijen, getoetst 117 -> 121).

De typen voor Aardbanen die hun eigen modellen met alleen tweelichamen, seculiere J2 of sterrentijd hadden, delen nu één pad: SGP4/SDP4-elementensets met tweedelige juliaanse datums, doorgevoerd naar het GCRS en het ITRS (International Terrestrial Reference System) via de keten IAU (International Astronomical Union) 2006/2000A, met optionele parameters voor aardoriëntatie.

  • Nieuw: sgp4::MeanElementSet, sgp4::SgpOrbit, sgp4::Eop, sgp4::teme_to_itrs_matrix[_eop] en sgp4::gcrs_to_itrs_matrix[_eop]; Sgp4::new_at en Sgp4::propagate_at nemen tweedelige epochen. Nieuw: jd2::Jd2::from_utc_calendar (SOFA-conventie dtf2d voor dagen met een schrikkelseconde), jd2::utc_to_tai, tai_to_utc, utc_to_ut1 (via TAI, zoals SOFA utcut1), tai_to_tt en een tweedelige jd2::earth_rotation_angle.
  • De poolmodus leo-pvt propageert met SGP4 op 2026-01-01T00:00:00 UTC op de IAU-keten (leo_fusion::polar::latitude_sweep_at neemt elke epoche); de SGP4-Walker-generator roteert via de IAU-keten naar het aardvaste stelsel.
  • Het type passes draait een nieuwe voorspeller voor schijnbare passages (passes::predict_passes_apparent, apparent_look_angles): SGP4 op de IAU-keten, refractie volgens ITU-R P.834-9 en de lichttijd van de downlink (nieuwe schakelaars refraction en light_time, standaard aan), parameters voor aardoriëntatie (ut1_minus_utc_s, xp_arcsec, yp_arcsec, standaard 0), kruisingen opgelost tot 1e-7 s en de culminatie via gulden-snedezoeken. Het geometrische passes::predict_passes is ongewijzigd.
  • tests/no_private_models.rs zorgt ervoor dat de kernels van het pakket voor geometrie, tijd en propagatie geen eigen Kepler-propagatie, seculiere J2-snelheden of rotatie met alleen sterrentijd bevatten; benoemde snelle niveaus en natuurkunde die het onderwerp van een rij is, zijn beredeneerde toegestane uitzonderingen.
  • Nieuwe VALIDATED rij "Tweedelige juliaanse datums en schrikkelseconden op het tijdpad van Aardbanen": pyerfa 2.0.1.5 dtf2d/utctai/taiutc op 224 momenten rond alle 27 schrikkelseconden binnen 1e-6 s (vooraf vastgelegd e947e69d); slechtste 1.9e-11 s.
  • Nieuwe VALIDATED rij "Eén pad voor Aardbanen": TEME-posities van 232 elementensets tegen python-sgp4 2,24 (de referentie-SGP4 van Vallado) binnen 6.1e-8 m (drempel 1 cm), en de rotaties GCRS -> ITRS en TEME -> ITRS tegen ERFA c2t06a, pnm06a en ee06a binnen 2.9e-6 mas en 0,41 mas (drempels 0,1 en 2 mas), met parameters voor aardoriëntatie (vooraf vastgelegd 72ea9eb0). Bekendgemaakt: de eerste run faalde op 2016-12-31T23:59:59,5 met één seconde rotatie; UT1 werd genomen uit de quasi-juliaanse UTC-datum op een dag met een schrikkelseconde, de engine gaat nu via TAI, en de tweede run komt overeen op de ongewijzigde drempels.
  • M131 "LEO-dekking en dilution of precision voor polaire en Arctische gebruikers tegen MEO-GNSS" wordt VALIDATED: Orekit 13.1.8 neemt de GCRS-toestanden van de engine, roteert ze en berekent zichtbaarheid en DOP (NumPy voor groepen met meerdere klokken); posities binnen 6.8e-5 m (drempel 0,2 m), aantallen in zicht identiek op 4040/4040 steekproeven, mediane DOP binnen 2.3e-11 relatief.
  • Nieuwe VALIDATED rij "Voorspelling van schijnbare passages van grondstations met refractie en lichttijd": Orekit 13.1.8 propageert dezelfde elementensets in een TEME die het bouwt volgens de vermelde definitie, met ITU-R P.834-refractie en zijn lichttijdmeetmodel, over 60 gevallen bij stations op zeeniveau: 1210 passages, kruisingen binnen 3.4e-6 s (drempel 5 ms), maximale elevatie binnen 5.5e-7 graad, schijnbare richting binnen 8.8e-7 graad (drempel 1e-4 graad).
  • Bevindingen, vastgepind gehouden: de eerste volledige vergelijkingen met Orekit van begin tot eind misten hun drempels voor positie en richting, niet door de engine maar omdat de SDP4 van Orekit 13.1.8 afwijkt van de referentie-SGP4 voor cirkelvormige (e = 0) diepe-ruimtebanen (tot 67 m) en zijn standaard-TEME is gebouwd op de nutatie van IERS 1996 (IAU 1980), ongeveer 72 milliboogseconden van de keten IAU 2006/2000A (2,7 m bij LEO). De ITU-R P.834-coëfficiënt van Orekit voor h*theta0^2 is 0,011380 waar de Aanbeveling 0,01380 afdrukt; de vergelijking is op zeeniveau, waar de term verdwijnt, en het verschil erboven is vastgepind.
  • "Voorspelling van passages van grondstations (grondsegment)" blijft VALIDATED met zijn bewering beperkt tot het geometrische passes::predict_passes; het type passes hoort bij de nieuwe rij.
  • Omgeving van de onafhankelijke referentie: Orekit 13.1.8 met Hipparchus 4.0.3, pyerfa 2.0.1.5, python-sgp4 2,24 (xval/d8-orekit13/setup.sh).
  • Herzieningen: meegeleverde scenarios/passes.toml totale toegang 1675 s -> 1659 s (vijf passages als voorheen; beste maximale elevatie 73,25 graad -> 70,08 graad), en elke uitvoer van passes verschuift met het nieuwe pad (de afgedrukte regel in docs/examples/multi-tool-pipeline.md en het item passes van docs/CAPABILITY.md zeggen dat nu); meegeleverde polar-arctic-leo-coverage GNSS-VDOP op de evenaar 1,19669 -> 1,19710, bij 89,9 graad 1,50645 -> 1,50590, gefuseerde VDOP bij 89,9 graad 1,14388 -> 1,14250 (de gepubliceerde cijfers met twee decimalen 1,20, 1,51 en 1,14 zijn ongewijzigd). Er verandert geen golden bestand.
  • Nog niet gerouteerd: leo_pass, de modi doppler, joint en timing van leo-pvt en de referentiebaan leo_navmsg (hun modellen zitten in leo_link::geometry en leo_fusion::geom), en ontwerpen voor de Aarde in constellation-design (een benoemd tweelichamenniveau voor snelle berekening).

D6, LunaNet AFS-referentiegenerator, LSIS V1.0 (vier nieuwe rijen, twee VALIDATED: 238 -> 242 rijen, getoetst 121 -> 123).

  • LunaNet Augmented Forward Signal (AFS) referentiegenerator (lunar_afs), vastgepind op de LunaNet Signal-In-Space Recommended Standard (LSIS) V1.0 van 29 januari 2025 en die versie in elke uitvoer noemend: de draaggolf van 2492,028 MHz; het AFS-I BPSK(1)-datakanaal met 500 symbolen per seconde en zijn Gold-code van 2046 chips; de AFS-Q BPSK(5)-pilot met zijn primaire Weil-code van 10230 chips, secundaire van 4 chips en tertiaire van 1500 chips; het frame met frame-identifier 0 (synchronisatiepatroon, BCH (51, 8) subframe 1, CRC-24, LDPC-subframes met rate een half 2 tot 4, blokinterleaver van 60 bij 98) met een uitputtende subframe-1-decoder en een min-sum-LDPC-decoder die uitsluitend uit de pariteitscontrolematrix is geschreven; en basisband-IQ-synthese met waarheidslabels geschreven als een SigMF-opname. Codes worden gegenereerd uit de schuifregisters en de Legendre/Weil-constructies van de standaard. Niets wat uit de standaard is gekopieerd wordt herdistribueerd (hij heeft geen hergebruiksvoorwaarden): de primaire indices van AFS-Q komen uit IS-GPS-800J, en wat alleen de bijlagen van de standaard definiëren (AFS-I G2-vertragingen, tertiaire codes, LDPC-submatrices) wordt tijdens de run gelezen uit een lokale cache die xval/lunar-afs/fetch_lsis.sh vult vanuit de door NASA gehoste PDF, waarbij elk bestand wordt gecontroleerd aan een vastgepinde SHA-256 (lunar_afs::lsis). Het model is een referentiegenerator voor de standaard, geen kanaal-, propagatie- of linkbudgetmodel.
  • sigmf::meta_to_json_with_extensions en sigmf::annotation_extension_fields: een opname kan velden met een naamruimte voor extensies bevatten die in core:extensions zijn gedeclareerd.
  • Nieuwe VALIDATED rij "LunaNet AFS-basisbandweergave tegen een onafhankelijke generator, gegeven zijn kanaaltoestand": tegen LANS-AFS-SIM (BSD-2-Clause, commit 480c6bf3, S-bandbuild) nul chipafwijkingen over de codes van PRN's 1 tot 210, nul symboolafwijkingen over de drie frames van de run, en een genormaliseerde complexe correlatie van 0,999990 over 23,9 s van zijn eigen samples (slechtste blok van 2 ms 0,999948), binnen drempels die vóór de vergelijking zijn vastgelegd (vooraf vastgelegd 986ac280). Hij stuurt de renderer aan met de eigen kanaaltoestand van de simulator en dekt de vermogensverdeling uit de draaggolf-ruisdichtheid en het schrijven van SigMF en 8 bit niet.
  • Nieuwe VALIDATED rij "Kanaalcodering van LunaNet AFS-frames, FID 0": de frames van 6000 symbolen zijn symbool voor symbool gelijk aan die van LANS-AFS-SIM (vooraf vastgelegd 986ac280); de subframe-1-code reproduceert het uitgewerkte voorbeeld van LSIS Figuur 8 en de CRC-24 de controlewaarde uit de catalogus voor CRC-24/LTE-A.
  • Beide gepromoveerde rijen hangen af van data in de LSIS-cache: hun test voor de onafhankelijke referentie wordt met een melding overgeslagen totdat xval/lunar-afs/fetch_lsis.sh is uitgevoerd.
  • Bevinding (nieuwe MODELLED rij), "LunaNet AFS-generatie van spreidingscodes": van 2.937.232 gegenereerde chips en bits, vergeleken met de tabellen van de standaard en de bestanden van Annex 3, wijkt er één af, de "laatste 24 chips" die Tabel E-5 afdrukt voor tertiaire PRN 147, die de cel van PRN 151 dupliceert terwijl het eigen bestand van Annex 3 van de standaard met de generator overeenkomt. Het criterium van nul afwijkingen wordt niet gehaald.
  • Bevinding (nieuwe MODELLED rij), "LunaNet AFS-decodeerbaarheid in een gesloten lus": drie vooraf vastgelegde runs tegen PocketSDR-AFS; de derde haalde zijn drempels voor tracking en decodering volledig maar niet zijn bewaking dat een build van de ontvanger met alleen afdrukken het log van de vastgepinde build reproduceert, omdat twee runs van de ongewijzigde ontvanger al verschillen in hun acquisitierecords.
  • Gecorrigeerd: de standaarddraaggolf van lunar_service (export_antenna.carrier_hz), lunar_jamming en attack_surface was een afgeronde 2,4 GHz; nu is het de AFS-draaggolf van LSIS-020, 2492,028 MHz. Bij de oude standaard werd het vrije-ruimteverlies 0,327 dB te laag weergegeven.
  • Herzieningen: geen. Elk meegeleverd scenario noemt zijn draaggolf, en de resultaten van alle 138 scenariobestanden zijn byte-identiek aan de vorige main.

D7, echte maan-IQ en GPS LNAV (zeven nieuwe rijen, geen VALIDATED: 242 -> 249 rijen, getoetst 123 ongewijzigd).

  • portable_math::FftPlan: een snelle Fourier-transformatie (FFT) met gemengde radix waarvan de uitvoer op elk platform dezelfde bits zijn; een SHA-256-pin van de transformaties met 8000 en 24000 punten slaagt op x86_64 en op wasm32-wasip1 (runner in xval/portable-fft-wasm/).

  • acquisition: parallelle zoekactie op codefase op bemonsterde IQ (pcps_acquire, pcps_grid) met coherente vouwing, niet-coherente accumulatie, een chi-kwadraatdrempel voor een valsalarmkans over de hele zoekactie en een celgemiddelde statistiek voor ruis met beperkte band; refine, prompt_series met code-Doppler, en de schatters M2M4 en rasterpiek voor de draaggolf-ruisdichtheid (C/N0).

  • gps_lnav: een encoder voor het legacy-navigatiebericht (LNAV) van IS-GPS-200 voor subframes 1 tot 3, met de pariteit van Tabel 20-XIV en een velddecoder.

  • realdata::ion_sdr: een lezer voor de ION GNSS SDR Metadata Standard (.sdrx) en zijn samplebestanden, met to_mid_rise voor niveaus in tweeën-complement.

  • realdata::lugre: de IQS-batchheader, RAW-, ACQ- en NAV-telemetrie en CLK-bestanden van LuGRE (Lunar GNSS Receiver Experiment), en een controle die opsomt waar metadata van .sdrx de binaire header tegenspreekt.

  • antenna::GainPattern2D en, in earth_gnss_lunar, het yawgestuurde lichaamsstelsel, zendazimut en off-nadirhoeken, en transmit_side_db voor relatieve C/N0 met gemeten patronen.

  • Codering van het GPS LNAV-navigatiebericht (nieuwe rij, blijft MODELLED na de naverificatie van de integrator): op het IGS-uitzendbestand van 2 maart 2025, geparst en gedecodeerd door RTKLIB v2.4.2-p13, slagen alle 960 woorden voor de pariteit, decoderen alle 96 subframes en zijn alle 608 uitgezonden gehele getallen gelijk aan die van Kshana (tests/gps_lnav_rtklib_integer_oracle.rs), maar de preregistratie (d4d9eb9d) bereikte de publieke branch twee seconden na de commit met het resultaat, dus de volgorde "vastgelegd voordat het bestand werd opgehaald" kan niet worden aangetoond en de rij wordt niet gepromoveerd.

  • realdata::ion_sdr vult woorden vanaf het meest significante bit (I in het hoge nibble van een LuGRE-byte; de eerdere lezing gaf het geconjugeerde signaal), houdt de oude lezing als SdrLayout::fill_lsb_first en leest samples die breder zijn dan een woord.

  • acquisition::refine_doppler_coherent: fasecoherente Doppler-verfijning (0,2 Hz RMS bij 30 dB-Hz over 200 ms in simulatie).

  • GPS L1 C/A tegen gps-sdr-sim: chips en pariteit bit-exact; 230 van de 1152 LNAV-velden verschillen een eenheid omdat gps-sdr-sim afkapt waar het uitgezonden gehele getal afronding vraagt.

  • LNAV gedecodeerd door RTKLIB: alle pariteit en subframes slagen en elke parameter ligt binnen een half kwantum; 41 geschaalde waarden verschillen enkele eenheden in de laatste plaats door de decimale constante 2^-43 van RTKLIB, boven de vastgelegde drempel.

  • LuGRE-acquisitie tegen GNSS-SDR 0.0.19: 266 van de 266 beslissingen komen overeen, 250 op dezelfde cel; de meeste positieven zijn artefacten van een gemiddelde van −0,5 in de kale 4-bit-niveaus; het deel voor C/N0 had geen gelijktijdige vluchtdata. Twee batches (OP5, OP12) zijn ten onrechte uitgesloten: hun metadata komt overeen met hun headers, maar de lezer kon toen geen sample breder dan een woord lezen.

  • LuGRE-acquisitie tegen door de baan voorspelde Doppler: met de beslissing op samplevermogen kruist elke zoekactie op ruis met beperkte band; met de celgemiddelde beslissing komen de sterkste paren in grootte overeen met omgekeerd teken, wat laat zien dat de vastgelegde I/Q-volgorde het geconjugeerde van de data is.

  • Blinde acquisitie op de batches van het maanoppervlak: vier batches verwerven elk een satelliet (voorspeld zichtbaar, geen vals alarm bij 1e-7), geen twee, dus de drempel voor het Doppler-verschil heeft geen paar om te beoordelen.

  • Relatieve C/N0 op maanafstand (M039 opnieuw geformuleerd): 15 records van Block IIR/IIR-M en één paar, te weinig voor de vastgelegde drempel.

  • Herzieningen: geen; er is geen gepubliceerd getal, golden bestand of docs-cijfer gewijzigd.

  • De rij M039 "GNSS van de Aarde op maanafstand" formuleert zijn bewering op maanafstand opnieuw als de relatieve C/N0 tussen satellieten op één epoche plus zichtbaarheid (absolute C/N0 wordt niet geclaimd); hij blijft MODELLED. De NOTICE op het hoogste niveau bevat de bronvermelding CC BY 4,0 van LuGRE.

Opgelost#

  • De DE440-oriëntatie van de hoofdassen van de Maan wordt nu geïnterpoleerd langs de geodeet tussen dagelijkse knooppunten. De eerdere interpolatie per element zat er tot 2.0e-4 rad naast (340 m op het maanoppervlak) nabij de kwartpunten van elke dag, niet de "ongeveer 14 m" die de rij vermeldde. De gebruikers ervan (geometrie van lunar laser ranging, maandatum, waarneembaarheid van maanfouten) krijgen de gecorrigeerde oriëntatie.
  • Engine-correcties van ronde 2, elk opnieuw uitgevoerd tegen zijn ongewijzigde vooraf vastgelegde tolerantie: de IERS-vintage van een EOP-rij wordt uit de I/P-vlaggen gelezen in plaats van uit een leeg Bulletin B-blok; snapshot_raim gebruikt het geodetische lokale niveau; de koppeling van het maanstelsel aan de klokgang gebruikt de equatoriale straal, J2 en rotatie; de liu22-fit begint met nulcorrecties zonder priors en gebruikt de gemiddelde-bewegingssnelheid van het artikel; de knooppuntafstand van EO bevat de nodale regressie door J2; de cycle-slip-tijd van Costas gebruikt rho/4; de gezamenlijke positiebepaling past de uitgezonden groepsvertraging van het paar toe; de gezamenlijke maanoplossing gebruikt een QR-stap; de NTN-grens wordt op de ware positie geëvalueerd; de klokreferentie bij constellatieontwerp is de laagste constellatie in zicht; de DE440-oriëntatiereeks beslaat 2014-2030 en geeft daarbuiten fouten in plaats van vast te klemmen.

Toegevoegd#

  • leo_navmsg::truth::TruthOrbit::from_ecef_states, een referentiebaan gebouwd uit getabelleerde aardvaste toestanden, gebruikt door de vergelijking met de fitter van echte banen.
  • De testbestanden en fixtures van de bovenstaande vergelijkingen, elk met zijn generator en een NOTICE.md met bron, licentie, ophaaldatum en SHA-256.
  • Ronde 2: araim_reference::add_v42_protection_levels en _ecef (ADD v4.2-foutdetectie, naar Stanford MAAST voor ARAIM 2, BSD-3-melding in de bron); raim::snapshot_raim_fde; cw_dynamics::second_order_correction en propagate_second_order; het INS-foutmodel met negen toestanden inertial::coast::ErrorDynamics; partiële afgeleiden van lunar_vlbi::KernelGeometry en de invoer lunar-vlbi voor het kernelpad; naif_kernel, een lezer voor SPK-type 2 en binaire PCK-kernels; lunar_llr_geometry::llr_bcrs_one_way_m met ITRF2020-stations; Jacchia 1971-dichtheid; solar_system::link_on over elke efemeridenprovider; launch::site_rotation_speed_at; eo_payload::j2_nodal_period en ground_track_spacing_equator_j2; batch_ls::gauss_newton_qr; precise_products (lezers voor RINEX-klok, ANTEX en DCB).

[0.29.3] - 2026-10-01#

Een patchrelease op 0.29.2. Kshana Studio is herbouwd rond twee weergaven: een eenvoudige weergave die eerst antwoord geeft en in gewone woorden uitlegt, en een geavanceerde weergave met het volledige dashboard. Er horen twee kleine fixes op kshana.dev bij. De engine verandert niet: elk meegeleverd scenario geeft een byte-identiek resultaat aan 0.29.2, afgezien van de versiestempel.

Gewijzigd#

  • Kshana Studio heeft een eenvoudige weergave. Daarmee opent de Studio.
    • Het antwoord komt eerst: een scenario opent met zijn resultaat, in één gewone zin. Elk meegeleverd scenario heeft een eigen zin, geschreven voor wat dat scenario meet.
    • Er zijn hooguit vijf instellingen zichtbaar, die het antwoord het meest veranderen. De rest staat onder "Geavanceerde instellingen", ingeklapt tot u ze opent.
    • "Hoe dit wordt berekend" legt de methode in een paar regels uit, en "Voor onderzoekers" geeft de eigen cijfers van de engine, het scenariobestand en het bewijs achter het resultaat.
  • Het volledige dashboard is de geavanceerde weergave. Elk paneel, elke grafiek, export en elk rapport van de eerdere Studio is daar te vinden.
  • Een schakelaar wisselt tussen de twee weergaven en behoudt uw plaats. Het scenario, de weergave waarin u was en de instellingen die u hebt aangepast gaan mee. De Studio onthoudt welke weergave u het laatst gebruikte. Links vanaf de site en de documentatie openen de eenvoudige weergave; een link met view=advanced opent de geavanceerde weergave, en elke eerdere Studio-link opent nog steeds hetzelfde scenario en dezelfde weergave.
  • Een snellere eerste weergave bij trage verbindingen. Het vastgelegde antwoord voor een scenario wordt getekend voordat de rest van de Studio laadt, zodat het antwoord op een trage mobiele verbinding in ongeveer twee seconden verschijnt in plaats van in ongeveer negen.
  • Betere zoekfunctie. Een zoekopdracht toont nu eerst scenario's waarvan het gebied of de titel overeenkomt met de woorden, vóór scenario's die ze alleen in de bestandsnaam of de tekst noemen.

Opgelost#

  • De globe op de startpagina wordt niet meer leeg als verminderde beweging aanstaat. Als de systeeminstelling voor verminderde beweging aanstond, kon het vergroten of verkleinen van het venster de globe in de hero leeg laten tot de pagina scrolde. De globe wordt nu in hetzelfde frame als de grootteverandering opnieuw getekend.
  • De L-bandconsole op de startpagina legt uit waarom haar band leeg is. In "Watch a jammer take the band" bleef het GPS L5 / Galileo E5a-paneel de hele minuut donker, wat er stuk uitzag. In dit scenario zendt geen jammer in die band uit en liggen de satellietsignalen onder de ruisvloer, dus er komt daar niets bovenuit. Een rustig label zegt dat nu in elk paneelstuk waarin niets boven de vloer uitkomt (het L5 / E5a-paneel, en het L2C-paneel voordat zijn ruisjammer begint), met per band de C/N0 en de lock-status uit dezelfde run. Het wordt alleen geplaatst waar niets boven de vloer uitkomt, zodat het nooit jammerenergie bedekt.

0.29.2 - 2026-10-01#

Een patchrelease op 0.29.1. Ze verwijdert gedupliceerde code in de LEO-navigatieboodschap-, fusie- en spectrummodules, voegt een licht thema toe aan kshana.dev, verplaatst Kshana Studio naar een eigen adres, maakt de site leesbaar voor zoekmachines en AI-assistenten, verhelpt enkele kleine zaken in de Studio en laat npm-releases publiceren zonder opgeslagen token. Er verandert geen engine-uitvoer: elk meegeleverd scenario geeft een byte-identiek resultaat aan 0.29.1, afgezien van de versiestempel.

Toegevoegd#

  • Een licht thema voor kshana.dev. Elke pagina kan licht of donker worden gelezen. De site volgt de systeeminstelling van de lezer en heeft een schakelaar om die te wijzigen.
  • Zoekmachines en AI-assistenten kunnen de site lezen. Elke pagina heeft nu een eigen titel, beschrijving, canoniek adres, social-cardtags en gestructureerde schema.org-gegevens, plus platte tekst voor de secties die een script tekent. De site publiceert robots.txt, een sitemap.xml met de datum waarop elke pagina voor het laatst veranderde, llms.txt en llms-full.txt (een korte en een volledige platte-tekstgids voor AI-assistenten), en een IndexNow-sleutel zodat een deploy zoekmachines kan laten weten wat er veranderd is.
  • npm-releases kunnen publiceren zonder opgeslagen token. De npm-job draait nu Node 24 en npm 11.5.1 of nieuwer, die npm trusted publishing ondersteunen: npm wisselt de GitHub-identiteit van de releasejob in voor een kortlevende inloggegevensset. Het geheim NPM_TOKEN werkt nog steeds en wordt gebruikt zolang het is ingesteld, dus er verandert niets totdat trusted publishing voor het pakket op npmjs.com is ingeschakeld. docs/RELEASING.md noemt de stappen.

Gewijzigd#

  • De kop op de startpagina is leesbaar boven de globe. Achter de kop en zijn tekst ligt nu een zachte schaduw, die de baanlijnen en satellietpunten van de geanimeerde globe vervaagt waar ze de kop kruisen.

  • Kshana Studio heeft een eigen adres: https://kshana.dev/studio/. Elke link op de site en in de documentatie wijst daarheen. Het oude adres, /playground/, werkt nog steeds en stuurt door naar het nieuwe, met behoud van het scenario, de weergave en andere instellingen in de link.

  • Studio-fixes. Het enginebestand wordt eenmaal gedownload in plaats van tweemaal. Tijdens het downloaden toont de Studio meteen het vastgelegde resultaat van het scenario, als vastgelegd gemarkeerd, in plaats van een leeg scherm. Op een telefoon is de header één compacte rij. De kerncijfers lopen door met twee per rij, zodat er geen buiten beeld valt. Veldlabels gebruiken de eigen woorden van het scenario, met de veldnaam ernaast, en de zoekfunctie vindt velden op beide.

  • Minder gedupliceerde code. De eenhedentabel van de LEO-navigatieboodschap schreef dezelfde tien SISRE-statistiekrijen voor vier fitsamenvattingen. Een macro schrijft ze nu eenmaal. De twee spectrum-waterfallgrafieken delen één tijdas, kleurenbalk en C/N0-balkpaneel. De downsampling van het hoofdraster hergebruikt downsample_grid, en de Simpson-integraal hergebruikt navsignal::simpson. De twee ingangen van het LEO-passagetype delen één setupstap. leo_link::geometry importeert de vectorhulpfuncties van leo_fusion::geom in plaats van ze te kopiëren. Het geavanceerde rapport importeert de HTML-escape van het API-rapport in plaats van die te kopiëren. Elk van de 139 scenariobestanden in scenarios/ is uitgevoerd op 0.29.1 en op deze code, en elk uitvoerbestand is byte-identiek.

  • De eenhedentabellen van leo-navmsg en leo-pvt hebben eigen bestanden. Ze zijn verplaatst uit modules die ook logica bevatten, naar src/leo_navmsg/units.rs en src/leo_fusion/pvt_units.rs. PVT_UNITS behoudt zijn publieke pad. Alleen deze twee tabelbestanden worden toegevoegd aan de uitzonderingen op copy-paste-detectie voor declaratieve catalogi in sonar-project.properties, die tests/sonar_cpd_exclusions_are_justified.rs controleert.

Opgelost#

  • De CI-badge van de README toont het resultaat van pushes naar main. De badge telde runs van elke gebeurtenis op main, zodat hij "failing" kon tonen terwijl elke push-run groen was; hij vraagt nu alleen om push-runs (event=push).

0.29.1 - 2026-10-01#

Een patchrelease op 0.29.0: het gemeten dekkingscijfer, de naamregel van het project op kshana.dev, een snellere dekkingsjob en een vernieuwde README. Er verandert geen engine-uitvoer: elk scenario geeft hetzelfde resultaat als op 0.29.0.

Herzieningen van gepubliceerde cijfers#

  • Regeldekking: ~96 % → ~95 %. De dekkingsjob heeft de uitgebrachte 0.29.0-code opnieuw gemeten (commit db796dd, CI-run 36809850252, 2026-10-01): 95.35 %, 55.970 van 58.697 regels van src/. Het gepubliceerde cijfer was 95,63 % (37.697 van 39.419 regels), gemeten op b1d350d vóór 0.28.0; het rondde af op ~96 %. Het nieuwe cijfer rondt af op ~95 %, dus elk oppervlak dat tests/coverage_figure_doc_sync.rs vastzet verschuift mee: docs/COVERAGE.md, de README-badge, de Evidence-regel en CI-tabel, de badges van crates.io, PyPI en npm, het technische rapport en de dekkingspagina van kshana.dev. De ondergrens van 85 % is ongewijzigd.

Toegevoegd#

  • De naamregel op kshana.dev. "Kshana · क्षण · the precise instant" opent nu de hero van de startpagina en staat onder het merk in de footer van elke pagina. kshana.dev doet nog steeds geen verzoek aan een andere host: het Devanagari is een zelfgehoste subset van Noto Sans Devanagari met de drie letters van क्षण (1.692 bytes, web/fonts/, met de tekst van de SIL Open Font License en zijn SHA-256 in web/fonts/FONTS.json). web/tools/fetch_third_party.py kan nu een Google Fonts-subset met text= opslaan onder een inhoudsgeadresseerde bestandsnaam.

Gewijzigd#

  • De links van de site komen aan waar ze naar wijzen, op nette adressen. Een link naar een sectie zet die sectie nu vlak onder de header, op een telefoon en op een desktop: een sectorlink bij Missies opent die sector met zijn paneel bovenaan; links bij Mogelijkheden en Edities blijven op hun plaats terwijl de grafieken erboven worden getekend; Edities voegt geen tweede headeroffset meer toe; en een link naar een ingeklapt deel van een docspagina opent dat. Elke pagina wordt gelinkt met zijn nette adres (/evidence#research, /docs/changelog, / voor de startpagina), en de canonieke links, de sitemap en de redirects van oude adressen noemen hetzelfde; de adressen met .html werken nog. Onderzoek heeft een eigen link in de header, tussen Bewijs en Ontwikkelaars, en in de footer. De docs tonen de roadmap niet meer (ROADMAP.md blijft in de repository): de groep Project is Changelog, Licensing, Security, Contributing, Governance en Code of conduct, en de Woordenlijst is verplaatst naar Aan de slag.
  • De dekkingsjob is sneller. Op 0.29.0 duurde hij 143 minuten tegen gezonde 91 tot
    1. De fuzzer tests/property.rs, de oorzaak de vorige keer, nam er 4 van voor zijn rekening. Het meegeleverde corpus groeide van 74 naar 139 scenario's, en drie testbinaries liepen er één bestand tegelijk helemaal doorheen (determinism tweemaal, advanced_report en animation eenmaal): samen 37 minuten onder dekkingsinstrumentatie, tegen 3 op 0.27.2. Ze delen nu tests/support/corpus.rs, dat het werk per scenario op elke kern uitvoert en de resultaten gesorteerd teruggeeft; elk scenario en elke assertie blijft. Op een arm64-laptop, debugbuild: determinism duurt 143 s op 14 kernen tegen 612 s met KSHANA_CORPUS_THREADS=1 (de oude seriële doorloop).
  • De README, vernieuwd. Hij opent met dezelfde naamregel als de site; de screenshots van de Studio zijn opnieuw genomen uit de 0.29.1-Studio, met een nieuwe van de Studio op een telefoon en zijn stapbalk onderaan; een nieuwe strook "The site" toont drie pagina's van kshana.dev uit de 0.29.1-build (tools/capture_site_shots.mjs, samengesteld door tools/readme_shots.py en vastgelegd in docs/assets/readme/site/SHOTS.json); het dekkingscijfer luidt ~95 %; en de alt-tekst van de onderzoeksfiguur, die die van de architectuurfiguur herhaalde, beschrijft nu de papers. De headerbadges zijn kleiner en korter (18 px hoog; "~95%", "83/223", "quality", "AGPL-3.0", "zenodo.20528627"), zodat de elf op twee regels passen; elke link en alt-tekst behoudt zijn volledige betekenis.
  • De containerimagejob krijgt 90 minuten. Bij v0.29.0 liep de geëmuleerde linux/arm64-build van de kshana-mcp-image tegen de oude limiet van 45 minuten aan tijdens het compileren van zijn laatste crate, zodat de image, de MCP-registervermelding en de kanaalcontrole niet zijn gepubliceerd. De limiet is nu 90 minuten; de image is ongewijzigd.
  • Acht float-literals anders gegroepeerd in src/ephem.rs en src/sgp4.rs (0.323_273_64 → 0.323_273_640): SonarQube Cloud las een laatste groep van _64 of _32 als een ontbrekend achtervoegsel f64 of f32 (regel S7454). De waarden zijn dezelfde getallen, dus elk resultaat blijft ongewijzigd.

0.29.0 - 2026-10-01#

Twaalf nieuwe scenariosoorten en drie nieuwe manieren om een run te lezen. De engine bestrijkt nu het radiospectrum, het hele zonnestelsel, constellaties rond elk lichaam, campagnes die scenario's tot één missie aaneenschakelen, en positiebepaling, navigatie en tijdsynchronisatie (PNT) vanuit een lage baan om de aarde (LEO), van het signaal tot de positiebepaling. Elke run kan ook worden weggeschreven als animatie, als volledig rapport en als set interoperabiliteitsbestanden voor andere hulpmiddelen.

Rond de engine: een herontworpen kshana.dev (een site met meerdere pagina's en een nieuw Kshana Studio-dashboard dat elke mogelijkheid in de browser uitvoert), een herschreven README, veertien hulpmiddelen op de Model Context Protocol-server (MCP), een browserbuild die dezelfde getallen geeft als de native build, en een openbare pagina voor Kshana Pro.

0.28.0 0.29.0
Soorten scenario's 63 75
Scenariobestanden (plus één suitemanifest) 77 138, waarvan 132 meegeleverd voor kshana example
Rijen van de verificatiematrix 174 223
waarvan VALIDATED tegen een externe onafhankelijke referentie 66 83
waarvan MODELLED (vermeld model, gecontroleerd op interne consistentie) 104 136
waarvan PARTNER (vereist hardware of gegevens van een partner) 4 4

Waar de groei vandaan komt:

Gebied Soorten Scenariobestanden Matrixrijen (getoetst + gemodelleerd)
Spectrum 1 1 3 (1 + 2)
Zonnestelsel en positiebepaling rond elk lichaam 2 3 6 (2 + 4)
Constellatieontwerp 1 3 3 (2 + 1)
Campagnes 1 5 3 (0 + 3)
Maritieme, weg- en spoorscenario's 0 5 0
Animatie, rapporten, interoperabiliteitsexports 0 0 0
LEO-signaalontwerpen en het multibandspectrum 1 4 4 (2 + 2)
LEO-overpassing en linkbudget 1 6 9 (6 + 3)
LEO-navigatiebericht 1 5 9 (3 + 6)
LEO-positiebepaling, -tijdsynchronisatie en -fusie 3 8 8 (1 + 7)
LEO-keten van begin tot eind 1 3 1 (0 + 1)
LEO-veerkracht, aandachtsgebieden en eindgebruikersscenario's 0 18 3 (0 + 3)
Totaal toegevoegd 12 61 49 (17 + 32)

De LEO-mogelijkheid is systeemonafhankelijk: ze draait op generieke, vermelde parameters en heeft geen benoemd systeem nodig. Benoemde systemen zijn optionele voorinstellingen, elk in een eigen bestand met zijn openbare bron. Eén voorinstelling, Celeste IOD (in-orbit demonstration), gebruikt cijfers die zijn gepresenteerd op de ESA NAVISP LEO-PNT-workshop, 2026 (ESA is het Europees Ruimteagentschap; NAVISP is het Navigation Innovation and Support Programme); ze staat in één bestand, src/celeste_iod.rs, met haar vijf scenario's die alleen in de repository staan, zodat ze zonder broncodewijziging kan worden achtergehouden, en geen van haar workshopcijfers wordt in deze changelog herhaald.

Lees "Herzieningen van gepubliceerde cijfers" voordat u upgradet. Eén engine-uitvoer verandert (de kolommen in het inertiaalstelsel van de soort ephemeris, na een tekenfix in de nutatiematrix), en de documentatie-audit heeft cijfers gecorrigeerd die eerdere documenten hadden afgedrukt.

Afkortingen in deze vermelding

Statussen: VALIDATED betekent gecontroleerd aan een onafhankelijke externe referentie (een gepubliceerde tabel, de software van een andere groep, of meetgegevens); MODELLED betekent een vermeld model dat alleen op interne consistentie is gecontroleerd; PARTNER betekent dat de controle hardware of gegevens van een partner vereist.

Afkorting Betekenis
3GPP, 5G, NTN 3rd Generation Partnership Project; mobiel netwerk van de vijfde generatie; niet-terrestrisch netwerk
AD, BC tijdrekeningen (anno Domini, voor Christus)
AIAA American Institute of Aeronautics and Astronautics
AltBOC, BOC, BPSK, MBOC alternatieve binaire offsetdraaggolf; binaire offsetdraaggolf; binaire fasesprongmodulatie; gemultiplexte binaire offsetdraaggolf (signaalmodulaties)
ATOMIC Autonomous Time and Orbit Determination for Microsatellite Constellations (een gepubliceerd LEO-efemeridemodel)
C/A, L1, L2, L2C, L5 coarse/acquisition-code en de namen van de draaggolven en civiele signalen van het Global Positioning System
C/N0 draaggolf-ruisdichtheidsverhouding
CIO Celestial Intermediate Origin
CLI opdrachtregelinterface
CRC-24Q 24-bits cyclische redundantiecontrole (Qualcomm-polynoom)
CSAC atoomklok op chipschaal
CSS, HTML, SVG, XML Cascading Style Sheets; HyperText Markup Language; Scalable Vector Graphics; Extensible Markup Language
CSV, JSON, PDF, TOML, URL door komma's gescheiden waarden; JavaScript Object Notation; Portable Document Format; Tom's Obvious Minimal Language; uniform resource locator
CW continue golf
CZML, KML, GeoJSON Cesium Language; Keyhole Markup Language; Geographic JSON (kaart- en globeformaten)
DE441 Development Ephemeris 441 van het Jet Propulsion Laboratory
DOI digital object identifier
DOP, GDOP, PDOP, HDOP, VDOP verzwakking van precisie: geometrisch, positie, horizontaal, verticaal
E1, E5, E5a, E5b namen van Galileo-signalen
E3F een slotnaam in de constellatietabel van het Global Positioning System
ECEF aardgecentreerd, aardvast
EE vergelijking van de equinoxen
EGM2008 Earth Gravitational Model 2008
EIRP equivalent isotroop uitgestraald vermogen
ERFA, SOFA Essential Routines for Fundamental Astronomy; Standards of Fundamental Astronomy (referentiebibliotheken voor astronomie)
ESA, NAVISP Europees Ruimteagentschap; zijn Navigation Innovation and Support Programme
FDMA frequentieverdeling voor meervoudige toegang
GCRF, GCRS Geocentric Celestial Reference Frame; Geocentric Celestial Reference System
GLONASS het Global Navigation Satellite System van Rusland
GNSS, GPS wereldwijd navigatiesatellietsysteem; Global Positioning System
IAU Internationale Astronomische Unie
ICD, OS SIS ICD, OS SDD interfacebeheerdocument; Galileo Open Service Signal-In-Space Interface Control Document; Galileo Open Service Service Definition Document
ICRF International Celestial Reference Frame
IMO Internationale Maritieme Organisatie
INS, MEMS traagheidsnavigatiesysteem; micro-elektromechanisch systeem
IOD demonstratie in een baan om de aarde
IQ in fase en in kwadratuur
IS-GPS-200 de interfacespecificatie van het Global Positioning System
ISS Internationaal Ruimtestation
ITRF, ITRS, PEF, TEME International Terrestrial Reference Frame; International Terrestrial Reference System; pseudo-aardvast; ware evenaar, gemiddelde equinox (referentiestelsels)
ITU, ITU-R Internationale Telecommunicatie-unie; haar Radiocommunicatiesector
J/S jammer-signaalverhouding
J2 tot J6, J2000 zonale harmonischen van het zwaartekrachtveld; het tijdperk 2000-01-01 12:00
JPL Jet Propulsion Laboratory
LEO, MEO lage baan om de aarde; middelhoge baan om de aarde
MBSE modelgebaseerd systeemontwerp
NEES genormaliseerde gekwadrateerde schattingsfout
NeQuick-G het ionosfeermodel van Galileo
OEM, SP3, TLE Orbit Ephemeris Message; Standard Product 3 (nauwkeurige banen); tweeregelige elementenset
PNT, PPP positiebepaling, navigatie en tijdsynchronisatie; nauwkeurige puntpositiebepaling
PSD, SSC spectrale vermogensdichtheid; spectrale scheidingscoëfficiënt
RAIM, SQM autonome integriteitsbewaking door de ontvanger; bewaking van signaalkwaliteit
RINEX, RTCM Receiver Independent Exchange Format; Radio Technical Commission for Maritime Services
RMS kwadratisch gemiddelde
RTKLIB een opensource-GNSS-positiebepalingsbibliotheek, hier gebruikt als onafhankelijke referentie
SGP4 Simplified General Perturbations 4 (het baanmodel van tweeregelige elementensets)
SHA-256 Secure Hash Algorithm, 256 bits
SigMF Signal Metadata Format
SISRE afstandsfout van het signaal in de ruimte
SPS PS Standard Positioning Service Performance Standard
SRTM Shuttle Radar Topography Mission
STK Systems Tool Kit (zijn efemeridebestandsformaat .e)
STL Satellite Time and Location
SVID identificatie van het ruimtevaartuig
T/P/F het totale aantal satellieten, de vlakken en de fasering van een Walker-constellatie
TEC totale elektronendichtheid
UHF ultrahoge frequentie
UTC gecoördineerde wereldtijd
WGS 84 World Geodetic System 1984
X1, X5 signaalnamen van het Xona Pulsar-systeem

Herzieningen van gepubliceerde cijfers#

Een gewijzigd gepubliceerd cijfer is een herziening en wordt vastgelegd, nooit stilzwijgend gecorrigeerd. Deze release bevat één herziening van engine-uitvoer en meerdere van cijfers die in de documentatie zijn afgedrukt.

Engine-uitvoer

  • De reductie van TEME naar GCRS draaide met 2·Δψ te veel: de nutatiematrix had het teken van Δψ omgekeerd. nutation::numat bouwde Rx(−(ε̄+Δε))·Rz(Δψ)·Rx(ε̄) waar iauNumat van SOFA Rx(−(ε̄+Δε))·Rz(−Δψ)·Rx(ε̄) bouwt, zodat nutation_matrix, nutation_matrix_2000a, teme_to_gcrs en gcrs_to_teme roteerden met tweemaal de nutatie in lengte, ongeveer 25 boogseconden. Elke controle op de keten was een eigenschapstest (juiste rotatie, heen-en-terug, een niet-nulbijdrage van de nutatie) die een tekenfout doorlaat; de end-to-end-Vallado-test omvatte TEME→PEF, TEME→ITRF en GCRS→ITRS maar niet TEME→GCRS. In het Vallado-voorbeeld (AIAA 2006-6753, 2004-04-06) miste de keten de gepubliceerde GCRF met 1.145 m; nu komt ze 0,11 m ervan vandaan, en de matrix is gelijk aan numat van ERFA tot 1e-14. tests/frame_reference_vectors.rs::teme_to_gcrs_matches_vallado_gcrf en nutation::tests::nutation_matrix_matches_erfa_numat falen allebei op het oude teken. De consistentietest van de CIO (Celestial Intermediate Origin) in src/cio.rs had het resulterende verschil van ~130 m toegeschreven aan "≈ 2·EE"; het residu is nu 5 cm en zijn grens is aangescherpt van 250 m tot 1 m. Dit verschuift gepubliceerde cijfers, hier als herziening vastgelegd: de kolommen gcrs_r_m en gcrs_v_m_s van de soort ephemeris (ongeveer 0,8–1,0 km voor het meegeleverde ISS-scenario (International Space Station); zijn kolommen voor TEME, aardvast, grondspoor, kijkhoek en Doppler veranderen niet), en Propagator::position_in_frame / state_gcrs voor de GCRS- en ITRS-stelsels. Geen samenvattingsregel, grafiek of golden hash van een meegeleverd scenario leest deze kolommen. De nieuwe interoperabiliteitsexports gebruiken de gecorrigeerde keten: de CZML-positie van de eerste orbit-sgp4-gps-satelliet komt tot 2,3 cm overeen met een ERFA-reductie van dezelfde TLE (gepropageerd door het Python-pakket sgp4).
  • De soort leo-navmsg, native en in de browserbuild. De soort berekent nu elke transcendente functie via één draagbare wiskundebibliotheek, zodat haar frame op elk platform en in elke build dezelfde bytes heeft (onder Fixed). Elk leo-navmsg-cijfer verschuift mee, en de fase navmsg van leo-pnt-chain. De soort is nieuw in deze release, dus er verschuift niets uit een eerdere release, maar cijfers die vóór de fix zijn afgedrukt wel: de controlewaarde van docs/LEO-NAVMSG.md voor het scenario voor coderen en decoderen was 0x110315 en is 0x19105F, en haar SISRE van het gedecodeerde bericht is 0,129 cm. Op kshana.dev toonde de Missions-kaart voor leo-navmsg-fit-interval-trade een grootste afstandsfout van 1,6 mm bij een fit van 60 s en 40,3 mm bij een fit van 900 s; de site wordt nu gebouwd met de engine van deze release en toont 1,8 mm en 46,6 mm.
  • De kaart van de jammingvoetafdruk op kshana.dev (Missions). Elk van haar 875 cellen is één run van maritime-strait-jamming waarbij alleen de positie van de ontvanger verandert. De cellen worden nu berekend uit dezelfde coördinaten met drie decimalen die de link "open this run" van de cel aan Kshana Studio geeft, zodat een cel precies toont wat zijn link reproduceert. De gemiddelde jammer-signaalverhouding (J/S) van 30 cellen verschuift met 0,1 dB, omhoog of omlaag; de trackingbeschikbaarheid van geen enkele cel verandert. De engine geeft identieke resultaten voor elke cel in 0.28.0 en 0.29.0.
  • Geseede resampling in het WebAssembly-pakket (WASM). De browserbuild trok andere bootstrap- en shuffle-indices dan de native build uit dezelfde seed (onder Fixed). Het interval quantum-anomaly-detect van de oppervlakte onder de curve in de browser was [0.9901265, 0.9938305] en is nu het native [0.99035875, 0.993861]. Er verschuift geen enkel native getal.

Cijfers die in de documentatie zijn afgedrukt

De documentatie is woord voor woord getoetst aan runs van de engine van deze release. Waar een afgedrukt cijfer niet met de run overeenkwam, is het document gecorrigeerd, en elke correctie staat hier vermeld, oud → nieuw. In elk geval hieronder is de engine-uitvoer niet veranderd; het document had haar verkeerd gelezen, verkeerd afgerond of was erdoor achterhaald.

  • Documentatie-audit van de pagina's over spectrum, constellatie, campagne, animatie, rapport en interoperabiliteit, en een nieuw docs/SOLAR-SYSTEM.md. Elk cijfer is opnieuw uitgevoerd met deze engine. Twee gepubliceerde getallen verschuiven: docs/CONSTELLATION-DESIGN.md gaf de dekkingstest met 5 000 satellieten als "ongeveer 0,13 s in een debugbuild"; dat is niet gereproduceerd (1,24 s op een belaste laptop), dus de pagina geeft nu het aandeel van het voorfilter dat de test afdrukt (9,9 % van 19.440.000 paartests) en de 0,14 s van de releasebinary voor de meegeleverde leo-pnt-mega-shell. Dezelfde pagina gaf de kruising van E3F als "0,050 graad ernaast"; geen test drukt dat cijfer af, dus de pagina vermeldt nu alleen de drempel van 0,06 graad die de test afdwingt en de afleiding 7,30 tegen 7,36 graad erachter. Er verandert geen engine-uitvoer.
  • LEO-PNT-documenten: herziene gepubliceerde cijfers (opnieuw uitgevoerd op de engine van deze release). docs/LEO-SIGNAL.md bandafweging: de eerste-orde ionosferische vertraging van generic-s is 3,24 m (was afgedrukt als 3,25 m) en van generic-c-wide 0,77 m (was 0,78 m). docs/LEO-NAVMSG.md coderen en decoderen: de SISRE van het gedecodeerde bericht was afgedrukt als 0,119 cm waar de run 0,122 cm gaf; de pagina drukt nu 0,129 cm af, het cijfer na de fix voor platformonafhankelijkheid onder Fixed hieronder. docs/LEO-PASS.md LEO-passage versus GNSS: 32 dB minder vrijeruimteverlies op de piek van de passage (was "26 tot 32 dB"). Voor de signaal- en passagecijfers is de engine-uitvoer niet veranderd; de documenten hadden haar verkeerd gelezen of verkeerd afgerond.
  • Tutorials, het uitgewerkte pijplijnvoorbeeld en de opdracht /kshana-run, getoetst aan de engine van deze release. Herzieningen van gepubliceerde cijfers, oud → nieuw: de soorten die <scenario>.table.csv schrijven zijn er zes, niet vier (leo-navmsg en telecom-timing ontbraken; docs/tutorials/README.md, commands/kshana-run.md); de koude-atoomkruising ½bT² in Tutorial 3 is 18.443 s, niet 18.440 s; de rondgangsfout van oem-interop in docs/examples/multi-tool-pipeline.md is de gemeten 4.88e-7 km, niet "~1e-7 km"; de CSAC-holdoverband van Tutorial 2 is de 2000–3200 s die de test bevestigt, niet "~2600–4400 s"; Tutorial 1 citeert de SP3-rijen en het geometrieblok met de precisie waarmee de engine ze schrijft. Er is geen engine-uitvoer veranderd.
  • Pagina's over validatie, kwantum, SGP4, animatie, beweringen en integriteit. docs/VALIDATION.md: de afgedwongen drempel voor de gesimuleerde Allan-deviatie van één seconde van een klok met witte frequentieruis is 20 % (was afgedrukt als 25 %; de drempel van 25 % is die op de curve bij 1, 10 en 100 s); de rij voor de snelheidsrandomwalk vermeldt nu zijn afgedwongen drempel van 20 % naast de waargenomen ongeveer 12 %; en de beschikbaarheid van de chip-scale atoomklok in orbit-gnss-challenged is ongeveer 0,73 (was afgedrukt als ongeveer 0,83). docs/QUANTUM.md: de door trillingen beperkte ruis per schot in het uitgewerkte koude-atoomvoorbeeld van de pagina is ongeveer 46 maal zijn schotruisvloer (was "~45×"; 46,49 herberekend), en het bereik "1–50 µg/√Hz" voor veldtoestellen, dat een toestel tegensprak dat de pagina zelf noemt, is vervangen door de gepubliceerde cijfers van de twee genoemde toestellen. docs/SGP4-VALIDATION.md: het grootste positieverschil is 4,12 mm (was "≈ 4 mm"), met vermelding van de satelliet. docs/ANIMATION.md: het voorbeeld van de video-encoder las de frames van 24 frames per seconde als 12; het gebruikt nu 24, de snelheid die het framemanifest vermeldt. docs/CLAIMS-VS-REALITY.md: het jammingmodel heeft 10 tests (was 8), en de "2,97 m tegen 48,8 m" van het gekoppelde filter is vervangen door wat zijn test bevestigt (de gekoppelde positiefout onder 0,6 maal de ontkoppelde, en wint in ten minste 90 van 100 trials). docs/INTEGRITY.md: de stempel "Today" las v0.22.0; hij noemt nu deze release, en twee mogelijkheden die sindsdien zijn gebouwd (de constellatiebrede foutmodus en het integriteitsondersteuningsbericht) verlaten zijn lijst van hiaten.

Toegevoegd#

Spectrum

  • Scenariosoort spectrum: een L-bandspectrummodel en waterfall (src/spectrum.rs, src/sigmf.rs, docs/SPECTRUM.md). De hele GNSS-L-band als één spectrale vermogensdichtheid (PSD): GPS L1 coarse/acquisition (C/A) en L2 civiel (L2C) (BPSK(1)), Galileo E1 (gemultiplexte binaire offsetdraaggolf, MBOC(6,1,1/11), of BOC(1.1)), GPS L5 en Galileo E5a (BPSK(10)), een kT-ruisvloer met een ruisgetal van de ontvanger, en jammers met continue golf (CW), smalband, chirp en gematchte ruis op een gescripte tijdlijn. Elke jammer wordt per band gescoord met zijn spectrale scheidingscoëfficiënt (SSC), wat per band per rij de jammer-signaalverhouding (J/S) en de effectieve draaggolf-ruisdichtheidsverhouding (C/N0) geeft. De grafiek is een SVG-waterfall met C/N0-balken; result.json bevat het raster in vermogen blokgemiddeld. Optioneel [iq] tekent het model als IQ-samples, schrijft en leest een Signal Metadata Format-opname (SigMF) (cf32_le, ci16_le) en vergelijkt een Welch-schatting met het model; optioneel [recording] schat een echt SigMF-bestand. Meegeleverd voorbeeld scenarios/l-band-waterfall-jamming.toml: een chirp haalt L1 C/A en E1 neer op 10 s, een CW-toon op de L1-draaggolf houdt C/A na het stoppen van de chirp op 17,98 dB-Hz terwijl E1, waarvan het spectrum daar een nul heeft, herstelt; L5 en E5a blijven onaangetast.
    • Nieuwe rij VALIDATED: de signaal-PSD's en SSC's, getoetst aan de hoofdlob van BPSK(n) van 2n x 1,023 MHz, de BOC(1.1)-lobben gecentreerd op +/-1.023 MHz, de gesloten vormen van Parseval achter de gepubliceerde SSC's van -61.8 / -64.8 / -67.8 dB/Hz, en de leerboekwaarden Q = 1 (CW) en 1,5 (gematcht). Het maximum van de BOC(1.1)-PSD ligt op +/-0.759 MHz, niet in het midden van de lob; de test legt beide vast.
    • Twee nieuwe rijen MODELLED: de waterfall en de C/N0-tijdlijn, die exact terugvallen op de keten van de soort jamming (in elk rapport gecontroleerd), en de SigMF-codec en de Welch-schatter. Er staat geen opname van een derde partij in de repository.
    • navsignal: een MBOC-variant en spectral_separation_coeff_offset.
    • Het rapport drukt de C/N0 af die de representatieve Q-tabel van de soort jamming zou geven, naast de uit het spectrum afgeleide; voor een CW-toon op de C/A-draaggolf verschillen ze 1,8 dB. Drie nieuwe matrixrijen: één getoetst aan een externe referentie (signaalspectra en spectrale scheidingscoëfficiënten) en twee gemodelleerd.

Zonnestelsel

  • Efemeride van het zonnestelsel en positiebepaling rond elk lichaam. Twee nieuwe scenariosoorten.
    • solar-system: de Zon, de acht planeten, Pluto, de Maan, Phobos, Deimos, Io, Europa, Ganymedes, Callisto en Titan op één epoch: heliocentrische positie en snelheid in het International Celestial Reference Frame (ICRF), gravitatieparameter, stralen, J2 (de tweede zonale harmonische) waar gepubliceerd, siderische rotatie, de pool en de nulmeridiaan van de Internationale Astronomische Unie (IAU), een baanspoor over één omwenteling, en de lichttijd, enkele en dubbele afstand, de Shapiro-vertraging door de Zon en de afstand tot de Zon vanaf een waarnemerslichaam en voor elke extra link. De planeten komen uit de Keplerelementen van het Jet Propulsion Laboratory (JPL) van Standish en Williams (Table 1, 1800 AD tot 2050 AD; Tables 2a/2b, 3000 BC tot 3000 AD); de manen uit gemiddelde JPL-elementen met de synchrone rotatiesnelheid van de IAU, en Titan uit het rotatiemodel van de IAU. Voorbeeld: scenarios/solar-system-tour.toml.
    • body-pnt: een orbiter of een landingsvaartuig op het oppervlak rond een van die lichamen, dat navigeert met pseudoafstanden van een Walker-constellatie rond het lichaam en een klokvrije dubbele afstand vanaf de aarde; verzwakking van precisie, formele onzekerheid en geseede kleinste-kwadratenposities met en zonder de aardelink. Voorbeelden: scenarios/mars-orbit-pnt.toml, scenarios/europa-surface-pnt.toml.
    • Body krijgt Mercurius, Venus, Jupiter, Saturnus, Uranus, Neptunus, Pluto en de zeven manen, een naamopzoeking en een fysiek record; AnalyticSolarSystem geeft elk lichaam ten opzichte van elk ander via de bestaande koppeling EphemerisProvider.
    • VALIDATED aan JPL Horizons (Development Ephemeris DE441; fixtures en queries in tests/fixtures/solar_system/): Mercurius tot Saturnus en de Aarde uit Table 1 binnen tweemaal de vermelde nominale fout (ergste 1,87 maal), alle acht planeten uit Tables 2a/2b (ergste 1,71 maal), en de lichttijd van de Aarde naar Mars en Jupiter. MODELLED: Uranus en Neptunus uit Table 1, die de vermelde fout ten opzichte van DE441 overschrijden (2,0 en 5,2 maal), Pluto, de manen, de lichaamsconstanten en de resultaten van body-pnt.
    • Bevinding: de maanreeks van Montenbruck & Gill in src/ephem.rs is door haar eigen precessieterm al naar de equinox van J2000 herleid (0,05 graad van Horizons), dus ze wordt zonder verdere precessierotatie gebruikt. Zes nieuwe matrixrijen: twee getoetst aan een externe referentie (planeetposities, lichttijd) en vier gemodelleerd.

Constellaties rond elk lichaam

  • Constellatieontwerp op schaal (soort constellation-design, src/constellation.rs). Walker-delta- en Walker-sterpatronen (T/P/F), expliciete elementenlijsten en ontwerpen met meerdere schalen, meerdere constellaties per run, rond de Aarde, de Maan, Mars of een andere planeet, Pluto of een grote maan, uit de lichaamsconstanten die de soort solar-system heeft toegevoegd. Voorinstellingen uit gepubliceerde nominale elementen: de basislijn en uitbreidbare constellatie met 24 slots van het Global Positioning System (GPS) (Standard Positioning Service Performance Standard, SPS PS, 2020), Galileo Walker 24/3/1 (Open Service Service Definition Document, uitgave 1,1), BeiDou-baan op middelhoge hoogte Walker 24/3/1 plus geostationaire en geneigde geosynchrone satellieten (Open Service Performance Standard 3,0) en GLONASS 24/3/1 (Interface Control Document 5,1). Dekking en verzwakking van precisie (DOP) over een breedte-/lengteraster: satellieten in zicht, GDOP, PDOP, HDOP en VDOP (geometrisch, positie, horizontaal, verticaal) en beschikbaarheid per cel, wereldwijd en op de slechtste locatie, met één ontvangerklok per constellatie. Een zichtbaarheidsvoorfilter (dekkingshalfhoek plus een breedteband onder de satelliet, exact op een bolvormig lichaam) draait 5.000 satellieten op een raster van 10 graad in ongeveer 0,13 s in een debugbuild.
    • VALIDATED: de Walker-generator reproduceert Galileo OS SDD Table 23 en de slotformule van de GLONASS-ICD; de GPS-voorinstelling reproduceert de kolom met equatorkruisingen van SPS PS (35 van 36 locaties binnen 0,0108 graad; E3F binnen 0,06 graad, waarbij de eigen rij van de tabel inconsistent is); de wereldwijde HDOP-verdeling van de GPS-basislijn komt overeen met SPS PS Appendix B (mediaan 0,940 tegen 0,94, 95 % 1,255 tegen 1,25, gemiddelde 0,965 tegen 0,96; drempel 0,03).
    • MODELLED: willekeurige ontwerpen, andere lichamen, de fase van BeiDou en de geneigde geosynchrone knopen, tweelichamenbanen met optionele J2, alleen geometrie.
    • Scenario's: constellation-multi-gnss-coverage (102 satellieten, beschikbaarheid 100 %, mediane PDOP 0,95, 31,0 in zicht boven 10 graad), leo-pnt-mega-shell (5.000 satellieten, beschikbaarheid 99,22 % bij PDOP 3 of lager boven 20 graad, 0 % bij de poolkappen, voorfilter houdt 11,5 % van de paartests over), lunar-relay-constellation (14 satellieten rond de Maan, beschikbaarheid 21,33 % in totaal en het hoogst boven het zuidpoolgebied). Alle drie zijn meegeleverd voor kshana example. Opmerkingen: docs/CONSTELLATION-DESIGN.md. Drie nieuwe matrixrijen: twee getoetst aan een externe referentie (Walker-generator en GNSS-voorinstellingen, wereldwijde GPS-DOP) en één gemodelleerd.
  • Een campagne aangestuurd door het spectrummodel, en constellaties rond elk lichaam. scenarios/campaign-spectrum-holdover-integrity.toml koppelt de soort spectrum aan een klok-holdover en een integriteitsmonitor (een chirp haalt L1 C/A en E1 neer; een CW-toon houdt C/A vervolgens laag terwijl E1 herstelt en de ontvanger terugvalt op een hemel met alleen Galileo), vastgelegd tegen het zelfstandige waterfallvoorbeeld in tests/campaign_composition_reference.rs. constellation-design bepaalt zijn centrale lichaam nu via Body::by_name, zodat een constellatie rond elke planeet, Pluto of grote maan kan worden gelegd met de constanten die de soort solar-system gebruikt.

Campagnes

  • Campagnes: veel scenario's samengesteld tot één run. Een nieuwe soort campaign (src/campaign.rs, gedocumenteerd in docs/CAMPAIGNS.md) voert leden van bestaande soorten uit via dezelfde dispatch als de opdrachtregel en leest getallen uit hun resultaten terug. Vier secties, in elke combinatie:
    • [[phases]]: een geketende missie op één tijdlijn. Voorinstellingen per soort lezen de klokfout tegen zijn bewakingsgrens, de gemiddelde effectieve draaggolf-ruisdichtheidsverhouding (C/N0) tegen de trackingvloer, het verticale beschermingsniveau tegen de alarmgrens, positiefout, satellieten in tracking en alarmvlaggen, vastgehouden op een gemeenschappelijk raster met fasegrenzen en gebeurtenissen. De toestand wordt doorgegeven door carry, handoff en end_at.
    • [sweep]: één tot drie gepunte sleutels van elke soort, optioneel met een geseed ensemble op elk knooppunt.
    • [monte_carlo]: realisatie k op basisseed + k, met gemiddelde, spreiding, percentielen en een bootstrap-betrouwbaarheidsinterval van 95% met vaste seed.
    • [compose]: gedeelde waarden die aan meerdere leden zijn gebonden, met een gecombineerde samenvatting van beste en slechtste. Elk resultaat draagt een campagnehash en een digest over elk ledenresultaat. Vier meegeleverde scenario's: campaign-jam-spoof-holdover-integrity (nominaal, jamming, spoofing beëindigd bij de detectie na 370 s door de klokmonitor, holdover met de gespoofde offset van 37,0 ns terwijl een traagheidseenheid doorvaart, een integriteitsalarm, herstel), campaign-sweep-jammer-power, campaign-shared-jammer-sea-road en campaign-monte-carlo-clock-holdover. tests/campaign_composition_reference.rs legt de compositie-identiteiten vast: een campagne met één fase reproduceert de zelfstandige run bit voor bit op drie soorten, een ensemble met vaste seed is bytestabiel, en op een klok met witte frequentieruis ligt het ensemblegemiddelde binnen het gerapporteerde interval met de spreiding binnen het chikwadraatinterval van sqrt(q_wf * tau) = 16,459 ns. Drie nieuwe gemodelleerde matrixrijen.

Animatie

  • Animatie-export (--animate svg|html|frames|all, src/animation.rs, docs/ANIMATION.md). Elke run waarvan het resultaat een tijdreeks bevat, kan nu worden weggeschreven als een geanimeerd Scalable Vector Graphics-bestand (SVG) (Cascading Style Sheets-keyframes, geen script: de sporen worden getekend achter een bewegende tijdcursor), als één op zichzelf staande HyperText Markup Language-speler (HTML) (afspelen en pauzeren, scrubben, snelheid, elk paneel op één gesynchroniseerde cursor, gebeurtenismarkeringen die bij een klik zoeken; geen extern bestand), of als een genummerde SVG-framereeks met een manifest.json die frames per seconde, duur en frametijden voor een video-encoder vermeldt. Een campagne wordt afgespeeld als haar fasen met haar alarmen gemarkeerd; een spectrumrun animeert zijn waterfall rij voor rij. De speler volgt prefers-color-scheme, en onder prefers-reduced-motion tonen zowel de SVG als de speler het afgewerkte beeld in plaats van te bewegen. --animate-fps en --animate-duration stellen het afspelen in; kshana::api::animate_toml en kshana::animation::animate_result zijn de ingangen van de bibliotheek, en result.json krijgt een blok animation alleen wanneer --animate draait. De uitvoer is een zuivere functie van het resultaat en de opties, byte-identiek bij een herhaalde run, zonder tijdstempel. Een soort zonder bemonsterde tijdas wordt geweigerd met "no time series to animate" en er wordt niets geschreven. De exporteur tekent de eigen samples van de run en voegt geen getal toe, dus hij is MODELLED (interne consistentie) en heeft geen rij in de verificatiematrix; er verandert geen gepubliceerd getal. Tests: tests/animation.rs (determinisme, aantal frames, geen extern adres, goedgevormde XML, het pad voor verminderde beweging, en elk meegeleverd scenario met een tijdreeks dat animeert).

Rapporten

  • Geavanceerde runrapporten (src/advanced_report.rs, docs/REPORTS.md). Elke run via de opdrachtregelinterface (CLI) schrijft nu <scenario>.report.html, een afdrukbaar HyperText Markup Language-rapport (HTML), en <scenario>.report.json, dezelfde inhoud als machineleesbaar JavaScript Object Notation-document (JSON). Secties: een managementsamenvatting; elke scenario-invoer met zijn eenheid, gelezen uit het schema van veldeenheden (het blok units van het resultaat), anders uit het achtervoegsel van de veldnaam, anders als niet vermeld aangegeven; de resultaten met de grafiek van de run, elke scalar en een samenvatting van elke numerieke kolom; voor een campagne de knooppunttabel van de sweep, het Monte Carlo-gemiddelde, de standaarddeviatie, de percentielen 5e / 50e / 95e en het bootstrap-betrouwbaarheidsinterval met een histogram per maat, de fasetabel van de keten, of de leden en gecombineerde samenvatting van de compositie (en het raster van een run van sweep of sweep-nd); een tijdlijn van gebeurtenissen; het label VALIDATED / MODELLED / PARTNER, de onafhankelijke referentie en het testbewijs van elke rij van de verificatiematrix die de soorten van de run aanspreken, gelezen uit de matrix via een kruistabel van soort naar rij (een rij die één invoerpad beoordeelt, zoals het pad Simplified General Perturbations 4 (SGP4) van orbit of het pad voor gemeten records van slot-timing, wordt alleen vermeld wanneer de run dat pad nam, en de lezersrij voor de Shuttle Radar Topography Mission (SRTM) wordt voor geen enkele soort vermeld, omdat geen scenarioveld een SRTM-tegel leest); de verklaringen over wat niet is gemodelleerd en de aannames, elk met zijn bron aangehaald; en een reproduceerbaarheidsrecord (engineversie, de bronscommit wanneer de build KSHANA_GIT_COMMIT instelt, Secure Hash Algorithm 256-bit-digests (SHA-256) van het scenariobestand en het resultaatdocument, seed, platform en de exacte opdracht). Het rapport leest geen klok: hetzelfde scenario, dezelfde seed en dezelfde enginebuild geven een byte-identiek rapport, en de enige tijdstempel die het kan tonen is die welke --study-name al schrijft. Een printstijlblad past op A4 en US Letter, herhaalt tabelkoppen en houdt rijen en figuren heel over pagina's; een Portable Document Format-bestand (PDF) wordt gemaakt met "Opslaan als PDF" van de browser. Er is geen optie --report pdf, omdat het renderen van de grafieken naar een PDF een nieuwe, zware afhankelijkheid zou vereisen. Tests: tests/advanced_report.rs rapporteert elk meegeleverd scenario (geen lege sectie, geen plaatshoudertekst, labels gelijk aan de matrix, de scenariodigest gelijk aan die van het bestand, byte-identiek bij een herhaalde run) en tests/advanced_report_cli.rs voert de vastgelegde opdracht opnieuw uit in een verse map en eist een byte-identiek result.json. Er verandert geen gepubliceerd getal, en de aantallen soorten, scenariobestanden en matrixrijen blijven ongewijzigd.
  • Het rapport, de animatie en de exports werken samen. Het geavanceerde rapport krijgt een sectie "Animatie en exports": de geanimeerde tekening van de run ingebed als inerte afbeelding (of de reden dat er geen is), links naar de animatie- en exportbestanden die ernaast zijn geschreven, en elk interoperabiliteitsformaat met of het van toepassing is, waarom niet, en zijn specificatie; report.json bevat hetzelfde blok companions. De HTML-animatiespeler toont de exportbestanden die ernaast zijn geschreven. De opdrachtregelinterface (CLI) rendert de exports nu voordat ze het rapport schrijft, zodat beide de bestanden kunnen noemen.

Interoperabiliteitsexports

  • Interoperabiliteitsexports en -imports (--export, src/interop/, docs/INTEROP.md). kshana <scenario.toml> --export <format> schrijft de geometrie van het scenario als CZML (de Cesium Language), KML (Keyhole Markup Language 2,2, een standaard van het Open Geospatial Consortium, met gx:Track tijdgetagde sporen), GeoJSON (Request for Comments 7946 van de Internet Engineering Task Force) en Ansys STK-efemeriden (Systems Tool Kit) .e (EphemerisTimePosVel, meters, één bestand per bewegend object), en de gesynthetiseerde IQ-snapshot (in fase en in kwadratuur) van de soort spectrum als SigMF-paar (Signal Metadata Format) via de bestaande src/sigmf.rs. --export all schrijft elk formaat dat van toepassing is en drukt af waarom de andere dat niet zijn; --export list rapporteert zonder te draaien. Bewegende objecten worden geschreven in het Geocentric Celestial Reference System (CZML INERTIAL, STK ICRF) en in aardvaste WGS 84 (World Geodetic System 1984) lengte, breedte en hoogte (KML, GeoJSON); vaste locaties in CZML zijn FIXED. De soort jamming voegt twee jammervoetafdrukken toe uit zijn eigen linkvergelijkingen. --import-route <file.geojson> schrijft een GeoJSON-LineString in de sporeninvoer van terrain-nav, terrain-slam, gravity-map en combined-altpnt. Exports zijn byte-deterministisch en bevatten geen tijdstempel. tests/interop_formats.rs valideert elke export tegen zijn gepubliceerde specificatie, vergelijkt geëxporteerde satelliettoestanden met die van de engine zelf tot 1 mm, en voert elk meegeleverd scenario door elk formaat, waarbij elk ofwel exporteert ofwel vermeldt waarom niet (de tabel in docs/INTEROP.md). Er verandert geen gepubliceerd getal: de IQ-synthese van de soort spectrum is verplaatst naar één gedeelde functie en zijn resultaatdocument is byte-identiek, en PassesScenario krijgt propagator() en epoch_calendar(), gebruikt door zijn eigen run. De aantallen soorten, scenariobestanden en verificatiematrixrijen blijven ongewijzigd. Een baan- of integriteitsscenario zonder epoch wordt gedateerd met de eigen gegevens van zijn satellieten: t = 0 is de vroegste epoch van een TLE (tweeregelige elementenset), broadcast-efemeride of SP3 (Standard Product 3), en elke zulke satelliet wordt op zijn eigen tijdstip geroteerd naar het GCRS en de aardvaste stelsels; 2000-01-01T00:00:00Z wordt alleen gebruikt als geen enkele satelliet een epoch heeft. De SP3- en OEM-exports (Orbit Ephemeris Message) behouden hun label 2000-01-01. Om dit te ondersteunen zijn Sgp4::epoch_jd_utc, Sp3Interpolator::jd_ut1 en Propagator::own_jd_utc toegevoegd; niets wat al bestond leest ze.

Navigatie in een lage baan om de aarde: signaal

  • LEO-PNT-signaalontwerpen en een multibandspectrum. Een nieuwe soort leo-signal en een soort spectrum die verder reikt dan de L-band: één soort, vier scenariobestanden (drie meegeleverd; het bestand Celeste IOD staat alleen in de repository) en vier matrixrijen (twee VALIDATED, twee MODELLED).
    • leo-signal: geparametriseerde signaalontwerpen voor positiebepaling, navigatie en tijdsynchronisatie (PNT) in een lage baan om de aarde (LEO) voor elk systeem (band, zendbandbreedte, ITU-toewijzing; acquisitie-, data- en pilootcomponenten met BPSK(n), BOC(m,n), MBOC of vlakke spectra, vermogensaandelen, FDMA-subdraaggolven, codelengtes en datasnelheden), uit ingecompileerde openbare voorinstellingsbestanden onder data/leo-signals/ (Xona Pulsar X1/X5, Iridium STL, een Starlink-signal of opportunity, CentiSpace, een representatief C-bandontwerp en representatieve UHF/L/S/C/brede-C-ontwerpen, elk met de URL van zijn bron) of inline geschreven. Per signaal: de bandbeperkte PSD en de vermogensfracties in de band, Gabor-bandbreedte, bandbeperkte early-late-codetrackingjitter tegen C/N0 en afstand (Betz & Kolodziejski 2009) en de afstandsnauwkeurigheid, de acquisitiezoekruimte, detectiekans en gemiddelde seriële en codeparallelle acquisitietijd, de SSC naar en van GPS L1 C/A, Galileo E1, GPS L5, Galileo E5a, E5b en AltBOC met het C/N0-verlies, CW-, breedband- en gematchte J/S-tolerantie uit de SSC-code van de spectrumsoort, een bandafweging (ionosferische vertraging, vrijeruimteverlies, afstandsbepaling bij gelijke C/N0 en gelijke EIRP, jammertolerantie), en optionele vormcontroles tegen een beschreven meting. Voorbeelden: scenarios/leo-band-trade.toml, scenarios/xona-pulsar-signals.toml, scenarios/celeste-iod-classical-pilot-signals.toml (de Celeste IOD-banden en signaalconfiguratie zoals gepresenteerd op de ESA NAVISP LEO-PNT-workshop, 2026; achtergehouden met de voorinstelling Celeste IOD, zie "LEO-PNT end to end" hieronder). Notities in docs/LEO-SIGNAL.md.
    • spectrum: banden mogen nu een voorinstelling voor een signaalontwerp zijn (elke component getekend, bandbeperkt, C/N0 en J/S herleid tot de gevolgde component) of een eigen draaggolf en modulatie; [[panels]] voegen waterfalls over andere frequentiebereiken toe op één tijdlijn; een jammer van het type wideband (barrage) voegt zich bij de vier golfvormen. Het rapport voegt bands[].tracked_power_dbw, bands[].design en panels toe, en één vermelding not_modelled. Gewone banden geven dezelfde getallen als voorheen. Voorbeeld: scenarios/multi-band-jamming-waterfall.toml.
    • navsignal krijgt de sinusintegraal, de gesloten vormen voor BPSK-vermogen in de band en de bandbeperkte Gabor-bandbreedte, de bandbeperkte early-late-jitter voor elk spectrum en zijn Gabor-grens, de gesloten vorm van de SSC voor offset-BPSK, het Galileo E5 AltBOC(15.10)-spectrum en een parser voor modulatielabels; Modulation::label drukt BPSK(1/3) af als breuk.
    • Vier matrixrijen: VALIDATED bandbeperkte gesloten vormen (90,3 % van het BPSK-vermogen in de hoofdlob, de jitter die terugvalt op de coherente vorm van Kaplan & Hegarty, 0,0039564 chips bij 45 dB-Hz, B_L 1 Hz, d 1 chip, T 20 ms, en op zijn Gabor-grens, en de BPSK-eigen-SSC 2/(3 R_c); de gesloten vorm van Gabor en de offset-SSC tegen zijn Parseval-vorm zijn vermeld als interne kruiscontroles); VALIDATED maximale LEO-Doppler (Xona X1 33,2 kHz binnen de gepubliceerde 32 tot 34 kHz, Iridium binnen 0,5 kHz van 36 kHz); MODELLED leo-signal; MODELLED multibandspectrum.
  • LEO-PNT-passage en linkbudget per band: de soort leo-pass. LEO-PNT is positiebepaling, navigatie en tijdsynchronisatie vanaf satellieten in een lage baan om de aarde (LEO). Een gebruiker (op de grond, op zee, in de lucht of binnenshuis, stilstaand of bewegend) en een of meer LEO-satellieten uit een ontworpen passage, expliciete elementen, een tweeregelige elementenset (TLE) via SGP4, of een Walker-constellatie uit de code van constellation-design. Per satelliet, band en epoch: kijkhoeken, afstand, gesloten-vorm-afstandssnelheid en -versnelling (elke run gecontroleerd met centrale verschillen), Doppler en Doppler-snelheid, vrijeruimteverlies, EIRP (equivalent isotroop uitgestraald vermogen) met een isoflux-, Gauss-bundel- of vlak satellietpatroon, een patchantenne voor de gebruiker, gasverzwakking volgens ITU-R P.676, regenverzwakking volgens ITU-R P.838/P.618, troposferische scintillatie volgens P.618, ITU-R P.2109-verlies bij binnendringen in gebouwen voor een gebruiker binnenshuis, polarisatiemismatch, systeemruistemperatuur en C/N0 (draaggolf-ruisdichtheid); de eerste-orde ionosferische vertraging per band uit een scheve TEC (totale elektronendichtheid) van Klobuchar of verticale TEC onder de satelliet, en ionosfeervrije bandparen met hun ruisversterking. Galileo- of GPS-satellieten worden met dezelfde ontvanger beoordeeld uit hun ontvangen vermogens volgens het interfacedocument, zodat de klokvormige LEO-passage en de vlakke MEO-draaggolven (medium Earth orbit) één grafiek delen. Een sectie [iot] geeft tijd tot de eerste positiebepaling, energie per positiebepaling en batterijduur tegen duty cycle (MODELLED).
    • Systeemonafhankelijk: de engine heeft geen voorinstelling nodig. Optionele voorinstellingen, elk in een eigen bestand en gemarkeerd als PUBLIC (met URL), REPRESENTATIVE of WORKSHOP: generiek multiband (UHF, L, S, C), generieke C-band, Xona Pulsar X1/X5 (arXiv 2509,19551), Iridium STL, Starlink als signal of opportunity met alleen Doppler, CentiSpace, en Celeste IOD (in-orbit demonstration), waarvan de signaalparameters zijn gepresenteerd op de ESA NAVISP LEO-PNT-workshop, 2026, en die in src/celeste_iod.rs staan zodat ze kunnen worden achtergehouden (zie "LEO-PNT end to end" hieronder).
    • Openbare bouwstenen in src/leo_link/ (geometry, antenna, itu, iono, energy, presets) die andere modules kunnen aanroepen.
    • Scenario's: leo-pass-vs-gnss-cn0, leo-indoor-uhf, leo-iot-energy, leo-pass-xona-pulsar, leo-pass-iridium, leo-pass-celeste-iod-multiband.
    • Negen matrixrijen. VALIDATED (6): ITU-R P.838-3-coëfficiënten tegen zijn Table 5; P.618-14-regenverzwakking en -scintillatie tegen de validatievoorbeelden van ITU-R Study Group 3; P.2109-verlies bij binnendringen in gebouwen tegen het werkboek van Study Group 3; eerste-orde ionosferische schaling tegen de groepsvertragingsverhouding van IS-GPS-200, met het vrijeruimteverlies; de maximale Doppler van een statische gebruiker in een cirkelbaan tegen arXiv 2509,19551 Table 1. MODELLED (3): de passage en het linkbudget, de voorinstellingen en het energiearme positiebepalingsbudget. Eén soort en zes scenariobestanden. Notities in docs/LEO-PASS.md.

Navigatie in een lage baan om de aarde: navigatieboodschap

  • LEO-navigatieboodschap (soort leo-navmsg, src/leo_navmsg/). De broadcast-efemeride- en klokboodschap van een satelliet voor positiebepaling, navigatie en tijdsynchronisatie (PNT) in een lage baan om de aarde (LEO), voor elke baan, draaggolf en elk model; benoemde voorinstellingen zijn optionele gegevens en elke mogelijkheid draait zonder ze. Eén soort, vijf scenariobestanden en negen matrixrijen (drie VALIDATED, zes MODELLED). Zie docs/LEO-NAVMSG.md.
    • Inhoud van de boodschap: SVID, uitgifte van gegevens, band en signaalgezondheid; week, tijd van de week en een kloktweedegraadspolynoom; de efemeride in een van vier modellen — de Keplerset met 16 parameters van de Galileo OS SIS ICD, die set plus correctiepolynomen langs het spoor, dwars op het spoor en radiaal, het model met 22 parameters van Liu et al. 2025 (doi 10.3390/rs17162894), of de ECEF-polynoom zonder klok van ATOMIC — en een Klobuchar-set, NeQuick-G-coëfficiënten met het effectieve ionisatieniveau, en parameters voor systeemtijd naar UTC met de schrikkelsecondegevallen van de ICD.
    • Fitter: een referentiebaan geïntegreerd met zonale J2–J6- of EGM2008-zwaartekracht en luchtweerstand, een geseede vrije of gestuurde klok, een Levenberg–Marquardt-fit op niet-singuliere elementen, vervolgens lineaire kleinste-kwadraten-correctiepolynomen en een klok gefit na aftrek van de relativistische term van de gebruiker.
    • Vier analyses en scenario's: leo-navmsg-fit-interval-trade (afstandsfout van het signaal in de ruimte (SISRE) tegen fitinterval en updateperiode), leo-navmsg-model-comparison (vier modellen, bits, en de fit van Kshana met 22 parameters op de hoogten van Liu et al. naast de gepubliceerde cijfers, MODELLED), leo-navmsg-midpass-update (continuïteit bij elke boodschapwissel in een passage) en leo-navmsg-encode-decode (het eigen gedocumenteerde binaire frame van Kshana met CRC-24Q en een kwantisatiebudget, een blok in RINEX-4-stijl dat als Kshana-extensie is gelabeld, en een CSV-tabel).
    • VALIDATED: de wereldwijd gemiddelde SISRE-gewichten tegen de gepubliceerde tabel voor middelhoge en geostationaire banen van Montenbruck et al. 2018; het Galileo-gebruikersalgoritme tegen RTKLIB op vier echte Galileo-broadcastefemeriden (tests/leo_navmsg_reference.rs); CRC-24Q tegen de controlewaarde uit de catalogus en het RTCM 10403 1005-voorbeeldframe.
    • Voorinstellingen, één bestand per stuk met bronnen: Xona Pulsar en Pulsar-0, Iridium, Starlink, CentiSpace, een representatief C-bandsysteem, ATOMIC, en Celeste IOD (de enige voorinstelling die materiaal gebruikt dat is gepresenteerd op de ESA NAVISP LEO-PNT-workshop, 2026, bewaard in src/celeste_iod.rs met zijn scenario's zodat ze kan worden achtergehouden).

Navigatie in een lage baan om de aarde: fusie

  • Gefuseerde MEO + LEO-positiebepaling, -navigatie en -tijdsynchronisatie: leo-pvt, leo-ppp en ntn-positioning. Drie nieuwe scenariosoorten in src/leo_fusion/, systeemonafhankelijk: elke constellatie bestaat uit Walker-schalen, elementensets of een GNSS-voorinstelling, elk signaal uit een draaggolf, een chipsnelheid en een omhullende van de draaggolf-ruisdichtheid (C/N0), elk foutbudget uit een expliciete één-sigma, en benoemde systemen in een lage baan om de aarde (LEO) zijn optionele voorinstellingen, één bestand per stuk met hun bronnen gemarkeerd als public, workshop of derived (Xona Pulsar X1/X5, Iridium Satellite Time and Location (STL), Starlink-signals of opportunity, CentiSpace, een representatief C-bandsysteem, het efemeridemodel zonder klok ATOMIC, en één ESA Celeste-voorinstelling voor een demonstratie in een baan om de aarde waarvan de uit de workshop afgeleide parameters in src/celeste_iod.rs staan zodat ze kunnen worden achtergehouden).
    • leo-pvt heeft vier modi: Doppler-positiebepaling (batchgewijze kleinste kwadraten op afstandssnelheid met klokdrift- en snelheidstoestanden, een modus met alleen Doppler voor signals of opportunity, de nauwkeurigheid langs het spoor en dwars op het spoor in één passage, en de omhullende van Doppler, Doppler-snelheid en jerk); gezamenlijke gewogen kleinste kwadraten voor GNSS + LEO met één klok per systeem (de inter-systeembias) of een bekende offset, sigma's per meting als invoer, en de DOP tegen het aantal LEO-satellieten; pool- en Arctische dekking tegen breedte; en LEO-tijdoverdracht naar gecoördineerde wereldtijd (UTC) tegen C/N0 en de oscillator van de ontvanger met de uitdrukking van IS-GPS-200 voor systeemtijd naar UTC.
    • leo-ppp: een float-extended-Kalmanfilter voor nauwkeurige puntpositiebepaling (PPP) op ionosfeervrije code en fase, alleen GNSS en met LEO-augmentatie, met zijn convergentietijd en een Monte Carlo-consistentietest met NEES (genormaliseerde gekwadrateerde schattingsfout). Het meegeleverde scenario geeft 7,4 min met vier MEO-systemen en 4,8, 3,2, 2,7 en 2,3 min met 60, 96, 192 en 288 LEO-satellieten, naast de 9,6, 7,0, 3,2, 2,1 en 1,3 min van Li et al. (J. Geod. 93:749, 2019) als MODELLED vergelijking van de trend.
    • ntn-positioning: 5G-positiebepaling met een niet-terrestrisch netwerk (NTN) in de 3GPP n256 mobiele-satelliet-S-band uit de Cramér-Rao-grens voor aankomsttijd en Doppler.
    • Scenario's: leo-doppler-positioning, starlink-sop-doppler-positioning, meo-leo-fused-pvt, leo-ppp-convergence, ntn-5g-positioning, polar-arctic-leo-coverage, leo-timing-utc (meegeleverd) en celeste-iod-fused-pvt (alleen in de repository, achtergehouden met de voorinstelling Celeste IOD).
    • Acht matrixrijen: de LEO-Doppler-omhullende VALIDATED aan de gepubliceerde cijfers van Iridium (±36 kHz: 35,9 kHz, binnen 5%) en Xona Pulsar X1 (32 tot 34 kHz: 33,6 kHz uit de schaal van 97 graad, zonder verbreding) (tests/leo_doppler_reference.rs); Doppler-positiebepaling, gezamenlijke pseudoafstandpositiebepaling, PPP-convergentie, NTN-grenzen, LEO-tijdsynchronisatie, poolbedekking en de voorinstellingen MODELLED. Drie soorten en acht scenariobestanden. Documentatie: docs/LEO-PNT-FUSION.md.
  • LEO-PNT van begin tot eind: de soort leo-pnt-chain, en de LEO-fasen aan elkaar gekoppeld. Eén positiebepalings-, navigatie- en tijdsynchronisatiesysteem (PNT) in een lage baan om de aarde (LEO), gevolgd van zijn signaalontwerp tot de positie van de gebruiker, elke fase de eigen soort van de engine op zijn eigen scenariotabel, met waarden die in code worden doorgegeven (docs/LEO-PNT.md):
    • Banden van leo-pass mogen een ontwerp leo-signal noemen (signal = "xona-x5"): de band neemt het midden, de zendbandbreedte en de chipsnelheid van de gevolgde component van het ontwerp over, verdeelt zijn EIRP (equivalent isotroop uitgestraald vermogen) over de componenten van het ontwerp, en rapporteert van elk epoch de C/N0 (draaggolf-ruisdichtheid) van de gevolgde component en de bandbeperkte codetrackingjitter (de afstandsfout; de paarruis van iono_free gebruikt die ook). Een band zonder ontwerp geeft dezelfde uitvoer als voorheen.
    • leo-pnt-chain voert uit: signaal -> passage -> navigatieboodschap -> gefuseerde gezamenlijke positiebepaling van leo-pvt -> optioneel leo-ppp. Elk LEO-systeem van de positioneringsfase dat ze niet instelt, neemt een C/N0-lijn in sin(elevatie) gefit aan de passage, de afstandsfout van het signaal in de ruimte (SISRE) van de boodschap (de representatiefout op de baan van de satelliet van de passage, met een vermelde baanbepalingsterm od_sisre_m als wortel van de som van kwadraten), en de draaggolf en chipsnelheid van het ontwerp; de gevallen van nauwkeurige puntpositiebepaling (PPP) nemen de SISRE. Elke overdracht staat vermeld met haar waarde en eenheid, en tests/leo_pnt_chain.rs controleert dat elke gelijk is aan de upstream-uitvoer en dat upstream-wijzigingen de downstream-cijfers laten verschuiven. LeoNavmsgScenario::broadcast_sisre is de nieuwe ingang voor de boodschap.
    • Scenario's: leo-pnt-end-to-end (een generieke constellatie op 1080 km en het representatieve signaal generic-l), xona-pulsar-end-to-end (het openbare X5-signaal), beide meegeleverd, en het optionele, alleen in de repository aanwezige celeste-iod-end-to-end.
    • De voorinstellingen voor Celeste IOD (in-orbit demonstration) van de gebieden passage, boodschap en gefuseerde positiebepaling staan nu in één bestand, src/celeste_iod.rs, dat build.rs alleen inbouwt als het bestaat (de configuratievlag kshana_celeste). De vijf scenario's (scenarios/*celeste-iod*.toml) staan alleen in de repository, dus het verwijderen van dat bestand en die scenario's houdt elk getal achter dat op de ESA NAVISP LEO-PNT-workshop, 2026, is gepresenteerd, zonder broncodewijziging; tests/workshop_preset_isolation.rs controleert welke bestanden de voorinstelling mogen noemen of de getallen van zijn bandplan mogen bevatten.
    • Elke LEO-soort in de kruistabel van het geavanceerde rapport, met zijn padspecifieke rijen alleen vermeld wanneer de run dat pad nam (een regenintensiteit, een gebouw, een analyse of modus die liep). De Doppler-vensters van leo-pvt krijgen t_s en de gevallen van leo-ppp krijgen t_min, zodat beide animeren; leo-pass en leo-pnt-chain exporteren CZML-, KML-, GeoJSON- en STK-efemeriden, en de andere LEO-soorten vermelden waarom een formaat niet van toepassing is.

Navigatie in een lage baan om de aarde: veerkracht, aandachtsgebieden en eindgebruikersscenario's

  • LEO-PNT-veerkracht, één scenario per aandachtsgebied van het experiment en één per eindgebruikerssector, en docs/LEO-PNT.md als overzicht van elke LEO-soort en elk scenario. Elk scenario draait zonder Celeste-gegevens en is meegeleverd.
    • leo-pass krijgt een sectie [spoofer]: een spoofer vervalst, zelfconsistent in afstand en afstandssnelheid, de signalen van een beweerde positie die springt en/of na een begintijdstip van de ware positie wordt weggeduwd (per LEO-band, en het MEO-GNSS-signaal), met of zonder de ionosfeer. Twee monitoren draaien bij een vermelde kans op vals alarm: consistentie van Doppler en passagegeometrie (gemeten afstandssnelheden tegen die welke uit de banen en een onafhankelijke voorafgaande positie en snelheid worden voorspeld; een gegeneraliseerde kleinste-kwadraten-chikwadraat over een venster, op de GNSS-, LEO- en alle kanalen, ruis van de frequentievergrendelingslus uit C/N0) en consistentie tussen de banden (de stap van de modelgecorrigeerde geometrievrije combinatie van elk LEO-bandpaar). Het resultaat geeft de statistieken per epoch (zodat het animeert), elk paar, en wanneer elke monitor detecteert. Bouwstenen in leo_link::spoof. Ontbrekende sectie, ongewijzigde uitvoer.
    • Elk bandpaar van leo-pass rapporteert ook de scheve totale elektronendichtheid (TEC) die zijn geometrievrije combinatie op de piek van de passage terugvindt en de sigma van de coderuis van die schatting (ionosfeerpeiling). Dit voegt twee velden toe aan elk multibandresultaat van leo-pass; er verandert geen bestaand getal.
    • De tijdsynchronisatiemodus van leo-pvt accepteert trace = true: elke rij rapporteert dan zijn tijdfout en voorspelde sigma op elk epoch, met dezelfde trekkingen, zodat de rijstatistieken ongewijzigd blijven en de run animeert en in een campagne kan worden geketend.
    • Een campagne exporteert nu elk ledenscenario dat geometrie heeft (faseruns, de basisscenario's van de sweep en Monte Carlo, samengestelde leden met hun gedeelde waarden gebonden) als eigen bestandsset, met het ledenlabel in de bestandsnaam; eerder exporteerde een campagne niets. De interoperabiliteitstabel in docs/INTEROP.md verandert dienovereenkomstig.
    • Een sweepsleutel van een campagne mag een array van tabellen op positie indexeren (system.2.sisre_m).
    • Veerkrachtscenario's: leo-resilience-multiband-diversity (een barrage in de L5-band van 50 MHz, geveegd in vermogen: elk L-bandsignaal valt weg, de LEO-signalen in UHF, S- en C-band houden hun C/N0), leo-resilience-js-margin (J/S-marge uit ontvangen vermogen: GPS L5, Galileo E5a en Xona X5 verloren bij -105, -100 en -95 dBW, een generiek LEO-signaal van -135 dBW dat bij -90 dBW nog wordt getrackt), leo-resilience-spoof-doppler (een sprong van 30 m die de Dopplertest met alleen GNSS mist en die de test op alle kanalen 105 s na het begintijdstip detecteert), leo-resilience-spoof-monitors (vier spoofers tegen beide monitoren) en leo-resilience-gnss-jammed-leo-carries (GNSS gejamd, de LEO-laag in S- en C-band getrackt, autonome integriteitsbewaking door de ontvanger op de LEO-laag alleen die bij 2 van 30 epochs alarm slaat).
    • Scenario's voor aandachtsgebieden: leo-focus-ppp-altitude, leo-focus-ntn-bandwidth, leo-focus-iot-eirp, leo-focus-science-iono-sounding, leo-focus-data-services, leo-focus-indoor-uhf, leo-focus-fused-pnt-sisre (veerkracht in L, S en C is leo-resilience-multiband-diversity).
    • Sectorcampagnes, elk geanimeerd en met export van zijn LEO-passages: leo-vertical-autonomous-vehicle, leo-vertical-rail-maritime (de meegeleverde maritieme en spoorscenario's plus LEO), leo-vertical-critical-infrastructure-timing, leo-vertical-polar-arctic, leo-vertical-5g-network-timing, leo-vertical-asset-tracking-iot. Resultaten in één regel in docs/LEO-PNT.md.
    • Drie matrixrijen MODELLED: de spoofingmonitor voor Doppler en passagegeometrie, de spoofingmonitor tussen de banden, en ionosfeerpeiling. tests/leo_resilience_verticals.rs controleert de monitoren (stil vóór het begintijdstip, de Dopplerstatistiek kwadratisch in een sprong, de ionosferische stap van een spoofer op de grond en geen bij een spoofer die de ionosfeer kent), de peilingsidentiteit, het tijdspoor tegen de rijstatistieken, en dat de export van een campagne gelijk is aan die van elk lid zelf.
    • De pagina leo-pass verhuist naar docs/LEO-PASS.md; docs/LEO-PNT.md is het overzicht.

Maritieme, weg- en spoorscenario's

  • Maritieme, weg- en spoorscenario's. Vijf meegeleverde voorbeelden op bestaande soorten, zodat schepen, wegvoertuigen en treinen elk een uitgewerkt geval hebben. Elk cijfer is MODELLED; geen enkel is getoetst aan gemeten gegevens.
    • scenarios/maritime-strait-jamming.toml (jamming): een breedbandjammer van 50 W op een mast van 30 m, 30 km over open water van een schip. Gemiddelde jammer-signaalverhouding (J/S) ongeveer 48 dB, en de beschikbaarheid daalt van 1,00 naar 0,00.
    • scenarios/maritime-port-approach-coast.toml (ins-trn-coast): een traagheidsnavigatiesysteem (INS) van navigatiekwaliteit met 12 knopen, GNSS verloren en geen ondersteuning. Het overschrijdt 10 m na 281 s en 100 m na 833 s, de cijfers voor havenaanloop en oceaanwateren van Resolutie A.1046(27) van de Internationale Maritieme Organisatie (IMO), hier als budgetten gebruikt.
    • scenarios/maritime-spoof-position-push.toml (spoof-detect): een spoofer van +2 dB die niet op de draaggolf is uitgelijnd en vier satellieten duwt om een schip 500 m weg te slepen. De gefuseerde monitor detecteert hem (score 0,70 tegen een drempel van 0,50) op autonome integriteitsbewaking door de ontvanger (RAIM) en bewaking van signaalkwaliteit (SQM); alleen vermogensbewaking mist hem.
    • scenarios/automotive-urban-canyon.toml (gnss-ins): een auto door een onderdoorgang van 15 s en een uitval van 60 s door een jammer langs de weg, tegen een budget van 1,5 m voor een halve rijstrook. De gefuseerde kwadratisch gemiddelde fout (RMS) tijdens de uitval is 1,9 m voor een micro-elektromechanisch systeem (MEMS) van automotivekwaliteit en 0,7 m voor een vergelijkingstoestel van tactische kwaliteit; vrijlopend drijft het MEMS-toestel af tot 850,8 m.
    • scenarios/rail-tunnel-coast.toml (ins-trn-coast): een INS van tactische kwaliteit op een trein met 160 km/h in een tunnel. Het overschrijdt 2 m (spooronderscheiding) na 35,8 s, ongeveer 1,6 km binnen, en 20 m na 107,3 s. Dit is alleen INS: de engine heeft geen odometermodel, dus dit is de pessimistische grens. Het aantal scenariobestanden in de README verschuift van 77 naar 82. Alle vijf zijn meegeleverd voor kshana example en vermeld in de browserplayground.

Model Context Protocol-server

  • De Model Context Protocol-server (MCP) bereikt elke soort en elke weergave van een run: zeven nieuwe hulpmiddelen, veertien in totaal. run_scenario verwerkte al elke soort; wat een agent ontbeerde was een weg naar een geldig scenario van een soort, en naar de drie uitvoerbestanden die de opdrachtregel naast een resultaat schrijft. Nieuwe hulpmiddelen:

    • list_example_scenarios en get_example_scenario leveren de meegeleverde referentiescenario's (de tabel kshana example), elk met zijn soort en de eerste zin van zijn eigen kop, byte voor byte het bestand onder scenarios/. Een scenario dat in de repository staat maar niet is meegeleverd, wordt met de reden geweigerd. Elke soort behalve lunar-llr-datum (waarvan het gegevensdeel alleen met de repository meekomt) heeft ten minste één voorbeeld.
    • report_scenario geeft het rapport van de run terug als JSON (JavaScript Object Notation) of als afdrukbare HTML-pagina (HyperText Markup Language) (docs/REPORTS.md).
    • animate_scenario geeft de tijdreeks van de run terug als geanimeerde SVG-tekening (Scalable Vector Graphics), een HTML-speler of genummerde frames, na een JSON-samenvatting van wat is getekend (docs/ANIMATION.md). Een antwoord bevat hooguit 120 frames; de opdrachtregel schrijft elke lengte.
    • list_export_formats, export_interop en import_route leveren de interoperabiliteitsexports en de GeoJSON-routeimport (docs/INTEROP.md): CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, de STK-efemeride (Systems Tool Kit) .e en SigMF (Signal Metadata Format), met een JSON-index van de bestanden (achtervoegsel, grootte en SHA-256, de digest van het 256-bits Secure Hash Algorithm) en het binaire SigMF-samplebestand als base64.

    De bibliotheek krijgt een standaard uitgeschakelde feature bundled-scenarios die de referentiescenariotabel beschikbaar stelt als kshana::bundled_scenarios; alleen de MCP-server schakelt die in, zodat het Python-wheel en de WebAssembly-module de scenariotekst nog steeds niet bevatten. Studiesuites (--study) blijven alleen via de opdrachtregel beschikbaar, omdat een suite bestanden op schijf noemt en de server er geen leest. De rondgangstests voeren elk nieuw hulpmiddel uit op meegeleverde scenario's en controleren de getallen van de engine: spectrum, het zonnestelsel, constellaties rond de Maan en Europa, een campagnesweep, en de soorten voor signaal, passage, navigatieboodschap, gefuseerde positiebepaling, nauwkeurige puntpositiebepaling, niet-terrestrisch netwerk en van begin tot eind in een lage baan om de aarde (LEO). Elk oppervlak dat het aantal MCP-hulpmiddelen vermeldt of de hulpmiddelen opsomt, zegt nu veertien, behalve de playgroundpagina onder web/, die door de site wordt vervangen.

kshana.dev, Kshana Studio en de README

  • Een herontworpen kshana.dev. De ene playgroundpagina is vervangen door een site met meerdere pagina's: Home, Missies, Mogelijkheden, Bewijs, Ontwikkelaars, Edities en Docs, met Kshana Studio één klik verderop. Elke grafiek, kaart en elk getal erop is een vastgelegde run van de engine van deze release, met het scenario en een link die dezelfde run in de Studio heropent; de sitebuild weigert een opname die door een andere enginecommit is gemaakt. De documentatiepagina's worden gegenereerd uit de docs/ van de repository, en de installatieopties uit haar kanalen. Lettertypen en scriptbibliotheken worden door kshana.dev zelf geserveerd, dus geen enkele pagina vraagt iets op bij een host van een derde partij. Oude adressen (/#playground, /#ledger, /#s=<scenario>-deellinks, /?embed=1&…-embedlinks en de rest) sturen door naar hun nieuwe plaats, en een onbekend adres krijgt een 404-pagina.
  • Kshana Studio, een dashboard voor elke mogelijkheid. De Studio opent met een startscherm met domeintegels en goede eerste runs, en leidt een run vervolgens door vijf genummerde stappen: Kies een scenario, Stel de parameters in, Voer de engine lokaal uit in de browser, Lees de resultaten (eerst de kerncijfers, elk met een chip PASS of FAIL waar de run een drempel vermeldt, daarna de panelen) en Deel of exporteer. Eén zoekvak vindt scenario's, domeinen en de velden erin en springt naar het bedieningselement; runs kunnen worden vastgezet en vergeleken; een kruimelpad zegt waar u bent; op een telefoon worden de stappen een stapbalk. Elke scenariosoort heeft zijn weergave, waaronder de spectrumwaterfall, het zonnestelsel, constellatiedekking, campagnes, de animatie, het runrapport, de interoperabiliteitsexports en de keten voor een lage baan om de aarde. Een diepe link (?scenario=…&tab=…) opent dezelfde run op het genoemde paneel.
  • Onderzoek en citeren. De pagina Bewijs noemt de vijf papers over Kshana op arXiv (2606,22054, 2606,24210, 2607,02566, 2607,05415 en 2607,06212), elk met een samenvatting, een door deze engine berekende figuur, de opdracht die ze reproduceert, een Studio-link en BibTeX, naast hoe de software te citeren. De README krijgt dezelfde sectie Onderzoek.
  • Een openbare pagina voor Kshana Pro. docs/PRO.md en de pagina Edities van de site zeggen wat de propriëtaire Pro-laag toevoegt aan dezelfde engine (ontwerpoptimalisator, onzekerheid en gevoeligheid, missiedossier, campagnebewaking, spectrumcoëxistentie, lokale jobservice, traceerbaarheid van eisen), wat elk voortbrengt en wat het niet doet. Elk Pro-cijfer dat de site toont, staat vermeld op die openbare pagina. Pro voegt geen fysisch model toe, en de open engine blijft heel en gratis.
  • Een herschreven README. Korte secties, één afbeelding per sectie, het Kshana-merkteken, twee rijen badges, gegenereerde afbeeldingen van architectuur, scenarioverloop, keten voor een lage baan om de aarde en verificatie (tools/gen_readme_assets.py, dat faalt bij een verouderde afbeelding), en Studio-screenshots die door tools/capture_studio_shots.mjs uit de draaiende Studio zijn genomen. De README's van crates.io, PyPI, npm en de MCP-server volgen hetzelfde ontwerp. Lang referentiemateriaal is ingeklapt of verplaatst naar docs/.

Gewijzigd#

  • <scenario>.report.html is nu het geavanceerde runrapport dat onder Toegevoegd wordt beschreven, en de regel wrote … van de CLI noemt ook <scenario>.report.json. De scorekaart van één pagina die het verving blijft ongewijzigd als RunOutput::html_report(), die de Python- en WebAssembly-bindings nog steeds teruggeven. OracleKind::modelled_reason() maakt de zin beschikbaar die docs/MODELLED-RATIONALE.md afdrukt voor elke rij MODELLED; dat document is ongewijzigd.
  • De README zegt waarop Kshana Pro voortbouwt. De sectie Edities en de regel Kshana Pro onder "Support & professional services" vermelden nu wat de gereedschappen van Pro voor modelgebaseerd systeemontwerp (MBSE) en programmabeheer doen en welke gepubliceerde uitvoer van de open engine ze lezen (de result.json en report.json van elke run, het scenariobestand, het schema van veldeenheden en de labels van de verificatiematrix), en waarop de digitale klokweergaven (digital twins), afwegingsstudies en bewijspakketten in de open engine berusten. Alleen formulering: er verandert geen engine-uitvoer en geen gepubliceerd getal.
  • Compatibiliteit. De publieke enum navsignal::Modulation krijgt een variant Mboc, wat een brekende wijziging is voor een aanroeper die hem uitputtend matcht. De kolommen gcrs_r_m en gcrs_v_m_s van de soort ephemeris veranderen (zie "Herzieningen van gepubliceerde cijfers"). Een run wordt nog steeds gereproduceerd door de engineversie die haar maakte.

Opgelost#

  • export_table_csv op de MCP-server noemde vier soorten als de enige met een CSV-tabel (door komma's gescheiden waarden); zes publiceren er een. Het hulpmiddel gaf de tabel altijd terug voor telecom-timing en voor leo-navmsg (zijn analyse encode-decode op een boodschapmodel kepler16 of kepler-rac), maar zijn beschrijving, zijn weigeringsmelding en de documenten die de soorten opsommen lieten beide weg, zodat een agent werd verteld er niet om te vragen. Ze worden nu genoemd, en een rondgangstest haalt beide tabellen op.

  • Het frame van de navigatieboodschap in een lage baan om de aarde (LEO) had niet op elk platform dezelfde bytes, en ook niet in elke build van één platform. scenarios/leo-navmsg-encode-decode.toml codeerde een frame met cyclische redundantiecontrole 0x110315 in de releasebuild op aarch64 macOS, 0x898BD8 in een debugbuild van dezelfde broncode op dezelfde machine, en 0x6A82D9 in de WebAssembly-build (WASM); leo-navmsg-celeste-iod.toml gaf native 0x6EDB2D tegen 0xC6E4F0 in de browser. Drie oorzaken, elk herleid tot de eerste afwijkende waarde:

    • Tussen platforms. De referentiebaan was op beide bit-identiek; het beginpunt van de fit niet. truth::state_to_elements neemt de osculerende inclinatie uit een acos en het argument van het perigeum uit een atan2, en de twee wiskundebibliotheken ronden die in de laatste plaats verschillend af (over 20.000 argumenten verschillen ze bij 781 sinussen, 858 cosinussen, 1.931 exponentiële functies en 1.899 arctangens-functies met twee argumenten).
    • Tussen buildprofielen. Een geoptimaliseerde build op macOS voegt een sinus en een cosinus van één argument samen tot één aanroep van de gecombineerde routine van het systeem, en zijn sinus is bij 379 van 200.000 argumenten niet die van de losse sin; een niet-geoptimaliseerde build doet de twee aanroepen. De soort neemt op dertien plaatsen een sinus en een cosinus samen.
    • In de klok. De normale sampler van rand_distr roept de exp en ln van de host aan in zijn twee zeldzame takken: van vier miljoen geseede trekkingen verschilden er drie in het laatste bit tussen de native en de WASM-build.

    De Levenberg–Marquardt-fit, die op deze boog stopt bij zijn limiet van 80 iteraties en niet bij een minimum, draagt één eenheid in de laatste plaats over naar verschillende gekwantiseerde velden. De soort berekent nu elke transcendente functie via de nieuwe src/portable_math.rs, die de pure-Rust-crate libm aanroept (al in de afhankelijkheidsboom, nu genoemd in Cargo.toml), voor elk doel uit één bron gecompileerd en niet een bibliotheekaanroep die de optimizer herschrijft: leo_navmsg::{truth, fit, elements, codec, sisre, services} en de scenariocode. Gehele machten op dat pad worden uitgeschreven als square-and-multiply, omdat f64::powi een niet-gespecificeerde precisie heeft, en de referentieklok trekt zijn normale afwijkingen uit portable_math::standard_normal (de poolmethode van Marsaglia op de ruwe uitvoer van de generator). De gedeelde routines waardoor de referentiebaan wordt geïntegreerd zijn eenmaal geschreven, generiek over de wiskundebibliotheek, met naast de bestaande een crate-interne ingang _portable: de bolfunctieharmonische versnelling, de zonale en luchtweerstandsversnellingen, de seculiere J2-snelheden en de Klobuchar-vertraging. De bestaande ingangen zijn tot op het laatste bit ongewijzigd, dus er verschuift geen getal van een andere soort. leo_navmsg::tests::the_encoded_frame_is_the_same_bytes_on_every_platform legt het hele frame van 171 bytes vast en één controlewaarde per efemeridemodel, in het gewone (niet-geoptimaliseerde) testprofiel, op elk platform en zonder poort voor een basislijnhost; the_kind_never_calls_the_host_mathematics_library leest de bronnen van de soort van schijf en faalt bij een inherente transcendente aanroep, bij een sampler rand_distr, of bij een aanroep naar een module die niet is beoordeeld. Na de wijziging leveren een debugbuild, een releasebuild en de WASM-build byte-identieke resultaatdocumenten voor alle vijf de scenario's van leo-navmsg. Dit verschuift getallen, hier als herziening vastgelegd. De soort leo-navmsg is nieuw in deze release, dus er verschuift niets wat in een eerdere release is gepubliceerd, maar wel elk cijfer van leo-navmsg, native en in de WASM-build, en daarmee de fase navmsg van leo-pnt-chain: de baancijfers omdat de fit nu start vanuit de draagbare elementen, de klokcijfers omdat de referentieklok een andere realisatie van hetzelfde proces is. docs/LEO-NAVMSG.md is opnieuw gegenereerd uit de nieuwe resultaten; zijn gepubliceerde controlewaarde voor het scenario voor coderen en decoderen was 0x110315 en is 0x19105F (positie binnen 1,126 mm van de exacte boodschap waar het 0,665 mm was, klok binnen 0,185 mm waar het 0,451 mm was). De omvang van de veranderingen in de cijfers onder de millimeter is de gevoeligheid van de fit, geen fout in een van beide sets: de fit is ongewijzigd en stopt nog steeds bij zijn iteratielimiet.

  • Geseede resampling trok andere indices op een 32-bitsdoel. Rng::gen_range over usize neemt 64 bits van de generator op een 64-bitshost en 32 bits op een 32-bitshost, zodat dezelfde seed andere indices gaf, en de stroom elders achterliet, in de WASM-build. Drie plaatsen trokken zo: de percentiel-bootstraps in eval_stats (bootstrap_ci, bootstrap_auc_ci), de shuffle voor elke trainingsronde in impairment_ml, en de permutatietest in impairment_study. Ze trekken nu via portable_math::uniform_index, dat altijd als u64 bemonstert: precies wat een 64-bitshost deed, dus er verschuift geen native getal. Dit verschuift gepubliceerde getallen van het WASM-pakket, hier als herziening vastgelegd: het bootstrapinterval quantum-anomaly-detect van de oppervlakte onder de curve (quantum_auc_ci, trade.foms[0].ci95) was [0.9901265, 0.9938305] in de browser en is nu het native [0.99035875, 0.993861].

  • Bestandsnamen van STK-efemeriden uit mover-id's. Een mover-id met een / of een spatie (een constellatieschaal en een satelliet, Pulsar inclined/S1-0163) liet de CLI crashen op --export stk; elk id gaat nu door een veilig bestandsdeel (letters, cijfers, -, _).

  • Het teken van de nutatie bij TEME→GCRS, hierboven beschreven onder "Herzieningen van gepubliceerde cijfers" omdat het gepubliceerde uitvoer verschuift.

0.28.0 - 2026-09-26#

Toegevoegd#

  • Scenariosoort slot-timing (src/slot_timing.rs): seconden tot een vrij lopende klok de bewakingsgrens van een tijdgeïndexeerde routerings- of taakslot verlaat, elke bijdragende term op dat moment met de dominante genoemd, de resterende tijd sinds de laatste positiebepaling, en het grootste interval tussen positiebepalingen dat de klok erbinnen houdt, na aftrek van de latentie van de positiebepaling. De klok komt uit een standaard per klasse, een voorinstelling uit een datasheet voor telecom-timing, een inline datasheet (maxima van de Allan-deviatie, veroudering, temperatuurcoëfficiënt) of een gemeten faserecord. Een overschrijding voorbij de langste middelingstijd die de bron ondersteunt, wordt als geëxtrapoleerd gemarkeerd. Meegeleverd voorbeeld: slot-timing-ocxo-leo. Zie docs/SLOT-TIMING.md.
  • Gemeten roodruisvloer. De overlappende Allan-deviatie van een faserecord wordt gefit met gewogen kleinste kwadraten in de basis voor witte fase en frequentiemodulatie volgens IEEE Std 1139 (slot_timing::fit_weighted), elk punt gewogen met zijn equivalente vrijheidsgraden, zodat een holdover-antwoord kan berusten op de eigen vloer van de klok in plaats van op de klasse-aanname. Een ongewogen fit legde een valse flikkervloer op een testrecord met witte ruis en verkortte een overschrijding van 2.000 s met 30 %.
  • Validatie met achtergehouden gegevens van de holdover-inversie op een echte klok (tests/slot_timing_cs5071a_holdout.rs): gefit op het eerste derde van het record van de 5071A-cesiumklok tegen de waterstofmaser, vallen de voorspelde één-sigma-overschrijdingen bij zes drempels van 0,5 tot 2,5 ns binnen 0,84 tot 1,03 van de overschrijdingen die op de andere twee derde zijn gemeten, tegen een drempel van 1,5 die vóór de eerste run van de test is vastgelegd. Een controle (de Allan-deviatie van één seconde gelezen als witte ruis) mist met een factor van ongeveer 1.000 en haalt de drempel niet. Nieuwe registerrij VALIDATED; de workflow realdata-clock voert hem nu uit.
  • Dezelfde voorspelling op een echte kristaloscillator (tests/slot_timing_ocxo_holdout.rs, scripts/fetch_ocxo.sh): op een gemeten oven-gestuurde kristaloscillator is de voorspelling met achtergehouden gegevens behoudend, op 0,59 tot 0,70 van de gemeten overschrijding en nooit later, en grotendeels buiten de drempel van 1,5, omdat de ruisvloer van die oscillator halveerde tijdens het record van 5.5 uur; in de steekproef gefit komt ze binnen 0,98 tot 1,17. Het kristalgeval is niet getoetst aan een externe referentie en blijft MODELLED. De run bracht ook een ontbrekende term aan het licht: de frequentie van een kristal zwerft, dus het model bevat nu de onzekerheid van de frequentie zoals bekend bij de positiebepaling (fix_frequency_sigma); zonder die term was de voorspelling tot 2,5× te optimistisch.
  • Dezelfde voorspelling op atoomklokken in een baan (tests/slot_timing_igs_holdout.rs, scripts/fetch_igs_clocks.sh): 14 dagen definitieve klokken van de International GNSS Service voor de GPS Block IIF-satellieten, met het protocol opgeschreven voordat de gegevens werden gedownload. Acht van de tien satellieten vallen binnen de drempel van 1,5; G25 en G30 voorspellen overschrijdingen tot ongeveer tweemaal zo laat als gemeten. Het protocol eist dat elke satelliet slaagt, dus het geval in een baan is niet getoetst aan een externe referentie en blijft MODELLED; de uitkomst is vastgelegd.
  • Klokklassen voor temperatuurgecompenseerd kristal (TCXO), oven-gestuurd kristal (OCXO) en rubidium-atoomfrequentiestandaard (RAFS) (ClockClass::Tcxo, Ocxo, Rafs), de onderdelen die een commerciële smallsat-bus of een grondgateway meevoert, elk met één openbare datasheet als bron (ClockClass::source). ClockClass::ALL, id en from_id toegevoegd. baseline_clock_class van quantum-trade accepteert de drie nieuwe id's. Het toevoegen van varianten aan een publieke enum is een brekende wijziging voor een aanroeper die hem uitputtend matcht.
  • Beschermingsniveau voor tijdsynchronisatie bij een ontvanger in een baan (src/orbital_timing.rs, de optionele sectie spoofing van de soort slot-timing): hoe lang een spoofer op de grond een satelliet in een lage baan om de aarde per passage kan bereiken, de afwijking die een spoofer met een vermelde maximale rampsnelheid opbouwt voordat de satelliet zijn bereik verlaat of een onafhankelijke controle draait, en of elke controle bij grondcontact of crosslink onafhankelijk is van die spoofer. Valt exact terug op tpl::timing_protection_level_ns voor een klok zonder flikker-, witte-fase- of random-run-ruis. MODELLED.
  • Drie notities: docs/SLOT-TIMING.md (waaronder tegen welke zwervingsmaat een slot moet worden geaccepteerd: maximale absolute tijdfout, niet maximale tijdsintervalfout of tijdsdeviatie, en waarom), docs/DECEIVED-TIME.md (een ondertekend commando dat op een misleide tijd wordt toegepast, leidt nog steeds verkeerd) en docs/DEPLOYMENT-TARGETS.md (waar Kshana draait; er wordt geen vluchtkern no_std aangeboden).

0.27.4 - 2026-09-26#

De release v0.27.3 bereikte crates.io (kshana en kshana-mcp) en PyPI, en stopte toen bij npm, zodat npm, de MCP-image op ghcr.io, het MCP-register, de JetBrains Marketplace en kshana.dev haar nooit ontvingen. 0.27.4 brengt dezelfde engine, met de releasefix hieronder, naar elk kanaal.

Opgelost#

  • De npm-publicatiestap noemt de tarball met een expliciet pad. npm leest een kaal npm-dist/kshana-0.27.3.tgz als de GitHub-afkorting owner/repo, dus de npm-job van v0.27.3 probeerde github.com/npm-dist/kshana-0.27.3.tgz te klonen en faalde met "Permission denied (publickey)". De tarball zelf was gebouwd en geattesteerd. De stap publiceert nu ./npm-dist/*.tgz. Alles na npm in de releasevolgorde (de MCP-image, de JetBrains-plug-in, de kanaalpariteitscontrole en de site) is overgeslagen, zoals ontworpen.

Gewijzigd#

  • De eenhedencatalogi van telecom-timing en gnss-ins zijn uitgezonderd van copy-paste-detectie, onder hetzelfde beleid en dezelfde rechtvaardigingstest als de andere catalogi. De kwaliteitspoort van SonarCloud was rood geworden door duplicatie in nieuwe code (4,0% tegen 3%), en elk gedupliceerd blok was een eenhedenrij of een ITU-T-maskervermelding.

0.27.3 - 2026-09-25#

Toegevoegd#

  • scenarios/small-uas-jammed-nav.toml: hoe lang de navigatie van een kleine drone standhoudt nadat GNSS is gejamd. Het vergelijkt een micro-elektromechanische (MEMS) traagheidseenheid van vluchtcontrollerklasse, een Bosch BMI088, met een eenheid van tactische kwaliteit. Het GNSS-signaal (Global Navigation Satellite System) is 100 s nominaal en wordt dan 60 s geweigerd (jamming-demo.toml laat zien waarom een jammer in de buurt dat doet). De biassen van de BMI088 zijn de residuen die na de kalibratie bij het opstarten overblijven, genomen uit de temperatuurcoëfficiënten in zijn datasheet (BST-BMI088-DS000-19 rev 1,9): 0,015 °/s per K voor de gyro en < 0,2 mg per K voor de versnellingsmeter. Twee aannames zijn in het bestand gemarkeerd: een opwarming van 10 K na de kalibratie, en voortdurende opwarming van 1 K per minuut tijdens de vlucht. De drift tijdens de vlucht is de fout die het filter niet kan leren voordat de jamming begint, en zij maakt een einde aan de coast. Elk cijfer is gemodelleerd; om het te toetsen zijn vluchtlogs uit een gejamde omgeving nodig. kshana example small-uas-jammed-nav drukt het af.

  • Elke sensor van gnss-ins kan zijn eigen filterprior instellen ([imu_quantum.filter_prior] of [imu_classical.filter_prior], met sigma_accel_bias en sigma_gyro_bias). De standaard is ongewijzigd, dus elk bestaand scenario geeft hetzelfde resultaat. De resterende gyrobias van een eenheid van consumentenkwaliteit ligt ongeveer 26 sigma buiten de standaard voor tactische kwaliteit, waar het filter hem nooit zou leren. Een prior die niet eindig en positief is, wordt geweigerd, en het resultaat echoot de prior wanneer er een is ingesteld.

  • kshana example [<name>] geeft een gebruiker van het register een scenario om uit te voeren. Een gebruiker van cargo install kshana heeft het uitvoerbare bestand en geen map scenarios/, dus de eerste opdracht die elke quickstart gaf, faalde. De opdrachtregelinterface (CLI) bevat nu de 75 referentiescenario's die op zichzelf draaien, byte voor byte, ingecompileerd uit scenarios/ (src/bundled_scenarios.rs; de tabel staat in de CLI-binary, zodat het Python-wheel en de WebAssembly-module niet groeien). kshana example somt ze op; kshana example clock-holdover > clock-holdover.toml schrijft er een weg. De andere twee bestanden staan alleen in de repository: lunar-llr-datum leest gearchiveerde laserafstandsmetingen naar de Maan die alleen met de repository meekomen, en quantum-pnt-demonstrator.suite is een studiemanifest dat drie zusterbestanden uitvoert met --study. Om een van beide vragen levert de reden en sluit af met 2 in plaats van iets af te drukken wat niet op zichzelf kan draaien. tests/cli_first_run.rs houdt de tabel in beide richtingen gelijk aan de map, zodat een nieuw scenariobestand dat niet is meegeleverd en niet als alleen-repository is benoemd, faalt.

  • Elke kwaliteitsmaat in een klok-, baan-, hybride- of fusieresultaat zegt nu of ze VALIDATED of MODELLED is, in het resultaat zelf. Het resultaatdocument krijgt een blok figure_tiers, altijd zijn laatste sleutel. Het somt elk gerapporteerd cijfer op (bijvoorbeeld quantum.fom.timing_p95_ns) met zijn niveau — VALIDATED betekent gecontroleerd aan een onafhankelijke externe referentie, MODELLED betekent een model uit eerste beginselen dat intern is getest — en de rij van de verificatiematrix waaruit het niveau wordt gelezen. Het niveau komt uit src/verification.rs via src/fom_label.rs, dus er is geen tweede tabel die kan afdwalen. Hiervoor kwamen de woorden "getoetst" en "gemodelleerd" nul keer voor in een klok-holdover-resultaat, en een lezer van de ruwe JSON (JavaScript Object Notation) kon de twee niet uit elkaar houden. De positiecijfers van hybrid en fusion hebben geen eigen matrixrij, dus ze staan onder untiered in plaats van een niveau te krijgen. Het blok bevat geen getallen. Het is bewezen additief, niet aangenomen: door het te verwijderen krijgt men het document van vóór de wijziging byte voor byte terug, voor alle vijf de soorten (een enginetest), en beide golden-harnassen (tests/registry_golden.rs, tests/cross_platform_golden.rs) strippen nu precies deze sleutel, en alleen als het de laatste is, en hashen de rest tegen hun ongewijzigde bevroren constanten. Een lijst in elk harnas legt vast welke scenario's het blok moeten bevatten, zodat de uitsluiting niet ongemerkt kan groeien.

  • Een soort telecom-timing antwoordt in de eenheden van een timingengineer: tijdfout, maximale tijdsintervalfout (MTIE) en tijdsdeviatie (TDEV), elk met PASS of FAIL en een marge tegen de maskers van de International Telecommunication Union Telecommunication Standardization Sector (ITU-T). De maskers zijn overgenomen uit de geldende edities: G.8272 (07/2025) voor de klassen A en B van de primaire referentietijdklok (PRTC), G.8272.1 (2024) Amd. 1 (07/2025) voor de verbeterde PRTC in vergrendelde modus en in holdover (waaronder zijn tijdfoutomhullende, die van 30 ns tot 100 ns stijgt over een holdoverperiode die wordt bepaald door hoe lang de klok vergrendeld was), G.8273.2 (2023) Amd. 2 (11/2025) voor telecom-boundary- en time-slave-klokken, klassen A tot D, en G.8271.1 (2022) Amd. 3 (05/2025) voor de netwerkgrenzen op referentiepunt C. Elke vermelding die die Aanbevelingen "for further study" laten, ontbreekt en is niet geschat, en docs/TELECOM-TIMING.md somt elk getal op met zijn tabel of clausule en elk item dat is weggelaten. Het rapport geeft ook de tijd tot overschrijding van elk tijdfoutbudget: standaard de 100 ns standaard voor ePRTC-holdover, een toewijzing van 400 ns voor netwerkholdover, de grens van 1.100 ns op punt C en de end-to-end-eis van 1,5 microseconde voor klasse 4.

    De invoer is een synthetische holdover of een reeks van uzelf. De synthetische gebruikt een van vier oscillatorvoorinstellingen (een oven-gestuurde kristaloscillator, een rubidiumstandaard, een cesiumstandaard en een chip-scale atoomklok), elk met de stabiliteits-, verouderings- en temperatuurcijfers van een benoemde Microchip-datasheet. Hoe die cijfers wit, flikker- en random-walk-frequentieruis, veroudering en een temperatuurterm worden, staat in elk rapport vermeld en is gelabeld als MODELLED. Een reeks van uzelf bestaat uit paren [time_s, time_error_ns], inline (zo draait het in de browser) of, bij native builds, uit een bestand met door komma's gescheiden waarden. De MTIE/TDEV-tabel, met naast elke waarde de grens van elk geselecteerd masker, wordt geschreven als het CSV-artefact van de run.

    scenarios/telecom-prtc-holdover-24h.toml is een rubidium-holdover van 24 uur met veroudering, flikker en een dagelijkse temperatuurcyclus: de grootste tijdfout is 603,2 ns, hij overschrijdt 100 ns 8.206 s na het verlies en blijft de hele dag binnen 1,5 microseconden, en hij haalt de omhullende voor ePRTC-holdover niet, zoals een klok die niet van cesiumklasse is hoort te doen. scenarios/telecom-tie-ingest.toml toont de inline invoer. De MTIE en TDEV die de soort rapporteert worden gecontroleerd met het pakket allantools op een vastgelegde holdoverreeks van 2 048 samples, exact voor MTIE en tot 1.1e-15 voor TDEV, zodat de matrix één rij VALIDATED en twee rijen MODELLED erbij krijgt (de maskertranscriptie en de voorinstellingen) en nu staat op 171 rijen — 65 VALIDATED, 102 MODELLED, 4 PARTNER. De dekking van veldeenheden gaat van 60 van 61 soorten naar 61 van 62, en van 1.742 naar 1.788 beschreven velden. De soort is nieuw en additief: geen bestaand scenario, geen pin en geen gepubliceerd cijfer verschuift.

  • De playground voert de engine uit in een Web Worker op de achtergrond, zodat een traag scenario de pagina niet meer bevriest. web/engine-worker.mjs host de WebAssembly-engine en web/engine.mjs stuurt elke scenario-uitvoering ernaar door — runs, parametersweeps en de exports naar SP3 / OMM / OEM / CSV. Een run die langer dan 150 ms duurt, toont een bezettoestand (Run uitgeschakeld, "Running… N s") en een knop Annuleren die de worker beëindigt en opnieuw start; een browser die geen modulewerker kan starten, valt terug op het oude pad via de hoofdthread. cislunar-arc-recovery, uit de catalogus weggelaten omdat het de pagina bevroor, staat er weer in, als traag gelabeld: het duurt ongeveer 13 s in Chrome (vier engineaanroepen van elk ongeveer 3 s), waarin de pagina responsief blijft.

  • Elke gerapporteerde grootheid van cislunar-observability heeft nu een eenheid, een herkomstklasse en een definitie — de op een na laatste soort op de crate-brede uitzonderingslijst. Alle 41 numerieke velden van het UITGEBRACHTE document zijn beschreven, zodat de dekking van veldeenheden van 59 van 61 soorten naar 60 van 61 gaat en van 1.698 naar 1.742 beschreven velden, terwijl de achterstand zonder definitie ongewijzigd 239 blijft.

    Dit werd geblokkeerd door de pin die het uitgebrachte document bevriest, die units noemde als een sleutel die het document nooit mocht krijgen. Er een toevoegen had betekend dat die assertie werd verwijderd en drie hashes in drie bestanden opnieuw werden vastgelegd — een vorm die niet te onderscheiden is van het toedekken van een regressie. In plaats daarvan bewijzen de twee pins die dit document meten nu dat de toevoeging additief is: elk strip het blok units er weer af en hasht opnieuw tegen de constante die is bevroren voordat het blok bestond, en beide constanten zijn ongewijzigd. Een mutatie bevestigt dat de garantie echt is — verplaats een uitgebrachte waarde en leg de hash van het hele document opnieuw vast zoals een slordige fix zou doen, en het strippen en opnieuw hashen faalt nog steeds. De derde pin, in het generieke registry-golden-harnas, is opnieuw vastgelegd in lijn met de zes zusters die om precies deze reden opnieuw zijn vastgelegd, en zijn waardedragende literal expect_summary verschuift niet.

  • realtime-frame-eop rapporteert aan welke referentie elke rij voor aarde-oriëntatie is getoetst, en hoe vaak de terugvaloptie werd gebruikt. table3_joint_eop[].{ut1, polar_motion,combined} krijgen truth_source en truth_fallback_rows. De vloer final wordt gescoord tegen de definitieve waarden van Bulletin B en kan alleen epochs gebruiken die er een publiceren; elke rij dN wordt gescoord tegen truth_pm()/truth_ut1(), die terugvallen op de snelle waarde van Bulletin A. In het meegeleverde uittreksel van 2026 zijn dat 12 van 31 samples bij één dag, tegen 0 bij de vloer — dus de vloerrij en de voorspellingsrijen ernaast berusten aantoonbaar op verschillende referenties, wat het rapport nu vermeldt in plaats van het te laten afleiden uit een aantal samples dat stijgt waar geneste horizons dat niet kunnen.

  • moonlight-service-volume geeft een Kepler-basislijn met gelijke grootte. ephemeris_comparison.keplerian_matched voert de illustratieve constellatie opnieuw uit met het eigen aantal satellieten van de OPGEHAALDE set, alleen aanwezig wanneer de aantallen verschillen. Het aantal maakt deel uit van de geometrie van dat ontwerp — RAAN en gemiddelde anomalie worden allebei gespreid als 360k/n — dus zonder dit werd een opgehaalde set van vijf satellieten gescoord tegen een illustratieve van acht satellieten en werden ontwerp en grootte door elkaar gehaald. Voor de LANS-referentieset van vijf satellieten blijkt 8,68 van het dekkingsverschil van 14.24 punten te komen door de drie ontbrekende satellieten en slechts 5,56 punten door het ontwerp; voor de vier ruimtevaartuigen die werkelijk in een baan om de Maan zijn, bereikt een speciaal gebouwde set van vier satellieten 4,86 % waar zij 0 % bereiken. Een test legt vast dat de gematchte rij een herbouwde constellatie is en niet de geconfigureerde onder een andere naam, zoals hij eerst was geschreven en wat de run toen rapporteerde.

  • Negen mogelijkhedenkaarten op de openbare site, die 22 rijen van de verificatiematrix dekken die zonder kaart op productniveau zijn geleverd. De engine had een familie van mogelijkheden gekregen — de ARAIM-controle tegen gepubliceerde referentievectoren van Working Group C, echte opgehaalde geometrie van een maanconstellatie, de maanontkenningscontour met een gemeten C/N₀-band, de stap van VLBI-schema naar stationscovariantie, optische en RF-overdracht met foutinjectie tussen modaliteiten, voorspelling van aarde-oriëntatie in real time tegen gearchiveerde Bulletin A, het delen van apertuur tussen navigatie en communicatie, INS/TRN-coasting, en dekking van eenheden en herkomst — elk met een matrixrij en een meegeleverd scenario, en geen enkele genoemd op kshana.dev. De dekking van kaart naar rij gaat van 72 van 168 rijen naar 94.

  • Acht scenario's toegevoegd aan de playground-catalogus. De knop Run van een mogelijkhedenkaart verschijnt alleen als web/app.js het bestand ook bevat; zes kaarten noemden een scenario dat daar niet in stond, waardoor ze zonder mogelijkheid om ze uit te voeren werden getoond — een daarvan, het datum voor echte laserafstandsmeting, verkeerde in die toestand sinds de oplevering. tests/scenario_examples_doc_sync.rs bewaakt de invariant nu in beide helften: het run-doel van een kaart moet onder scenarios/ zijn meegeleverd en door de catalogus worden aangeboden. Mutatiegetest tegen beide faalwijzen.

  • moonlight-service-volume geeft zijn geometrie per satelliet uit als <scenario>.table.csv wanneer een exportlocatie is ingesteld (G11). Het is de grootste array die de crate publiceert — 2304 rijen in de uitgebrachte gezamenlijke communicatie- en navigatietabel — en hij bereikte gebruikers alleen binnen JSON, de vorm die de curve van 57 punten van een zusterscenario inkortte tot 23 punten onder een kolom die beweerde ze allemaal te bevatten. Eén rij per verbinding, het aantal rijen op de kopregel, de antennekolommen alleen aanwezig als er een antenne is ingesteld. Een run zonder exportlocatie is byte voor byte ongewijzigd en schrijft geen bestand.

  • De SBOM beschrijft nu wat er wordt geleverd: 60 componenten werden 66. scripts/gen-sbom.sh vermeldde elk pakket van de resolve met standaardfeatures, ontwikkelafhankelijkheden inbegrepen. Daardoor stonden sgp4 en chrono — crates die alleen voor tests dienen en in geen enkel artefact worden gecompileerd — in de materiaallijst, en ontbrak de keten van --features python die het PyPI-wheel linkt (pyo3, pyo3-ffi, pyo3-macros, pyo3-macros-backend, pyo3-build-config, portable-atomic, target-lexicon, heck), de foreign-function-grens van dat wheel. Het script doorloopt nu de resolve-graaf vanaf het pakket kshana, uitsluitend langs normale en buildverbindingen, over de unie van de featuresets default, python en wasm (het npm-pakket bevat dezelfde SBOM), voor elk doelplatform. Het vastgelegde oordeel van de CycloneDX-formaatcontrole is opnieuw als basislijn vastgesteld via de gecommitte generator: 60 → 66 componenten, 53 → 60 samengestelde licentie-expressies, en nog steeds nul schemafouten zodra die in de standaard expression-vorm zijn gezet.

  • De CSV-reproduceerbaarheidstabel bereikt elke toegang, niet alleen de CLI en het Python-wheel. De MCP-server krijgt een zevende tool, export_table_csv, die een scenario uitvoert en de byte-stabiele tabel teruggeeft die de CLI als <scenario>.table.csv schrijft — of een fout die de soorten noemt die er een publiceren (realtime-frame-eop, lunar-time-budget, lunar-jamming, en moonlight-service-volume alleen als export_site_lat_deg + export_site_lon_deg zijn ingesteld). De WebAssembly-module krijgt table_csv, dat dezelfde tekst teruggeeft of undefined. De MCP-round-triptest en de Python-bindingtests leggen de teruggegeven CSV nu byte voor byte vast tegen tests/golden/realtime-frame-eop.csv, en leggen vast dat RunOutput.write_csv het aantal geschreven bytes teruggeeft, en 0 zonder aangemaakt bestand voor een soort zonder tabel. Elk oppervlak dat het aantal MCP-tools vermeldt of de tools opsomt, zegt nu zeven.

  • run_all in de WebAssembly-module: één enginerun voor alle uitvoer. run, chart_svg, summary en table_csv voeren het scenario elk helemaal opnieuw uit, dus de playground betaalde per klik voor vier volledige runs — ongeveer 12 s in plaats van 3 s voor cislunar-arc-recovery in een browser. run_all geeft {json, svg, summary, csv} terug uit één run, en de playground gebruikt dat nu. Het komt byte voor byte overeen met de vier afzonderlijke aanroepen.

Opgelost#

  • HERZIENING: de koppeling van de gyro-bias in het GNSS/INS-filter had het verkeerde teken, en de cijfers voor een uitval in gnss-ins veranderen. Het extended Kalman-filter (EKF) met foutstatus houdt beide inertiale biassen bij als residuen (waar min de lopende schatting, teruggekoppeld door optelling). De versnellingsmeterkolom stuurde de snelheidsfout aan met +C_b^n b_a, maar de gyrokolom stuurde de standfout aan met −C_b^n b_g. Een resterende gyro-bias draait de berekende stand in werkelijkheid met +C_b^n b_g, zodat elke schatting van de gyro-bias de verkeerde kant op duwde. Het pakket bleef alleen stabiel doordat de standaard a-priori van de gyro-bias (1e-4 rad/s, 1-sigma) strak genoeg was om die toestanden vast te houden. Met een bredere a-priori divergeerde het filter zelfs als de werkelijke gyro-bias nul was: 93 m gefuseerde uitvalfout werd 4,3 km. De gepubliceerde cijfers voor scenarios/gnss-ins.toml veranderen als volgt:

    gnss-ins.toml voor (≤ 0.27.2) na
    koude-atoom-IMU, gefuseerde RMS tijdens uitval 96,1 m 1,9 m
    koude-atoom-IMU, coast binnen specificatie (50 m) 30 s 60 s (de hele uitval)
    tactische IMU, gefuseerde RMS tijdens uitval 62,5 m 3,1 m
    tactische IMU, coast binnen specificatie (50 m) 37 s 60 s (de hele uitval)

    De cijfers voor vrij lopen (130,7 m en 314,3 m) veranderen niet; die gebruikten het filter nooit. De eerdere lezing van het pakket, dat de gefuseerde coast wordt beperkt door een overdracht-standvloer en dus niet verbetert met een betere sensor, was een artefact van deze bug en wordt ingetrokken. Met constante, ruisvrije biassen leert het filter ze nu terwijl GNSS beschikbaar is, dus de gefuseerde coast is een beste geval. De externe filterpy-referentie (tests/gnss_ins_sensor_fusion_reference.rs) controleert alleen de meetupdates, waardoor ze de propagatie nooit zag. Twee tests controleren het teken nu rechtstreeks en beide falen op het oude. De eerste, in closed_loop.rs, voert een bekende resterende gyro-bias door de strapdown en eist dat het filter de resulterende standfout voorspelt binnen 2 %. De tweede eist dat een brede a-priori een gyro-bias van 1e-3 rad/s leert en binnen 6 m blijft. De platformoverschrijdende golden van gnss-ins is om deze reden opnieuw vastgelegd en om geen andere.

  • Elke quickstart van een register draait nu zoals geschreven op een schone machine. Gemeten vóór deze wijziging bevatten de voorbeelden voor crates.io en PyPI (Python Package Index) scenarios/clock-holdover.toml, dat een registerinstallatie niet heeft, en het npm-voorbeeld crashte onder Node.js met TypeError: fetch failed, omdat de init() van het pakket zijn WebAssembly-binary ophaalt en de fetch van Node geen lokaal bestand kan lezen. Nu:

    • README.crates.md en README.pypi.md bevatten dat scenario inline, zoals README.npm.md al deed. De Rust-fence is een heel programma met een eigen main, omdat de voor rustdoc verborgen regel # Ok::<…> waarmee ze eindigde op crates.io wordt getoond en niet compileert wanneer ze wordt geplakt. tests/readme_code_fences_doc_sync.rs compileert haar nog steeds byte voor byte en weigert nu ook een verborgen regel in de fence.
    • README.npm.md scheidt de browser van Node.js en geeft een Node-recept dat de binary van schijf leest en aan initSync doorgeeft. De doc-sync-test accepteert initSync als de loader die wasm-bindgen genereert.
    • Alle drie nemen het scenario op met zijn herkomststrings onverkort, zodat de scenario-hash op elk oppervlak 5ba83a232b94 is. Het npm-voorbeeld kortte ze vroeger in, waardoor het een andere hash had dan de CLI.
    • Gereproduceerd uit lokale builds van deze boom: een nieuw cargo new-project met een padafhankelijkheid op de verpakte crate bouwde en draaide het Rust-voorbeeld; een met maturin uit de verpakte bronnen gebouwd wheel, geïnstalleerd in een nieuwe virtuele omgeving, draaide het Python-voorbeeld; en het pakket wasm-pack --target web, ingepakt en met npm geïnstalleerd, draaide het Node-recept. Alle drie drukten dezelfde samenvattingsregel af.
  • cargo run -- <scenario.toml> werkt vanuit een clone. Cargo.toml stelt default-run = "kshana" in. Zonder dat weigerde cargo met “could not determine which binary to run”, waar elke regel met cargo run -- in de documentatie tegenaan liep.

  • De foutmeldingen van de CLI in de eerste minuut zeggen wat u hierna moet doen. Een scenariopad dat niet bestaat, voegt nu een hint toe die naar kshana example wijst, en een tweede positioneel argument drukt de gebruikstekst af en noemt ook het argument. --help, --version, de foutmelding voor een onbekende optie (exit 2) en de eenregelige ok: van --validate bij succes bestonden al op main. tests/cli_first_run.rs dekt ze nu allemaal, aangezien geen enkele test de binary er eerder voor draaide.

  • list_kinds() in Python is gedocumenteerd als een JSON-string die wordt teruggegeven, niet als een lijst. Het geeft dezelfde metadata terug als scenario_kinds(), geserialiseerd, dus erover itereren doorloopt tekens. Het behoudt zijn string als retourwaarde zodat bestaande aanroepers niet breken. kshana.pyi, de doccomment van de binding, docs/PYTHON_API.md en README.pypi.md zeggen dat nu en verwijzen naar scenario_kinds().

  • De drie register-README's schrijven elke afkorting bij het eerste gebruik voluit. PNT wordt nu uitgeschreven in de tagline, waar het voor het eerst voorkomt, en CLI, TOML, JSON, SVG, CSV, CSAC, HTML, URL en API worden uitgeschreven in de bestanden die ze gebruiken. De kop van de tabel met onafhankelijke referenties zegt niet langer “CI-gated” voordat CI is gedefinieerd.

  • Een gepubliceerd cijfer gecorrigeerd: de beschikbaarheid van ARAIM met twee constellaties op de meegeleverde Celestrak-TLE's voor GPS + Galileo. docs/CAPABILITY.md stelde dat het poolen van Galileo de beschikbaarheid verhoogt van 0,21 naar 0,67 bij een VAL van 12 m en dat de constellatiefout-robuuste modus beperkt is met slechts twee constellaties. Dat kwam doordat tests/araim_dual_real_data.rs elke satelliet propageerde vanaf zijn eigen TLE-epoch (parse_propagators laat de epoch weg), en de epochs in die bestanden beslaan 70,6 h (GPS) en 335,7 h (Galileo), zodat de satellieten op onderling inconsistente tijdstippen stonden. De test behoudt nu elke epoch (parse_tle) en evalueert elke satelliet op één gemeenschappelijk UTC-tijdstip, de laatste TLE-epoch in de set (2026-06-07T07:21:04). De gemeten beschikbaarheid over hetzelfde raster van 24 h en 289 samples wordt voor alleen GPS 0,993 (was 0,208), gepoold 1,000 (was 0,671) en constellatiefout-robuust dubbel 0,990 (was 0,031); bij de APV-I-limiet gaat de dubbele modus van 0,180 naar 1,000. De conclusie keert om: op een consistente hemel dragen twee constellaties de constellatiefout-hypothese bij een VAL van 12 m. Dezelfde cijfers ontstaan met de vroegste TLE-epoch als referentie. Een zelfcontrole in de test legt haar beschikbaarheidslus sample voor sample vast op araim_dual_constellation_availability, dus het enige verschil is de tijdsuitlijning. docs/CAPABILITY.md en docs/REAL_TLE_GUIDE.md §3 bevatten de nieuwe cijfers; de vermelding voor 0.13.0 hieronder blijft zoals uitgebracht.

  • De openbare oppervlakken adverteren RINEX 4 niet langer als getoetst. De engine weigert een RINEX 4-navigatiebestand nu bij naam in plaats van het verkeerd te decoderen, maar het standaardenoverzicht toonde nog steeds een kaart “RINEX 3 / 4” met een label getoetst aan een onafhankelijke externe referentie, gekoppeld aan het RINEX-3-bewijs van de navigatieparser. De kaart is nu “RINEX 3”, en README, docs/CAPABILITY.md, docs/STANDARDS.md, ROADMAP.md en de samenvatting van de mogelijkheden vermelden wat waar is: RINEX 3.0x-observatiebestanden worden geparseerd, de observatie-indeling 4,00 wordt verwacht te werken maar er is nog geen 4,00-bestand door de code gelezen, en RINEX 4-navigatiebestanden worden geweigerd.

  • --validate zegt wanneer “ok” betekent dat er niets te controleren was. Ongeveer twee derde van de catalogus publiceert geen verplicht veld — die pakketten draaien hun referentieconfiguratie vanuit een lege body — dus de lint kon er alleen “ok” voor afdrukken, in dezelfde woorden als na het controleren van zes velden. De succesregel vermeldt nu het aantal verplichte velden dat aanwezig bleek, of dat de soort er geen vereist.

  • scripts/gate.sh weigert een niet-numerieke REPEAT of TEST_THREADS. Onder bash 3,2 liet REPEAT=no de numerieke vergelijking falen en onwaar opleveren, zodat de gate “repeatability loop SKIPPED (REPEAT=0)” meldde voor een waarde die niet 0 was en toch een bon schreef. Beide knoppen stoppen nu met exit 2 tenzij het gewone gehele getallen zijn.

  • De MSRV wordt overal waar een mens haar leest als 1,85 vermeld. Cargo.toml ging bij de vorige release naar 1,85; de README-badge, de install- en troubleshootingtekst, codemeta.json en de eigen onderbouwing van de MCP-crate zeiden nog 1,75.

  • RunOutput.__repr__ in de Python-binding rapporteert bytes, niet “chars”. Het drukte len() van UTF-8-strings af, wat een aantal bytes is: 710 “chars” voor een tabel van 708 tekens.

  • De README documenteert --study --study-name niet langer samen. --study-name is een vlag voor één scenario, die met --study wordt genegeerd (de binary waarschuwt). De twee kopieervoorbeelden in README.md en README.crates.md tonen nu alleen de studieopdracht.

  • Het klokstabiliteitsbewijs van de site vermeldt beide waargenomen toleranties. De caesiumreeks 5071A wordt gereproduceerd tot ≤ 3e-5 en PHASE.DAT tot ≤ 5e-5; de alinea gaf 3e-5 voor beide.

  • Twee uitvoerbestanden van de engine worden niet langer bijgehouden. scenarios/quantum-pnt-demonstrator.study.{json,html} waren gestempeld door engine 0.20.0 met elke kwaliteitsmaat leeg, en de eigen studieopdracht van de README overschreef ze, waardoor de boom vervuild raakte en de push-gate werd geblokkeerd. *.study.json / *.study.html worden nu genegeerd zoals de andere vier engine-uitvoerbestanden.

  • Een seed-sweep in de playground faalt niet langer bij elke run. De sweep doorliep de integer-knop seed lineair (1, 10,9, 20,8, …), en de engine, die hem als u64 las, verwierp elke gebroken waarde. Integer-knoppen doorlopen nu verschillende gehele getallen.

  • Elke download uit de playground zegt welke engine en welke invoer hem maakte. Een paar soorten (bijv. realtime-frame-eop) geven geen engine_version of scenario_hash uit, dus hun downloads heetten gewoon kshana-csv.csv. De naam valt nu terug op de versie van de geladen engine en een FNV-1a-64-vingerafdruk van 12 hexadecimale tekens van de scenariotekst.

Gewijzigd#

  • De gepubliceerde crate is minder dan de helft zo groot als voorheen, en cargo install kshana bouwt alleen de CLI. Het pakket bevatte vroeger de papers, hun indieningspakketten, de artefacten van de papergrafieken, de notebooks, docs/, de onderhoudsscripts en de voorbeeldprogramma's. Geen ervan wordt door de bibliotheek of de CLI gecompileerd. Het bevatte ook de drie interne generatoren onder src/bin/ (crossover_study, gen_validation_artifacts, validation_report), zodat een registerinstallatie vier uitvoerbare bestanden compileerde en installeerde, waarvan drie alleen nuttig binnen een checkout. Die bomen en de drie generatorbronnen zijn nu uitgesloten. Cargo leidt de binaries van een pakket af uit de bestanden die het bevat, dus het gepubliceerde manifest noemt alleen kshana. In een clone worden de generatoren nog steeds automatisch gevonden, zodat cargo run --bin <name> en de releasejob die validation_report draait ongewijzigd zijn. Gemeten met cargo package: 763 bestanden, 16,7 MiB, 6,8 MiB gecomprimeerd ervoor; 591 bestanden, 10,5 MiB, 3,0 MiB gecomprimeerd erna. De verificatiebuild, die alleen de verpakte bestanden compileert, slaagt. cargo install --path op de verpakte crate installeerde één uitvoerbaar bestand, kshana.

  • Uitvoer die een tijdsynchronisatie-ingenieur kan lezen: geen p95 0.0ns meer, geen security 0.000 meer zonder aanval, en aantallen per site die met de README's overeenkomen. Dit is een weergaveherziening. Er verandert geen gepubliceerd getal; de JSON-waarden zijn identiek, wat de golden-hashes hierboven bewijzen.

    • De eenregelige samenvatting drukte de tijdsynchronisatiefout van de optische klok op het 95e percentiel (p95) af als 0.0ns terwijl de tabel ernaast 1.20e-4 ns toonde. Een tijdsynchronisatiecijfer ongelijk aan nul dat te klein is voor één decimaal wordt nu afgedrukt met drie significante cijfers (p95 1.20e-4ns); een exacte nul wordt nog steeds afgedrukt als 0.0. Het HTML-rapport (HyperText Markup Language), de vergelijkingstabel van de studie en het downloadbare rapport van de playground gebruiken dezelfde regel, dus geen enkel cijfer ongelijk aan nul wordt nog als 0.000 afgedrukt.
    • security is een analytische grens voor de detecteerbaarheid van spoofing die alleen iets betekent tegen een ingestelde aanval. De soorten clock, orbit, hybrid en fusion stellen er geen in, dus hun samenvatting drukt nu security n/a (no attack) af in plaats van een getal zoals 0.000 dat leest als een mislukte detectie. De waarde blijft in fom.security, gemarkeerd met applicable: false en de reden in figure_tiers, en de rapporttabellen tonen “not applicable”. De soort spoof scoort detectie nog steeds.
    • Twee samenvattingspins in tests/registry_golden.rs veranderden om precies deze twee redenen en om geen andere: golden_clock (de kwantum-p95 en beide waarden van security) en golden_orbit (beide waarden van security; de p95-waarden zijn exact nul). Hun hashes van het hele document veranderden niet. De verwachte samenvattingen in de README, de drie tutorials en hun lesscenario's zijn bijgewerkt om overeen te komen, en tests/tutorials.rs controleert de lesexemplaren tegen de engine.
    • De begeleide rondleiding van de playground opent niet langer bij het eerste laden. Het modaal venster ving de eerste klikken op en de spotlight scrolde de pagina weg van waar de bezoeker was geland. Ze start vanaf de knop “Take the 60-second tour” of de zwevende knop Tour.
    • De pagina scrolt op een telefoon niet langer zijwaarts. Bij 390 px kwamen de merkrij en de GitHub-knop op ongeveer 410 px inhoud, een overloop van 4 px; de header past nu vanaf 320 px, en de tabel met kwaliteitsmaten scrolt binnen zijn eigen vak in plaats van de pagina te verbreden.
    • De mogelijkhedenverkenner opende met zijn eigen aantal kaarten (“46 capability cards … 17 backed by an external oracle”) naast README's die 64 van 168 zeggen. Hij opent nu met de verificatiematrix, gelezen uit de gegenereerde web/data/verification-matrix.json (dezelfde matrix waaraan de aantallen in de README zijn vastgepind), en noemt de kaarten daarna als de samenvattingslaag die ze zijn. web/counts.test.mjs, een nieuwe stap in de continuous-integration-workflow (CI), controleert de rekensom en vergelijkt README.md en de beschrijvingen van de pagina onderling; tests/web_validation_counts_doc_sync.rs legt de koppeling vanaf de Rust-kant vast.
  • De openbare beschrijving opent nu met tijdsynchronisatie en holdover, het best getoetste domein. De opening van de README en docs/POSITIONING.md presenteren Kshana als een open, reproduceerbare, herkomstgelabelde bewijsengine voor PNT-veerkracht: tijdsynchronisatie en holdover van kritieke infrastructuur eerst (de schatters voor Allan, gemodificeerde Allan, tijdsdeviatie en maximale tijdsintervalfout en de inversie van de coast-variantie bij holdover zijn de VALIDATED-rijen daarachter), kwantum als neutrale afwegingsmethode kwantum-versus-klassiek waarvan de resultaten MODELLED zijn gelabeld, en lunaire / cislunaire en deep-space-navigatie als onderhouden mogelijkheden in plaats van het hoofdpunt. Beide pagina's zeggen nu wat Kshana niet is — geen simulator van radiofrequente signalen of hardware-in-the-loop-opstelling, geen vervanging voor MATLAB/Simulink, STK of Orekit — en verwijzen naar de nieuwe soort telecom-timing en docs/TELECOM-TIMING.md. De oude zin “there is no good open tool” is verdwenen: een zoekopdracht die niets vindt is geen bewijs dat er niets bestaat. ROADMAP.md krijgt een ongedateerde prioriteitsvolgorde (tijdsynchronisatie eerst, de kwantumafweging tweede, lunair onderhouden) en laat drie verouderde punten vallen (Coriolis- en lichtverschuivingssystematiek, de beginvoorwaarden voor NRHO en het lunaire scenario, alle opgeleverd); de regel in de README “Coriolis and light-shift remain roadmap” is op dezelfde manier gecorrigeerd.

  • docs/CAPABILITY.md onderschat zichzelf niet langer. De rij voor aardvaste stelsels zei “none” terwijl de matrix GCRS→ITRS als VALIDATED beoordeelt; ze is nu “full”, en de rij voor kernstelsels legt de ANISE-kruiscontrole vast als geleverd. De begeleide modus stond als roadmap vermeld; de playground heeft begeleide schuifregelaars en een begeleide rondleiding opgeleverd. Een controle tegen src/verification.rs corrigeerde vijf andere rijen die ouder waren dan hun validaties: het Cowell-krachtenmodel en batch/sequentiële baanbepaling tegen Orekit 12,2, grondstationpassages tegen de elevatiedetector van Orekit, de kernel voor verzwakking van precisie (DOP) tegen gnss_lib_py, en OEM-import tegen de onafhankelijke parser oem; de rij voor verificatie en validatie noemt nu de bewakers die controleren dat elke geciteerde test bestaat.

  • De woordenlijst legt uit wat een resultaatbestand zegt. docs/GLOSSARY.md krijgt begrijpelijke vermeldingen voor de uitvoertermen (holdover, p95, integriteit, de beveiligingsscore, PDOP, sigma_y, q_wf), de tijdsynchronisatietermen voor telecom (tijdsfout, max|TE|, cTE, dTE, MTIE, TDEV, PRTC, ePRTC, T-BC, T-TSC, OCXO, CSAC) en de drie bewijsniveaus (VALIDATED, MODELLED, PARTNER).

  • Afkortingen worden bij het eerste gebruik voluit geschreven in elk met de hand geschreven openbaar document. De README en 24 bestanden onder docs/ hadden enkele honderden afkortingen die vóór, of zonder, hun uitleg werden gebruikt; elke is nu uitgeschreven waar ze in dat bestand voor het eerst voorkomt. De drie gegenereerde bestanden (docs/VERIFICATION-MATRIX.md, docs/MODELLED-RATIONALE.md, docs/SCENARIOS.md) blijven ongemoeid: ze worden geschreven uit src/verification.rs en api::list_scenario_kinds(), dus hun formulering moet bij de bron veranderen.

  • Regeldekking heeft een vastgelegde meting. docs/COVERAGE.md legt 95,63 % vast (37.697 van 39.419 regels) uit de CI-job coverage op b1d350d, en tests/coverage_figure_doc_sync.rs pint de vijf openbare oppervlakken “~96%” daaraan vast — het ene kopgetal dat met de hand werd bijgehouden en al eens ongemerkt was verschoven.

  • Nieuwe doc-sync-gates voor oppervlakken die niets las. tests/readme_code_fences_doc_sync.rs controleert elke import { … } from "kshana" in een JavaScript-fence tegen de WebAssembly-exports, en pint het Rust-voorbeeld van README.crates.md byte voor byte vast aan een kopie die de testbinary compileert. tests/security_md_doc_sync.rs faalt als src/lib.rs #![forbid(unsafe_code)] verliest of SECURITY.md het niet meer vermeldt. tests/no_overclaims.rs scant nu ook web/README.md en de drie register-README's, en elke standaard op de site moet zijn proof expliciet vermelden.

  • De twee controles van echte-hardwareklokken draaien op een runner. realdata-clock.yml (maandelijks en bij dispatch) haalt de reeksen 5071A en PHASE.DAT op en draait beide tests met KSHANA_REQUIRE_REALDATA=1, zodat een ontbrekende invoer faalt in plaats van wordt overgeslagen. Beide fetchscripts zijn vastgepind op één allantools-commit en verifiëren SHA-256.

  • De Python-typestub wordt gecontroleerd tegen het gebouwde wheel (mypy.stubtest in de bindingsjob), waardoor csv/write_csv zonder stub werden uitgeleverd.

  • De woordenlijst definieert URE, EOP, FoM, CTI en TIB, die de README en het register zonder uitleg gebruikten.

  • Het gepubliceerde veldcontract van elke soort is nu waar, en een test houdt het zo. Vijf van de 61 soorten veranderden. Soorten met een niet-lege required_fields gaan van 21 naar 22: ephemeris vereist nu tle|orbit+epoch (een kale kind = "ephemeris" slaagde vroeger voor --validate en liet de run daarna falen), en quantum-trade voegt candidate_adev_taus+candidate_adev_values|candidate_clock_class toe, wat de run al eiste. Een verplichte vermelding mag | (een van deze) en + (allemaal samen) gebruiken; --validate begrijpt beide. lunar-joint-od-clock, pvt en earth-gnss-lunar publiceren 9 echte optionele velden die ze hadden weggelaten. docs/SCENARIOS.md zegt nu dat kind voor elke soort verplicht is behalve clock. tests/required_fields_are_true.rs controleert elke soort tegen zijn meegeleverde scenario: het verwijderen van een verplichte vermelding moet de run laten falen, en een document met alleen de verplichte velden moet draaien.

  • De notities voor de JetBrains Marketplace worden bewaakt. scripts/check-version-sync.sh faalt nu tenzij de nieuwste <change-notes>-vermelding in plugin.xml de te leveren versie noemt; zeven gepubliceerde versies hadden de notities van 0.22.0 ongewijzigd geleverd.

  • Het dekkingscijfer van het technisch rapport is het gemeten cijfer. paper/kshana-technical-report.md zei “near 97 %”; het zegt nu near 96 % (95,63 % gemeten, docs/COVERAGE.md) en is het zesde oppervlak dat de dekkingstest vastpint.

  • De engineclient buiten de hoofdthread wordt getest (web/engine.test.mjs, in CI): dispatch-allowlist, annuleren en opnieuw starten, de drie terugvalroutes op de hoofdthread en herstel na een crash, tegen een nepworker.

  • Er wordt niets gepubliceerd voordat de getagde commit zijn tests heeft doorstaan, en een release is pas klaar als elk register hem aanbiedt. De volgorde is nu tag, verifiëren, publiceren, pariteit, site, in één run van release.yml (docs/RELEASING.md).

    • Publiceren wacht op het oordeel. publish.yml, mcp-publish.yml en jetbrains-plugin.yml starten niet langer bij de tag-push; release.yml roept ze aan vanuit jobs die needs: verify hebben. Eerder liepen ze er een race mee: bij v0.27.2 hadden crates.io, npm en de Python Package Index (PyPI) allemaal binnen 4,5 minuten na de tag gepubliceerd, en verify kwam 84 minuten erna terug; bij v0.27.0 publiceerden npm en PyPI terwijl de job van crates.io faalde. Een handmatige herpoging op een tag wordt tegengehouden door de nieuwe scripts/check-release-verdict.sh, die een groene verify voor precies die commit vanuit de Actions-interface eist en bij al het andere gesloten faalt.
    • Alles wordt gebouwd voordat er iets wordt geüpload, en crates.io, waarvan de verpakkingsstap degene is die halverwege een release faalde, publiceert als eerste.
    • Een ontbrekend registertoken laat de job falen in plaats van de upload over te slaan en succes te melden.
    • Een pariteitscontrole na het publiceren. scripts/check_channel_parity.py bevraagt crates.io (kshana en kshana-mcp), npm, PyPI (de brondistributie en alle zes de platformwheels) en ghcr.io totdat elk de versie aanbiedt, of laat de run falen; docs.rs en het Model Context Protocol-register (MCP) worden gerapporteerd, niet vereist. Tegen eerdere releases gedraaid vindt het 0.22.0 ontbrekend op npm en PyPI, 0.23.0 op PyPI en 0.27.0 op crates.io.
    • Vooraf gebouwde opdrachtregelbinaries voor macOS (Apple silicon en Intel) en Windows x86-64, benoemd naar doelplatform (kshana-aarch64-apple-darwin enzovoort), naast de Linux-kshana, waarvan de naam ongewijzigd is. Een bestand SHA256SUMS dekt elk onderdeel, en verify-release controleert het en draait de binaries voor macOS en Windows op hun eigen systemen.
    • kshana.dev toont een release, niet main. Het werd vroeger bij elke push naar main opnieuw uitgerold terwijl zijn pagina's de laatste release noemden. pages.yml bouwt nu alleen een releasetag: de release start het zodra elk kanaal de versie aanbiedt, en een handmatige dispatch rolt de laatste release (of een genoemde) opnieuw uit.
    • Eén bron voor wheels. De met de hand gekopieerde matrix met zes doelplatforms van publish.yml is verdwenen; het roept wheels.yml aan, zodat de auditwheel-taggate en de controle op byte-reproduceerbaarheid nu de wheels beoordelen die PyPI ontvangt, en een falen in een van beide de release stopt.
    • Vastgepinde buildtools. Elke workflow vraagt Rust 1.93.0 aan (de msrv-job zijn eigen versie); publish.yml en pages.yml hadden @stable aangevraagd, en het log van v0.27.2 toont dat rustup 1.98.1 installeerde en daarna met 1.93.0 compileerde, alleen omdat rust-toolchain.toml zwaarder weegt. wasm-pack is vastgepind op 0.13.1 (de versie die v0.27.2 bouwde, die het niet-vastgepinde installatiescript koos) met een controle van de checksum, en mcp-publisher op 1.8.1 met zijn gepubliceerde SHA-256. scripts/check-toolchain.sh faalt nu als een workflow om een andere compiler vraagt of een gedownload script in een shell pijpt. Er is geen verificatiejob, golden pin of lokaal gatescript verwijderd of versoepeld.

Beveiliging#

  • Elke GitHub Action van derden is vastgepind op commit-SHA — 93 verwijzingen in 15 workflows, 92 ervan nieuw — waarbij de tag als afsluitend commentaar blijft staan zodat Dependabot kan bijwerken. De uitzondering is dtolnay/rust-toolchain, waarvan de tag de toolchainkiezer is.

  • De basislagen van het image van de MCP-server zijn vastgepind op multi-arch-digest, en Dependabot bewaakt nu de Dockerfile van mcp/kshana-mcp, zodat de OS-lagen nog steeds beveiligingsupdates ontvangen — via een beoordeelde PR.

  • De controle van tag tegen manifest draait in de twee publicatieworkflows die de versie van de tag leveren. mcp-publish.yml (ghcr-image, MCP-register) en jetbrains-plugin.yml (Marketplace) lopen een race met publish.yml in plaats van erop te wachten, dus een verkeerd gemaakte tag werd alleen in een zusterworkflow bewaakt. Beide draaien nu scripts/check-version-sync.sh vóór het bouwen.

  • Vier advisories die Dependabot opwierp op de dag dat zijn meldingen werden ingeschakeld, zijn verholpen. De MCP-server gaat van rmcp 1,7 naar 2,2: drie advisories tegen rmcp < 2,1 (een lek in de sessietabel van Streamable-HTTP, ontbrekende validatie van OAuth protected-resource, aangepaste headers die een cross-origin-redirect volgen) — hier geen enkele bereikbaar, aangezien de server alleen stdio spreekt, maar een gepubliceerde crate hoort geen kwetsbare SDK vast te pinnen. De macro's van rmcp 2 hebben Rust 1,88 nodig, dus alleen kshana-mcp declareert nu rust-version = "1.88"; de bibliotheek kshana blijft op 1,85. De ene API-wijziging (Content → ContentBlock) is doorgevoerd, en de round-triptests slagen. De SonarQube-scanactie gaat van v5 naar v6, wat een advisory over argumentinjectie verhelpt (≥ 4,0, < 6,0).

0.27.2 - 2026-09-22#

Toegevoegd#

  • Elk Rust-item dat een rij van de verificatiematrix citeert, wordt nu tegen de crate opgelost. De bestaande bewaker controleerde de citaten in de vorm van bestandspaden; 63 van de 164 niet-partnerrijen noemen hun bewijs in plaats daarvan als item in de crate — navsignal::code_tests, integrity::tpl_scalar::tests, api::tests::tracking_loop_kind_round_trips_through_the_dispatch — en een token zonder achtervoegsel .rs was onzichtbaar voor een padscanner. Die rijen hadden een hernoemde module, een geleegde testmodule of een functie die nooit bestond kunnen noemen, en elke gate was groen gebleven.

    tests/verification_rows_name_a_test_that_exists.rs lost alle 339 van zulke citaten op via de moduleboom, eist dat elke niet-partnerrij ten minste één test noemt die daadwerkelijk #[test] draagt, en eist dat partnerrijen er geen noemen. Vier mutaties dienden om hem te beoordelen: een geciteerde module hernoemen, het enige testcitaat van een rij naar een functie zonder test laten wijzen, de echte mod tests hernoemen en de attributen #[test] eruit strippen — elk gaat rood op de bewering die erover gaat.

    Eén rij was al fout: Alternative / complementary PNT citeerde tests/*, een glob, wat geen citaat is. Ze noemt nu tests/alternative_complementary_pnt_reference.rs en de drie testmodules in de crate daarachter.

  • De gepubliceerde cijfers worden bij elke build opnieuw tegen de engine gecontroleerd (tests/published_figures_still_reproduce.rs). De drie demogrammen in de README zijn de eigen chart.svg-uitvoer van de engine en niets voerde het scenario opnieuw uit; de twee crossover-studies van het paper werden eenmaal gegenereerd en gecommit; en de README vermeldt vier kwaliteitsmaten in proza naast scenario-fom.png. Alle drie zijn nu vastgepind aan live engine-uitvoer.

    Het afstemmen leverde het nuttige resultaat op: de demogrammen waren getekend met engine 0.22.0 en de crossover-JSON van het paper met 0.20.0, en bij 0.27.1 is elke geplotte waarde in alle vijf artefacten identiek — de drie grafiek-SVG's verschillen van een nieuwe run in precies twee tekens elk, de versiestempel in de voettekst. De grafieken zijn opnieuw gerenderd zodat de voettekst klopt. De JSON van het paper blijft bewust gestempeld met 0.20.0: het is het verslag van de run waarvan een gepubliceerd paper een cijfer insluit, en opnieuw stempelen zou een herkomst claimen die de PDF niet heeft. De bewaker stelt in plaats daarvan de sterkere eigenschap vast — dat de huidige engine elke gepubliceerde waarde nog steeds reproduceert.

Opgelost#

  • SonarCloud-analyses werden vastgelegd als VERSION=not provided, zodat de periode voor nieuwe code van previous_version nooit vorderde: ze was nog verankerd aan de analyse van 2026-07-02, beoordeelde tweeëntachtig dagen werk als één enkele delta en mat 7877 “nieuwe” gedupliceerde regels tegen een drempel van 3 %. De scan geeft nu de crateversie mee. De onderliggende duplicatie is echt en wordt hierdoor niet verborgen: ze is geconcentreerd in de declaratieve FieldUnit-registers die in ensemble, hybrid, fusion, inertial en report worden herhaald, en in de verificatietabel met 168 rijen, en ze wordt hier als werk benoemd in plaats van van de meting te worden uitgesloten.

  • scripts/gate.sh had geen lock voor één schrijver, en elke run schreef hetzelfde log. Dat is geen netheid: de integration_binaries, tests_passed en tests_ignored van de bon worden UIT dat log teruggelezen, en de pre-push-hook vertrouwt de bon. Een gate die was gedood maar waarvan de testbinary nog leefde, bleef schrijven in het bestand dat de volgende run net had afgekapt — zodat de aantallen van de ene run als die van een andere run konden worden aangemerkt, waarmee een push werd toegestaan op grond van een suite die nooit had gedraaid op de boom die werd gepusht. Het is nu één gate per checkout (weigeren met exit 75 naast een levende, een verouderde lock opruimen waarvan de pid weg is) en één log per run, waarbij target/gate-run.log bij het afronden wordt ververst vanuit de eindigende run. Beide richtingen zijn getest: een levende pid weigert, een dode wordt opgeruimd.

  • src/verification.rs beweerde dat zijn tests “niet bewijzen dat de genoemde test-/oracle-strings naar live code verwijzen”. Twee bewakers doen nu precies dat, dus de moduledoc zei het tegenovergestelde van de waarheid; ze vermeldt nu wat machinaal wordt gecontroleerd en wat aan menselijk oordeel wordt overgelaten. Een verouderde verwijzing naar verification::gen — de module is artifacts — is gecorrigeerd in de eigen documentatie van de zusterbewaker.

Gewijzigd#

  • main is op 2026-09-22 herschreven en geforceerd gepusht. Tien commits werden vier. De herschrijving voegde elke commit die een gate rood liet in de commit die hem weer opruimde, zodat elke commit op main nu een boom heeft die slaagt, en verwijderde de geannuleerde runs die een concurrency-groep voor de hele branch op elke vervangen commit had achtergelaten.

    Er is niets weggegooid. De commits van vóór de herschrijving blijven bereikbaar via de tags die ernaar wijzen, en de uiteindelijke boom is byte voor byte identiek aan de boom waarmee de herschrijving begon — git diff tussen de oude top en de nieuwe is leeg, afgezien van de drie workflowbestanden die deze release wijzigt.

    De vervangen SHA's, voor iedereen die naar een ervan verwijst:

    oud onderwerp
    9733177 docs(changelog): disclose the authorship rewrite and the two dangling crate sha1s
    5d16ea8 fix(docs): the engine-flow diagram said 6 figures of merit; the engine scores 7
    148d31d fix(test): two more cross-platform pins, and two wrong assumptions of my own
    a3a2667 feat(web): surface the lunar cluster on the site — seven capability cards
    1e8bec6 docs(lunar): document 42 public fields and ratchet the ceiling down to 985
    7bba514 chore(release): v0.27.0
    3154548 test(docs): guard the distribution diagram, the last unguarded one
    7864142 chore(release): v0.27.1

    De tags v0.27.0 en v0.27.1 zijn bewust NIET verplaatst. Ze wijzen nog steeds naar 7bba514 en 7864142, de exacte commits waarvan de bomen de artefacten voortbrachten die nu live staan op crates.io, npm, PyPI, ghcr.io en het MCP-register. De .cargo_vcs_info.json van een crate legt de sha1 vast waaruit hij is verpakt, registers zijn onveranderlijk, en de SLSA-attestatie van de buildherkomst op de releaseonderdelen van v0.27.1 is aan die commit gebonden. Het verplaatsen van de tags had al die gepubliceerde artefacten laten wijzen naar een commit die niet meer bestaat. Ze laten staan houdt de oude commits bereikbaar en elke gepubliceerde herkomstketen oplosbaar, ten koste van twee tags die geen voorouders meer zijn van main — en daarom bestaat deze release: v0.27.2 geeft main een eigen tag, verpakt uit een commit die erop staat.

    Dit is de tweede bekendgemaakte herschrijving van deze geschiedenis; de eerste, op 2026-09-21, maakte het auteurschap canoniek en is vastgelegd in de notities van 0.27.0 met zijn eigen twee losse crate-sha1's. Een herschrijving wordt hier elke keer bekendgemaakt, omdat een repository die verifieerbare herkomst verkoopt niet stilletjes de grond onder een gepubliceerd artefact kan verschuiven.

0.27.1 - 2026-09-22#

Opgelost#

  • De gepubliceerde crate compileerde niet. src/lunar_orientation.rs bevat een include_str! op het hoogste niveau van tests/fixtures/llr_geometry/de440_moon_pa.csv, en het manifest sluit /tests/fixtures uit van het pakket, zodat de tarball die crates.io ontving een bestand miste dat de bibliotheek zelf insluit. De publicatie van v0.27.0 faalde om die reden in zijn verificatiebuild en er kwam geen 0.27.0 op crates.io; npm en PyPI, waarvan de jobs er niet van afhangen, publiceerden normaal. De uitsluiting kent nu een uitzondering voor die ene catalogus.

    Elke andere include_str! van een fixture in src/ staat binnen een module #[cfg(test)] en bereikt dus nooit de verpakte bibliotheek. Alleen een op het hoogste niveau doet dat.

  • Niets in CI draaide cargo package, en daarom werd een tarball die niet kan compileren pas ontdekt door de publicatiejob, nadat twee andere registers al hadden geleverd. Een job package bouwt en compileert nu bij elke push precies die tarball.

Gewijzigd#

  • De emissiepins van de lunar-frame-realisatie verschuiven niet langer bij een versieverhoging. De SVG-voettekst bevat de engineversie, zodat elke release drie hashes opnieuw als basislijn vaststelde — twee keer op één dag — en een pin die uit routine opnieuw wordt vastgelegd niet meer wordt gelezen. De versiestring wordt vóór het hashen genormaliseerd tot een plaatsaanduiding, en van de emissie wordt apart vastgesteld dat ze de draaiende versie vermeldt, zodat dat feit nauwkeuriger wordt gecontroleerd dan de hash het ooit controleerde.

0.27.0 - 2026-09-22#

Toegevoegd#

  • lunar-llr-datum — het datum van het lunaire referentiestelsel uit een echte waarnemingscampagne. lunar-frame-campaign verving een geïnjecteerde Helmert-transformatie door een gesimuleerde campagne en zei dat ook: het stationsnetwerk, het schema en de sigma per waarneming zijn illustratieve invoer. Dit scenario haalt de simulatie weg uit de twee plaatsen waar een schema en een foutmodel in het antwoord doorwerken. De epochs zijn de zendtijden van 337 gearchiveerde normal points van ILRS-laserafstandsmeting naar de maan (2015-04-08 .. 2015-06-27, Grasse MeO 7845 en Matera MLRO 7941, alle vijf retroreflectorarrays), en elk waarnemingsgewicht is de eigen gearchiveerde precisie van dat normal point, bin_rms / sqrt(n_raw) — een mediaan van 5,13 mm enkele-weg-afstand, uit het bestand gehaald in plaats van hier gekozen. De stationscoördinaten komen uit IERS ITRF2020 en de reflectorcoördinaten uit JPL DE430 Tabel 7; elke fixture legt een URL, een ophaaldatum en een SHA-256 vast en wordt uit zijn bron geregenereerd door een gecommitte generator die de bron verifieert en afbreekt in plaats van een getal uit te geven. Het rapport noemt welke schakels gemeten zijn en welke gemodelleerd blijven, en de gemodelleerde zijn gemeten: de waargenomen-min-berekende enkele-weg-afstand over de echte data is 156.494 m RMS, wat dezelfde testset bevestigt tegen JPL Horizons over dezelfde periode (195.655 m RMS-vector, slechtste epoch 0,054° — binnen de ~0,3° die de ingebouwde analytische lunaire reeks voor zichzelf claimt). Additief: een nieuwe soort, een nieuwe lezer (realdata::llr_crd) en een nieuwe module (lunar_llr); de bestaande lunar-frame-pakketten zijn bit voor bit vastgepind.

  • sigma_ure_m als scenarioparameter op lunar-integrity en moonlight-service-volume. De nauwkeurigheid van signal-in-space-afstandsmeting was een constante tijdens het compileren (LUNAR_SIGMA_URE_M), dus een sweep van het servicevolume kon slechts één vaste waarde als geslaagd of gefaald beantwoorden. Beschermingsniveaus zijn er exact lineair van afhankelijk, dus door hem beschikbaar te stellen wordt de sweep een eis aan de afstandsmetingsnauwkeurigheid over het hele volume. De standaardwaarde reproduceert het eerdere gedrag bit voor bit.

  • Export van geometrie per satelliet op moonlight-service-volume: export_site_lat_deg + export_site_lon_deg voegen een array per_sat_geometry toe met azimut, elevatie en schuine afstand naar elke satelliet op elke epoch voor één genoemde selenografische locatie, plus de zichtbaarheidsvlag. De samenvatting van de aggregaatdekking laat de geometrie per satelliet bewust samenvallen, maar de schuine afstand is precies wat een linkbudget verbruikt, dus een gezamenlijke communicatie- en navigatieanalyse was niet mogelijk uit de samenvatting alleen. Uit tenzij beide coördinaten zijn gegeven; puur additief.

  • lunar_service::topocentric, de openbare kijkhoekhelper achter de export.

  • Een rij in de verificatiematrix voor de nieuwe geometriemogelijkheid.

  • Het echte antennepatroon in de geometrie-export. De engine bevat sinds P1 een patroon van een uniform belichte cirkelvormige apertuur (antenna::pattern_gain_dbi, de Airy-vorm [2·J₁(x)/x]²) en niets buiten antenna.rs gebruikte het — in plaats daarvan deed een boresight-gain gekoppeld aan een vuistregel voor gain en bundelbreedte het werk. Een optionele tabel export_antenna op moonlight-service-volume (alleen gelezen als de exportlocatie is ingesteld) geeft nu aan elke geëxporteerde rij de hoek buiten de boresight bij de satelliet en de zendgain naar de locatie uit dat patroon, en voegt een blok antenna_pattern toe dat het aantal satellieten in de bundel onder het echte patroon naast het aantal in de bundel onder de symmetrische benadering rapporteert (θ₃dB[deg] = √(31000/G_lin)) met het verschil als een genoemde correctie. Beide getallen worden uitgegeven; geen van beide vervangt het andere. Gemeten bij de eigen representatieve lunaire apertuur van de engine (schotel van 1 m, 2,4 GHz, η = 0,60) over een locatie nabij de zuidpool en de illustratieve schil van het LCNS-type, verschillen de twee met meer dan één satelliet: het echte patroon plaatst 0 van 76 zichtbare verbindingen binnen de halfvermogensbundel, de benadering claimt er 28 — een correctie van −2,33 satellieten per epoch, slechtste enkele epoch 3. De benadering heeft een eigen aperturerendement (0,641 tegenover de regel 70·λ/D graden waarmee ze gewoonlijk wordt aangehaald, 0,920 tegenover een uniforme cirkelvormige apertuur), dus op een schotel met η = 0,60 levert ze een bundel die 1,238× te breed is; het blok geeft beide impliciete rendementen uit in plaats van ze aan afleiding over te laten. Puur additief: gemeten over het gedocumenteerde werkpunt, 597 reeds bestaande bladen, 0 gewijzigd, 0 verwijderd, 494 toegevoegd.

  • antenna::symmetric_beamwidth_rad, antenna::symmetric_relation_implied_efficiency, antenna::within_half_power_beam, antenna::HALF_POWER_DROP_DB, antenna::SYMMETRIC_GAIN_BEAMWIDTH_CONST_DEG2, antenna::UNIFORM_APERTURE_HPBW_COEFF en lunar_service::nadir_off_boresight_rad, de openbare onderdelen erachter. Het patroon is nu ook verankerd aan de gepubliceerde Airy-constanten in plaats van alleen aan zichzelf: de halfvermogensovergang wordt door bisectie gelokaliseerd en vergeleken met x = 1.61634, wat de exacte halfvermogensbreedte 1.02899·λ/D maakt en eerlijk vastlegt dat de conventionele coëfficiënt 1.02 pattern_gain_dbi op −2,955 dB brengt, niet op −3,010 dB.

  • Een langevormtabel voor reproduceerbaarheid voor lunar-time-budget. De array-uitvoer van het scenario — het raster van middelingstijden, de zeven x(τ)-curves per term en hun wortel-som-kwadraat-totaal — bereikte gebruikers alleen als JSON-arrays. Eén uitgebrachte tabel werd bij 400 tekens afgekapt en publiceerde 23 van zijn 57 middelingstijden onder een kolom die beweerde ze allemaal te bevatten, en het manuscript bouwde de curves per term opnieuw op uit gesloten vormen omdat de engine ze nooit uitgaf. Een gewone run schrijft nu ook <scenario>.table.csv met één rij per (rasterindex, middelingstijd, term), wat niet kan worden afgekapt tot iets dat er nog heel uitziet. De rasterindex is een exacte joinsleutel; τ wordt geschreven met 13 significante cijfers en elke x met 7, zodat de bytes niet uiteenlopen tussen builds van dezelfde bron. Puur additief: de rapport-JSON is byte voor byte identiek.

  • Het rapport van hybrid-optical-rf beschrijft zichzelf nu. Een blok link_configuration herhaalt de opgeloste linkinvoer — draaggolflengte, zend- en ontvangapertuur, afstand, pulsbreedte, integratietijd, rendementen en verliezen — met toegepaste standaardwaarden, zodat een paper de configuratie vermeldt waarmee het draaide in plaats van een standaardwaarde aan te halen die uit de broncode is gelezen. Een blok units geeft de eenheid en herkomstklasse van elke grootheid die een paper waarschijnlijk citeert. De sporen van de covariantie bij overdracht zijn de reden dat het bestaat: ze werden uitgegeven als kale variance en een manuscript leidde vierkante meters af uit een interne consistentiecontrole. De afleiding klopte, en juist daarom was het een defect — niets had gevangen dat ze onjuist was. Puur additief: gemeten over vier configuraties, 456 reeds bestaande velden, 0 gewijzigd, 0 verwijderd, 196 toegevoegd.

  • Een rij in de verificatiematrix voor de reproduceerbaarheidstabel van het tijdsbudget, eerlijk InternalConsistency / MODELLED — het totaal wordt gecontroleerd tegen de wortel-som-kwadraat van de termen in hetzelfde bestand, dat de eigen termdefinities van de engine deelt en daarom geen onafhankelijke referentie is. Samen voegen deze drie rijen toe. Het lopende totaal voor deze nog niet uitgebrachte sectie is 168 rijen — 64 VALIDATED, 100 MODELLED, 4 PARTNER.

Gewijzigd#

  • Het auteurschap van commits in de hele geschiedenis is nu één enkele identiteit, en twee gepubliceerde crates wijzen naar een commit die niet meer bestaat. Op 2026-09-21 is de git-geschiedenis herschreven zodat elke menselijke commit is geschreven en gecommit door ashfordeOU <236818772+ashfordeOU@users.noreply.github.com>. Eerder droeg ze drie spellingen van één persoon — 688 commits als ashfordeOU <contact@ashforde.org>, 34 als Chakshu Baweja <contact@ashforde.org> en 94 al canoniek. De ene commit van dependabot[bot] is bewust als eigen auteur gelaten: het herlabelen van de afhankelijkheidsverhoging van een bot zou het auteurschap claimen van werk dat hier niemand deed.

    Er is geen inhoud veranderd. De herschrijving raakte alleen auteur- en committerheaders, en dat is controleerbaar in plaats van beweerd: de boom van elke tag en elke branch is bit-identiek aan wat hij eerder was. v0.26.0 wordt nog steeds opgelost tot boom 92284e9420605568f1bfabb78cd95d383b40f3e2, precies zoals voorheen.

    Wat het kostte. De naam van een commit is een hash over zijn boom, zijn ouders en zijn auteurheaders, dus het wijzigen van een voorouder hernoemt elke afstammeling. De releasecommit van v0.26.0 was dce2dbf7700788cf6de46260c14673c0e5347360 en is nu d4921f3025569e00e425e1747d0acfc261e96e18. Twee artefacten legden de oude naam vast bij het publiceren en kunnen niet worden gecorrigeerd, omdat een gepubliceerde registerversie van nature onveranderlijk is:

    • kshana 0.26.0 op crates.io — .cargo_vcs_info.json legt dce2dbf… vast
    • kshana-mcp 0.26.0 op crates.io — dezelfde sha1, path_in_vcs: mcp/kshana-mcp

    Niets anders wordt geraakt. Het npm-pakket legt geen gitHead vast, en de PyPI-distributie legt helemaal geen commit vast; beide zijn gecontroleerd in plaats van aangenomen.

    Er is geen herstel waardoor dce2dbf… de herschreven commit noemt: die string is de oude voorgeschiedenis, en de enige manier waarop ze wordt opgelost is de geschiedenis van vóór de herschrijving gepubliceerd te houden, wat het auteurschap zou herstellen dat de herschrijving verwijderde. De herkomst van 0.26.0 loopt daarom via de tag in plaats van via de vastgelegde sha1 — en de tag levert dezelfde bytes waaruit de crate is gebouwd. De volgende release legt een geldige commit vast zonder dat actie nodig is.

Opgelost#

  • realtime-frame-eop gebruikte standaard een EOP-bestand zonder voorspellingsrijen (G12). Het scenario bevatte een uittreksel van vijf rijen alleen definitief uit finals2000A als offline standaardwaarde, dus een kale run rapporteerde predicted_rows.n = 0 en de tabel per horizon rustte op paren van 5, 4, 3 en 2. De engine kon altijd een voorspellingsrij lezen — de invoer had er simpelweg geen. De standaardwaarde is nu het letterlijke IERS-uittreksel van 2026 (tools/finals2000A_2026.txt, MJD 61173–61204): 20 definitieven van Bulletin B en 12 rijen van Bulletin A met alleen voorspellingen, zodat een kale run zonder bestandsargument en zonder netwerk predicted_rows.n = 12 rapporteert en een tabel per horizon bij n = 20 / 31 / 30 / 29, en ook de vergelijking met de operationele voorspeller en de overeenstemming met de eigen gepubliceerde voorspellingen van het product worden gevuld. Het langere uittreksel van 45 rijen is als alternatief gemeten en verworpen: ook dat is alleen definitief, dus predicted_rows.n was op 0 gebleven. Dit verplaatst gepubliceerde getallen, onder regel R4 en met toestemming van de oprichter: tien van de 22 cellen van de uitgebrachte p4_frame_eop.csv en 24 van de 42 gevulde cellen van tests/golden/realtime-frame-eop.csv. De gemeten pooldrempel voor snel-min-definitief wordt 0,0678 mas (van 0,0769 mas), wat de waarde is die de eigen poolbewegingstabel van paper P4 al publiceert bij n = 20 — de twee komen nu overeen in plaats van 13,5 % te verschillen. Elk ander cijfer dat P4 uit deze tabel afdrukt is op de afgedrukte precisie ongewijzigd. De volledige opsomming oud → nieuw, inclusief de velden die niet veranderden, staat in docs/revisions/G12-default-eop-cell-changes.md. Het uittreksel met alleen definitieve waarden blijft meegeleverd, byte voor byte vastgepind en in gebruik: een aantal van nul voorspellingsrijen daarop is de eigenschap van het bestand, en een test bewijst dat nog steeds.

  • Een verouderde begrenzing van het aantal satellieten in moonlight-service-volume. Het scenario begrensde n_sats op 12 hoewel de eigen constellatiebouwer 24 ondersteunt en een test 24 afdwingt, zodat elk gevraagd aantal boven 12 stilzwijgend werd verlaagd en een sweep over het aantal satellieten boven 12 identieke waarden teruggaf — niet te onderscheiden van echte geometrische verzadiging. Nu begrensd op de limiet van de bouwer. Dit is alleen voor n_sats > 12 een gedragswijziging.

  • Dezelfde verouderde begrenzing in lunar-differential-pnt. lunar_dpnt begrensde n_sats op 12 met hetzelfde gevolg, en deze bereikte een gepubliceerde tabel: dpnt_nsats_sweep.csv bevat een rij n = 16 die byte voor byte identiek is aan zijn rij n = 12, omdat de engine een antwoord met twaalf satellieten teruggaf onder een label van zestien satellieten. Nu begrensd op de limiet van de bouwer van 24, en een nieuwe test pint het vast — elke grotere constellatie moet zowel haar eigen aantal rapporteren als het beschermingsniveau strikt verbeteren, zodat de begrenzing niet ongemerkt kan terugkeren. Dit verplaatst gepubliceerde getallen: het beschermingsniveau bij n = 16 wordt 16,92 m → 14,57 m. Doorgesweept tot 24 is de curve strikt monotoon (11,94 m bij 24 satellieten, 29,5 % beter dan bij 12), dus er is geen verzadiging bij 12 — het ogenschijnlijke plateau was de begrenzing. Gedragswijziging alleen voor n_sats > 12.

0.26.0 - 2026-09-18#

Een release voor documentatie, transparantie en playground. Er verandert geen enginegedrag: de verificatiematrix staat op 102 rijen — 56 VALIDATED, 42 MODELLED, 4 PARTNER, ongewijzigd ten opzichte van 0.25.0.

Toegevoegd#

  • Rustdoc op het niveau van de crate (//! in lib.rs) die de toegangspunten, het model van eerlijkheid en niveaus en de reproduceerbaarheid beschrijft, zodat docs.rs opent op een echte landingspagina in plaats van een kale muur van modules.
  • docs/SCENARIOS.md — een referentie per soort voor alle 50 scenariosoorten, gegenereerd uit api::list_scenario_kinds() (de enige bron van waarheid) door gen_validation_artifacts en bewaakt door tests/scenarios_reference_doc_sync.rs, zodat ze niet kan afwijken van de dispatcher.
  • Moduledocs voor de 11 eerder ongedocumenteerde openbare modules (allan, estimator, fom, hybrid, inertial, models, report, run, scenario, timetransfer, types).
  • Literatuurbronnen voor vijf formulemodules die een vergelijking vermeldden maar geen referentie noemden: batch_ls (Tapley/Schutz/Born; Bjorck), cr3bp (Szebehely; Koon et al.), detection (Kay), attitude_budget (Wertz; Sidi), reentry (Allen-Eggers, NACA TR-1381).
  • Een gepubliceerde security.txt op kshana.dev voor gecoördineerde bekendmaking.
  • Validatieniveau per run in de playground. De tabel met kwaliteitsmaten van één run bevat nu een label VALIDATED/MODELLED per cijfer, gelezen uit dezelfde opzoeking fomTier() die het downloadbare rapport gebruikt (die src/fom_label.rs spiegelt, zelf afgeleid uit de verificatiematrix), zodat het niveau naast een live getal nooit kan afwijken van het register.
  • lunar-attack-surface in het playground-menu — alle 50 te dispatchen soorten zijn nu één klik weg (was 49/50).
  • Vijf extra uitvoerbare mogelijkhedenkaarten (ruimteweer, evaluatie van RF-verstoringen, veerkracht, CCSDS OEM-interoperabiliteit, KIF), waarmee het aantal uitvoerbare kaarten van 11 naar 16 gaat. Kaarten die alleen API of bibliotheek zijn, houden een eerlijke link naar de documentatie in plaats van een nepknop voor uitvoeren.

Gewijzigd#

  • De documentatiedekking wordt nu in CI als ratel bewaakt. check-doc-coverage.sh compileert de bibliotheek met missing_docs, telt de waarschuwingen en faalt alleen als het aantal boven een vastgepind maximum (986) komt. Een harde #![warn(missing_docs)] onder -D warnings had ~1000 op dit moment ongedocumenteerde openbare items veranderd in een build-onderbreking van de ene op de andere dag; zo laten nieuwe ongedocumenteerde openbare items de build falen terwijl de bestaande achterstand bewust wordt afgelost.

Opgelost#

  • De rij voor de MCP-tool list_scenario_kinds adverteerde “~17 built-in scenario kinds” terwijl api::list_scenario_kinds() al enige tijd 50 had blootgesteld — een voor agents bedoeld document dat de werkelijke mogelijkheden driemaal onderschat. Vastgepind op het ware aantal.
  • De referentie voor de formaatcontrole van de CycloneDX-SBOM is opnieuw gegenereerd voor de bijgewerkte afhankelijkheidsgraaf (60 componenten). Het oordeel van de formaatcontrole is ongewijzigd: nul genormaliseerde schemafouten en elke afzonderlijke licentie-id staat nog steeds in de officiële SPDX-opsomming.

0.25.0 - 2026-07-15#

Toegevoegd#

  • Vijf mogelijkheden bevorderd tot extern VALIDATED, elk nu kruiselings gecontroleerd tegen een onafhankelijke implementatie door een derde van dezelfde eenduidig gedefinieerde grootheid (niet-circulair, met offline regenereerbare fixtures):
    • Conversie van IEEE-1139-machtswet → Allan-deviatie tegen de gesloten vormen van allantools voor alle vijf ruistypen (tests/powerlaw_oadev_reference.rs);
    • Gewichten van de CRPA MVDR- / minimum-norm-nulsturingsbundelvormer tegen numpy/scipy LAPACK (tests/crpa_reference.rs);
    • Standbepaling met Wahba / TRIAD / QUEST tegen de SVD Rotation.align_vectors van SciPy op ruisvrije waarnemingen (tests/wahba_reference.rs);
    • Uitwisseling van OEM-covariantieblokken volgens CCSDS 502,0, heen en terug gevoerd door de parser van de onafhankelijke bibliotheek oem (tests/ccsds_oem_covariance_reference.rs);
    • de detectiestatistiekkernel voor kwadratische-wet-acquisitie (gegeneraliseerde Marcum-Q / P_d / P_fa / drempel) tegen SciPy ncx2/chi2 (tests/acquisition_reference.rs). De machinaal gecontroleerde validatiematrix gaat naar 56 VALIDATED · 42 MODELLED · 4 PARTNER over 102 rijen (was 51 · 47 · 4). Eerlijke kanttekeningen over de reikwijdte blijven behouden — bijv. de bevordering van acquisitie betreft alleen de detectiestatistiekkernel; CFAR/straddling-verlies blijft MODELLED.
  • Kwaliteitsmaten in het positiedomein (fom::positioning_performance): exacte CEP, SEP en 2DRMS uit de 3D-ENU-positiecovariantie van een navigatieoplossing plus een horizontaal beschermingsniveau. CEP/SEP zijn de exacte mediane radiale fouten (niet de lineaire regel 0.589·(σ₁+σ₂)), kruiselings gecontroleerd tegen de rayleigh/maxwell-kwantielen van scipy.stats en een onafhankelijke NumPy-Monte-Carlo-mediaan (tests/positioning_fom_reference.rs). Vervangt de vorige eerlijke stub zonder implementatie — de functiesignatuur is gewijzigd van () die een fout teruggeeft naar (cov_enu, hpl_m) die een PositioningFom teruggeeft.
  • Equivalente vrijheidsgraden (EDF) voor betrouwbaarheidsintervallen zijn voltooid voor alle schatters uit de Allan-familie (assurance::uncertainty::edf): de EDF voor modified Allan, Hadamard en total variance gebruikt nu het gecombineerde EDF-algoritme van Greenhall & Riley en de TOTVAR-vorm uit Tabel 7 van NIST SP 1065 (eerder was alleen de EDF van overlappende Allan geïmplementeerd; de andere hergebruikten die stilzwijgend), kruiselings gecontroleerd tegen allantools edf_greenhall/edf_totdev (tests/uncertainty_edf_reference.rs).
  • Onafhankelijke externe kruiscontroles voor de mogelijkheden voor geometrie, DOP, EOP, DRO en RF-afstandsmeting bij lunaire PNT (tests/validate_p*.rs, met fixtures en oraclegeneratoren onder tests/fixtures/{p1_footprint,lunar_service,eop_prediction,rf_ranging_precision,dro_family_jpl,p2_independent_dop}/). Elke controle laat een al meegeleverde gemodelleerde mogelijkheid tegen een referentie lopen die door een andere implementatie is geproduceerd, zodat overeenstemming niet-circulair is: de orbitale zend-/vangstvoetafdruk tegen scipy.special.j1 (Cephes — een werkelijk andere Bessel J1); de DOP van de geometrie van oppervlaktebakens tegen een onafhankelijke NumPy-oplossing van (HᵀH)⁻¹; de groei van de voorspellingsfout van UT1/EOP-persistentie tegen een afzonderlijke NumPy-herparsing van dezelfde letterlijke IERS-rijen van finals2000A; de vlakke familie van distant retrograde orbits tegen de NASA/JPL Three-Body Periodic Orbit Database; en het budget voor RF-afstandsmetingsprecisie tegen een referentie uit eerste beginselen. Dit is aanvullend regressiebewijs voor bestaande modules; het toevoegen van deze kruiscontroletests labelt zelf geen enkele mogelijkheid om (de vijf bevorderingen hierboven zijn afzonderlijke, door een referentie ondersteunde statuswijzigingen in src/verification.rs).
  • Scenario lunar-attack-surface (src/attack_surface.rs, kind = "lunar-attack-surface"): een samengestelde, via binaries bereikbare (CLI / Python / MCP / wasm via run_toml) lunaire P1-signaalbeveiligingsrun die het tekort aan vermogen in het linkbudget en zijn gevoeligheidsband van 12–18 dB, het vereiste jam-/spoofzendvermogen versus standoff, de orbitale vangstvoetafdruk onder een echt antennepatroon, de uitkomst van de pull-in bij het vangen door spoofing van de trackinglus, het bereik tot de horizon van een lichaam zonder atmosfeer en het authenticatiebudget van OSNMA/TESLA aan elkaar rijgt. Een lege body reproduceert de P1-basislijn.
  • Gevoeligheidsband van het vermogenstekort (linkbudget::deficit_sensitivity_band, deficit_power_factor): een echte sweep over meerdere assen (referentie × EIRP × schuine afstand) gebouwd op sweep::SweepAxis en geëvalueerd via received_signal_power_dbw, die de P1-band van 12–18 dB reproduceert en de lineaire factoren 32× (afgerond) / 36× (niet afgerond) met elkaar verzoent.
  • Driedimensionale spoof-vangstkubus (spoof_capture::capture_cube): voegt de as van carrier-/Doppler-offset toe aan de vangstkaart (J/S × code-offset × carrier-offset, lock-tijd per cel); de snede met nul carrier reduceert exact tot de 2D-capture_map.

Gewijzigd#

  • Detectie door een schaars monitornetwerk (monitor_network) combineert nu de fysieke AGC-statistiek van spoof_monitors en het selenografische zichtbaarheidsraster van lunar_service om de detectiestatistiek en geometrie van elk station af te leiden, in plaats van vrije parameters en een ad-hoc overlap langs een grootcirkel; de detectiekansen per monitor en voor het netwerk blijven de gesloten vormen van detection met chi-kwadraat/Marcum-Q. De velden SurfaceMonitor / SpoofEvent zijn gewijzigd naar fysieke grootheden (lat/lon/hoogte/vermogen).

Opgelost#

  • Dimensionering van de authenticatieoverhead van OSNMA/TESLA (nma_budget): de OSNMA-veldaandelen per pagina (8-bit HKROOT + 32-bit MACK per pagina van 2 s) waren verkeerd gelabeld als totalen per subframe, waardoor de overhead 15× werd onderschat (1,33 bit/s). Gecorrigeerd naar de gepubliceerde totalen per subframe van 30 s uit de SIS-ICD (HKROOT 120 + MACK 480 bits ⇒ 20 bit/s). Het gevolg wordt nu eerlijk vermeld: bij een navigatiesnelheid van 50 bit/s voor AFS is de authenticatieoverhead een kostenpost van de eerste orde, ≈40 %, niet een te verwaarlozen paar procent; het veld auth_latency is gedocumenteerd als de vertraging van de sleutelvrijgave (een ondergrens voor de end-to-end-tijd tot de eerste geauthenticeerde positiebepaling).

0.24.0 - 2026-07-09#

Een brede release van mogelijkheden. Ze brengt twee volledig extern getoetste analysesuites — een complete familie voor multicriteria-beslissingsanalyse (MCDA) en de schatters voor Allan-wander en klokstabiliteit bij lange τ — en opent een nieuwe uitvoerbare scenariolaag voor lunair tijdsbudget, real-time frame/EOP, optisch/RF-hybride, cislunaire waarneembaarheid en veerkracht van gelaagde PNT bij conflict bovenop het substraat, plus een substraat van mogelijkheden voor lunaire oppervlaktebakens en signaalbeveiliging. De machinaal gecontroleerde validatiematrix groeit tot 51 VALIDATED · 47 MODELLED · 4 PARTNER over 102 rijen (was 40 · 47 · 4 over 91): alle elf nieuwe rijen zijn validaties tegen een externe referentie van de beslissingsanalyse- en tijdsschatters, gecontroleerd tegen onafhankelijke bibliotheken (SciPy, pymcdm, pyDecision, allantools) met een nauwe tolerantie, terwijl het nieuwe PNT-oppervlak eerlijk als MODELLED wordt getoond. Zoals altijd wordt geen numerieke modelclaim opgewaardeerd zonder externe dataset erachter.

Toegevoegd#

Uitvoerbare scenario's — elk een geregistreerd scenario kind, via de engine gedispatcht en end-to-end bewezen door CI via tests/determinism.rs (die elke meegeleverde scenarios/*.toml draait en hard faalt bij elke niet-uitvoerbare fixture):

  • Veerkracht van gelaagde PNT bij conflict (conflict-resilience, src/conflict_resilience.rs) — een Monte-Carlo-engine met seed voor een PNT-architectuur met meerdere lagen, met een model van overleving bij geleidelijke degradatie per vector volgens §4,2 (vier genoemde dreigingsvectoren, de gesloten vorm voor overleving van bruikbare PNT waartoe de Monte-Carlo per laag convergeert, uitgegeven in de resultaat-JSON) en gedocumenteerde, tegen afwijking bewaakte herkomst van dreigingsparameters (src/conflict_threat_params.rs). Architecturen zijn MODELLED; de convergentie van de overlevings-Monte-Carlo → gesloten vorm is de getoetste kern.
  • Cislunaire waarneembaarheid (cislunar-observability, src/cislunar_observability.rs) — een eigenspectrum van de waarneembaarheids-Gramiaan over een boog, een door differentiële correctie verkregen seeder voor distant retrograde orbits (DRO), en een onafhankelijke kruiscontrole met een square-root-informatiefilter waarvan de posterior-covariantie precies bij volledige waarneembare rang eindig wordt. De constellatie is MODELLED; de invarianten van rang/Gramiaan/STM/SRIF zijn de getoetste kern.
  • Heterogene optische/RF-hybride continuïteit en integriteit (hybrid-optical-rf, src/hybrid_integrity.rs, src/optical_availability.rs, src/optical_linkbudget.rs, src/cross_raim.rs) — beschikbaarheid en integriteit over domeinen heen wanneer optische en RF-PNT worden gecombineerd. MODELLED.
  • Endogeen lunair tijdsbudget (lunar-time-budget, src/lunar_time_budget.rs) en real-time frame- / EOP-budget (realtime-frame-eop, src/realtime_frame_eop.rs, src/frame_eop.rs) — de lunaire tijds- en aardoriëntatiebudgetten van P3/P4, endogeen afgeleid uit de tijdsynchronisatieketen in plaats van beweerd. MODELLED.

Extern getoetste analysesuites — bibliotheekmogelijkheden, die elk als nieuwe VALIDATED-rijen in de matrix komen (gecontroleerd tegen een onafhankelijke externe referentie, geen zelfcontrole):

  • Volledige suite voor multicriteria-beslissingsanalyse (MCDA) (src/mcda/) — de vier methodefamilies: waardeaggregatie (WSM, WPM, WASPAS), ratiosysteem (MOORA) en proportioneel (COPRAS), afstand tot het ideaal (TOPSIS), compromisprogrammering (VIKOR) en outranking (PROMETHEE II met zes gegeneraliseerde criteriumvormen, ELECTRE I concordantie/discordantie) — plus AHP-prioriteitsgewichten uit de Perron-eigenvector met de poort voor de Saaty-consistentieratio (CR < 0,10), MAUT-nut, extractie van het Pareto-front en gevoeligheidsanalyse van gewichten. De negen aggregators reproduceren pymcdm / pyDecision en de AHP-eigenvector komt overeen met SciPy/LAPACK, alles tot < 1e-9 (tests/mcda_*_reference.rs). De gevoeligheidstornado wordt ook getoond binnen het veerkrachtscenario voor conflict.
  • Schatters voor Allan-wander en klokstabiliteit bij lange τ (src/allan.rs) — MTIE (de piek-tot-piek-wanderstatistiek van de tijdsfout waartegen ITU-T G.810/G.823/G.8261-synchronisatiemaskers zijn geschreven), MDEV en TDEV als wander in het tijdsdomein, en Theo1 / TOTVAR als schatters met uitgebreid bereik. VALIDATED tegen allantools op de reeks van NIST SP 1065; de van bias ontdane hybride ThéoH gebouwd op TOTVAR blijft eerlijk MODELLED.
  • Harnas voor zekerheid / externe referentie (src/assurance/) — een referentieharnas dat rechtstreeks aan de CI-eerlijkheidspoort is gekoppeld, een herkomstrecord volgens W3C-PROV met een deterministische Merkle-wortel, en Greenhall equivalente vrijheidsgraden + chi-kwadraat-betrouwbaarheidsintervallen op stabiliteitsschatters.
  • PackRegistry / ExternalPack-uitbreidingsnaad (src/registry.rs, src/api.rs) — een dispatchnaad zodat mogelijkheidspakketten via één register lopen (de ingebouwde dispatch ligt op het hete pad van de CLI; pakketten buiten de boom hechten zich erachter aan een ExternalPack::register_into met standaardwaarde), bewaakt door een golden-suite voor byte-identiteit en standalone / wasm32 CI-poorten.

Substraat van gemodelleerde mogelijkheden — nieuwe bibliotheekmodules die de scenario's hierboven voeden en toekomstige (nog geen op zichzelf staand scenario kind):

  • DOP van lunaire oppervlaktebakens (src/lunar_beacon.rs) met een budget voor gerealiseerde nauwkeurigheid, een sweep over N satellieten en een GDOP-kaart, plus een verstoorde lunaire efemeride (src/lunar_perturbed.rs) en geometrie van de horizon zonder atmosfeer / inverse van spoofvermogen / band van het AFS-tekort (src/jamming.rs, src/linkbudget.rs). Hergebruikt de door gnss_lib_py getoetste DOP-kernel.
  • Inlezen van DEM in LOLA-formaat + zichtlijn over terrein (src/realdata/lola_dem.rs).
  • Driedelige verdediging voor signaalbeveiliging — spoof-vangst, kruissensorintegriteit en dimensionering van het monitornetwerk (src/spoof_capture.rs, src/cross_sensor_integrity.rs, src/monitor_network.rs) met een antennevoetafdruk van de orbitale bundel en een OSNMA-authenticatiebudget (src/antenna.rs, src/nma_budget.rs). MODELLED.

Gewijzigd#

  • De validatiematrix en elk afgeleid artefact zijn opnieuw gegenereerd uit de enige bron van waarheid (src/verification.rs): het register op de site, de diagrammen van modulekaart en validatieherkomst, en de tellingstrings in de README en per oppervlak geven nu 51 / 47 / 4 van 102 (was 40 / 47 / 4 van 91); de bewaker voor eerlijke tellingen scant nu de volledige git-geschiedenis, en de README-figuren zijn verenigd op het donkere merkpalet.
  • Eén gedeelde adaptieve integratiedriver ondersteunt nu zowel integrate als integrate_dopri (src/integrator.rs), waarmee de gedupliceerde stapper verdwijnt.
  • Statische analyse met SonarQube Cloud aan CI toegevoegd (Rust + geïmporteerde dekking), met badges voor beveiliging / onderhoudbaarheid / betrouwbaarheid in de README.
  • Een passage die AI-clients van derden noemt is hier weggelaten; ze staat in CHANGELOG.md op GitHub.

  • Discipline voor release en verpakking: CI registreert per publicatie van een pakket/register een deploymentomgeving, en de gerichte openbare standalone-job is losgekoppeld van de trage validatiebinaries.
  • De hygiënebewaker voor niet-vermelding is beperkt tot alleen markeringen van auteurschap, zodat het noemen van een integratiehost of product de build niet meer laat falen.
  • Documentatie: de sectie Citing van de README somt nu de vier gepubliceerde arXiv-preprints op, en de mogelijkheid van de DOP van oppervlaktebakens is gedocumenteerd in de lunaire rij.

Opgelost#

  • Integer-lustellers voor lussen die door floats worden aangestuurd (Sonar S2193).
  • Nauwkeurige inverse van chi-kwadraat bij weinig vrijheidsgraden via Newton-verfijning in het pad van het betrouwbaarheidsinterval voor zekerheid.
  • kshana.dev: de sectie met standaarden opent nu standaard en de terugvalwaarde voor het aantal in het register is gecorrigeerd; verouderde strings in README en site rond de waarneembaarheidslaag zijn gesynchroniseerd.

0.23.0 - 2026-06-29#

Een release van mogelijkheden die een algemene laag voor Fisher-informatie / Cramér–Rao-waarneembaarheid en optimaal experimentontwerp toevoegt, en de release waarop het paper over lunaire PNT-waarneembaarheid rust. De machinaal gecontroleerde validatiematrix groeit tot 40 VALIDATED · 47 MODELLED · 4 PARTNER over 91 rijen (was 39 · 46 · 4 over 89): de nieuwe schattingsengine is gecontroleerd tegen een externe referentie en is VALIDATED; de lunaire toepassing ervan is eerlijk MODELLED. Zoals altijd wordt geen numerieke modelclaim opgewaardeerd zonder externe dataset erachter.

Toegevoegd#

  • src/fim.rs — Fisher-informatie, Cramér–Rao-grenzen en optimaal experimentontwerp. Een algemene, herbruikbare engine voor schattingstheorie: de Fisher-informatiematrix M = HᵀWH uit een meetjacobiaan en gewichten; een symmetrische eigenwaardeoplosser (cyclische Jacobi); de Cramér–Rao-ondergrens via de inverse, of de Moore–Penrose-pseudo-inverse plus een basis van de nulruimte wanneer de informatie rangdeficiënt is (het geval van vrij netwerk / datumdefect); en D-, A-, E- en T-optimale metrieken voor experimentontwerp met een selector best_design over kandidaatgeometrieën. VALIDATED tegen NumPy (eigh/inv) en de gepubliceerde gesloten-vormgrenzen van Kay (1993) tot 1e-9 (tests/fim_observability_reference.rs), zodat het als rij met een externe referentie in de matrix komt in plaats van als zelfcontrole.
  • Waarneembaarheid van lunaire gezamenlijke baanbepaling (lunar_observability in src/lunar_combination.rs, getoond in het rapport over lunaire combinaties): past de FIM/CRLB-engine toe op de gezamenlijke oplossing van baan en klok om het datumdefect van het absolute station bloot te leggen, het herstel van de rang naarmate stations op Aardebasislijnen worden toegevoegd, de bereikte CRLB van de stationspositie en de E-optimale conditionering. Eerlijk MODELLED — de schattingsengine is extern getoetst, maar het lunaire netwerk waarop ze wordt toegepast is een representatieve simulatie, en geen enkele huidige dataset kan die geometrie in een meting omzetten.
  • Representatieve geometrie van de elliptische bevroren lunaire baan (ELFO) voor het scenario voor lunaire combinaties (orbit_ecc, orbit_inc_deg, orbit_argp_deg, orbit_planes; cirkelvormige plaatsing blijft de standaard) en een veld voor waarneembaarheid zonder VLBI in het rapport, zodat kan worden getoond dat het resultaat van het datumdefect voor elke geometrie geldt. Dezelfde ladder 3→1→0 en drempel van drie stations gelden op een ELFO uit de familie Moonlight/LCNS, en met drie VLBI-basislijnen op Aarde is de absolute stationspositie waarneembaar met een grens onder een meter — vastgelegd door elfo_geometry_confirms_the_observability_structure. Nog steeds MODELLED.

Gewijzigd#

  • De validatiematrix en elk gegenereerd bewijsartefact zijn opnieuw gegenereerd uit de enige bron van waarheid (src/verification.rs): het register (web/data/verification-matrix.json), docs/VERIFICATION-MATRIX.md, docs/MODELLED-RATIONALE.md, de figuren voor validatie-uitsplitsing en soort referentie, en de tellingstrings in de README op alle distributieoppervlakken geven nu 40 / 47 / 4 van 91.

0.22.1 - 2026-06-29#

Een patchrelease die alleen verpakking betreft. Geen wijzigingen in engine, scenario of resultaten; de validatiematrix is ongewijzigd op 39 VALIDATED · 46 MODELLED · 4 PARTNER over 89 rijen.

Opgelost#

  • npm-publicatie: het pakket repository.url dat uit het cratemanifest was afgeleid, gebruikte de GitHub-eigenaar met verkeerde hoofdletters (AshfordeOU), waardoor de sigstore-herkomstverificatie van npm faalde (die vergelijkt de eigenaar hoofdlettergevoelig). Het manifest repository is nu de canonieke kleine letters ashfordeOU, zodat de gegenereerde package.json overeenkomt met het onderwerp van de herkomst en de npm-release wordt gepubliceerd.

Gewijzigd#

  • De wheel-build pint codegen-units = 1 vast zodat het manylinux-wheel byte-reproduceerbaar is over herbouwingen heen (de reproduceerbaarheidscontrole door herbouwen en vergelijken).

0.22.0 - 2026-06-29#

Een consolidatierelease gericht op bewijs, herkomst en distributiediscipline. De machinaal gecontroleerde validatiematrix groeit tot 39 VALIDATED · 46 MODELLED · 4 PARTNER over zijn 89 rijen (was 15 · 42 · 4 over 61), aangedreven door kruisvalidatie van gemodelleerde mogelijkheden tegen onafhankelijke externe referenties. Elk gedistribueerd artefact draagt nu een cryptografische SLSA-attestatie van de buildherkomst, levert een CycloneDX-SBOM mee en wordt in gelijke pas over alle oppervlakken gepubliceerd. Geen numerieke modelclaim wordt opgewaardeerd zonder externe dataset erachter; nieuwe mogelijkheden blijven eerlijk MODELLED.

Toegevoegd#

  • Standdynamica (src/attitude_dynamics.rs, MODELLED) — vrije starre-lichaams-Euler-vergelijkingen zonder koppel + kwaternionkinematica (RK4), met zelftests op behoudswetten (kwaternionnorm, kinetische energie, |Iω|, precessie van een symmetrische tol).
  • Kruisvalidatie van gemodelleerde mogelijkheden tegen onafhankelijke externe referenties, waarmee de validatiematrix op 39 VALIDATED-rijen komt, elk gedekt door een externe dataset (de CI-eerlijkheidspoort verbiedt een status VALIDATED zonder dataset). De nieuwste validaties tegen een externe referentie: de gemeten stabiliteitscurve van de optische klok (de ADEV-curvefit van quantum_trade reproduceert de gepubliceerde σ_y(τ) van de ⁸⁸Sr-optische-roosterklok van Norcia et al., Science 366:93 (2019), Zenodo 10.5281/zenodo.3382347, CC-BY-4.0, meegeleverd onder tests/fixtures/optical_clock_adev/); generatie van de GPS L1 C/A-spreidingscode (de G1/G2-LFSR van src/sdr.rs reproduceert de octalen van de codefase uit Tabel 3-Ia van IS-GPS-200 voor PRN 1–9); en de SRTM-lezer voor digitale hoogtemodellen op echt terrein (src/altpnt/terrain.rs leest een meegeleverde SRTM v3-tegel van NASA/USGS in het publieke domein, N36W117 / Death Valley, en plaatst Badwater Basin binnen zijn gedocumenteerde meetband).
  • Nieuwe MODELLED-mogelijkheden, elk intern kruiselings gecontroleerd tegen een gesloten vorm of een zusterpad in de code: relatieve bewegingsdynamica van Clohessy–Wiltshire / Hill, passieve geolocatie van zenders met TDOA/FDOA, standbepaling met Wahba/TRIAD/QUEST, geheeltallige ambiguïteitsoplossing van de draaggolffase bij GNSS (LAMBDA), B-plane-sturing en patched-conic-zwaartekrachtassistentie, bundelvorming met CRPA-arrays tegen jamming, acquisitiestatistieken met kwadratische wet voor GNSS, franjeambiguïteit / dynamisch bereik van kwantum-inertiaalsensoren, machtswetruis van klokken volgens IEEE-1139 + flicker-FM-vloer, en uitwisseling van CCSDS-OEM-covariantieblokken.
  • Register van bewijs uit één bron met gegenereerde verificatiedocumenten en een bewaker tegen afwijking; een doorbladerbaar validatieregister op kshana.dev met directe links naar het bewijs per kaart.
  • Machineleesbare citatiemetadata — codemeta.json (CodeMeta 2,0) en .zenodo.json, door tests/citation_metadata_doc_sync.rs vastgepind aan het Cargo-manifest.
  • Herkomst van de toeleveringsketen — SLSA-attestatie van de buildherkomst voor de crate-tarball, wheels, sdist en npm-tarball; Trusted Publishing van PyPI via OIDC; CycloneDX-SBOM meegeleverd in het wheel en het npm-pakket; diff van reproduceerbare builds en verificatie na de release.
  • Vindbaarheid — robots.txt, sitemap.xml en Open Graph / JSON-LD-metadata op kshana.dev; een gegenereerde figuur validation-breakdown afgeleid uit de matrix.
  • README's per oppervlak voor crates.io / PyPI / npm met een bewaker voor eerlijke tellingen.

Gewijzigd#

  • De referentie voor Sagnac-tijdoverdracht is opgewaardeerd naar ExternalDataset — de Sagnac-correctie voor een omloop om de evenaar wordt nu gecontroleerd tegen de door Ashby gepubliceerde 207,4 ns (Living Reviews in Relativity 6:1, 2003, Vgl. 1,29; gereproduceerd tot < 0,05 ns). De samengestelde mogelijkheid voor tijdoverdracht blijft eerlijk MODELLED.
  • Documentatie, diagrammen en figuren vernieuwd naar de live matrix (39/46/4/89): het diagram van de validatieherkomst, de figuur oracle-kind-stacked (nu uit de matrix gegenereerd met een CI-bewaker tegen afwijking), VALIDATION/PROVENANCE/CAPABILITY/QUANTUM-MODELS/WHEEL_TAGS, de architectuur- en tutorialdocumenten en het totaal in het register op kshana.dev.
  • De broncodeboom is opnieuw geformatteerd met de vastgepinde rustfmt (toolchain 1.93.0) — puur stijl, geen gedragswijziging.
  • Versiebeheer in gelijke pas. Elk distributieoppervlak (crate, PyPI, npm, MCP-crate + OCI-image, JetBrains-plugin) volgt nu de versies van de engine in gelijke pas, afgedwongen door scripts/check-version-sync.sh in CI.
  • JetBrains-plugin opnieuw gelicentieerd onder AGPL-3.0-only (de gepubliceerde 0.1.1 adverteerde nog Apache-2.0) en leidt zijn Marketplace-versie nu af van de releasetag.
  • Verharding van de robuustheid — unwrap-aanroepen buiten tests verwijderd of verantwoord; clippy::unwrap_used afgedwongen op code buiten tests.
  • kshana.dev volledig vernieuwd met bewijs eerst: dominante hero, architectuurdiagrammen en resultaatfiguren, i18n, inklapbare/responsieve secties voor register en standaarden.

Opgelost#

  • SP3 precieze efemeride — pas de IGS-correctie voor aardrotatie op de knooppunten toe tijdens interpolatie.
  • Afbeeldingen in registers — de README's van PyPI/crates.io/npm gebruiken absolute afbeeldings-URL's; de relatieve afbeeldingspaden van de hoofd-README werden als kapotte afbeeldingen weergegeven op de PyPI-pagina van 0.21.0. Een CI-bewaker (tests/surface_readme_image_urls_doc_sync.rs) voorkomt de regressie.
  • CI — fmt + clippy groen; stop met compileren tegen echte data die door git wordt genegeerd.

Tests#

  • De covariantie van de Kalman-klok blijft PSD en symmetrisch (eigenschapstest, tests/property.rs).
  • Doc-sync-bewakers: elke openbare string met een validatietelling, de citatiemetadata, de gegenereerde figuur en de afbeeldings-URL's in README's per oppervlak zijn allemaal vastgepind aan hun bron van waarheid.

0.21.0 - 2026-06-26#

Deze release voegt twee MODELLED toepassingssuites toe aan de open engine — een demonstrator voor Quantum-Enabled PNT (vertrouwde kwantumtijdoverdracht, GNSS-vrije kwantumnavigatie, kwantumdetectie van fouten/afwijkingen) en een suite voor lunaire / cislunaire PNT (lunaire coördinatentijd, lunaire VLBI, gezamenlijke OD+klok, realisatie van het referentiestelsel, servicevolume, differentiële PNT, export voor interoperabiliteit) — elk uitvoerbaar vanuit één kind, elk met een eerlijk record TradeEvidence plus een register van representativiteit / hiaten tot vlucht. Ze brengt ook zes nieuwe validaties tegen een externe referentie, waarmee de machinaal gecontroleerde validatiematrix op 15 VALIDATED · 42 MODELLED · 4 PARTNER komt over zijn 61 rijen. De nieuwe toepassingscijfers zijn MODELLED uit illustratieve parameters uit openbare bronnen — geen TRL, geen vluchterfgoed, geen certificering of goedkeuring door een ruimtevaartagentschap — en de getoetste kernels die ze hergebruiken zijn als zodanig gelabeld.

Toegevoegd#

  • Demonstratorsuite voor Quantum-Enabled PNT (quantum-time-transfer, quantum-gnss-free-nav, quantum-anomaly-detect). Drie uitvoerbare MODELLED toepassingsgebieden achter de engine, die elk TradeEvidence uitgeven plus een record van representativiteit / hiaten tot vlucht:
    • Vertrouwde kwantumtijdoverdracht (src/timetransfer_chain.rs) — een budget voor optische-roosterklok + fotonische link versus CSAC + RF-tweewegverbinding, dat het beschermingsniveau voor tijdsynchronisatie hergebruikt, met een beveiligingskwaliteitsmaat voor vertragings-/replay-aanvallen (1 − P_md) en detectie van klokafwijkingen + CUSUM-latentie.
    • GNSS-vrije kwantumnavigatie (src/quantum_nav_od.rs) — een inertiale coast met koude-atoominterferometer versus een INS van navigatiekwaliteit over een GNSS-uitval, eerlijk over het feit dat de bias van de versnellingsmeter zonder externe positiebepaling niet waarneembaar blijft, zodat de fout nog steeds groeit.
    • Kwantumdetectie van fouten / afwijkingen (src/quantum_faults.rs) — een gelabelde foutencatalogus met een ROC AUC met bootstrap-betrouwbaarheidsinterval en een minimaal detecteerbare fout bij een vaste kans op vals alarm.
    • Een gedeelde bibliotheek met foutmodellen van kwantumapparaten (src/quantum_devices.rs) en een uniform harnas voor de afweging kwantum-versus-klassiek (src/qtrade.rs) ondersteunen alle drie.
  • Suite voor lunaire / cislunaire PNT. Zeven uitvoerbare MODELLED kind-soorten, gelaagd op de CR3BP-kern: Lunar Coordinate Time (seculiere snelheid LTC/TCL − TT, src/lunar_time.rs), geodetische lunaire VLBI-vertragingsobservabele (src/lunar_vlbi.rs), gezamenlijke multitechniek-OD + klok-batchschatter (src/lunar_combination.rs), realisatie van het referentiestelsel (Helmert met 7 parameters + IAU 2015 WGCCRE-koppeling, src/lunar_frame_realise.rs), analyse van het servicevolume van het type Moonlight / LCNS (src/lunar_service.rs), lunaire differentiële PNT (src/lunar_dpnt.rs) en een export voor interoperabiliteit, afgestemd op LunaNet / IOAG (CCSDS-OEM + lunaire tijdschaal in de KIF-envelop, src/lunar_interop.rs). Alles MODELLED uit illustratieve parameters uit openbare bronnen; niet getoetst aan echte VLBI- of Gateway-tracking; geen verbondenheid met of goedkeuring door een ruimtevaartagentschap.
  • Zes nieuwe validaties tegen een externe referentie (de validatiematrix staat nu op 15 getoetst):
    • ADEV / HDEV op een echte 5071A-caesiumklok — getoetst aan decadepuntreferenties van Stable32 (tests/cs5071a_reference.rs).
    • OADEV / MDEV / TDEV op de Stable32-referentie PHASE.DAT — getoetst aan de gepubliceerde tabellen van Stable32 (tests/phasedat_reference.rs).
    • ROC AUC voor detectie van afwijkingen op echte telemetrie van ESA OPS-SAT — getoetst aan scikit-learn (tests/opssat_ad_reference.rs).
    • Synthese van ICGEM-zwaartekrachtfunctionalen — getoetst aan de GRS80-normaalzwaartekrachtstandaard (Somigliana γ tot 3.5e-12; verstoringskaart van EGM2008, tests/icgem_gravity_reference.rs).
    • Klobuchar-ionosfeermodel uit de broadcast — getoetst aan RTKLIB (tests/klobuchar_reference.rs).
    • RAIM-detectiekernel (171 gevallen, tests/raim_reference.rs) en het SBAS DO-229E-beschermingsniveau op echte EGNOS-data (RTKLIB SBAS-PL-fork, tests/sbas_reference.rs) — beide getoetst aan hun externe referenties.
  • Register van representativiteit en hiaten tot vlucht (src/representativeness.rs). Een gestructureerd record dat elke demonstrator uitgeeft — wat representatief is, wat vereenvoudigd is en wat er tussen het model en de vlucht staat — de eerlijke metgezel van elke MODELLED afweging.
  • Studie-aggregatie en ergonomie van de CLI. Een manifest van een scenariosuite met studie-aggregatie in één opdracht, hash-stabiele studiemetadata + --study-name, linting van scenario's met --validate, en weergave van het validatieniveau per kwaliteitsmaat in studierapporten.

Gewijzigd#

  • kshana.dev opnieuw ontworpen rond een gedeelde domeinruggengraat — mogelijkheden en validatie samengevoegd in één domeinverkenner met een gemeenschappelijk vocabulaire, de nieuwe getoetste eilanden zichtbaar gemaakt, een landnauwkeurig geanimeerd Aardeinstrument en een CTA om een studie aan te vragen, en de branding/links van Ashforde OÜ.
  • README + ARCHITECTURE gecontroleerd op volledigheid en eerlijkheid — verouderde tellingen van getoetste items gecorrigeerd (nu 15 externe referenties), de diagrammen uitgebreid, en de preprints over het Conditional Timing Protection Level (arXiv:2606,24210) en de optimismekloof bij RF-verstoringen (arXiv:2606,22054) geciteerd.
  • De bronnen in paper/ en de pijplijn voor het JOSS-concept worden bewaard in de openbare repo.

0.20.0 - 2026-06-22#

Deze release voegt vier studiemogelijkheden toe aan de open engine — een voorwaardelijk Timing Protection Level, op raamwerken afgestemde scoring van PNT-veerkracht, een evaluatie van de optimismekloof bij RF-verstoringen en een front-end voor software-defined receivers / echte data — elk reproduceerbaar vanuit één opdracht en schrijvend naar een byte-deterministisch artefact. Alle studies zijn MODELLED (synthetische of kalibratie met een openbare dataset), dragen hun eerlijke herkomst (engineversie, seeds, confighash) en validatielabels, en zijn geen certificeringen.

Toegevoegd#

  • Voorwaardelijk Timing Protection Level (tpl). Een door holdover beperkte grens op de niet-gedetecteerde tijdsfout bij GNSS-spoofing, met een monitorondergrens van k sigma, een coastvariantie van van Loan over de detectielatentie en een CUSUM-tijd tot alarm. Gekalibreerd op een echte vastgelegde aanval (JammerTest 2024, scenario 2.1.1) via cargo run --release --example tpl_jammertest, die zijn referentietabel reproduceert uit scalairen die zijn teruggewonnen uit de openbare opname (de ruwe dataset wordt niet herverspreid).
  • Op raamwerken afgestemde scoring van PNT-veerkracht + studie naar beslissingsinstabiliteit (resilience). Architectuurmodel, scoring afgestemd op RPCF, Dirichlet-gewichtensimplex, Kendall-tau en top-1-flipfrequentie als instabiliteit, en instorting van diversiteit in gemeenschappelijke modus (Hill-N2), met cargo run --release --example resilience_report -- paper-artifacts/resilience-study.json. Crosswalk in docs/RESILIENCE-CROSSWALK.md.
  • Studie naar de optimismekloof bij RF-verstoringen (impairment_study, impairment_ml, eval_stats). Een panel van 13 detectoren over een synthetisch corpus met gegronde parameters, een optimismekloof tussen in- en out-of-distribution, schaalwettrends met een permutatienul, en een leave-one-out-voorspeller van degradatie, via cargo run --release --example optimism_study -- paper-artifacts/optimism-study.json.
  • Front-end voor software-defined receivers (sdr) en adapters voor echte data (realdata/). Ruwe IQ/IF tot correlatortaps en SQM, plus inleesadapters (RINEX, u-blox UBX, GnssLogger, JammerTest, Yunnan, SatGrid) en probe-voorbeelden. Deze lezen opnames die de gebruiker lokaal aanlevert; er worden geen opnames gecommit.
  • Gecommitte studie-artefacten. De byte-deterministische optimism-study.json en resilience-study.json worden nu bijgehouden onder paper-artifacts/ zodat de studiegetallen kunnen worden gecontroleerd zonder opnieuw te bouwen; ze blijven regenereerbaar uit de generatoren hierboven. Ruwe datasets blijven buiten de repo (/realdata-cache/).

Gewijzigd#

  • Versie verhoogd naar 0.20.0 in Cargo.toml, CITATION.cff en README; de artefacten van de crossover-studie zijn opnieuw gegenereerd zodat hun stempel overeenkomt met de uitgebrachte versie.

0.19.0 - 2026-06-18#

Gewijzigd#

  • Opnieuw gelicentieerd van Apache-2.0 naar de GNU AGPL-3.0-only, met een commerciële licentie beschikbaar bij Ashforde OÜ (dual-licensing). De open engine blijft volledig open en openbaar verifieerbaar; de netwerk-copyleft van de AGPL (§13) betekent dat een gesloten of gehoste afgeleide terug moet naar open source — of een commerciële licentie moet nemen. Dit beschermt de getoetste kern tegen fork-and-close en behoudt tegelijk de geloofwaardigheid van een openbare, uitvoerbare, controleerbare engine. Zie LICENSE (AGPL) en het nieuwe LICENSING.md (wat elke licentie dekt en wanneer ze van toepassing is).
    • LICENSE bevat nu de AGPL-3.0-tekst; SPDX-headers in alle bronnen bijgewerkt naar AGPL-3.0-only; NOTICE, README, GOVERNANCE, GLOSSARY, de website en de metadata van crate/pakket (Cargo.toml, pyproject.toml, CITATION.cff, de MCP-crate + image) dienovereenkomstig bijgewerkt.
    • Bijdragevoorwaarden (CONTRIBUTING.md) licentiëren inkomende bijdragen nu onder de AGPL en verlenen Ashforde OÜ het recht bijdragen op te nemen in de commercieel gelicentieerde editie, zodat de dual-licentie blijft werken.
    • Afhankelijkhedenbeleid ongewijzigd maar opnieuw verantwoord (deny.toml, GOVERNANCE): afhankelijkheden blijven permissief (Apache/MIT/BSD/ISC). AGPL is alleen toegestaan voor de eigen crate van kshana — een copyleft-afhankelijkheid zou de commerciële editie besmetten en dual-licensing breken.
    • Let op voor downstream: dit is een copyleft-herlicentiëring. Gebruikers die op de permissieve voorwaarden van Apache-2.0 vertrouwden, kunnen de laatste Apache-2.0-release blijven gebruiken (v0.18.0 en eerder, zoals gepubliceerd); vanaf v0.19.0 is het AGPL-3.0 / commercieel.

Beveiliging#

  • pyo3 verhoogd van 0,24 → 0,29 om RUSTSEC-2026-0176 / RUSTSEC-2026-0177 (GHSA-36hh-v3qg-5jq4 / GHSA-chgr-c6px-7xpp) uit externe OSV-/afhankelijkheidsscans te halen. Beide zijn advisories op functieniveau waarvan de getroffen functies (BoundList/TupleIterator::nth/nth_back, PyCFunction::new_closure) door Kshana nooit worden aangeroepen, en pyo3 is een optionele afhankelijkheid (feature python) — dus de werkelijke blootstelling was nul — maar de verhoging houdt de scan schoon voor downstream-auditors. src/python.rs gemigreerd naar de pyo3-0,29-API (Bound-retourtype voor scenario_kinds; expliciete skip_from_py_object op de pyclass RunOutput). Alle 11 tests van de Python-binding slagen tegen de opnieuw gebouwde extensie.

0.18.0 - 2026-06-17#

Toegevoegd#

  • Elf nieuwe uitvoerbare scenariosoorten — demonstrators met twee tenders, een CCSDS-interoperabiliteitsbrug en een suite voor missieanalyse / omgeving van de eerste orde (alle MODELLED, additief; bestaande reproduceerbaarheids-goldens ongewijzigd). Elk is via CLI / Python / WASM / MCP te dispatchen, levert een scenarios/<kind>.toml mee en draagt een expliciet label MODELLED in zijn resultaat-JSON en samenvattingsregel (een test per soort in tests/dominance_demonstrators.rs stelt vast dat het label aanwezig is en dat de uitvoer nooit de string VALIDATED bevat):

    • impairment-eval (src/impairment_eval.rs) — Testbank voor de evaluatie van detectie van RF-verstoringen met machine learning: een gelabeld synthetisch corpus + een detectoronafhankelijk ROC/AUC-harnas + een rapport over de optimismekloof tussen in- en out-of-distribution (alleen operationele kenmerken — nooit veld-/IQ-data).
    • quantum-trade (src/quantum_trade.rs) — PNT-afweging kwantum-versus-klassiek met inlezen van gemeten ADEV en een veerkrachtenvelop voor GNSS-geweigerde omstandigheden.
    • space-weather (src/space_weather.rs) — zonne-/geomagnetische indices (Kp↔ap IAGA-tabel, dagelijkse Ap, gecentreerde F10.7a over 81 dagen), exosferische temperatuur volgens Jacchia-71 en een door activiteit aangestuurde koppeling van de thermosferische dichtheid over een statische atmosfeer (GEEN absoluut dichtheidsmodel van NRLMSISE).
    • oem-interop (src/oem.rs) — CCSDS 502,0 OEM-import + round-trip-brug voor efemeriden van GMAT / Orekit / STK (de lezer parse_oem, exacte inverse van de schrijver).
    • launch-window (src/launch.rs) — lanceerazimut voor twee lichamen (sin Az = cos i/cos lat), Δv voor vlakwijziging, bonus van de rotatie van de locatie en geometrie van dagelijkse kansen.
    • reentry (src/reentry.rs) — ballistische re-entrycorridor volgens Allen-Eggers: piekvertraging, snelheden bij piek-g en piekverhitting, hoogte bij piek-g.
    • eo-coverage (src/eo_payload.rs) — EO-geometrie voor zwad / GSD / toegang / revisit (SMAD-ruimtedriehoek).
    • space-packet (src/space_packet.rs) — CCSDS 133.0-B Space Packet primary-header coderen/decoderen met bitexacte round-trip.
    • attitude-budget (src/attitude_budget.rs) — 3-DOF zwaartekrachtgradiëntkoppel + RSS-budget voor wijzfout (scalair budget vóór hardware, geen regellus).
    • passes (src/passes.rs) — voorspelling van op-/ondergangspassages voor grondstations (AOS/TCA/LOS, maximale elevatie, toegang).
    • link-budget (src/linkbudget.rs) — CCSDS-401 / DSN-810-005-linkvergelijking in één richting (C/N₀ = EIRP − FSPL − L_other + G/T − k, FSPL / Eb·N₀ / marge / sluiting).
  • Hybride kwantum + klassieke strak gekoppelde UKF met 17 toestanden — als uitvoerbaar scenario beschikbaar gemaakt (MODELLED). Een nieuwe scenariosoort hybrid-ukf (src/fusion/hybrid_ukf.rs, scenarios/hybrid-ukf.toml) die het eerder alleen via de API beschikbare strak gekoppelde GNSS/INS-unscented-filter met 17 toestanden (src/fusion/tightly_coupled17.rs) verandert in een scenario dat de bindings voor CLI/Python/WASM/MCP kunnen dispatchen. De foutvector met 17 toestanden bestaat uit de 15 INS-foutstatussen (positie, snelheid, standsfout, bias van versnellingsmeter + gyro), aangevuld met de door CAI afgeleide correctie van de bias van de versnellingsmeter — de koude-atoominterferometer (src/inertial/quantum_imu.rs) bepaalt de ondergrens van de snelheidsrandomwalk q_va, dus de langetermijndrift van de coast is die welke door de kwantumsensor wordt begrensd — en een klok met 2 toestanden voor fase + frequentie waarvan de procesruis komt uit de q-parameter-klokengine (clock_state::q_from_allan, die het Allan-deviatieprofiel van een klok afbeeldt op de PSD's q_wf/q_rw, geschaald naar afstandseenheden). Het platform wordt voor een aanloop door GNSS ondersteund (het filter leert de biassen, snelheid en klok), en coast dan door een GNSS-uitval op alleen de CAI-IMU + klok, dus de run toont klassieke-IMU op korte termijn + kwantum op lange termijn als hybridisering. De kwaliteitsmaat is de zelfconsistentie van het filter: gepoolde NEES (Normalised Estimation Error Squared, over de schatbare deelverzameling van positie/snelheid/klok) en innovatie-witheid NIS (Normalised Innovation Squared) over een Monte-Carlo-ensemble, gecontroleerd tegen hun χ²-banden van 95% (Bar-Shalom §5,4). Het afgestemde filter komt binnen de banden uit; een opzettelijk verkeerd afgesteld filter (de knoppen q_factor / r_factor) wordt gemarkeerd — een objectief controleerbare, onderscheidende poort, geen stempel zonder inhoud. De controle op NEES/innovatie-witheid is de STATISTISCHE REFERENTIE: een uitspraak over zelfconsistentie (de gerapporteerde covariantie van het filter komt eerlijk overeen met de spreiding van zijn eigen fouten onder de gemodelleerde ruis), GEEN garantie voor nauwkeurigheid in de praktijk. Eerlijke reikwijdte: alles is gemodelleerd / simulatie — de CAI- en klokinvoer zijn begrensde, representatieve waarden uit de literatuur, geen gemeten hardware; de CAI-hardware en de bijbehorende Key-Person blijven in handen van de partner; niets hier impliceert TRL > 3, vluchterfgoed of externe validatie (de resultaat-JSON en de samenvattingsregel dragen deze labels expliciet). Het enkele traject met constante snelheid op gelijke hoogte laat de toestanden van stand en IMU-bias slechts zwak waarneembaar, dus NEES wordt beoordeeld over de 8 schatbare toestanden; een manoeuvrerend traject voor volledige waarneembaarheid van alle 17 staat op de roadmap. Voegt ook instrumentatie voor consistentie toe met Ukf::update_stats (geeft de NIS per update terug) en TightlyCoupled17::{update_gnss_nis, nees, nees_subset}. Alle bestaande scenario's blijven ongemoeid (additief; reproduceerbaarheids-goldens ongewijzigd).

  • Sequentiële (recursieve) navigatie op basis van terreinreferentie — SITAN als lopend filter. Een nieuwe scenariosoort terrain-slam (src/altpnt/sequential.rs, scenarios/terrain-slam.toml) die het bestaande meetmodel van hoogtemeter versus DEM epoch voor epoch door de SIR-engine particle_filter laat lopen, in plaats van de batchmatige grof-naar-fijn-zoekactie die terrain-nav gebruikt om één constante INS-offset te herstellen. Bij elk waypoint wordt de wolk voortgeplant met de door de INS gerapporteerde toename (zelf bedorven door de groei van de drift per stap), opnieuw gewogen met de terreinovereenkomst en bij degeneratie opnieuw gesampled — zodat een in de tijd variërende INS-drift langs het spoor wordt gevolgd, wat een fit met een constante offset structureel niet kan. Op de synthetische DEM blijft de recursieve schatting begrensd en convergeert opnieuw (eindwaarde ≈ 70 m) terwijl de oplossing met alleen inertiaal onbegrensd divergeert tot ≈ 5 km; de fout per epoch volgt de onderscheidendheid van het terrein (ze coast op de beïnvloede INS over vlakke zadels en vergrendelt opnieuw boven onderscheidend reliëf), en de monitor van de effectieve steekproefgrootte bevestigt een gezonde wolk. Eerlijke reikwijdte: de kaart is bekend en vast — recursieve lokalisatie tegen een opgeslagen DEM (de lokalisatiehelft van terrein-SLAM), geen gezamenlijke kaartschatting; van nature niet-circulair (de ingevoerde driftramp is de onafhankelijke referentie). Alle bestaande scenario's blijven ongemoeid (additief; reproduceerbaarheids-goldens ongewijzigd).

  • Ruggengraat voor GNSS-geweigerde veerkracht + demonstratorsneden voor FutureNAV (src/holdover.rs, en fundamenten voor veerkrachtenveloppen onder src/impairment_eval.rs, src/quantum_trade.rs, src/navsignal.rs, src/inertial/quantum_imu.rs, met FutureNAV-verificatiesneden in src/verification.rs). Voegt de bouwstenen voor alternatieve PNT — klok-holdover, signaaltracking, inertiale coast, terrein — samen tot één verhaal over veerkracht bij GNSS-uitval. MODELLED; additief.

  • Kshana Interchange Format (KIF) — een geversioneerde, zelfbeschrijvende artefactenvelop (src/interchange.rs). Een met een schema getagde wrapper rond scenarioresultaten zodat een opgeslagen artefact zijn soort, schemaversie en labels MODELLED/VALIDATED met zich meedraagt, en oudere enveloppen voorwaarts compatibel leesbaar blijven. Additief; bestaande resultaat-JSON ongewijzigd.

  • Modulatie / tracking van navigatiesignalen + CR3BP-differentiële corrector voor halo/NRHO (src/navsignal.rs, src/cr3bp.rs). Een model van de eerste orde voor modulatie en tracking van navigatiesignalen, en een differentiële corrector voor het circulaire beperkte driebodenprobleem voor halobanen / bijna-rechtlijnige halobanen, getoond op de bestaande as voor deep-space-mogelijkheden. MODELLED.

  • Evaluatiemodus voor distributieverschuiving + knop voor de ernstschaal van het corpus voor impairment-eval (src/impairment_eval.rs). Voegt een expliciete splitsing in/out-of-distribution en een instelbare ernstschaal van het corpus toe aan het harnas voor de ROC/AUC-optimismekloof (alleen operationele kenmerken — nooit veld-/IQ-data).

  • ROI van kosten per dekking + koppeling van gemiste detectie aan integriteitsimpact (src/frugal.rs, src/integrity_impact.rs). Een ROI-lens voor frugale engineering (kosten per eenheid dekking) en een koppeling van de frequentie van gemiste detecties aan de impact op integriteit. MODELLED; additief.

  • Geciteerd parameterblad voor het foutmodel van de koude-atoominterferometer (CAI) (src/inertial/quantum_imu.rs). Een met literatuur onderbouwd, begrensd parameterblad voor het inertiale CAI-model — de invoer is geciteerd, geen gemeten hardware (geen claim over TRL of vlucht); het voedt de ondergrens van de snelheidsrandomwalk van hybrid-ukf.

  • Projectbestuur. GOVERNANCE.md die het beslismodel en de grens tussen open en gesloten documenteert; de rij voor gemeenschap/bestuur in de mogelijkhedenkaart verschuift none → partial om dit weer te geven.

Opgelost#

  • Beschermingsniveau voor ARAIM-integriteit — nominale bias (b_nom) en σ_URA nu toegepast. Het MHSS-beschermingsniveau trekt nu per foutmodus de eenzijdige projectie van de nominale bias b_k = Σ_i |s_i|·b_nom af, en gebruikt de integriteits-sigma σ_URA (onderscheiden van de nauwkeurigheids-sigma σ_URE) die in het Integrity Support Message wordt meegegeven. Dit maakt het beschermingsniveau conservatiever en correct volgens de standaarden, en wijzigt daarom de PL-waarden die bestaande integriteitsscenario's rapporteren. Het ISM/scenario krijgt de velden #[serde(default)] sigma_ura_m / b_nom_m, dus invoer die ze ongezet laat behoudt het eerdere gedrag. Zie docs/ARAIM_REFERENCE.md voor de herstelde formule b_k en de eerlijke implementatienotitie.

  • Consistentie van de χ² van de spoofmonitor. parity_raim_test gebruikt nu het gedeelde pad voor inverse-χ² van raim::chi2_quantile, waarmee een tweede afwijkende χ²-implementatie verdwijnt zodat RAIM en de pariteitsspoofmonitor het over hun drempels eens zijn.

  • gravity-map-nav aangesloten op de dispatcher van de CLI. Het scenario was eerder alleen via de API bereikbaar; het wordt nu gedispatcht als een kind= zoals elk ander scenario.

  • Documentatie/juistheid van aantallen. De aantallen scenariosoorten in de README zijn nu met een scenario_count_doc_sync-test vastgezet op api::list_scenario_kinds().len(), zodat het gedocumenteerde aantal niet meer kan afwijken van de dispatcher.

0.17.0 - 2026-06-14#

Toegevoegd#

  • Deep-space- en Mars-PNT: open radiometrische navigatie-engine plus GSE-simulatie. Een nieuwe, volledig additieve mogelijkheidsas bovenop de op Aarde getoetste kern (elk bestaand Aarde-scenario is byte-identiek: de reproduceerbaarheidsgoldens slagen ongewijzigd, zonder regeneratie). Voegt toe: een dynamicakern voor meerdere lichamen (Body{mu, re, zonals, gravity, rotation, IAU-pole} met tesserale Mars-zwaartekracht GMM-3, een IAU-lichaamsvast Marsstelsel, een inplugbare EphemerisProvider-naad, tweedelige Juliaanse datums met submicroseconde-nauwkeurigheid en TT↔TDB); radiometrische waarnemingen (iteratieve lichttijd plus Shapiro-vertraging, twee-, één- en drieweg-Doppler en afstand via de Moyer-tweebenige oplossing, coherente transponder-omkering, regeneratieve/PN-afstandsmeting volgens CCSDS 414, Δ-DOR volgens CCSDS 506, media van zonneplasma, troposfeer en ionosfeer); CCSDS-TDM (503) inlezen en uitvoeren; een reduced-dynamic Square-Root Information Filter met empirische RTN-versnellingen, een onboardklok met drie toestanden en een Mars-luchtweerstandsmodel; een gezamenlijke eenweg- en tweeweg-fusieschatter; het mars-pnt-scenario-oppervlak (relaisconstellatie plus LMO/transfer/oppervlak) in CLI, Python, WASM, MCP en de playground; en een end-to-end GSE-prestatiesimulator (geometrie → linkbudget → waarnemingen → SRIF → covariantie). Validatieniveau: simulatiegetoetst: synthetische gesloten-lus-baanbepaling (Mars-LMO ≈ 0,2 m) en analytische zelfconsistentie, waarbij de Zon-centrale Marsdynamica onafhankelijk is gecontroleerd tegen JPL DE440 (xval/anise-mars-od, kernel-afhankelijk: 137 m bij een boog van 1 dag, het eerlijke residu van niet-gemodelleerde n-lichamen). De gerapporteerde deep-space-nauwkeurigheden zijn simulatie- en covariantiekwaliteitsmaten, geen resultaten van echte missies; validatie met echte DSN/ESTRACK-trackinggegevens staat nog op de roadmap. ANISE (MPL-2.0, edition-2024) blijft beperkt tot een kruiscontrole-crate die buiten de workspace valt, zodat de cargo deny-licentiepoort en de MSRV-1.75-job ongemoeid blijven.
  • Grondsporen op agentschapsniveau uit echte IERS-aardoriëntatie. Het ephemeris-scenario accepteert een optioneel veld eop_finals2000a, de ingevoegde inhoud van een echt IERS-bestand finals2000A, en herleidt het grondspoor via de UT1−UTC en poolbeweging per epoche die daaruit zijn geïnterpoleerd (dezelfde EopSeries die precise_od gebruikt), waarbij de nominale scalars dut1_s/xp_arcsec/yp_arcsec worden overschreven. De gegevens reizen mee in het scenario, zodat de run reproduceerbaar blijft en geen bestandssysteem nodig heeft (hij werkt in de WASM-playground). Een vlag kshana --eop <finals2000A> voegt vanaf de CLI een echt bestand in het scenario samen. Dit heft de asymmetrie op waarbij alleen precise_od echte aardoriëntatiegegevens gebruikte.

Opgelost#

  • Consistentie van het referentiestelsel bij afstandssnelheid. Het grondstation wordt nu in het inertiaalstelsel afgebeeld via de exacte inverse van de reductie van de satelliet (frames::itrf_to_teme, die zowel de poolbeweging als de sterrentijdrotatie ongedaan maakt) in plaats van via een GMST-rotatie die poolbeweging negeert, zodat beide eindpunten één stelsel delen. Het effect op de gerapporteerde Doppler ligt onder de validatiedrempel, maar het neemt een echte stelselmismatch weg, evenals een overdreven bewering van „exact” in de broncode.
  • carrier_hz wordt gecontroleerd. Een draaggolffrequentie van nul of een niet-eindige waarde geeft nu een foutmelding in plaats van stilzwijgend een Doppler van nul op te leveren (λ = c/draaggolf werd daardoor oneindig), net als de bestaande step_s-bewaking.

0.16.0 - 2026-06-11#

Toegevoegd#

  • Validatie van het krachtenmodel door efemeridefitting, kruiselings getoetst aan echte agentschapsproducten. Een nieuwe batch-kleinstekwadratenschatter (src/precise_od.rs) met een variationele toestandsovergangsmatrix en uitbijterbewerking, aangestuurd door een volledig krachtenmodel (PreciseForceModel: EGM2008-geopotentiaal, derde lichamen, vaste-aarde-, oceaan- en atmosferische getijden, en empirische CPR/2-per-omloop-versnellingen), gevoed door een echte IERS-aardoriëntatieparser voor finals2000A. Getoetst aan gepubliceerde referentiebanen: Galileo-MEO tot 13 cm post-fit, ESA Swarm-A LEO en LRO maan (selenocentrisch, GRAIL-zwaartekracht, IAU-2015-lichaamsstelsel: reduced-dynamic 6,6 m, eerlijk gezegd boven de doelwaarde van 5 m op het open pad; het DE-klasse ANISE/DE440-pad dat die waarde wel haalt, is een crate buiten de workspace).
  • Scenario spoof-detect: een geïntegreerde meerlaagse spoofingdetector die RAIM-pariteit per epoche, AGC- en signaalkwaliteitsmonitoren (SQM) en een gefuseerd besluit combineert, getoetst aan de gepubliceerde scenarioparameters van TEXBAT (Humphreys et al., ION GNSS 2012), inclusief het moeilijke geval met uitgelijnde draaggolf.
  • Scenario ephemeris: toestand, stelsels, grondspoor en Doppler. Propageer één satelliet (TLE→SGP4 of een analytische baan) en lever per stap de inertiale TEME- en GCRS-toestand (positie en snelheid), de aardvaste ITRF/ECEF-positie, het WGS-84-grondspoor van het subsatellietpunt (breedtegraad / lengtegraad / hoogte) en het topocentrische azimut / elevatie / afstand met afstandssnelheid en Doppler vanaf een grondstation. Bereikbaar via de CLI, Python, WASM en de MCP-server, en meegeleverd als de voorinstelling „Ground track” in de webplayground, waar het spoor over een echte wereldkaart wordt getekend (Natural Earth 1:110m-kustlijnen, ingebed: geen netwerk of externe afhankelijkheid).
  • CCSDS OEM-export (--export-oem / export_oem = true): het snelheidsdragende Orbit Ephemeris Message dat GMAT / Orekit / STK verwerken, op gelijke voet met de bestaande SP3- en OMM-exporters.
  • Vaste-aarde-, oceaan- (FES2004) en atmosferische (Ray 2001 S2) aardgetijden op de geopotentiaal (IERS Conventions Ch. 6), ingebouwd in het krachtenmodel.
  • ARM64-wheels: de PyPI-build levert nu ook wheels voor Linux aarch64 (manylinux_2_28), macOS arm64 en Windows arm64.
  • Uitgebreid technisch rapport (preprint) waarnaar de README verwijst, en het JOSS-artikel indienbaar gemaakt (ORCID van de auteur, bij elke wijziging in CI naar PDF gecompileerd).

Gewijzigd#

  • Stelsels tot op de millimeter getoetst aan gepubliceerde Vallado-vectoren. De TEME→PEF/ITRF-reductie, de volledige CIO IAU 2006/2000A GCRS→ITRS-keten en de ECEF→geodetische WGS-84-conversie zijn nu vastgezet op het uitgewerkte voorbeeld in Vallado et al. (AIAA 2006-6753) met de bijbehorende IERS-EOP, en niet alleen op interne zelfconsistentie.
  • Onafhankelijke kruiscontroles van tijdschalen. ERA en de tijdschalen UTC/TAI/TT komen tot < 1 µs overeen met hifitime, en de planeteefemeride DE440 komt overeen met JPL Horizons (geocentrische posities van Maan en Zon), beide als altijd actieve CI-poorten.
  • De webplayground verbergt het tabblad met kwaliteitsmaten wanneer een resultaat geen rijen met kwaliteitsmaten bevat, zodat pakketten met alleen een grafiek (efemeride, RAIM, spoof) op hun grafiek openen, bij efemeride op het grondspoor, in plaats van op een lege tabel.
  • De geleide schuifregelaars en de parametersweep van de playground werken nu voor het scenario efemeride / grondspoor: de regelaars (breedtegraad / lengtegraad van het station, tijdstap, duur, UT1−UTC) zijn instelbaar, en een sweep kan de geometrie van een overvlucht (maximale elevatie, piek-Doppler, hoogte, snelheid) uitzetten tegen elk daarvan, bijvoorbeeld maximale elevatie tegen breedtegraad van het station. Het tabblad Sweep wordt nu alleen getoond wanneer een scenario daadwerkelijk te sweepen is, zodat geen enkel pakket een regelaar aanbiedt die niets uitzet.
  • De SGP4-benadering DUT1 ≈ 0 gedocumenteerd op de plek waar GMST wordt aangeroepen (een rotatiefout van ≤ ~13″, ruim binnen de eigen modelfout van SGP4) en CAPABILITY.md ververst.

0.15.1 - 2026-06-09#

Toegevoegd#

  • De JetBrains-plug-in Kshana — PNT simulator is nu gepubliceerd en geaccepteerd op de JetBrains Marketplace. De README, kshana.dev en de distributiedocumentatie verwijzen er rechtstreeks naar.

Opgelost#

  • Publicatie in het MCP-register slaagt nu: de description in server.json overschreed de limiet van 100 tekens van het register (HTTP 422). Die is ingekort, en de servernaam (en het eigenaarslabel van de image) is afgestemd op de canonieke namespace io.github.ashfordeOU/kshana-mcp.
  • Publicatie op de JetBrains Marketplace slaagt nu: de CI uploadde dezelfde pluginversie opnieuw die al handmatig was gepubliceerd, wat de Marketplace weigert. De pluginversie is verhoogd naar 0.1.1, en de idempotentiebewaking behandelt een antwoord „already contains version” nu ook als een geslaagde no-op.
  • Cache-busting voor kshana.dev: de van een versiestempel voorziene querystrings voor style.css/app.js volgen de release, zodat terugkerende bezoekers altijd de actuele build krijgen.

0.15.0 - 2026-06-08#

Toegevoegd#

  • kshana-mcp: Kshana als Model Context Protocol-server (MCP) (mcp/kshana-mcp/). Een zelfstandige crate buiten de workspace (de rmcp-SDK is edition 2024) die de getoetste engine via stdio beschikbaar stelt aan AI-agents en -assistenten: Cursor, JetBrains AI Assistant / Junie en elke MCP-client. Tools: run_scenario, list_scenario_kinds, validate_scenario, export_sp3, export_omm, elk een dunne wrapper om kshana::api.
  • JetBrains IDE-plug-in (ide/jetbrains/). Klik met de rechtermuisknop op een scenario .toml → Run Kshana Scenario; kwaliteitsmaten en resultaat-JSON stromen naar een Kshana-toolvenster. Een pure platform-Kotlin-plug-in, compatibel met elke JetBrains IDE 2024,3+.
  • Openbare distributie en automatische publicatie per release voor beide:
    • kshana-mcp naar crates.io (cargo install kshana-mcp) via publish.yml.
    • kshana-mcp als OCI-image voor meerdere architecturen op ghcr.io (docker run ghcr.io/ashfordeou/kshana-mcp) via een nieuwe mcp-publish.yml.
    • kshana-mcp naar het officiële MCP-register via GitHub OIDC (zonder secrets); de registervermelding (server.json) gebruikt het OCI-pakkettype met een via een label geverifieerde eigenaar.
    • de IDE-plug-in naar de JetBrains Marketplace via publishPlugin (met token als voorwaarde, optionele ondertekening door de ontwikkelaar) bij elke releasetag.

0.14.1 - 2026-06-08#

Toegevoegd#

  • Onafhankelijke kruisvalidatie van referentiestelsels met ANISE/SPICE (xval/anise-frames/). Een zelfstandige crate buiten de workspace controleert de IAU 2006/2000A CIO-reductie van kshana (kshana::cio::gcrs_to_itrs_matrix, GCRS→ITRS) tegen ANISE (de pure-Rust-herimplementatie van NAIF/SPICE) die GCRF→ITRF93 roteert met earth_latest_high_prec.bpc van JPL, waarbij dezelfde IERS-aardoriëntatieparameters finals2000A aan beide kanten worden gevoerd, over acht driemaandelijkse epochen van 2020–2023. De twee onafhankelijke stelselrealisaties komen overeen tot een maximale relatieve rotatie van 0,028″: ≤ 0,86 m op de grond, ≤ 0,93 m in LEO, ≤ 3,6 m in GNSS-baan, waarmee de al lang bestaande ROADMAP-stelselkruiscontrole van „< 10 m” ruim wordt gehaald (dit vult de bestaande bit-voor-bit-ankers van SOFA/ERFA aan en vervangt ze niet). De crate is geïsoleerd omdat anise + hifitime MPL-2.0 / edition-2024 zijn en nooit in de afhankelijkhedengraaf van de gepubliceerde kshana, de bijbehorende Cargo.lock, de licentiepoort cargo deny of de MSRV-build mogen belanden; ANISE is vastgezet met default-features = false. Bevat een binary frame-xval (haalt de BPC van ~5 MB op, drukt een tabel af, schrijft report.{json,md}), een testpoort die zichzelf overslaat zonder kernel of netwerk, en een optionele CI-job die alleen via workflow_dispatch draait (blokkeert main nooit). Gedocumenteerd in docs/VALIDATION.md (CIO-rij) en ROADMAP.md.

Opgelost#

  • Mobielvriendelijke playground. Horizontale overloop van het .panel van de playground op telefoons verholpen (een CSS-grid-item met standaard min-width: auto werd ~100 px breder dan de viewport weergegeven) via min-width: 0 en breedtebewaakte bedieningselementen; schoon geverifieerd bij 360 / 390 / 414 / 768 px. De actieknoppen „Pin to compare” / „Download report” zijn uitgelijnd (gelijke marges in de flexrij). Runknoppen, schuifregelaars, selectievakken en navigatielinks zijn vergroot tot het aanraakdoelminimum van ~44 px van WCAG 2.5.5 / Apple-HIG op telefoons en aanraakapparaten, met ongewijzigde afmetingen op desktop.

0.14.0 - 2026-06-08#

Opgelost#

  • Robuustheidsversterking na een adversariële battle-testronde. (1) sbas_protection_level weigert nu niet-eindige elevatie/azimut/variantie en negatieve of niet-eindige covariantiediagonalen (een bijna-singuliere geometrie, opgeschaald door kleine σ, kon eerder de absolute pivotpoort passeren en een NaN-VPL of absurde HPL teruggeven als een geldige Some: een stil integriteitsfalen). (2) De numerieke propagator (propagate/propagate_dopri) faalt gesloten bij een niet-eindige begintoestand in plaats van de adaptieve regelaar eindeloos te laten draaien. (3) De DEM-celhulpfunctie crasht niet meer op een raster met één sample (1×N). (4) Het azimut van lunar_look_angle blijft strikt binnen [0, 360). (5) SphericalHarmonicField::from_gfc weigert niet-fysische (NaN / niet-positieve) waarden voor GM/straal.

Toegevoegd#

  • Binary validation_report en release-artefact: een generator zonder afhankelijkheden die een afdrukklare HTML-validatiesamenvatting van één pagina uitgeeft, waarin elke in CI afgedwongen validatie (SGP4 666/666, EGM2008, bit-voor-bit-stelsels, NIST Allan, IMU-datasheets, ARAIM/SBAS, reproduceerbaarheid op 3 besturingssystemen, dekking) wordt gekoppeld aan haar test en externe onafhankelijke referentie. De releaseworkflow genereert kshana-validation-summary.html en voegt het (met SLSA-herkomst) toe aan elke getagde release.
  • pytest voor numpy-interoperabiliteit en versterking van wheels: tests/python/test_numpy_interop.py (draait in CI) plus een vastgezette manylinux-container en een verificatiestap met auditwheel show in de wheel-build.
  • Tutorials en onderwijs: docs/tutorials/ (drie uitgewerkte tutorials, geannoteerde scenario's per domein, oefeningen van niveau 1/2/3) met tests/tutorials.rs die elk geciteerd getal vastzet op live engine-uitvoer.
  • Artefacten voor externe indiening (paper/, notebooks/, submissions/): een conceptartikel voor JOSS, een notebook kwantum versus klassiek en kant-en-klare indieningspakketten voor awesome-gnss / ESA Navipedia / NASA ASCL / ESA ESSR / ION/IAC, plus FUNDING.yml, waarmee de externe stappen voor indiening worden voorbereid.
  • Terreingebonden en gecombineerde alt-PNT-navigatie (module altpnt): een TERCOM/SITAN-terreinmatchingnavigator over een DEM (.hgt-lader plus generator van synthetische testdata) en een gecombineerde navigator zonder GPS op basis van zwaartekracht, magnetisme (IGRF) en terrein, beschikbaar als scenariosoorten terrain-nav en combined-altpnt. Getoetst aan convergentie van de terreinmatching (een bekende opgelegde afwijking wordt teruggevonden) en een begrensde fout van het gecombineerde filter over een venster zonder GPS.
  • LunaNet LANS-geometrie (lunar): benoemde maanoppervlaklocaties (Apollo 11/15/16, rand van Shackleton) met gezaghebbende selenografische coördinaten, kijkhoeken vanaf het oppervlak (az/el/afstand), zichtbaarheid/dekking en DOP van de locatie, getoetst aan de maanstraal, de gepubliceerde locatiecoördinaten en de identiteit van 90° elevatie bij radiaal zenit.
  • Geleide browserplayground: schuifregelaars in geleide modus, een uitvoerpaneel met tabbladen, een rondleidingsoverlay bij het eerste gebruik, modi voor parametersweep en overlay van meerdere runs, een 3D-baanweergave in canvas/SVG zonder afhankelijkheden (het baanpakket geeft nu een additieve eci_track uit), een embed/iframe-modus en download als HTML-rapport, elk met node-unittests in CI.
  • Aan datasheets getoetst IMU-foutmodel (tests/imu_allan_spec.rs): ARW/VRW/bias-instabiliteit van ADIS16465/16488/16460 teruggewonnen uit de gesynthetiseerde Allan-deviatie en gecontroleerd tegen de specificaties van de fabrikant (identificatie volgens NIST SP1065 / IEEE 952).
  • Validatie van Allan-schatters volgens NIST SP1065 (tests/allan_nist_sp1065_1000point.rs): de vier schatters reproduceren de gepubliceerde referentiedeviaties van 1000 punten en de betrouwbaarheidsgrenzen van Tabel 32.
  • SBAS / DO-229E-beschermingsniveaus, ionosfeervrij L1/L5 en een DO-316 compliance-map (module sbas). sbas_protection_level vormt de gewogen geometriematrix uit elevatie/azimut van elke satelliet en het foutbudget van UDRE/GIVE/airborne/troposfeer, inverteert de normaalmatrix (gedeelde orbit::invert4) en projecteert de varianties naar HPL/VPL via de K-factoren van DO-229E (PA 6.0/5.33, NPA 6,18). iono_free_l1l5 voegt de ionosfeervrije GPS L1/L5-pseudo-afstand toe (IS-GPS-705, γ₁₅ = 1.79327), getoetst op het opheffen van de onafhankelijke eerste-orde-ionosfeervertraging van de engine. do316_compliance_map herleidt eisen uit DO-316/DO-229E naar de implementerende functies. Getoetst aan gesloten-vormdefinities van de K-factoren, de numpy-referentiegeometrie inv(GᵀG) en de identiteit van twee covariantieroutes; de kruiscontrole van gepubliceerde PL-waarden met RTKLIB/gLAB is gedocumenteerd als in afwachting van beoordeling in docs/COMPLIANCE.md.
  • Volledige tesserale sferisch-harmonische zwaartekracht: het EGM2008-veld tot graad/orde 70. Een nieuw gravity_sh::SphericalHarmonicField evalueert de geopotentiaal en de bijbehorende versnelling in het aardvaste stelsel uit volledig genormaliseerde coëfficiënten C̄_nm, S̄_nm, met de stabiele genormaliseerde Legendre-recurrentie van Holmes–Featherstone (denormaliseren zou bij deze graad overlopen). De meegeleverde coëfficiënten zijn het NGA EGM2008-product (publiek domein, via ICGEM), gebundeld in egm2008_data.rs en bit-voor-bit gereproduceerd door tools/gen_egm2008.py uit het vastgelegde tools/egm2008_to70.gfc; elk ICGEM-model in .gfc-formaat laadt via from_gfc. Getoetst aan drie onafhankelijke referenties: instorting tot een puntmassa (alleen C̄00 = −μr/|r|³), een veld met alleen zonale termen dat de bestaande forces::zonal_accel reproduceert tot ~1e-9, en de analytische versnelling die overeenkomt met de eindige-verschilgradiënt van de direct gesommeerde potentiaal tot <1e-6.
  • Algemeen-relativistische Lense–Thirring-versnelling (frame dragging) (forces::lense_thirring_accel, IERS 2010 Eq. 10,12), de gravitomagnetische term bovenop de bestaande Schwarzschild-correctie, via een nieuwe vlag ForceModel::lense_thirring() ingebouwd in de numerieke propagator. Getoetst als lineair in het impulsmoment van de Aarde en 1–2 ordes van grootte onder de Schwarzschild-term, het regime van de metingen van LAGEOS / Gravity Probe B.
  • Een trait Propagator die de analytische en numerieke baanpropagators verenigt. De numerieke Cowell-propagator met krachtenmodel is nu een volwaardige gelijke van SGP4: een nieuw type NumericalPropagator (begintoestand + ForceModel + Tolerance + keuze van stapverdubbelende of Dormand–Prince-Integrator) en Sgp4 implementeren beide propagator::Propagator, waarvan state_at(t_seconds) -> StateVector de inertiale TEME-toestand in SI-eenheden (m, m/s) teruggeeft, zodat de twee uitwisselbaar zijn achter een Box<dyn Propagator>. De SGP4-impl is de exacte omrekening van km/min naar SI van de inherente methode (geverifieerd met een gelijkheidstest); de numerieke impl haalt via de trait dezelfde exact-Kepler-poort onder de meter, de twee adaptieve drivers komen overeen, en een PropagatorError brengt de onderliggende SGP4-code naar boven.

0.13.0 - 2026-06-08#

Deze release dicht de grootste correctheidskloof in de engine: aardoriëntatie en referentiestelselreductie gebeuren nu op het niveau van een referentie-implementatie (bit-voor-bit getoetst aan ERFA/SOFA), de integriteitsstack krijgt ARAIM voor twee constellaties op echte GPS+Galileo-TLE's, en de lagen voor propagatie, kwantumsensoren, maan/cislunair en geomagnetisme worden allemaal verdiept, naast een getypeerde Python-API, een rijkere browserplayground en een reproduceerbaarheidsmatrix op drie besturingssystemen. Hoogtepunten:

  • Referentiestelsels, bit-voor-bit. Volledige IAU 2000A- en 2000B-nutatie, IAU 2006-precessie, de op CIO gebaseerde (X, Y, s) IAU 2006/2000A GCRS↔ITRS-reductie, IERS-poolbeweging en TEME→GCRS/ITRS-uitvoerstelsels, elk bit-voor-bit getoetst aan ERFA/SOFA-referentieroutines.
  • ARAIM voor twee constellaties (GPS + Galileo) op echte TLE's, met HPL/VPL, uitvoer als Stanford-diagram en een open docs/ARAIM_REFERENCE.md.
  • Cislunaire PNT: een Aarde–Maan-CR3BP-propagator, MCI↔MCMF-stelsels, selenografische coördinaten en een uitvoerbaar LunaNet-scenario voor maanintegriteit.
  • Kwantumsensing: Coriolis- en AC-Stark-systematiek voor de koude-atoominterferometer, een driftsweep en validatie tegen het budget van Freier (2016).
  • Het geomagnetische hoofdveldmodel IGRF-14, zelfstandig en getoetst.
  • Getypeerde Python-API (PyO3 RunOutput/ScenarioMeta, .data(), scenario_kinds, validate_toml, typestubs) met een CI-wheelbuild, plus eersteklas GCRS/ITRS-propagatoruitvoer en CCSDS OMM-export.
  • Geloofwaardigheid en reproduceerbaarheid: een rechtstreekse vergelijking van de SGP4-nauwkeurigheid met de onafhankelijke crate sgp4, een CI-dekkingspoort (~97% regels op src/) en een reproduceerbaarheidsmatrix op drie besturingssystemen (ubuntu/macos/windows).

Gewijzigd#

  • Elke playground-grafiek past nu bij het sitethema. Alle twaalf SVG-grafiekgeneratoren, de resultaat-/holdover-grafiek (src/report.rs + src/chart.rs), de Allan-deviatiegrafiek (web/app.js) en elke scenariografiek (src/hybrid.rs, jamming.rs, timetransfer.rs, spoof.rs, raim.rs Stanford + beschikbaarheid, lunar.rs, ensemble.rs, sweep.rs, gnss_sim.rs, fusion/pack.rs, inertial/mod.rs), gebruikten koele marineblauwe panelen (#0e131b), koelgrijze assen en tekst en een botsend rood/blauw/paars reekspalet. Ze gebruiken nu overal het warme grafietpalet: panelen met --bg, warm raster met --line, labels met --fg, met een consistente toewijzing van reeksen: kwantum = honinggoud (--accent-bright), klassiek = warm amber (--partial), specificatie/limiet = --crit. Weergaven met veiligheidskleuren behouden hun betekenis: het RAIM-Stanford-diagram blijft groen (beschikbaar) / amber (misleidend) / rood (gevaarlijk) / gedempt staalgrijs (niet beschikbaar), en HPL/VPL lezen als goud/brons.
  • Grafieken beschrijven zichzelf nu bij opslaan/downloaden. Beide grafieken bakken hun titel in de SVG (de titel van de Allan-grafiek en de ondertitel „lower is better” stonden eerder alleen als HTML rond de afbeelding, zodat een opgeslagen afbeelding geen bijschrift had), en beide dragen een herkomstvoettekst, Kshana v<version> · <scenario-hash> · kshana.dev, zodat een gedownloade grafiek op zichzelf staat en reproduceerbaar blijft.
  • Elke grafiek draagt nu de herkomstvoettekst. De voettekst, Kshana v<version> · scenario <hash> · kshana.dev, wordt centraal gestempeld voor alle scenariosoorten in api::run_toml (eerder stond hij alleen op de holdover- en Allan-grafieken), zodat elke opgeslagen of gedownloade afbeelding, uit de playground, uit de .chart.svg-export van de CLI of uit de HTML-scorecard, haar versie, scenariovingerafdruk en bron vermeldt. De hash is voor de duidelijkheid gelabeld als scenario en komt uit scenario_hash van het resultaat waar aanwezig, met een terugval op een bron-hash voor de integriteits- en maanrapporten. Wat de vingerafdruk is en waarom hij er staat, is beschreven in de README-sectie „Output” en in docs/PROVENANCE.md.

Opgelost#

  • raim::chi2_quantile en de RAIM Stanford-ruissampler geven nu geen panic meer bij waarden buiten bereik of niet-eindige waarden (een bevinding uit fuzzing die afhing van de read_dir-volgorde, afkomstig van de nieuwe ARAIM-scenario's). chi2_quantile bewaakt p/k nu zoals normal_quantile (en geeft een grenswaarde terug in plaats van met assert! te crashen), en de beschikbaarheids-Normal van de Stanford-ruis begrenst tot een strikt positieve σ, zodat de integriteits-/ARAIM-stack nooit crasht op gemuteerde of verkeerd geconfigureerde scenario's.

Toegevoegd#

  • CI-matrix voor reproduceerbaarheid over platforms. Een nieuwe job reproducibility-matrix draait de reproduceerbaarheidstests bij elke push op ubuntu-latest, macos-latest en windows-latest. Omdat het volledige resultaat-JSON niet byte-identiek is over besturingssystemen heen (afwijking in de laatste ULP van libm), bevestigt hij exact de platformonafhankelijke projectie, de invoervingerafdruk plus de vorm van de uitvoer, per scenario vastgezet als SHA-256-goldens in tests/golden/ door de nieuwe tests/cross_platform_golden.rs, naast de numerieke pins (golden.rs, tot 1e-6), de SGP4-toestanden (sgp4_verification.rs, tot 2e-5 km) en determinisme binnen hetzelfde proces (determinism.rs). Samen bewijzen deze reproduceerbaarheid over platforms op drie besturingssystemen, zonder de broosheid van exacte byte-hashing van de volledige uitvoer. docs/REPRODUCIBILITY.md documenteert de scheiding.
  • Dekkingspoort voor code in CI. Een nieuwe job coverage draait cargo-tarpaulin met de op LLVM-bron gebaseerde engine, publiceert een lcov-rapport als build-artefact en handhaaft een ondergrens voor regeldekking op src/ (gegenereerde gegevenstabellen, het CLI-startpunt, de tests en webassets uitgesloten). De gemeten regeldekking is ~97% op src/ (SGP4 en de klokmodules ≥95%); de poort staat op 85%, boven het doel van ≥80% en ruim onder de gemeten waarde, zodat hij regressies opvangt zonder onbetrouwbaar te zijn. Een dekkingsbadge wordt gepubliceerd in de README.
  • SGP4/SDP4 rechtstreeks vergeleken met de onafhankelijke crate sgp4. Een nieuwe test (tests/sgp4_crate_comparison.rs) toetst de propagator van Kshana kruiselings aan de meest gebruikte Rust-SGP4-bibliotheek (neuromorphicsystems/sgp4, toegevoegd als dev-dependency alleen voor tests) over dezelfde 666 AIAA 2006-6753-vectoren. Met beide aangestuurd op het WGS72-zwaartekrachtmodel dat de vectoren gebruiken, komen de twee onafhankelijke implementaties overeen tot submicron bij banen nabij de aarde en resonante banen en tot 4,12 mm in het slechtste geval over alle regimes, en reproduceren beide de referentietabel tcppver.out. De vastgelegde vergelijkingstabel (tests/fixtures/sgp4_comparison.md, opnieuw gegenereerd via KSHANA_REGEN_FIXTURES=1) splitst het resultaat uit per regime (LEO/MEO, deep-space, resonantie van ½ dag en 1 dag) en vermeldt de vier bewust pathologische gevallen die de crate bij constructie weigert. De live-asserties houden beide binnen 2e-5 km van de referentie en laten ze onderling binnen 4e-5 km overeenkomen: een regressiebewaking, geen eenmalige controle. Dit is concurrerende stamboom: juistheid tegenover een onafhankelijke codebase, niet alleen een statische tabel. (De standaard from_elements van de crate gebruikt WGS84 en wijkt daardoor ~km af van de WGS72-referentie; dit wordt eerlijk vermeld in de tekst bij de tabel.)
  • CCSDS OMM-export is nu end-to-end bereikbaar. De OMM-schrijver (src/omm.rs) had eerder geen CLI/API-pad; de gemiddelde elementen van een scenario orbit kunnen nu worden gepubliceerd als een CCSDS 502.0-B-2 OMM-catalogus, één OMM-KVN-bericht per satelliet die via een TLE is gedefinieerd, via kshana <orbit.toml> --export-omm out.omm, of export_omm = true in het scenario schrijft automatisch <scenario>.omm (naar het voorbeeld van de bestaande --export-sp3). Elk bericht bevat het echte NORAD-catalogusnummer van de satelliet, de internationale COSPAR-aanduiding (YYYY-NNNP) en de epoche (CCSDS-vorm met dag van het jaar), ingelezen uit TLE-regel 1 door de nieuwe tle::parse_tle_identity; de naamregel wordt OBJECT_NAME (anders OBJECT <id>). CREATION_DATE is de scenario-epoche, niet de wandklok, zodat de uitvoer reproduceerbaar is. Nieuwe API: api::export_omm / api::auto_export_omm, OmmFile::from_tle_block, OrbitClockScenario::to_omm_string. Een synthetisch Walker- of RINEX-scenario (zonder gemiddelde TLE-elementen) geeft een fout in plaats van een leeg bestand uit te geven. Getoetst aan de meegeleverde momentopname van 30 satellieten gps-ops (tests/sp3_export_roundtrip.rs).
  • Interactieve hover-uitlezingen op de playground-grafieken. Wanneer de cursor over een grafiek beweegt, springt een haarkruis naar de dichtstbijzijnde sample en verschijnt een waarde-tooltip (web/hover.mjs, aangesloten in web/app.js). Op de Allan-grafiek toont hij τ en de σ_y(τ) van elke klok; op de tijdreeksgrafieken van scenario's (klok-holdover, dead-reckoning, tijdoverdracht, hybride PNT, GNSS/INS) toont hij de tijd en de waarde van elke suite in de eigen eenheden van de grafiek (ns / m / ps / benuttingsgraad), uit het resultaat ingelezen zodat de uitlezing bij de curve past. Gespecialiseerde diagrammen (RAIM, spoof, sweep) krijgen geen overlay. De grafieken blijven zichzelf beschrijvende blob-<img>s: de overlay is een transparant haarkruis plus tooltip erbovenop, zodat downloaden/vergelijken/exporteren ongemoeid blijven. De coördinatenwiskunde (dichtstbijzijnde sample, cursor→plotfractie, polylijn-parsing) is unit-getest (web/hover.test.mjs, draait in CI).
  • A/B-vergelijkingsmodus in de playground. Zet een willekeurige run vast als basislijn A, voer een tweede scenario uit, en de twee worden naast elkaar getoond met een deltatabel van kwaliteitsmaten (holdover, tijdsynchronisatie-RMS/p95, beschikbaarheid) die per maat de winnaar kleurt (web/compare.mjs, aangesloten in web/app.js; deltalogica unit-getest in web/compare.test.mjs, draait in CI). Alle waarden worden als tekst ingevoegd en alle grafieken via blob-<img>, zodat niets uit een scenariotekenreeks ooit als opmaak wordt geïnjecteerd.
  • Downloadknoppen voor grafieken (SVG + PNG). Elke playground-grafiek heeft nu een werkbalk „Download SVG / PNG” die bij het thema past (web/chartdl.mjs, aangesloten in web/app.js). SVG levert het getrouwe, schaalbare origineel terug; PNG rastert dezelfde zichzelf beschrijvende afbeelding op 2x voor dia's en documenten. Bestanden krijgen een naam met hun herkomst, kshana-<chart>-v<version>-<scenario-hash>.<ext>, en de logica voor bestandsnaam en grootte is unit-getest (web/chartdl.test.mjs, draait in CI).
  • Geomagnetisch hoofdveldmodel IGRF-14 (src/igrf.rs). Het IAGA-standaardveld in sferische harmonischen (graad/orde 13, epoche 2025,0 + secundaire variatie 2025–2030; coëfficiënten machinaal gegenereerd uit het officiële igrf14coeffs.txt door tools/gen_igrf.py in src/igrf_data.rs, bit-voor-bit reproduceerbaar). Een Schmidt-genormaliseerde synthese geeft de veldvector (noord/oost/omlaag) en afgeleide elementen (declinatie, inclinatie, horizontale/totale intensiteit) op elke geodetische locatie en datum, plus de geomagnetische pool en de dipoolsterkte: het magnetische tegenstuk van de zwaartekrachtkaartmatcher voor alternatieve PNT-navigatie. Zelfstandig getoetst: de synthese komt overeen met de exacte gesloten-vorm gekantelde dipool, het volledige analytische veld van graad 13 komt overeen met een eindig verschil van de scalaire potentiaal, de dipoolas reproduceert de bekende geomagnetische pool (~80,7°N, −72,7°E) en een sterkte van ~29,7 µT, en het globale veld is fysisch.
  • Getypeerde Python-bindingen (src/python.rs). Naast de string-in/string-uit-functies run/run_full biedt de module nu een getypeerde klasse RunOutput (.json, .svg, .summary en een accessor .data() die het resultaat ingelezen teruggeeft als een native Python-dict: geen JSON-herparsing, geschikt voor NumPy-omhulling), plus run_typed, scenario_kinds() (ingelezen lijst van metadata-dicts) en validate_toml() (een lijst foutmeldingen die geen uitzondering werpt). Bevat een PEP 561-typestub (kshana.pyi + py.typed) voor mypy/pyright/editors en een quickstart docs/PYTHON_API.md. De bestaande functies zijn ongewijzigd.
  • Eersteklas uitvoerstelsels voor propagators (src/orbit.rs enum Frame + position_in_frame + state_gcrs). Elke Propagator (Kepler, SGP4, RINEX, GLONASS, SP3) kan nu zijn positie uitgeven in TEME, GCRS (≈ J2000) of ITRS (aardvast): TEME natief, GCRS via de getoetste TEME→GCRS-reductie, ITRS door die te koppelen aan de IAU 2006/2000A CIO-rotatie gcrs_to_itrs, en zijn volledige GCRS-toestand (positie + snelheid) via state_gcrs. De inertiale uitvoer van de datum is niet langer beperkt tot TEME.
  • Op CIO gebaseerde IAU 2006/2000A-reductie van hemels naar aards stelsel (src/cio.rs). De moderne, equinoxvrije keten GCRS↔CIRS↔ITRS: CIP-coördinaten X, Y afgelezen uit de IAU 2006/2000A bias-precessie-nutatiematrix (hergebruik van de getoetste FW-precessie + 2000A-nutatie met de eraNut06a P03-aanpassing), de reeks van 66 termen voor de CIO-locator s (eraS06, machinaal gegenereerd uit de ERFA-referentie door tools/gen_s06.py in src/cio_s06_data.rs, bit-voor-bit reproduceerbaar), de GCRS→CIRS-matrix (eraC2ixys), de aardrotatiehoek (eraEra00) en de volledige GCRS→ITRS-rotatie (eraC2tcio, samengesteld met de bestaande IERS-poolbeweging). Bit-voor-bit getoetst aan de gepubliceerde eraXys06a (X=0.5791308482835292617e-3, Y=0.4020580099454020310e-4, s=-0.1220032294164579896e-7 bij JD_TT 2453736,5) en aan de testvectoren van eraC2ixys en eraEra00. De CIO-keten en de oudere equinox/GMST-1982-TEME-reductie blijken overeen te komen op het verschil in sterrentijdconventie na, gedocumenteerd als ≈2·(equinoxvergelijking). Dit is de rigoureuze reductie die het equinox/GMST-pad benaderde.
  • Volledige IAU 2000A-nutatiereeks (src/nutation.rs nutation_iau2000a, nutation_matrix_2000a). Het complete MHB2000-model, 678 luni-solaire + 687 planetaire termen, nauwkeurig tot < 0,1 mas, naast de bestaande afkapping 2000B van 77 termen. De tabellen zijn machinaal gegenereerd uit de IAU SOFA / ERFA-referentie nut00a door tools/gen_nut00a.py in src/nutation_iau2000a_data.rs (de generator reproduceert het vastgelegde bestand bit-voor-bit), en de hele reeks, zowel de fundamentele-argumentenverzamelingen van IERS-2003 en MHB2000 als de planetaire lengtes, is bit-voor-bit getoetst aan de gepubliceerde testvector eraNut00a (Δψ = −0.9630909107115518e-5, Δε = 0.4063239174001679e-4 bij JD_TT 2453736,5, tot 1e-13 rad). De standaardreductie TEME→GCRS houdt de 2000B-reeks aan (~1 mas, onder de vereenvoudiging van de snelheidsstelselrotatie in de keten); nutation_matrix_2000a biedt de matrix van de datum met < 0,1 mas voor aanroepers die die nodig hebben.
  • Uitvoerbaar scenario voor maanintegriteit (kind = "lunar-integrity", scenarios/lunanet-araim.toml). Sluit de beschermingsniveaupas voor de zuidpool van de Maan (src/lunar.rs LunarScenario → south_pole_hpl_pass) aan op de scenariorunner met een JSON-LunarReport en een SVG-grafiek van HPL tegen tijd, zodat het cislunaire integriteitsgeval rechtstreeks vanaf de CLI bereikbaar is. Het toont eerlijk de kloof: met de LANS σ_URE van 30 m overschrijdt de HPL aan de zuidpool (≈ 260–450 m) een alarmlimiet van 50 m (0 % beschikbaar): PNT-integriteit op de Maan is nog niet gehaald.
  • ARAIM-beschikbaarheid voor twee constellaties op echte GPS+Galileo-TLE's, en aansluiting op de scenariorunner (src/raim.rs, src/orbit.rs, scenarios/araim-gps-galileo.toml). Voegt araim_dual_constellation_availability toe (de geavanceerde ARAIM-engine, met storingen van één satelliet en van een hele constellatie, uitgevoerd over een tijdraster) en visible_positions_labeled, en sluit die via een vlag araim_dual aan op de runner IntegrityScenario, zodat een multi-GNSS-ARAIM-studie rechtstreeks vanuit TOML bereikbaar is. Een test met echte gegevens (tests/araim_dual_real_data.rs) op meegeleverde momentopnamen van Celestrak GPS+Galileo van 2026-06-07 toont dat het poolen van Galileo de ARAIM-beschikbaarheid optilt van 0,21 naar 0,67 bij een veeleisende VAL van 12 m (10,5→21,8 satellieten in zicht), terwijl de modus die robuust is tegen constellatiestoringen met slechts twee constellaties fundamenteel beperkt is: de kwantitatieve reden waarom robuuste integriteit met twee constellaties richting een derde constellatie of SBAS drijft. Eerlijk restant: de numeriek exacte reproductie van EU ARAIM TN Tabel A-3 tegen één versievastgezette epoche, en een Zenodo-fixturerecord.
  • Het circulaire beperkte driebodenprobleem (CR3BP) voor het Aarde–Maan-systeem (src/cr3bp.rs). Een nieuwe kern voor cislunaire dynamica die de tweelichamen-/SGP4-propagators niet kunnen bieden: bewegingsvergelijkingen in het roterende stelsel (cr3bp_accel), een RK4-propagator (propagate_cr3bp), de integraal van de Jacobi-constante (jacobi_constant) en de vijf Lagrangepunten (lagrange_points). Getoetst aan gesloten-vorm- en gepubliceerde ankers: de collineaire Aarde–Maan-punten (L1 ≈ 0,83692, L2 ≈ 1,15568, L3 ≈ −1,00506), de exacte gelijkzijdige L4/L5 = (½−μ, ±√3/2, 0), alle vijf bevestigd als veldevenwichten, Jacobi behouden tot op integratorprecisie onder propagatie, en de herstelkracht buiten het vlak die halo-/NRHO-banen mogelijk maakt. Dit is de basis voor het weergeven van een echte NRHO. Eerlijk restant: met differentiële correctie bepaalde periodieke beginvoorwaarden van de NRHO 9:2, het excentrische/efemeride-(DE-)model en de gedenormaliseerde transformatie naar de selenocentrische stelsels van src/lunar.rs.
  • IERS-poolbeweging en de TEME→ITRF-reductie (src/frames.rs). Voegt polar_motion_matrix toe (SOFA iauPom00: W = Rx(−y_p)·Ry(−x_p)·Rz(s′) met de TIO-locator s′), pef_to_itrf / itrf_to_pef en teme_to_itrf, de op GMST gebaseerde TEME→PEF-rotatie gevolgd door poolbeweging, wat een ITRF-precieze aardvaste positie compleet maakt bovenop de uitsluitend op GMST gebaseerde teme_to_ecef (poolbeweging is op baanstraal een effect van tientallen meters). x_p/y_p zijn waargenomen IERS-grootheden die de aanroeper aanlevert. Eerlijk restant: een volledig op CIO gebaseerde (X, Y, s)-keten en een numerieke ANISE/SPICE-kruiscontrole van <10 m blijven vervolgwerk.
  • Systematiek van de koude-atoominterferometer, driftsweep en validatie tegen een gepubliceerd apparaat (src/inertial/quantum_imu.rs, docs/QUANTUM.md). Breidt de CAI-versnellingsmeter vanuit eerste beginselen uit met de twee belangrijkste deterministische systematische effecten: de Coriolis-/rotatiefase Φ_cor = 2·k_eff·v_⊥·Ω·T² (coriolis_phase, met de equivalente versnellingsbias 2·Ω×v via coriolis_accel_bias) en de AC-Stark-lichtverschuivingsfase Φ_LS = (δ_LS,1 − δ_LS,3)/Ω_eff (ac_stark_phase, die bij een constante verschuiving door de π/2–π–π/2-symmetrie wegvalt). Voegt cai_drift_sweep toe (drift van de dead-reckoning-positie tegen cyclustijd: de kern van een vergelijking kwantum tegenover klassiek) en een validatietest tegen de mobiele gravimeter van Freier et al. 2016 (arXiv:1512,05660): de gemodelleerde ondergrens van kwantumprojectieruis ligt onder, en binnen ~2 ordes van, de gepubliceerde kortetermijnruis van 96 nm/s²/√Hz. docs/QUANTUM.md bijgewerkt. Eerlijk restant: systematiek van golffront/bundelrichting, oplossing van franjeambiguïteit, de exacte reproductie van de vliegtest van CARIOQA-PMP / Boeing-AOSense (vereist gepubliceerde PSD's van het platform) en een JS-playground-voorinstelling.
  • Cislunaire stelselreductie en een integriteitspas voor de zuidpool van de Maan (src/lunar.rs). Breidt de lunaire ARAIM-engine uit met de MCI↔MCMF-rotatie (Moon-centered inertial ↔ Moon-fixed) (mci_to_mcmf / mcmf_to_mci, een vereenvoudigd gemiddeld-rotatiemodel met de lunaire sterrentijdsnelheid), selenografische breedtegraad/lengtegraad/hoogte (mcmf_to_selenographic / selenographic_to_mcmf) en south_pole_hpl_pass: een geland ontvanger in de Artemis-regio tegenover een representatieve LunaNet-relaisset over een pas van 24 uur, wat de integriteitskloof eerlijk kwantificeert: met de nominale LANS σ_URE van 30 m is het beschermingsniveau eindig maar overschrijdt het een alarmlimiet van 50 m voor oppervlakteoperaties. Eerlijk restant: de nauwkeurige LANS NRHO-efemeride (een cislunaire 3-lichamenbaan), de fysische libratie / precesserende maanpool (DE421/SPICE) en een LunaNet-TOML-scenario blijven vervolgwerk.
  • ARAIM-integriteitsondersteuningsbericht, Stanford-diagram-SVG en de open ARAIM-referentie (src/raim.rs, docs/ARAIM_REFERENCE.md). Voegt een expliciet IntegritySupportMessage toe (σ_URA / σ_URE / b_nom / P_sat / P_const, met de referentiewaarden van WG-C voor GPS+Galileo en omzetters .fault_priors() / .dual_fault_priors() naar de engines araim_raim voor één storing en araim_dual_raim voor storingen van een hele constellatie), een zelfstandige stanford_svg-renderer van het Stanford-integriteitsdiagram (de vier zones, de grens PL = error, de hulplijnen voor de alarmlimiet, één kleurgecodeerde markering per epoche) en docs/ARAIM_REFERENCE.md waarin het algoritme, de ISM, de storingshypothesen, het contract voor het beschermingsniveau en het voordeel van twee constellaties worden beschreven. Tests tonen de winst in geometrie/redundantie (het poolen van een tweede constellatie verkleint de HPL voor één storing) en tolerantie voor constellatiestoringen (de gebruiker met twee constellaties overleeft het verlies van een hele constellatie; een gebruiker met één constellatie niet). Eerlijk restant: de numerieke reproductie van EU ARAIM TN Tabel A-3 / het beschikbaarheidscijfer van 15–25 % tegen een versievastgezette momentopname van echte TLE's, een Zenodo-fixturerecord en het aansluiten van araim_dual_raim op de scenariobestandsrunner.
  • IAU 2000B-nutatie en de volledige inertiale reductie TEME→GCRS/J2000 (src/nutation.rs). Voegt het tweede en derde onderdeel toe van een echte inertiale stelselreductie bovenop de meegeleverde IAU 2006-precessie: de luni-solaire MHB2000-nutatiereeks van 77 termen (nutation_iau2000b, de standaardafkapping IAU 2000B, nauwkeurig tot ~1 mas) met de fundamentele argumenten van Delaunay en de SOFA-nutatiematrix iauNumat, en de keten van Vallado AIAA-2006-6980 TEME→TOD (equinoxvergelijking) → TOD→MOD (nutatie) → MOD→GCRS (bias-precessie), beschikbaar als teme_to_gcrs(r, v, jd_tt) / gcrs_to_teme. De reeks, argumenten en eenheidsconstanten zijn overgenomen uit de IAU SOFA / ERFA-referentie nut00b en bit-voor-bit getoetst aan de gepubliceerde testvector eraNut00b (Δψ, Δε tot 1e-13 rad). Eerlijk restant: de volledige IAU 2000A-reeks van 678 termen (<0,1 mas), een numerieke ANISE/SPICE-kruiscontrole van <10 m en poolbeweging blijven vervolgwerk (zie ROADMAP.md).

0.12.0 - 2026-06-06#

Deze release brengt de eerste niet-analytische baanpropagator van Kshana: een Cowell-integrator met een hiërarchisch krachtenmodel van zes storingen (tweelichamen + zonale J2–J6 + epochegestuurde derde lichamen Zon/Maan + stralingsdruk van de Zon met een conische umbra-/penumbraschaduw + atmosferische weerstand + de post-Newtoniaanse relativistische Schwarzschild-correctie), aangestuurd door een keuze uit twee adaptieve integratoren (RK4 met stapverdubbeling en het ingebedde paar Dormand–Prince RK5(4)), naast een laag voor manoeuvres / baanontwerp (impulsieve en eindige brandperioden, een Lambert-oplosser van Izzo en een porkchop-sweep), een alt-PNT-laag met zwaartekrachtkaartmatching die een GPS-vrij spoor van 60 minuten herstelt tot onder 500 m, een batch- en sequentiële pijplijn voor baanbepaling en een volledig strak gekoppeld GNSS/INS-UKF met 17 toestanden en kwantum-CAI-dead-reckoning. Elke numerieke mogelijkheid is vastgezet op analytische waarheid of een met de hand afgeleide gesloten vorm; de standaard uitgeschakelde storingen laten de vrijgegeven goldens ongemoeid.

Toegevoegd#

  • Post-Newtoniaanse (Schwarzschild) relativistische correctie (forces::relativistic_accel + propagator::ForceModel::relativity). Voegt de dominante algemeen-relativistische storing op een baan nabij de aarde toe, de belangrijkste oorzaak van de relativistische perigeumvoortgang, in de IERS-/Montenbruck–Gill-vorm β = γ = 1 a = (μ/c²r³)·{[4μ/r − v²]·r + 4(r·v)·v}. Net als atmosferische weerstand is zij snelheidsafhankelijk, en loopt zij dus mee in de rechterzijde van de integrator voor (r, v) via [accel_rv], opt-in en standaard uitgeschakeld. Zelfstandig getoetst: op een cirkelbaan valt zij terug op de gesloten vorm 3μ²/(c²r³)·r̂ (zuiver radiaal en naar buiten gericht, componenten buiten de as exact nul); haar verhouding tot tweelichamen is de leerboekwaarde ≈1.9·10⁻⁹ in LEO (de signatuur van μ/(c²r)); een geval met radiale snelheid komt overeen met de met de hand vereenvoudigde μ(4μ + 3v²r)/(c²r³); en in de propagator verstoort zij de baan zonder die te dissiperen: de halve lange as blijft behouden tot ruim onder een meter per dag, het structurele tegendeel van het monotone verval door weerstand. Omdat zij standaard uit staat, blijven de goldens voor tweelichamen/J2/zonaal ongemoeid. Het afstemmen van de PPN-parameters (β,γ) en de Lense–Thirring-frame-draggingterm blijven vervolgwerk.
  • Conisch schaduwmodel met umbra en penumbra (forces::conical_shadow), nu gebruikt door de stralingsdruk van de Zon. Verbetert de binaire eclips met umbracilinder tot een gladde factor ν ∈ [0,1]: de Zon en de Aarde worden gemodelleerd als schijven met schijnbare hoekstralen a = asin(R☉/d☉), b = asin(Rₑ/|r|) en een schijnbare middelpuntsafstand c, en ν is één min de fractie van de zonneschijf die door de aardschijf wordt bedekt (de overlappende lensoppervlakte van de twee cirkels): volledig zonlicht voor c ≥ a+b, totale umbra voor c ≤ b−a, annulair voor c ≤ a−b en een doorlopende penumbra daartussen. srp_accel gebruikt dit nu, zodat de SRP-kracht soepel afneemt door de eclips in plaats van aan/uit te schakelen. Voegt de nominale IAU-waarde forces::SOLAR_RADIUS toe. Zelfstandig getoetst: ν = 1 in volledig zonlicht en ν = 0 diep in de umbra (exact), een gladde monotone penumbra (ν stijgt van 0 → ~½ bij c = b → 1 over de band [b−a, b+a]), en de conische penumbra reikt voorbij de umbracilinder (een punt dat de binaire cilinder volledig verlicht noemt, is 0 < ν < 1 voor de kegel). De eenvoudigere cylindrical_shadow blijft beschikbaar; limb darkening van de Zon en de schaduw van de afgeplatte Aarde blijven vervolgwerk.
  • Ingebedde integrator Dormand–Prince RK5(4) (integrator::dopri54_step / integrator::integrate_dopri + propagator::propagate_dopri). Voegt het standaard ingebedde Butcher-tableaupaar van Dormand–Prince (1980) toe naast de bestaande RK4-driver met stapverdubbeling: zeven FSAL-stadia leveren een oplossing van de 5e orde en een foutschatting van de 4e orde uit één set evaluaties (7 tegenover 11 functie-aanroepen per stap), een goedkopere schatting van de lokale fout. De adaptieve driver hergebruikt dezelfde RMS-foutnorm en stapregelaar 0.9·(1/err)^(1/5), en is dus een directe alternatieve vervanger; propagator::propagate_dopri maakt hem beschikbaar op het krachtenmodel van de baan. Zelfstandig getoetst: de ingebedde foutschatting is O(h⁵) (halvering van de stap verkleint haar ~32×); DP5(4) integreert y' = y tot e en de harmonische oscillator over 50 perioden met behoud van energie tot <1e-6; hij bereikt hetzelfde eindpunt bij dezelfde tolerantie in minder functie-evaluaties dan stapverdubbeling (zonder in te leveren op nauwkeurigheid); en propagate_dopri haalt dezelfde poort van analytische waarheid als het RK4-pad: submeter tegenover de exacte Kepleroplossing met universele variabelen over een LEO-baan van 24 uur, terwijl de twee drivers op een J2..J6-baan (geen gesloten vorm) binnen <1 m overeenkomen. Hogere ingebedde paren (RKF7(8) / DOP853) blijven vervolgwerk.
  • Atmosferische weerstand aangesloten op de propagator als eerste snelheidsafhankelijke kracht (forces::atmospheric_density + forces::drag_accel + propagator::ForceModel::drag). Voegt de stuksgewijs exponentiële atmosfeer van Vallado Tabel 8-4 ρ = ρ0·exp(−(h−h0)/H) toe (28 banden vanaf zeeniveau tot voorbij 1000 km, onder het oppervlak begrensd) en de kwadratische weerstand a = −½ · ρ(h) · (C_D·A/m) · |v_rel| · v_rel tegenover de meeroterende atmosfeer v_rel = v − ωₑ ẑ × r (forces::EARTH_ROTATION_RATE = 7.2921151467e-5). Omdat weerstand van snelheid afhangt, krijgt ForceModel een nieuwe accel_rv(t, r, v) en geeft de rechterzijde van de integrator nu de snelheid door (f(t,[r;v]) = [v; a(t,r,v)]); de alleen op positie gebaseerde accel_at is ongewijzigd, zodat de conservatieve termen en goldens ongemoeid blijven. Zelfstandig getoetst: de dichtheid verankert op de zeeniveauwaarde van 1,225 kg/m³, wordt onder het oppervlak begrensd, neemt monotoon af door LEO, ligt bij 400 km in de zonnegemiddelde band van ~1e-12 kg/m³, en haar teruggewonnen lokale schaalhoogte (≈ 58 km bij 400 km) is fysisch; weerstand werkt de meeroterende relatieve snelheid tegen met de LEO-grootte van ~2e-6 m/s² voor C_D·A/m = 0.02 m²/kg; en, de sleutelsignatuur, weerstand is dissipatief: een baan van 300 km verliest specifieke energie monotoon en haar halve lange as neemt af met een begrensd ~km/dag, terwijl de vacuümbasislijn de energie behoudt tot <1e-9. De thermosferische dichtheid van NRLMSISE-00 (de clausule over weerstandsdichtheid < 5 %) blijft vervolgwerk.
  • Stralingsdruk van de Zon epochegestuurd aangesloten op het krachtenmodel van de propagator (forces::srp_accel + propagator::ForceModel::solar_radiation). Voegt het kanonskogel-SRP-model a = ν · P☉ · cᵣ · (A/m) · (AU/d)² · d̂ toe met een eclipsfactor van een cilindrische schaduw (forces::cylindrical_shadow, ν ∈ {0.1}): de stralingsdruk P☉ = Φ☉/c uit de moderne totale zonne-irradiantie van 1361 W/m² (≈ 4,5398·10⁻⁶ N/m²), de afname van de flux met het kwadraat van de afstand (AU/d)² en de radiale duw van de Zon af. Hij loopt mee in dezelfde epochegestuurde rechterzijde als het derde lichaam, waarbij de Zon van ephem één keer wordt bemonsterd op de voortgeschreden epoche epoch_jd_tt + t/86400, gedeeld door de derde lichaam Zon en SRP. Combineerbaar: with_zonals_j2_j6().third_body(true, true, epoch).solar_radiation(1.5, 0.02). Zelfstandig getoetst aan met de hand afgeleide signaturen: de stralingsdruk op 1 AU komt uit op de leerboekwaarde van ≈ 4,5398·10⁻⁶ N/m²; de SRP van een volledig verlichte LEO-satelliet is bit-identiek aan de kanonskogelformule, wijst van de Zon af en ligt in de band van ~1,36·10⁻⁷ m/s² voor cᵣ = 1,5, A/m = 0,02 m²/kg; een verdubbeling van de afstand tot de Zon verkleint de grootte tot een kwart (omgekeerd kwadraat); de cilindrische schaduw verduistert alleen de umbracilinder (anti-zonwaarts en binnen één aardstraal van de lijn Aarde–Zon) en geeft exact nul SRP in de eclips; en in de propagator verstoort SRP een LEO-baan met een kleine begrensde hoeveelheid die ~lineair meeschaalt met A/m, terwijl een model zonder storingen bit-voor-bit tijdonafhankelijk blijft, zodat de goldens voor tweelichamen/J2/zonaal ongemoeid blijven. De conische umbra/penumbra (gladde ν ∈ [0.1]), atmosferische weerstand en externe kruisvalidatie met GMAT/Orekit blijven vervolgwerk.
  • Epochegestuurde derde lichamen Zon/Maan aangesloten op de tijdvarierende rechterzijde van de propagator (propagator::ForceModel::third_body / accel_at). De storing door het derde lichaam is niet langer een op zichzelf staande krachtterm: zij wordt nu door de Cowell-propagator geïntegreerd als een echt tijdvarierende kracht: elke evaluatie van de rechterzijde bemonstert de posities van Zon/Maan uit ephem op de voortgeschreden epoche epoch_jd_tt + t/86400 (met hergebruik van precession::julian_centuries_tt voor de omrekening tussen dagen en eeuwen), zodat de storende lichamen tijdens de integratie langs hun banen bewegen in plaats van bij de start te zijn bevroren. Combineerbaar met elk zwaartekrachtmodel (ForceModel::with_zonals_j2_j6().third_body(true, true, epoch)). Zelfstandig getoetst: de Zon-term in de rechterzijde is bit-identiek aan third_body_accel, geëvalueerd op de efemeridepositie voor dat moment, zowel bij t = 0 als bij t = 1 day (wat de koppeling 86400 s ↔ 1 dag ↔ 1/36525 eeuw exact bewijst), het storende lichaam schuift ~2,6·10⁹ m/dag op tussen samples (niet bevroren), de ogenblikkelijke getijdengroottes in LEO halen de leerboekbanden van ~5·10⁻⁷ m/s² (Zon) en ~1,1·10⁻⁶ m/s² (Maan, ≈ 2× de Zon), elk lichaam verstoort het etmaallange traject meetbaar en blijft toch begrensd, en dezelfde begintoestand gepropageerd op epochen een kwartjaar uit elkaar geeft een ander traject (de getijdenas draait 90°), terwijl een model waarin geen van beide lichamen is ingeschakeld bit-voor-bit tijdonafhankelijk is, zodat de goldens voor tweelichamen/J2/zonaal ongemoeid blijven. Efemeridenauwkeurigheid van DE-klasse en externe kruisvalidatie met GMAT/Orekit blijven vervolgwerk.
  • Maanefemeride met lage precisie (ephem::moon_position), die het paar derde lichamen Zon/Maan completeert. Voegt de lunaire reeks met lage precisie van Montenbruck & Gill toe (§3.3.2) naast het Zonmodel, zodat de lichaamsonafhankelijke forces::third_body_accel nu door beide hemellichamen kan worden aangestuurd zonder externe DE/SPK-kernel. Zelfstandig getoetst aan met de hand afgeleide lunaire signaturen: de geocentrische afstand blijft over een maand binnen de echte perigeum-/apogeumomhulling (~356.500–406.700 km) en haar maandgemiddelde herstelt de halve lange as van ~384.400 km; de ecliptische breedte overschrijdt nooit de baanhelling van ~5,3° van de Maan (gecontroleerd door te projecteren op de ecliptische pool in equatoriale coördinaten, waarmee de breedtereeks en de schuinterotatie samen worden getoetst); de richting van de Maan keert na één siderische maand (27,3217 d) terug tot binnen 1° en haar dagelijkse beweging blijft binnen de fysische band van 12–15°/dag; en de lunaire storing door het derde lichaam op een LEO-satelliet heeft de leerboekgrootte van ~1,1·10⁻⁶ m/s² (≈ tweemaal die van de Zon). Positienauwkeurigheid van DE-klasse, atmosferische weerstand en SRP blijven vervolgwerk.
  • Zwaartekracht van een derde lichaam (Zon) met een ingebouwde efemeride met lage precisie (forces::third_body_accel, ephem::sun_position). Voegt de storing door een derde lichaam toe aan het krachtenmodel: a = GM₃·((s−r)/|s−r|³ − s/|s|³) (directe aantrekking min de indirecte term die het geocentrische stelsel moet aftrekken), waarbij de positie van de Zon wordt geleverd door de analytische reeks met lage precisie van Montenbruck & Gill in de nieuwe module ephem, zonder externe DE/SPK-kernel voor een run met lage getrouwheid. Zelfstandig getoetst: de versnelling komt overeen met de exacte gradiënt van haar eigen storingspotentiaal (third_body_potential), de storing verdwijnt in het geocentrum en heeft de leerboekgrootte van ~5·10⁻⁷ m/s² op een LEO-satelliet, en de Zonefemeride haalt met de hand afgeleide J2000-ankers: een perihelium-afstand van ≈ 1,471·10¹¹ m, een declinatie van ≈ −23° nabij de decemberzonnewende, een schijnbare beweging van ≈ 1°/dag (≈ 90° per kwartjaar) en een afstand die over een heel jaar binnen de omhulling van 0,983–1,017 AU van de aardbaan blijft. Levert de helft voor het derde lichaam van de stap krachtenmodel in de mijlpaal van de numerieke propagator (de Maan wordt geleverd in een begeleidend item hierboven); positienauwkeurigheid van DE-klasse, atmosferische weerstand en SRP blijven vervolgwerk.
  • Krachtenmodel met zonale harmonischen J2–J6 (forces::zonal_accel / zonal_potential). Breidt het krachtenmodel van de Cowell-propagator uit voorbij J2 tot het volledige zonale aardveld tot en met graad 6 (de gepubliceerde standaard niet-genormaliseerde EGM-96-J2..J6), aangesloten op de propagator als ForceModel::with_zonals_j2_j6(). De versnelling is de exacte analytische gradiënt van de zonale storingspotentiaal R(r) = −(μ/r)·Σ Jₙ(Re/r)ⁿPₙ(z/r) (Legendre-polynomen door opwaartse recurrentie), op drie onafhankelijke manieren getoetst: zij valt tot machineprecisie terug op de aan de hand van 666 vectoren getoetste j2_accel wanneer zij tot [J2] wordt beperkt; zij komt overeen met de numerieke gradiënt van haar eigen potentiaal over het volledige J2..J6-veld (de gouden-standaardcontrole voor een conservatief veld); en de oneven termen J3 tegenover de even termen J2/J4..J6 vertonen hun kenmerkende noord–zuid-(anti)symmetrie onder z → −z, de peervormige asymmetrie. Een gepropageerde J2..J6-baan behoudt de totale energie (kinetisch + centraal + zonale potentiaal) tot ~1e-8 over een dag en verstoort de baan met alleen J2 met een kleine hoeveelheid ongelijk aan nul. Dit levert stap 2 („J2–J6 zonale harmonischen”) van de mijlpaal van de numerieke propagator; het tesserale EGM-veld van hoge graad, weerstand, SRP, derde lichamen en externe kruisvalidatie met GMAT/Orekit blijven vervolgwerk.
  • Numerieke (Cowell-)baanpropagator (src/propagator.rs). De eerste niet-analytische propagator van Kshana (de rest van de baanstack is analytisch SGP4/SDP4): hij sluit het krachtenmodel tweelichamen + J2 (src/forces.rs) aan op de adaptieve RK4-driver met stapverdubbeling (src/integrator.rs) als f(t,[r;v]) = [v; a(r)], met een schakelaar ForceModel. Getoetst aan analytische waarheid die sterker is dan een numerieke kruistool zou zijn: de ongestoorde baan reproduceert de exacte Kepleroplossing met universele variabelen tot submeter over een LEO-baan van 24 uur (een strengere poort dan het „tegenover een numerieke referentie < 10 m” waarin de mijlpaal is verwoord), specifieke energie en impulsmoment blijven behouden tot ~1e-9 relatief, en de nodale regressie door J2 reproduceert de gesloten-vorm-j2_secular_rates tot de eerste-ordetheorie (binnen 2 %, het O(J2²)-restant). Voegt ook solve_kepler_checked toe, een Newton-oplosser voor de vergelijking van Kepler die Err teruggeeft in plaats van een stilzwijgend onjuist antwoord wanneer hij niet convergeert binnen een begrensd iteratiebudget (het geval e = 0.999 nabij het perigeum). Eerlijke reikwijdte: het krachtenmodel is alleen tweelichamen + J2; het tesserale EGM-veld van hoge graad (200×200 + lader), weerstand (NRLMSISE-00), SRP, krachten van derde lichamen en een externe kruisvalidatie met GMAT/Orekit blijven vervolgwerk.
  • Gravimetrische kaartmatching zonder GPS gedurende 60 minuten tot < 500 m (run_gps_denied_gravity_nav). Verdiept de alt-PNT-laag tot het validatiedoel Quantum Wayfarer van ESA NAVISP: een voertuig vliegt een spoor van ~700 km tijdens een volledige GNSS-uitval van één uur, waarbij de inertiale oplossing wegdrijft tot ≈ 70 km, en een koude-atoomgravimeter plus een hiërarchische grof-naar-fijn deeltjes-/rastermatcher herstelt de constante INS-drift tot ≈ 145 m (< 500 m), een reductie van > 480×. De echte witteruisondergrens van de gravimeter wordt geïnjecteerd als een deterministische, met een seed bepaalde reeks, zodat de matcher nooit ruisvrije waarheid krijgt aangereikt en de run toch exact reproduceerbaar is (bit-identiek geverifieerd, en stabiel tot op enkele meters over ruisrealisaties). Een test van regressieniveau toont dat de verfijning noodzakelijk is: een enkel grof raster loopt vast op ~2 km, alleen de verfijning in drie stappen doorbreekt de grens van 500 m. Nieuw vastgelegd scenario scenarios/gps-denied-gravity-nav.toml. De rij docs/CAPABILITY.md blijft eerlijk gedeeltelijk (nog steeds geen meegeleverde EGM2008-kaart), met haar bewijs bijgewerkt naar het resultaat van 60 min < 500 m. Eerlijke reikwijdte ongewijzigd: veld in sferische harmonischen van lage graad + synthetische mascons; een Monte Carlo over realisaties van de representatiefout van de kaart is vervolgwerk.
  • Register van overclaims + regressiebewaking (docs/CLAIMS-VS-REALITY.md, tests/no_overclaims.rs). Sluit het spoor van eerlijkheid/terugnemen van claims af: de veertien overclaims die een eerdere audit heeft gecatalogiseerd (OC-0…OC-13) zijn nu allemaal GREEN; de sterke claims (OC-0 gekoppelde klok+positie-Kalman, OC-2 jamming J/S→C/N₀→verlies van lock, OC-7 Mach–Zehnder-CAI-fysica, OC-8 ARAIM HPL/VPL) zijn vervangen door geleverde, geteste mogelijkheden en niet door afgezwakte formuleringen, en de overige rijen zijn teruggebracht tot wat de code waarmaakt. Een nieuwe CI-test scant de live publieke oppervlakken (README, CAPABILITY, GLOSSARY, web/) en faalt als een ingetrokken kale overclaim-formulering zonder voorbehoud terugkeert, zodat een GREEN-rij niet stilzwijgend kan terugvallen. De FoM „integriteit” per run blijft eerlijk gelabeld als zelfconsistentie van het filter (niet luchtvaartintegriteit); de echte ARAIM HPL/VPL wordt apart getoond, zodat de twee nooit door elkaar worden gehaald.
  • Navigatie met zwaartekrachtkaartmatching (alt-PNT zonder GPS). Nieuw src/gravimeter.rs voegt de alt-PNT-mogelijkheidslaag toe waar de studies naar zwaartekrachtkaartmatching van ESA NAVISP, Quantum Wayfarer / QT-CCI, om vragen: een meetmodel voor een koude-atoomgravimeter waarvan de witteruisondergrens is afgeleid uit de ASD van de CAI-versnellingsmeter (σ = ASD/√τ); een volledig genormaliseerd zwaartekrachtanomalieveld in sferische harmonischen van lage graad (getoetst aan de gesloten-vorm-Legendrefuncties P̄₁₁=√3·cosφ, P̄₂₀=(√5/2)(3sin²φ−1), P̄₂₂=(√15/2)cos²φ en een met de hand afgeleide anomalie met één term van 1,897 mGal) plus synthetische mascons voor de lokale kenmerken van hoge graad; en een deeltjesfilter voor zwaartekrachtkaartmatching (samengesteld uit mapmatch + particle_filter) dat een spoor zonder GPS herstelt uit de reeks anomalieën waar het doorheen vliegt. Een vastgelegde NAVISP-benchmark (scenarios/gravity-map-nav.toml) verkleint een vrije inertiale drift van ~73 km tot enkele km. Eerlijke reikwijdte: Kshana bundelt niet de volledige EGM2008-coëfficiëntenset van 2190°; het veld is van lage graad + mascons, geen echte kaart met hoge resolutie; de EGM/EIGEN-lader, een magnetische kaart, terreingebonden SLAM en aansluiting op de scenario-engine kind= met een SVG-driftgrafiek blijven vervolgwerk. docs/CAPABILITY.md „Gravity-map / alt-PNT navigation” → gedeeltelijk.
  • Manoeuvremodellering en brugkop voor baanontwerp. Nieuw src/maneuver.rs voegt de eerste laag voor baanontwerp boven SGP4 toe: impulsieve ΔV-knopen die een snelheidsdiscontinuïteit toepassen en een covariantie van 6×6 doorgeven (deterministische brandperiode ⇒ identiteit als toestandsovergang; de covariantie van de uitvoeringsfout roteert van het brandstelsel, ECI of LVLH, naar het snelheidsblok), een integratie van eindige brandperioden (constante stuwkracht over een brandboog met massa als toestand) waarvan de bereikte ΔV wordt gecontroleerd aan de gesloten-vorm-Tsiolkovski-raketvergelijking tot beter dan 0,01 %, een Lambert-oplosser van Izzo-2015 voor één omloop (r1, r2, vliegtijd ⇒ v1, v2), een exacte Kepler-propagator met universele variabelen (tweelichamenwaarheid) en een porkchop-sweep die een raster van lanceerepoche × aankomstepoche afbeeldt op vertrek-C3 en aankomst-V∞, uitgegeven als 2-D-JSON-array voor contourweergave in de browser. De validatie is zelfstandig en sterker dan een uitlezing uit een tutorial: elke Lambert-uitvoer wordt rondgevoerd door de Kepler-propagator (hij moet weer op r2 landen), en het porkchop-minimum wordt gecontroleerd aan de analytische ondergrens van de Hohmann-overgangs-C3 voor twee coplanaire cirkelbanen. Kshana positioneert dit als de prestatiesimulatielaag boven GMAT/Orekit, niet als vervanging ervan (takken met meerdere omlopen en een echte planeteefemeride blijven buiten bereik). Tien tests.
  • Volledig strak gekoppeld GNSS/INS-UKF met 17 toestanden en kwantum-CAI-dead-reckoning. Nieuw src/fusion/tightly_coupled17.rs bevat de complete inertiale navigatietoestand die een strak gekoppeld filter schat, [position, velocity, attitude-error, accelerometer bias, gyro bias, clock bias, clock drift] (17 toestanden), gepropageerd door de strapdown-mechanisatie die wordt aangestuurd door de gemeten specifieke kracht en hoeksnelheid, met de kleinehoek-rotatie C ≈ I + [ψ×] van lichaam naar inertiaal, zodat de houdingsfout doorwerkt in de horizontale versnelling (de standaard INS-kantelkoppeling). Tijdens een GNSS-uitval drijft het alleen op de IMU; de procesruis van de snelheidsrandomwalk is de afgeleide q_va van de koude-atoominterferometer-versnellingsmeter (crate::inertial::quantum_imu), zodat de dead-reckoning-drift die is welke door de kwantumsensor wordt begrensd: een uitval van 120 seconden blijft beperkt tot enkele honderden meters, tegenover de kilometers die een vrije INS van navigatieklasse zou bereiken. De update met pseudo-afstand/afstandssnelheid loopt via het gedeelde unscented filter (met α = 1 voor goed geconditioneerde gewichten bij deze toestandsgrootte). Vijf tests: identiteit van het meetmodel, integratie met constante snelheid met een perfecte IMU, GNSS-ondersteuning, schatting van de accelerometerbias en de door CAI begrensde benchmark van 120-s uitval.

0.11.0 - 2026-06-05#

Gewijzigd#

  • Eerlijke formulering van de kwantumpositionering. De kopaanduiding is nu overal een „PNT-resilience simulator with quantum-sensor performance models”, in de tagline van de README, de citatieregel, CITATION.cff (titel + samenvatting) en de bannergrafiek, ter vervanging van de losser marketingformulering „hybrid quantum/classical PNT simulator”. In het onderdeel What it is / is not van de README staat nu een expliciete reikwijdteverklaring „It is not (yet)” (geen atoominterferometriefysica-engine vanuit eerste beginselen, geen GNSS-ontvanger/PVT-oplosser, geen hulpmiddel voor missieontwerp), en een nieuwe ROADMAP.md op het hoogste niveau maakt van de kwantumfysicalaag een P2-item (Mach–Zehnder-CAI-fase, projectieruis, trillingstensor), zodat lezers weten dat de fysica vanuit eerste beginselen gepland en op komst is, niet verlaten. Geen wijziging in gedrag of API.

Toegevoegd#

  • Afwegingsstudie voor constellatieontwerp: Walker-ontwerpsweep met een Pareto-front, JSON met hertijd en een validatie van de Walker-formule tot onder een kilometer. src/walker.rs krijgt walker_design_sweep, dat een raster planes × sats_per_plane doorloopt (bijvoorbeeld een afweging van 3×3) bij een vaste inclinatie en per ontwerp de dekkingsfractie, de slechtste PDOP en de maximale/gemiddelde hertijdkloof tabelleert; pareto_front markeert de niet-gedomineerde ontwerpen (minder satellieten, meer dekking, lagere PDOP, kortere hertijd), en WalkerDesignReport::to_json serialiseert de cellen en het Pareto-front, inclusief de velden voor hertijd, als JSON. Nieuwe validatie legt de generator vast op de Walker-formule i:T/P/F: satellieten op dezelfde positie in aangrenzende vlakken blijken door een exacte rotatie R_z(2π/P) op elkaar af te beelden tot onder 1 km over een volledige 24 uur SGP4-propagatie (de korteperiodieke J2-ademing is gemeenschappelijk en valt weg), en de posities binnen het vlak blijken gemiddeld op een afstand van 2π/S te liggen. Bouwt voort op de vastgelegde echte momentopname van Celestrak gps-ops van 2021-07-28 (scenarios/orbit-sgp4-gps.toml, gebruikt door de scenariodekkings- en SP3-roundtriptests).
  • Geavanceerde tijd- en frequentieoverdracht: TWSTFT, GNSS common-view, PPP, optisch, IEEE-1139-machtswetfit en een klokensemble. Nieuw src/timetransfer_adv.rs bouwt de operationele overdrachtsmethoden op de meegeleverde gesloten vormen voor Sagnac/common-view en de Allan-stabiliteitshulpmiddelen. twstft_sagnac geeft de Sagnac-correctie voor Two-Way Satellite Time and Frequency Transfer als de lussom van drie sprongen, exact gelijk aan de BIPM-gesloten vorm Δt = 2·A·ω_E/c² (kruiselings gecontroleerd door de onafhankelijke twstft_sagnac_bipm); run_twstft geeft een reeks T_A − T_B van één dag uit en haar TDEV. gnss_common_view_series neemt enkelvoudige verschillen van twee synthetische grondstations, zodat de satellietklok wegvalt. iono_free_combination + ppp_receiver_clock zijn de ionosfeervrije PPP-combinatie en de oplossing van de ontvangerklok tegen een (synthetische) waarheid van SP3-klasse, waarbij de eerste-orde-ionosfeer exact wegvalt. rytov_variance, fried_parameter en het lognormal_fading-model met gemiddelde één modelleren de door turbulentie veroorzaakte scintillatie van een optische vrije-ruimteverbinding. fit_power_law_psd is een volledige IEEE-1139-kleinstekwadratenfit van h_α met vijf coëfficiënten aan de Allan-variantiecurve (alle vijf canonieke ruisprocessen tegelijk), waarbij per τ-decade het dominante proces wordt gerapporteerd. ensemble_timescale vormt een met de inverse variantie gewogen papieren tijdschaal waarvan de Allan-deviatie strikt onder die van de beste bijdragende klok ligt. 31 unittests; de validatiedoelen zijn gesloten vormen en synthetische waarheid; een echte inlezing van BIPM Circular-T / IGS SP3 volgt nog.
  • Ionosfeerkaarten IONEX: bestandsparser, interpolatie in de tijd en afbeelding van de schuinheidsfactor op een schuin pad. src/ionex.rs krijgt parse_ionex, dat het IONEX-bestandsformaat leest (rasterdefinitie in de kop + blokken START/END OF TEC MAP) tot een reeks IonexMaps, waarbij de noord-naar-zuid-volgorde van de breedtegraden in het bestand wordt genormaliseerd tot een TecGrid met positieve stap en waarden worden geschaald met 10^EXPONENT. interpolate_tec_in_time mengt twee opeenvolgende kaarten tot een opgevraagde epoche, en obliquity_factor / slant_tec beelden de verticale TEC af op een schuine straal via de enkellaags dunne-schilfactor M(z) = 1/cos z′ (sin z′ = (Rₑ/(Rₑ+H))·sin z). Samen met het meegeleverde rastermodel maken deze van een gemeten wereldwijde IGS-ionosfeerkaart een bruikbare schuine vertraging.
  • Constellatieontwerp: dimensionering van streets-of-coverage en vergelijking van meerdere constellaties. src/walker.rs krijgt min_satellites_streets_of_coverage, een geïdealiseerde oplosser voor het minimale aantal satellieten bij streets-of-coverage: uit de meegeleverde halve dekkingshoek λ en halve straatbreedte c dimensioneert hij de bijna-polaire constellatie voor continue enkelvoudige wereldwijde dekking als p = ⌈π/(2c)⌉ vlakken (bijvoorbeeld een vlak met 4 satellieten op GPS-hoogte vraagt 2 vlakken, 8 satellieten), en meldt None wanneer de satellieten te schaars zijn om een aaneengesloten straat te vormen. compare_constellations is het hulpmiddel voor vergelijking van meerdere constellaties: het beoordeelt elk benoemd Walker-ontwerp op hetzelfde station en venster via pdop_sweep en geeft hun dekking / PDOP / omvang naast elkaar terug. Eerlijke reikwijdte: de naadexacte Rider-correctie op de grens van tegengesteld roterende vlakken en een 3-D-dekkingsglobe blijven vervolgwerk.
  • Spoofdetectie in meerdere lagen: pariteitsdetector voor RAIM-consistentie + laagfusie. src/spoof_monitors.rs krijgt de derde en laatste detectielaag en de fusiestap: parity_raim_test past de positie-/klokoplossing met kleinste kwadraten aan een redundante set pseudo-afstanden aan en toetst de resterende gewogen kwadratensom van de residuen aan haar drempel (m−4) van χ², waarbij een met bias behepte deelverzameling van satellieten wordt gemarkeerd en een gemeenschappelijke bias (opgenomen door de ontvangerklok) terecht RAIM-onzichtbaar blijft, zonder die te verbergen. fuse_spoof_layers combineert de lagen voor pariteit, AGC en SQM tot één gewogen besluit dat vastlegt welke lagen hebben aangeslagen. Een Monte Carlo karakteriseert de detector: empirische P_fa ≈ 0,068 tegenover een ontwerppunt van 0,05, met gemiste detectie die daalt van 0,885 bij een spoofbias van 2σ naar 0,16 bij 8σ. Eerlijke reikwijdte: kruisvalidatie tegen specifieke gepubliceerde spoofingtestvectoren (Spirent / ION GNSS+) vereist die externe datasets en blijft vervolgwerk.
  • Validatie-ensemble gekoppelde tegenover ontkoppelde Kalman. Een Monte Carlo met 100 trials in src/fusion/coupled.rs kwantificeert de waarde van het meedragen van de kruiscovariantie positie↔klok: een getrouwe inline ontkoppelde basislijn (bit-voor-bit getoetst aan de meegeleverde CoupledPntFilter) verwerkt dezelfde gegevens met de kruisblokken op nul, en na bijna-gedegenereerde pseudo-afstanden plus een klokalleen-fix herstelt het gekoppelde filter de positie tot 2,97 m RMS tegenover 48,8 m voor het ontkoppelde filter, en wint in 97 van 100 trials: de klokfix scherpt de positie alleen aan via de correlatie die het ontkoppelde pakket weggooit. Dit completeert de validatiesuite voor Kalman-juistheid (Joseph-vorm, PSD-veiligheid, NEES/NIS-consistentie en nu het ensemble voor gekoppelde filters).
  • Pijplijn voor baanbepaling (batch + sequentieel). Een nieuwe src/orbit_determination.rs herstelt de baantoestand [r, v] van een satelliet uit afstandsmetingen van grondstations, en combineert drie meegeleverde onderdelen: het krachtenmodel tweelichamen + J2 (src/forces.rs) en de RK4-integrator (src/integrator.rs) propageren een kandidaattoestand over de boog, een afstandsmeetmodel voorspelt elke stationsafstand, en de Gauss–Newton-batchcorrector (src/batch_ls.rs) drijft de kandidaat naar de best passende toestand (determine_orbit_batch). Dezelfde dynamica en hetzelfde afstandsmodel sturen ook een sequentiële recursieve bepaling aan op het meegeleverde unscented filter (determine_orbit_sequential). Vier tests valideren dit: afstandsvoorspelling over de boog; batchherstel tot submeter / mm·s⁻¹ uit ruisvrije afstanden; batchherstel tot ~2 m met een post-fit-residu op de ruisondergrens van 5 m (de signatuur van een consistente kleinstekwadratenfit); en sequentieel herstel tot binnen tientallen meters. Eerlijke reikwijdte: metingen van afstandssnelheid/Doppler en hoeken, een analytische J2-toestandsovergangsmatrix en zichtbaarheidsmaskering van stations blijven vervolgwerk.
  • Strak gekoppelde GNSS/INS-UKF-navigator. Een nieuwe src/fusion/tightly_coupled.rs sluit de meegeleverde unscented Kalman-kern (src/fusion/ukf.rs) aan op een werkende strak gekoppelde navigator over de [px,py,pz,vx,vy,vz,b,d] met acht toestanden (ECEF-positie/snelheid plus klokbias en klokdrift in afstandseenheden). Hij neemt de ruwe satellietmetingen op, pseudorange (ρ = |p − sᵢ| + b) en range_rate/Doppler (ρ̇ = (p − sᵢ)·(v − ṡᵢ)/|p − sᵢ| + d), in plaats van een vooraf gevormde positiebepaling, zodat TightlyCoupled (met propagate/propagate_orbital/ update_gnss) met minder dan vier satellieten blijft corrigeren en GNSS-uitval overbrugt op zijn gepropageerde dynamica. Vijf tests valideren dit end-to-end, inclusief de acceptatiescenario's van de mijlpaal: de geometrie van pseudo-afstand/Doppler tegenover handwaarden; ruisvrije convergentie tot submeter met vijf satellieten; een geval met drie satellieten dat convergeert van ~212 m naar ~13 m, waar een momentopname-PVT niet eens kan worden gevormd; een uitval van 120 seconden bij constante snelheid binnen 50 m; en, de hoofdacceptatie, een bochtige LEO-pas van 30 minuten (echte baan met tweelichamen + J2) met een GNSS-uitval van 120 seconden, gehouden op 0,77 m RMS over de pas en 2,9 m in het slechtste geval tijdens de uitval. Die orbitale overbrugging combineert het meegeleverde zwaartekrachtmodel (src/forces.rs) en de RK4-integrator (src/integrator.rs) tot het procesmodel van de UKF (propagate_orbital), zodat het filter de kromming van de baan volgt, wat een overbrugging met constante snelheid niet kan (de kromming alleen is ~58 km over 120 s in LEO). Eerlijke reikwijdte: de orbitale overbrugging gebruikt het krachtenmodel tweelichamen + J2 in plaats van ruwe specifieke kracht van een IMU (voor een niet-aangedreven orbitaal platform vallen die samen); het inbrengen van een strapdown-IMU-foutentoestand en ionosfeer-/troposfeercorrecties in de lus blijven vervolgwerk.
  • Meetmodel voor mapmatching (navigatie met terrein- of zwaartekrachtreferentie). Een nieuwe src/mapmatch.rs levert het meetmodel dat het meegeleverde deeltjesfilter met sequentiële importance-resampling (src/particle_filter.rs) verandert in een werkende navigator zonder GPS: field_likelihood (een Gaussiaanse waarschijnlijkheid voor veldmatch) en map_match_likelihood, dat elk georeferentieveld bemonstert, terreinhoogte (TRN) of een zwaartekrachtanomalie, op de positie van een deeltje en het weegt naar de overeenstemming met de gemeten waarde van het voertuig. Het veld is elke sampler Fn(lat, lon) -> value, zodat het te combineren is met het bilineaire raster in src/ionex.rs of een closure. Twee tests verankeren het: de waarschijnlijkheid piekt (=1) bij een perfecte match en daalt tot e^(−½) bij één sigma, en een deeltjesfilter over een kenmerkend synthetisch terreinstuk herstelt de ware positie tot binnen 0,1. Eerlijke reikwijdte: de echte referentiekaarten (SRTM-hoogte, EGM/EIGEN-zwaartekrachtanomalie) en hun laders blijven vervolgwerk.
  • Cislunaire PNT-integriteit (lunaire ARAIM). Een nieuwe src/lunar.rs past de MHSS-ARAIM-engine voor de Aarde toe op een navigatiedienst op de Maan in LunaNet-stijl met de lunaire parameters (σ_URE ≈ 30 m tegenover 0,6 m voor GPS, P_sat ≈ 1e-4): lunaire constanten, een selenocentrische Oost/Noord/Omhoog-basis en hulpfunctie voor hemelgeometrie, en lunar_araim (HPL/VPL). Drie tests verankeren het: de orthonormale selenocentrische basis, de geometrie van de schuine afstand en de exacte lineaire schaling van het beschermingsniveau met σ_URE (lunair 30 m geeft een 50× groter beschermingsniveau dan dezelfde geometrie bij de GPS-waarde van 0,6 m: de kwantitatieve reden waarom PNT-integriteit op de Maan moeilijk is). Eerlijke reikwijdte: de nauwkeurige LANS NRHO-efemeride, het foutbudget van het signaal in de ruimte en de MCI↔MCMF-stelselreductie blijven vervolgwerk.
  • Tweedelige Juliaanse datums (hoge precisie). Een nieuwe src/jd2.rs voegt Jd2 toe, een Juliaanse datum gesplitst in een geheel day en een fractioneel frac in [0,1) (de conventie van SOFA/hifitime), met new/from_parts/add_seconds/diff_seconds/total. Verschillen tussen nabije epochen blijven exact tot de ondergrens van f64, waar een JD met een enkele f64 nabij J2000 ~50 µs verliest. Vier tests verankeren het: de roundtrip, normalisatie van de fractie, exact herstel van microseconden (met het falen van de enkele f64 ernaast gedemonstreerd) en additieve/omkeerbare rekenkunde met seconden.
  • CCSDS OMM-schrijver (Orbit Mean-Elements Message). Een nieuwe src/omm.rs vult de efemeridenschrijver oem aan met het bericht met gemiddelde elementen: OmmFile::from_tle beeldt de gemiddelde elementen van SGP4/TLE af op de OMM-eenheden (gemiddelde beweging in omw/dag, hoeken in graden, plus BSTAR), en to_omm_kvn serialiseert de KVN-vorm van de CCSDS 502.0-B-2-standaard, zodat een Kshana-baan door elk OMM-bewust hulpmiddel kan worden gebruikt in plaats van als een eigen TLE. Twee tests verankeren de eenhedenomzetting van TLE naar OMM (≈ 15,5 omw/dag, 51,6° inclinatie, enzovoort) en de aanwezigheid van de vereiste KVN-sleutelwoorden. Eerlijke reikwijdte: de KVN-vorm en de TLE-afbeelding worden hier geleverd; de XML-weergave (ndm/omm) en een roundtrip met een referentieparser blijven vervolgwerk.
  • Deeltjesfilter met sequentiële importance-resampling. Een nieuwe src/particle_filter.rs voegt de niet-lineaire, niet-Gaussiaanse schatter toe achter kaartondersteunde navigatie zonder GPS (terreingebonden matching of matching van zwaartekrachtkaarten): predict (deeltjes propageren door de dynamica + Gaussiaanse procesruis), update (herweging met een waarschijnlijkheid van de meting per deeltje), systematische resample, de degeneratiemonitor effective_sample_size en de gewogen-gemiddeldeschatting. Zes tests verankeren de deterministische kern exact: ESS dat 1…N bestrijkt, systematische resampling die indices kiest naar rato van het gewicht, de convexe combinatie van het gewogen gemiddelde, een Gaussiaanse waarschijnlijkheid die de schatting naar de meting trekt, het gedrag van resamplen naar uniform en determinisme van predict met seed. Eerlijke reikwijdte: de engine wordt hier geleverd; de referentiekaarten (SRTM-hoogte, EGM-zwaartekrachtanomalie) en het kaartmeetmodel blijven vervolgwerk (de sampler met raster+bilineair in ionex zou een zwaartekracht- of terreinkaart even goed bedienen).
  • TEC-ionosfeerkaarten in IONEX-stijl. Een nieuwe src/ionex.rs voegt het gemeten-ionosfeeralternatief voor het uitgezonden Klobuchar-model toe: een TecGrid (een regelmatig breedte-/lengteraster van verticale TEC, een wereldwijde IGS-ionosfeerkaart) met bilineaire interpolatie in een doorborings-punt (vtec_at, buiten het raster begrensd) en de eerste-ordevertraging Δ = 40.3·TEC/f² (vtec_to_delay_m, delay_at). Vier tests verankeren het: 1 TECU ≈ 0.162 m op L1 met de schaling 1/f², knoopexacte interpolatie, bilineaire middelpunten die het gemiddelde van de hoeken geven en aan de rand begrensde opvragingen buiten het raster. Eerlijke reikwijdte: het raster en de interpolatie worden hier geleverd; het inlezen van het IONEX-bestandsformaat, interpolatie in de tijd tussen kaarten en de afbeeldingsfunctie voor het schuine pad blijven vervolgwerk.
  • Geometrische correcties voor tijdoverdracht (Sagnac + GNSS common-view). Een nieuwe src/timegeo.rs voegt de twee deterministische effecten toe waarmee een echte klokvergelijking rekening moet houden, als aanvulling op het stochastische tweewegmodel in timetransfer: sagnac_correction (Δt = (ω_E/c²)·(x₁y₂ − x₂y₁), de vertraging door de roterende Aarde: tientallen ns voor continentale basislijnen) en common_view_offset, het enkelvoudige GNSS-common-view-verschil dat de fout van de satellietklok exact opheft en de offset tussen de stations herstelt. Drie tests verankeren ze op exacte referenties: de ≈ 33 ns Sagnac van een equatoriale kwartslag, antisymmetrie en de nulgevallen radiaal/polair, en de exacte opheffing van de satellietklok. Eerlijke reikwijdte: een volledig TWSTFT-budget voor transponder/hardwarevertraging en een ionosfeervrije PPP-oplossing voor tijdoverdracht blijven vervolgwerk.
  • Krachtenmodel voor banen (tweelichamen + J2). Een nieuwe src/forces.rs voegt het versnellingsmodel toe dat een numerieke propagator integreert: two_body_accel (−μ·r/|r|³), de storing door afplatting j2_accel (de ECI-gesloten vorm) en gravity_accel die ze optelt, te combineren met src/integrator.rs als f(t,[r;v]) = [v; a(r)]. Het biedt ook de analytische J2-seculiere snelheden (j2_secular_rates): de nodale regressie Ω̇, de apsidale rotatie ω̇ en de drift van de gemiddelde anomalie Ṁ. Zes tests verankeren de fysica op exacte referenties: μ/r² voor de tweelichamenterm, de gesloten vorm van J2 op de evenaar (~10⁻³ van de grootte van de tweelichamenterm), de kritieke inclinatie (63,4349°) die het perigeum bevriest (ω̇ = 0), de nodale regressie van het ISS (Ω̇ ≈ −5°/day) en de oostwaartse drift van een retrograde zonsynchrone baan. Eerlijke reikwijdte: alleen tweelichamen + J2; J3–J6, weerstand, SRP en derde lichamen blijven vervolgwerk.
  • Deelbare permalinks voor scenario's. Een nieuwe src/permalink.rs voegt een Base64-codec volgens RFC 4648 zonder afhankelijkheden toe (het standaardalfabet +/ met padding en een URL-veilig alfabet -_ zonder padding) en wrappers encode_scenario / decode_scenario, zodat een TOML uit de playground kan worden gecodeerd in een queryparameter ?s= en als URL kan worden gedeeld. Beschikbaar gesteld aan de browser als wasm-bindingen encode_permalink / decode_permalink. Vier tests verankeren het op de canonieke RFC 4648-vectoren ("foobar" → "Zm9vYmFy", enzovoort), een URL-veilige roundtrip van een scenario (geen +///= om te escapen), weigering van ongeldige symbolen en een roundtrip over alle 256 bytes. Eerlijke reikwijdte: de codec en de bindingen worden hier geleverd; de Share-knop in de playground, de Plotly/D3-grafiek met meerdere reeksen en de A/B-vergelijkingsmodus blijven vervolgwerk.
  • Gauss–Newton-batch-kleinstekwadraten (de differentiële batchcorrector). Een nieuwe src/batch_ls.rs voegt de schattingskern toe waarop een batch-baanbepaling (of elke parameterfit) rust: gauss_newton linealiseert een door de gebruiker aangeleverd model h(x) met een Jacobiaan van centrale eindige verschillen, vormt en lost de gewogen normaalvergelijkingen (HᵀWH)·Δx = HᵀW·(z − h(x)) op (met hergebruik van de geteste matrixinverse) en itereert tot convergentie met gewichten per meting. Vier tests verankeren het: een lineaire lijnfit die de exacte gewogen-kleinstekwadratenoplossing bereikt, een niet-lineaire fit a·exp(b·t) die de ware parameters herstelt, een 3-D-afstandsmultilateratie die uit ruisvrije afstanden een bekende positie herstelt (de variant voor baanbepaling) en weigering van onderbepaalde/niet-passende invoer. Eerlijke reikwijdte: dit is de generieke correctorengine; het baanspecifieke meetmodel voor afstand/afstandssnelheid/azimut-elevatie, de analytische J2-toestandsovergangsmatrix en de validatie op gepubliceerde gevallen blijven vervolgwerk.
  • Spoofingmonitors op RF-laag (AGC-vermogen en SQM). Een nieuwe src/spoof_monitors.rs voegt twee onafhankelijke spoofdetectoren in de ontvangerfrontend toe, als aanvulling op de klokondersteunde tijdspoofmonitor in spoof: een AGC-vermogensmonitor (combine_power_dbm incoherente vermogenssom + AgcMonitor) die het overtollige ontvangen vermogen markeert dat een spoofzender toevoegt boven een instelbare dB-marge, en een signaalkwaliteitsmonitor (bpsk_autocorr driehoekige code-autocorrelatie + SqmMonitor) die de Early-minus-Late-correlatoronbalans markeert die multipath/meaconing/replay veroorzaakt. Vier tests verankeren de exacte gesloten vormen (3,01 dB voor een verdubbeling van het vermogen, het aggregaat 10·log10(N), de driehoekige R(τ)=1−|τ| en de alarmdrempel van 10 % voor Early/Late). Eerlijke reikwijdte: de volledige RAIM-consistentie-pariteitsdetector voor spoofing, de fusie van de monitoruitvoer in meerdere lagen en validatie tegen gepubliceerde spoofingvectoren van Spirent/ION GNSS+ blijven vervolgwerk.
  • Adaptieve numerieke ODE-integrator. Een nieuwe src/integrator.rs voegt het eerste onderdeel van een numerieke propagator toe (de baanpropagatie van Kshana is verder analytisch SGP4/SDP4): een generieke Runge–Kutta-stap van de vierde orde (rk4_step) over elk eerste-ordesysteem y' = f(t, y), en een adaptieve driver (integrate) die de lokale fout beheerst door stapverdubbeling (Richardson-extrapolatie) met de standaardstapregelaar 0.9·(tol/err)^(1/5) en de logica voor accepteren/verwerpen. Zes tests verankeren het op exacte oplossingen: de exponentiële y' = y → e tot < 1e-9, de foutreductie van ~16× per gehalveerde stap die convergentie van de vierde orde bewijst, behoud van energie/terugkeer van de harmonische oscillator over een volledige periode, en de adaptieve driver die met variabele stappen een strakke tolerantie haalt. Eerlijke reikwijdte: dit is de integratorkern en haar foutbeheersing; de ingebedde tableaus Dormand–Prince RK5(4)/RKF7(8) en het hiërarchische krachtenmodel voor banen (tweelichamen + J2–J6 + weerstand + SRP + derde lichamen) die er een NumericalPropagator van maken, blijven vervolgwerk.
  • Unscented (sigmapunt-)Kalmanfilter. Een nieuwe src/fusion/ukf.rs voegt het geschaalde unscented Kalmanfilter toe (Julier & Uhlmann; Wan & van der Merwe) als algemene schatter met n toestanden over door de gebruiker aangeleverde proces- en meetfuncties: de sigmapuntschatter die een strak gekoppelde GNSS/INS-navigator gebruikt wanneer het model voor pseudo-afstand/Doppler sterk niet-lineair is en de Jacobiaan van een EKF verslechtert. Het bevat de ondersteunende dichte lineaire algebra (Choleskyfactor voor de spreiding van de sigmapunten, Gauss–Jordan-inverse voor de innovatiecovariantie) en een Joseph-vrije update P⁺ = P⁻ − K S Kᵀ. Zes tests leggen het vast, waarvan de belangrijkste gebruikmaken van de exacte eigenschap dat de unscented transformatie voor een lineair model het Kalmanfilter tot numerieke precisie reproduceert (voorspelling, update en een volledige cyclus van voorspelling + update, allemaal vergeleken met een met de hand gedraaid lineair KF, plus een analytische Bayesiaanse posteriorcontrole in 1-D en de identiteiten van Cholesky/inverse). Eerlijke reikwijdte: dit is de schattingsengine; de strak gekoppelde GNSS/INS-navigator met 17 toestanden, het meetmodel voor pseudo-afstand/Doppler en het validatiescenario voor uitval blijven vervolgwerk.
  • Beschermingsniveaus voor ARAIM met twee constellaties. Een nieuwe araim_dual_raim breidt de Advanced RAIM voor één storing (araim_raim) uit met de storingsmodus voor een hele constellatie van EU ARAIM / DO-316: naast de hypothesen zonder storing en per satelliet draagt elke constellatie (per satelliet gelabeld) één hypothese bij die al haar satellieten tegelijk verwijdert, met prior P_const (een nieuwe DualFaultPriors { p_sat, p_const }). Elke hypothese voegt een term toe aan dezelfde MHSS-integriteitssom, zodat VPL/HPL de kleinste grenzen zijn waarvan de totale P_HMI het budget haalt over storingsvrij + enkele SV + storingen per constellatie (de Bonferroni-verdeling van valse alarmen loopt over alle N + C hypothesen). Met P_const = 0 is het resultaat bit-voor-bit araim_raim; een gebruiker met één constellatie krijgt None terug bij een storing van zijn eigen constellatie (die kan niet worden uitgesloten), en dat is precies waarom dekking met twee constellaties ertoe doet. Vier tests dekken de equivalentie, de verruiming van het beschermingsniveau, de niet-beschikbaarheid voor één constellatie en de invoervalidatie, met hergebruik van de bestaande machinerie voor deeloplossingen met oplossingsscheiding.
  • IAU 2006-precessie (Fukushima–Williams-hoeken en bias-precessiematrix). Een nieuwe src/precession.rs implementeert de IAU 2006-precessie (P03; Capitaine, Wallace & Chapront 2003): de vier Fukushima–Williams-hoeken (γ̄, φ̄, ψ̄, ε̄_A) als polynomen in Juliaanse eeuwen van TT (fw_angles), en de rotatiematrix voor bias-precessie van GCRS naar gemiddeld-van-de-datum, daaruit opgebouwd via de SOFA-constructie iauFw2m (precession_matrix, met hulpfuncties gcrs_to_mod / mod_to_gcrs). Dit is het eerste onderdeel voor een inertiaalstelsel bovenop de bestaande op GMST gebaseerde reductie frames. Acht tests valideren aan gesloten-vormankers: de gemiddelde schuinte van de ecliptica op J2000 ε̄ = 84381.406″ = 23.4392794°, de gepubliceerde constante termen van de hoeken, de accumulatie van de algemene precessie ψ̄ ≈ 5039.998″ over een eeuw, orthonormaliteit van de matrix en det = +1, de bijna-identiteitswaarde (alleen stelselbias) op J2000 en de netto rotatiehoek van ≈ 1.40°/eeuw. Eerlijke reikwijdte (ROADMAP.md): alleen precessie; de IAU 2000A-nutatie met 678 termen, de volledige keten TEME→GCRS en een numerieke SOFA/ANISE-kruiscontrole van µas/<10 m blijven vervolgwerk.
  • Fysica van de koude-atoominterferometer (CAI) als versnellingsmeter vanuit eerste beginselen. src/inertial/quantum_imu.rs modelleert een Mach–Zehnder-atoominterferometer met drie pulsen vanuit eerste beginselen in plaats van uit een datasheet: effectieve golfvector k_eff = 4π/λ, interferometerfase Φ = k_eff·a·T², kwantumprojectieruis (shotruis) σ_Φ = 1/(C·√N), gevoeligheid voor versnelling per shot, contrastverval C(t) = C₀·e^(−t/τ) en, waar het om gaat, CaiAccelerometer::q_va(), dat de witte versnellings-PSD die de klassieke AccelModel al verwerkt uit het aantal atomen, de interrogatietijd en het contrast afleidt. Het model omvat nu ook trillingskoppeling, de dominante term in echte apparaten: de overdrachtsfunctie van versnelling naar fase van de interferometer |H(ω)| = (4/ω²)sin²(ωT/2) (accel_transfer_function), de fasevariantie bij witte PSD σ_Φ² = k_eff²·S_a·T³/3 (vibration_phase_variance_white, met een numerieke bandintegraal als kruiscontrole vibration_phase_variance_band), de rang-1-beam_axis_projection langs de bundel, en CaiAccelerometer::vibration_phase_noise / vibration_limited_accel (die laatste valt terug op de van k_eff onafhankelijke ondergrens √(S_a/(3T))). Elf tests controleren de fysica met de hand (Rb-87 k_eff ≈ 1.61×10⁷, Φ(1 g) ≈ 1.58×10⁴ rad, σ_a ≈ 0.13 µg/shot ondergrens van shotruis tegenover een trillingsondergrens van ≈ 5,9 µg, de schalingswetten 1/T², 1/√N en T³). Eerlijke reikwijdte in docs/QUANTUM.md: dit omvat de projectieruisondergrens en het door trillingen begrensde regime daarboven; laserfaseruis, Coriolis- en lichtverschuivingssystematiek en de validatiescenario's PHARAO/CARIOQA blijven vervolgwerk.
  • Kwantum-CAI-versnellingsmeter aangesloten op het inertiale scenario. Een versnellingsmeter in een inertiaal dead-reckoning-scenario wordt nu opgelost tot een nieuwe ImuKind: Classical (de bestaande sensor met datasheetcoëfficiënten) of QuantumCai wanneer hij een optioneel blok [cai] draagt (CaiCfg: golflengte, pulsscheiding, aantal atomen, contrast, cyclustijd en een optionele vibration_psd van het platform). De PSD van de snelheidsrandomwalk q_va van een sensor quantum_cai wordt uit de fysica van de interferometer afgeleid, de ondergrens van shotruis plus, wanneer een trillings-PSD is opgegeven, de door trillingen begrensde bijdrage in kwadratuur, in plaats van uit een aangeleverde coëfficiënt, en de herkomst van de run legt vast dat de ruis uit de fysica is afgeleid. Het veld cai is skip_serializing_if = "Option::is_none", zodat bestaande scenario's het weglaten en byte-identiek serialiseren (de scenariohash is ongewijzigd). Vijf tests dekken de afleiding, de kwadratuursom van trillingen, de keuze tussen Classical/QuantumCai, hash-stabiele serialisatie en een end-to-end run met CAI.
  • Optimalisatie van constellatieontwerp en geometrie van streets-of-coverage. src/walker.rs krijgt optimize_walker_design, een gradiëntvrije rasteroptimalisator die de ontwerpruimte {planes × sats × inclination} doorzoekt en het beste Walker-ontwerp teruggeeft onder een gekozen DesignObjective (MinSatellitesForCoverage, MaxCoverage of MinWorstPdop) over de al getoetste PDOP-sweep (een test bevestigt dat hij de winnaar van de brute-forcemethode teruggeeft). Daarnaast de analytische gesloten vormen voor streets-of-coverage coverage_half_angle_rad (λ = arccos(Re/r·cos ε) − ε) en street_half_width_rad (cos c = cos λ / cos(π/s), Rider/Beste), met de hand gecontroleerd aan leerboekgeometrie en detectie van de onderbezettingskloof. De volledige Rider-oplosser voor het minimale aantal satellieten bij wereldwijde dekking, een 3-D-playgroundglobe en een kruiscontrole van DOP met een extern hulpmiddel blijven vervolgwerk.
  • Export van de precieze SP3-efemeride vanuit de CLI. Een gepropageerd baan-/constellatiescenario kan nu naar een SP3-c-bestand worden geschreven: kshana <orbit.toml> --export-sp3 out.sp3, of export_sp3 = true in het scenario schrijft automatisch <scenario>.sp3 (api::export_sp3 / auto_export_sp3, OrbitClockScenario::to_sp3_string, optioneel epoch). Een roundtriptest (tests/sp3_export_roundtrip.rs) propageert de echte momentopname van Celestrak gps-ops, exporteert die, leest haar opnieuw in en bevestigt dat de teruggewonnen ECEF-posities over 24 uur tot < 0,5 m overeenkomen met de SGP4-waarheid (ruim binnen de tolerantie van 10 m op TLE-niveau). De README beschrijft de interoperabiliteitsrol (RINEX → RTKLIB/gLAB, SP3 → Ginan/producten met precieze banen).
  • Gekoppeld Kalmanfilter voor klok+positie (kruisblokcovariantie). src/fusion/coupled.rs CoupledPntFilter is één gestapeld [pos, vel, phase, freq]-filter (updates in Joseph-vorm) waarvan de meting van de pseudo-afstand ρ = g·pos + c·phase + noise de blokken positie en klok echt koppelt, anders dan de twee onafhankelijke tweetoestandsfilters van het oudere fusiepakket, die de kruisblokcovariantie exact op nul houden. Getoetst: een gedeelde pseudo-afstand brengt P[pos,phase] op een waarde ongelijk aan nul; twee verschillende geometrieën lossen samen opgelegde offsets van positie+klok op die één enkele afstand niet kan scheiden; een fix met alleen de klok scherpt de positie aan via de kruiscovariantie (het voordeel dat ontkoppelde filters niet kunnen bieden); en de Monte-Carlo-NEES is consistent met χ²(4). Dit is de realisatie met 1 vrijheidsgraad (de dimensionaliteit van het fusiepakket); de 3-D-uitbreiding met 8 toestanden en de aansluiting op het uitvoerbare pakket worden bijgehouden als vervolgwerk.
  • Bewaking van de filterconsistentie van het Kalmanfilter (NIS/NEES). De covariantie-update van het klokfilter met twee toestanden is nu in gestabiliseerde Joseph-vorm `P⁺ = (I−KH)P(I−KH)ᵀ
    • KRKᵀ, which stays positive-semidefinite under extreme Q/R ratios (Cholesky-checked in CI at R=1e-26 / Q≈1e-30). A new src/filter_health.rsruns a Monte-Carlo consistency assessment (Bar-Shalom §5.4): pooled **NIS** (normalised innovation², target 1) and **NEES** (normalised estimation error², target 2) against 95% χ² bands, surfaced as afilter_health { nis_mean, nis_chi2_lower_95, nis_chi2_upper_95, nees_mean, nees_chi2_lower_95, nees_chi2_upper_95, consistent } block in the clock result JSON and as a green/amber card in the playground. A Q/R-mismatch sweep test proves the monitor flips to inconsistent when the process noise is mistuned by ×0.1–×10. Adds a general χ² quantile (detection::chi2_inv_cdf`, Wilson–Hilferty, table-checked).
  • docs/PROVENANCE.md: één citeerbare herkomsttabel. Bundelt elke sensorparameter (klokken, inertiaal, tijdoverdracht), elk fysisch/algoritmisch model (baan, tijdsystemen, stelsels, iono/tropo, integriteit, detectie, jamming, Allan) en elke validatiedataset (AIAA 2006-6753, Celestrak gps-ops) met haar gepubliceerde bron (datasheet, artikel, ICD of standaard) en een eerlijk volwassenheidslabel (voor vluchten gekwalificeerd / grondlab / ruimtedoel op grondhardware). Gelinkt vanuit de inleiding van de README en de documentatietabel; vult de strings provenance per run aan die al meereizen in het resultaat-JSON.
  • Getypeerde scenario-API. Dispatch gebeurt nu op een getypeerde enum ScenarioKind in plaats van op een ruwe stringmatch op kind (ScenarioKind::classify + uitputtende dispatch), zodat het toevoegen van een pakket door de compiler wordt gecontroleerd. Nieuwe getypeerde oppervlakken naast de ongewijzigde run_toml die een string teruggeeft: run_scenario(src) -> Result<RunOutput, KshanaError> met een gestructureerde foutentaxonomie (InvalidInput / NonConvergence / Unsupported / IoError, elk met een stabiele kind_tag()); een trait Scenario en uitbreidingspunt ExternalPack (het pakket jamming is daar als uitgewerkt voorbeeld doorheen aangesloten); en introspectie met list_scenario_kinds() (naam, beschrijving, verplichte/optionele velden per soort). De Python- en WebAssembly-bindingen krijgen list_kinds() en error_kind(). Gedocumenteerd in docs/ARCHITECTURE.md.
  • Echte GPS-constellatie + dekking van de bedrijfsomhulling. scenarios/orbit-sgp4-gps.toml levert nu een echte momentopname van Celestrak gps-ops (2021-07-28, 30 satellieten) in plaats van synthetische Walker-TLE's, met strict_checksum = true zodat het alleen laadt wanneer elke TLE-checksum geldig is; scripts/fetch_tles.sh documenteert reproduceerbaar verversen en de README vermeldt de open databron. Nieuw tests/scenario_coverage.rs oefent elk pakket uit over ≥5 varianten van de omhulling en toetst op eindige/begrensde uitvoer, bevestigt dat de flicker-FM-ondergrens de coast van een klok meetbaar verslechtert wanneer die is ingeschakeld (nu ingesteld in drie meegeleverde scenario's), en bevestigt dat het fusiefilter convergeert met een realistische accelerometerbias ongelijk aan nul (binnen 3× het geval met bias op nul), waarmee de realismekloof „fusion only works with zeroed biases” wordt gedicht. docs/VALIDATION.md krijgt een tabel Operating Envelope.
  • GNSS-simulatie in het meetdomein (soort gnss-sim). Een voorwaarts model op pseudo-afstandsniveau: per zichtbare satelliet synthetiseert het ρ = geometric range + c·δt_rx − c·δt_sv + I + T + noise + multipath en de L1-Doppler, met de enkelvoudige-frequentie-ionosfeer van Klobuchar (IS-GPS-200 §20.3.3.5.2.5) en de zenittroposfeer van Saastamoinen, geprojecteerd met de afbeeldingsfunctie van Niell (1996), beschikbaar als TOML-blokken [iono] en [tropo]. De residuen voeden momentopname-RAIM voor HPL/VPL per epoche, en een JSON-array gnss_measurements[] draagt per SV de pseudo-afstand, Doppler, C/N₀ en de correcties voor iono/tropo. Een run zonder ruis reproduceert geometrie + correcties tot submillimeter (CI-test). Nieuw src/gnss_sim.rs en scenarios/gnss-sim-raim.toml.
  • Stochastische detector voor tijdspoofing (soort spoof). Het spoofpakket draait nu een echte detector in plaats van een deterministische vergelijking van helling tegenover grens: vier injectievormen (linear_ramp, step_jump, meaconing, replay), een tweezijdige χ²₁-energietest / Neyman–Pearson-test op de monitorstatistiek met klokondersteuning, met de drempel bepaald uit een doelbudget voor valse alarmen target_pfa, en de kans op gemiste detectie P_md gerapporteerd in gesloten vorm en via Monte Carlo (mc_runs trials per hypothese; de twee komen overeen tot enkele ×1/√N). De kwaliteitsmaat Security is nu 1 − P_md bij de operationeel schadelijke (spec-)grootte. Nieuw src/detection.rs (Gaussische staartfuncties, NP-/energietest, Monte-Carlo P_fa/P_md) en scenarios/spoof-meaconing.toml. Achterwaarts compatibel: een kale [attack] rate_ns_per_s wordt nog steeds geaccepteerd als lineaire helling.

Gewijzigd#

  • Definitie van de Security-FoM (soort spoof): van de analytische detecteerbaarheidsgrens 1 − min_detectable/threshold naar de 1 − P_md van de stochastische detector. Het veld security van het klokpakket blijft de snellere analytische benadering.

Toegevoegd (vervolg)#

  • RF-jammingmodel (soort jamming). Een linkbudgetmodel voor interferentie dat het vermogen en de geometrie van een jammer omzet in verlies van lock per satelliet: de jammer-tot-signaalverhouding uit de padverzwakking in vrije ruimte en de ontvangstantennewinst per richting, de effectieve C/N₀ via de standaard anti-jamvergelijking (ontspreidingsprocesgewinst × de spectrale scheidingsfactor Q; Kaplan & Hegarty §9,4) en een instelbare trackingdrempel, gescoord over een Walker-constellatie als kwaliteitsmaat availability_under_jamming. Nieuw src/jamming.rs en scenarios/jamming-demo.toml. De eerlijke reikwijdte (geen multipath, terreinschaduw, AGC of adaptieve nulsturing) is gedocumenteerd in docs/CAPABILITY.md / docs/VALIDATION.md.
  • Generieke N-D-parametersweep over elke scenariosoort (sweep-nd). De vorige N-D-sweep was alleen voor het klokpakket. sweep-nd varieert gepunte TOML-sleutels van een scenario [base] over het cartesische product van zijn assen, verstuurt elk roosterknooppunt opnieuw via het normale runpad en leest één of meer maten uit het resultaat via een gepunt JSON-pad, zodat het voor elk pakket werkt (inertiaal, gnss-ins, integriteit, spoof, …) zonder koppeling aan het Rust-type van elk pakket. Roosterknooppunten worden op native doelen parallel over OS-threads geëvalueerd (zonder extra afhankelijkheid); wasm valt terug op sequentieel. Deterministisch en rijgewijs, ongeacht het aantal threads. Nieuw voorbeeld scenarios/sweep-nd-inertial.toml.
  • Via TOML configureerbaar deterministisch IMU-foutmodel in het pakket gnss-ins. De strapdown-foutketen met drie assen (schaalfactor, misalignement, g-gevoeligheid, kwantisatie, snelheidshelling; IEEE Std 952-1997 §A.2, Groves 2013 §4,3) is nu per sensor bereikbaar vanuit een scenariobestand via een optioneel blok [imu_*.error_model], bovenop de constante inschakelbiases. Wie het blok weglaat, houdt per sensor een zuivere bron met constante bias, zodat bestaande runs van gnss-ins ongewijzigd zijn. Dit sluit het eerder alleen in de bibliotheek aanwezige foutmodel aan op een uitvoerbaar pakket en kwaliteitsmaat.

0.10.0 - 2026-06-04#

Gewijzigd#

  • Validatie met echte gegevens. De multi-GNSS-RINEX-navigatieparser, de GLONASS-RK4-propagator en de SP3-lezer worden nu geoefend op echte IGS/DLR-bestanden (een echt gemengd RINEX 3-broadcastnavigatiebestand en een IGS SP3-c-baanproduct), en niet alleen op zelfgeschreven voorbeelden, met controle op niet-lege satellietverzamelingen en eindige, fysisch plausibele ECEF-posities. De fixtures dienen alleen voor tests (uitgesloten van de gepubliceerde crate); zie tests/fixtures/igs/NOTICE.
  • RAIM op de geometrie van echte referentiebanen. De kernen voor momentopname, oplossingsscheiding (MHSS) en ARAIM-beschermingsniveau zijn nu getoetst aan de echte geometrie van precieze IGS-banen (SP3), en niet alleen aan synthetische constellaties: de zichtlijngeometrie wordt opgebouwd uit de eerste SP3-epoche op een echt grondstation, en de tests controleren beschermingsniveaus op meterniveau die APV-I-beschikbaar zijn, dat een pseudo-afstandsbias van 60 m de χ²-monitor laat aanslaan, dat oplossingsscheiding de gestoorde satelliet identificeert en dat de niveaus van ARAIM de toegewezen P_HMI halen. Dit dicht de kloof van alleen op synthetische geometrie getoetsen (gLAB-pariteit op ontvangerniveau over een volledige RINEX-boog blijft een roadmap-item, omdat er een pseudo-afstandsoplossing voor nodig is).

Toegevoegd#

  • Betrouwbaarheidsintervallen per knooppunt voor de N-D-parametersweep (sweep::nd_sweep_ensemble). Elk roosterknooppunt van de N-dimensionale sweep over het cartesische product kan nu worden geëvalueerd als een Monte-Carlo-ensemble van seeds, waarbij per knooppunt (voor beide klokken) het gemiddelde, de percentielen en een percentiel-bootstrap-BI van 95% van de maat worden gerapporteerd: een statistisch eerlijke sweep in plaats van één trekking per knooppunt. Hergebruikt de ensemble-/bootstrapmachinerie (metric_stat); deterministisch; runs = 1 valt exact terug op de nd_sweep met één seed. (Het veralgemenen van de sweep over alle pakketten, verweven met de refactoring naar typed-Scenario, en parallelle uitvoering volgen nog.)
  • NaveGo-kruisvalidatie van de IMU-ruispipeline (tests/navego_imu_crossval.rs). Een externe kruiscontrole tegen NaveGo (de opensource INS/GNSS-toolbox van R. Gonzalez): reproduceert de synthetische rondgang van navego_example_allan.m op het gepubliceerde Microstrain 3DM-GX3-35-referentieprofiel en bevestigt dat onze overlappende ADEV-schatter de coëfficiënten van NaveGo voor snelheids- en hoekrandomwalk (ADEV(1 s) = σ·√dt) tot op minder dan 5% terugvindt, met de verwachte −1/2-helling van witte ruis. (Het opgenomen STIM300-.mat-logbestand van 40 MB wordt niet ingelezen: het is afhankelijk van een binair formaat.)
  • Strak gekoppelde (pseudorange) GNSS/INS-update. GnssInsEkf::update_tightly_coupled (en de wrapper ClosedLoopInsGnss::fuse_tightly_coupled) implementeren de eerder als stub aanwezige meting in het afstandsdomein: de innovatie is de voorspelde afstand van de INS-positie tot elke satelliet ten opzichte van de gemeten pseudorange, met een zichtlijn-Jacobiaan op de positiefout. Omdat elke satelliet een scalaire meting is, blijft het filter corrigeren met minder dan vier satellieten, waar een losjes gekoppelde PVT-positiebepaling niet bestaat. Vijf tests dekken nulling met vier satellieten, correctie met twee satellieten (geen PVT mogelijk), waarneembaarheid langs de zichtlijn met één satelliet en invoervalidatie. Alleen pseudorange; draaggolffase en een expliciete ontvangerklokstatus blijven roadmap. De ongebruikte cargo-feature tight_coupling (die de oude foutstub afschermde) is verwijderd.
  • Losjes gekoppeld GNSS/INS-scenariopakket (kind = "gnss-ins", src/fusion/pack.rs). Koppelt de driedimensionale strapdown-navigator en de EKF met 15 foutstatussen (closed_loop / gnss_ins_ekf) aan een uitvoerbaar scenario met een kwaliteitsmaat: de EKF stuurt de mechanisatie bij met ruisende GNSS-positiebepalingen zolang er dekking is en houdt daarna de uitval vol, waarbij het reset-naar-referentie-mechanisme van het oude scalaire 1-DOF-pakket wordt vervangen door echte fusie. Het resultaat geeft de gefuseerde horizontale foutreeks, de gescoorde positie-FoM (beschikbaarheid / RMS tijdens uitval / holdover) en de RMS van de open-lus vrije INS ter vergelijking; een kwantum/klassiek IMU-paar verschilt alleen in de werkelijke bias. Aangeroepen vanuit het CLI/Python/wasm-toegangspunt met een voorbeeld scenarios/gnss-ins.toml. Eerlijke kadering: alleen losjes gekoppeld, één deterministisch traject, en de gefuseerde fout tijdens uitval wordt begrensd door de attitudefout bij overdracht (er wordt dus niet beweerd dat hij met de bias schaalt); de robuuste bevindingen zijn dat fusie beter presteert dan onondersteunde dode rekening voor een sensor met bias en dat een sensor met lagere bias de betere onondersteunde uitloop heeft.
  • Constellatieontwerp op de getoetste SGP4-kern (src/walker.rs). Een nieuwe module walker genereert een ontworpen Walker-delta-patroon (i: T/P/F) als SGP4-gemiddelde elementen, zodat de synthetische constellatie wordt gepropageerd via hetzelfde SGP4-pad dat tot op 4,12 mm is getoetst aan de AIAA 2006-6753-vectoren, en niet via de analytische Kepler-generator. Daarbovenop: pdop_sweep tabelleert dekking en mediane/slechtste PDOP over een ontwerpraster {planes × sats × inclination}, en coverage_revisit geeft de dekkingsfractie en de herbezoekgaten (slechtste/gemiddeld) op een grondpunt. Getoetst aan de fysische monotoniciteiten waaraan een afweging moet voldoen (meer satellieten ⇒ hogere dekking, lagere PDOP, kortere herbezoektijd). Daarnaast is een echte Celestrak-gps-ops-TLE-momentopname (2021-07-28, 30 operationele GPS-satellieten) toegevoegd als fixture uitsluitend voor tests, en het echte pad TLE → SGP4 → ECEF-geometrie is ertegen getoetst (volledige MEO-schil binnen 1%, negen satellieten tegelijk in zicht bij PDOP 1,64), naast de bestaande echte-datapaden voor SP3 en RINEX.
  • Ruistypespecifieke effectieve vrijheidsgraden voor de Allan-betrouwbaarheidsintervallen. allan::edf_overlapping_adev implementeert de gesloten vormen uit NIST SP 1065 Tabel 5 (de eenvoudige set van Stable32) voor alle vijf canonieke machtswetruistypen: witte/flicker-PM, witte/flicker-FM en random-walk-FM, ter vervanging van het conservatieve niet-overlappende aantal als χ²-vrijheidsgraden. Een nieuwe enum PowerLawNoise en classify_power_law bepalen het dominante type uit de helling van de gemodificeerde Allan-deviatie van de opname (MDEV scheidt witte van flicker-PM waar ADEV dat niet kan), en overlapping_adev_curve koppelt nu het geïdentificeerde ruistype, de edf en een 95%-betrouwbaarheidsband aan elk punt van de geëxporteerde ADEV-curve (AdevPoint krijgt noise/edf/ci_lo/ci_hi, additief met serde-standaardwaarden). Op twee manieren getoetst: de vijf formules komen tot op 1e-12 overeen met met de hand berekende waarden, en een Monte-Carlo-ensemble van 4 000 opnamen met witte FM bevestigt dat de formule de werkelijke chi-kwadraat-edf van de schatter voorspelt binnen 20% (en dat hij het conservatieve aantal duidelijk overtreft). Acht nieuwe tests.
  • Stochastisch model voor tweewegtijdoverdracht. timetransfer::TwoWayLink vervangt de sampler met alleen witte ruis door een fysisch onderbouwd model: de reciproke (common-mode) padvertraging valt weg in de schatting (m_AB - m_BA)/2 (two_way_offset_estimate, zodat twee onafhankelijke eenwegmetingen middelen tot 1/sqrt(2)), en wat overblijft is de niet-reciproke differentiële vertraging, gemodelleerd als een gekleurd witte-FM- plus random-walk-FM-proces (het getoetste ClockModel), wat de reeks van de synchronisatiefout een realistische Allan-signatuur geeft (sigma_y^2(tau) = q_rw*tau/3) in plaats van vlakke witte ruis. LinkCfg krijgt q_wf_s/q_rw_s (serde-standaardwaarde 0 ⇒ het oude gedrag met alleen witte ruis, bit voor bit), de link-FoM geeft adev_tau0 weer (de Allan-deviatie van het model bij de basisstap) en het scenario en de CLI van timetransfer maken dit beschikbaar. Golden-FoM opnieuw vastgezet. Zes met de hand afgeleide tests (common-mode-opheffing, de tweewegwinst sqrt(2), de RWFM-wet tau/3 via de eigen step() van de link, gelijkwaardigheid met het oude gedrag bij q=0, determinisme en end-to-end weergave van de FoM).
  • Numerieke pariteit met Stable32 voor de schatters uit de Allan-familie (NBS14). tests/allan_reference.rs toetst de overlappende ADEV, gemodificeerde ADEV, tijdsdeviatie en overlappende Hadamard-schatters aan de referentiedeviaties van Stable32 voor de canonieke dataset NBS14 (W. J. Riley, Handbook of Frequency Stability Analysis, NIST SP 1065, ~p.107) bij tau = 1, 2 met een relatieve tolerantie van 1e-4; de werkelijke overeenstemming is ~1e-6. Dit legt de schattingswiskunde vast tegen de feitelijke referentie-implementatie, en niet alleen tegen de eigen analytische samenhang van de schatters. Alleen de openbare referentiegetallen worden gebruikt; er is geen code van derden.
  • Verticaal Stanford-integriteitsdiagram, geëxporteerd door het scenario integrity. Het uitvoerbare scenariotype integrity exporteert nu een verticaal Stanford(-ESA)-diagram naast de HPL/VPL-beschikbaarheidskaart: op elk beschermd tijdstip wordt een geseede, reproduceerbare foutloze afstandsfoutentrekking via de geometrie omgezet in een werkelijke verticale positiefout en ingedeeld ten opzichte van de VPL en de verticale alarmgrens (Available / System-Unavailable / Misleading / Hazardously-Misleading). Het diagram (punten per tijdstip + gebiedstellingen) zit in de resultaat-JSON en de tellingen van integriteitsgebeurtenissen en HMI in de CLI-samenvatting, zodat de Stanford-classificator, die eerder alleen in de bibliotheek bestond, end-to-end bereikbaar is. IntegrityScenario krijgt een veld seed (standaard 0) dat de foutrealisatie bepaalt; de beschikbaarheidskaart zelf blijft puur geometrisch en onafhankelijk van de seed.
  • ARAIM-integriteitsrisicobudget (P_HMI) voor de beschermingsniveaus. raim::araim_raim leidt de horizontale en verticale beschermingsniveaus af uit een expliciet integriteitsrisicobudget in plaats van een vaste vermenigvuldiger K_md: voor de oplossing met alle satellieten in zicht en elke enkelvoudige satellietuitsluitings-deeloplossing bouwt het per modus de (prior, detection threshold, σ) op elke as, waarna araim_protection_level het kleinste PL oplost waarvan de opgetelde kans op gevaarlijk misleidende informatie (araim_integrity_risk, P_HMI = Σ_k p_fault,k · Q((PL − T_k)/σ_k), Blanch et al. Baseline ARAIM) het toegewezen P_HMI haalt. Het resultaat geeft het integriteitsrisico dat de niveaus daadwerkelijk bereiken, zodat een gebruiker integriteit en alarmgrens expliciet tegen elkaar kan afwegen. Zes met de hand afgeleide tests (gesloten vormen voor foutvrije en gedrempelde enkelvoudige modi, sommatie en monotoniciteit over meerdere modi, end-to-end foutvrije bescherming waarbij een 10⁵× strakker budget het PL verhoogt, foutdetectie en -identificatie, en de redundantiedrempel van zes satellieten). Enkelvoudige-fout-MHSS is de ARAIM-basislijn; gelijktijdige fouten in meerdere SV-deelverzamelingen, de constellatiebrede foutmodus en validatie met de gLAB-referentiedataset zijn gedocumenteerde uitbreidingen.
  • Tweesnelheden-coning/sculling-compensatie voor de strapdown-mechanisatie. inertial::mechanization::coning_sculling_compensate vouwt de hoogfrequente coning- (attitude) en rotatie-plus-scullingtermen (snelheid) uit de geordende IMU-incrementen van de subintervallen van een grove update, zodat een NavState::step_increments met gematigde snelheid de door trillingen gerectificeerde beweging reproduceert die een grove stap over de ruwe sommen mist. Een validatietest drijft een coning+sculling-omgeving van 10 Hz gedurende 60 s aan en vergelijkt fijnsnelheidsreferentie, naïeve grove integratie en de gevouwen grove integratie: het vouwen verlaagt de positiefout ongeveer 18× (van meters naïeve drift naar minder dan een decimeter), wat bevestigt dat de coning/sculling-termen dragend zijn. Een typealias ScalarErrorBudget noemt het oude 1-DOF-model AccelModel bij zijn naam, onderscheiden van de driedimensionale navigator NavState.
  • Parser voor RINEX-observatiebestanden. Een nieuwe module rinex_obs leest het RINEX 3.0x / 4,00-observatiebestand, de werkelijke metingen van de ontvanger, en completeert zo het RINEX-paar naast de bestaande parser voor navigatieberichten. parse_obs decodeert de header (versie/type, de per-systeem SYS / # / OBS TYPES-lijsten met vervolgregels, benaderde positie, interval, tijdstip van de eerste observatie) en de records per satelliet van elk tijdstip: pseudorange, draaggolffase, Doppler en signaalsterkte, geïndexeerd op hun RINEX-3-observatiecode (C1C, L1C, …) met de vlaggen voor lock-verlies (LLI) en signaalsterkte (SSI), waarbij een leeg veld als afwezig wordt bewaard en niet als nul. Eerlijke reikwijdte: dit is de inlezing van het standaardformaat (een echt observatielogbestand van RTKLIB/gLAB/IGS-stations erin, getypeerde metingen eruit), geen positioneringsengine; hier is geen pseudorange-oplossing, PPP of RTK.
  • CCSDS OEM-schrijver (Orbit Ephemeris Message). Een nieuwe module oem exporteert een gepropageerde constellatie als een geldig CCSDS 502.0-B OEM-bericht 2,0, het KVN-efemerideformaat dat GMAT, Orekit, STK en de meeste vluchtdynamicatools inlezen. OemFile::from_propagators bemonstert de inertiale (TEME) toestand van elke satelliet, positie en snelheid, rechtstreeks uit de propagator zonder aardvaste rotatie, anders dan bij de SP3-export, op een tijdraster, en OemFile::to_oem_string serialiseert de header CCSDS_OEM_VERS/CREATION_DATE/ ORIGINATOR plus één segment META_START … META_STOP per satelliet (OBJECT_NAME/OBJECT_ID/CENTER_NAME/REF_FRAME = TEME/TIME_SYSTEM = GPS/ START_TIME/STOP_TIME), gevolgd door de regels epoch X Y Z X_DOT Y_DOT Z_DOT (km, km/s). De CREATION_DATE wordt door de aanroeper geleverd, nooit uit de systeemklok genomen, zodat de uitvoer bytegelijk is over runs heen (het reproduceerbaarheidscontract). Dit is het tegenstuk voor ruimtevaartuigefemeriden van de GNSS-SP3-export: een Kshana-baan kan nu in een standaardformaat aan een vluchtdynamicatool worden overgedragen.
  • SP3-precisie-efemeride als propagatiebron. Sp3File::interpolator bouwt per satelliet een Sp3Interpolator die de positie tussen de getabelleerde SP3-tijdstippen invult met een Lagrange-polynoom van de 9e orde (standaardpraktijk bij de IGS) en deze naar het gedeelde TEME-stelsel draait, beschikbaar als Propagator::Sp3Precise. Een precisiebaanbestand van de IGS of een analysecentrum kan nu dezelfde geometrie-, zichtbaarheids- en integriteitspipeline aansturen als de broadcast- en analytische propagatoren. Getoetst met een rondgang: een Kepler-baan die naar SP3 is geschreven en via de interpolator weer is ingelezen, komt op de knooppunten tot onder een meter overeen met het origineel en binnen < 100 m halverwege het interval. Klokinterpolatie volgt.
  • GLONASS-broadcast-efemeride (completeert multi-GNSS RINEX-nav). Nieuwe module glonass: GLONASS zendt geen Kepler-elementen uit maar een aardvaste toestandsvector in PZ-90 (positie, snelheid, luni-solaire versnelling). parse_glonass_nav leest de RINEX-3-records R, en de satellietpositie op elk tijdstip volgt uit Runge-Kutta-integratie van de 4e orde van de bewegingsvergelijkingen uit de GLONASS-ICD (centrale zwaartekracht + J2 + Coriolis- en middelpuntvliedende termen door aardrotatie + de uitgezonden versnelling). Beschikbaar als Propagator::Glonass, zodat GLONASS-satellieten samen met de Kepler-systemen door de constellatie-, zichtbaarheids- en integriteitspipeline stromen; één rinex-constellatieblok kan nu GPS, Galileo, QZSS, BeiDou en GLONASS mengen.
  • Multi-GNSS RINEX-navigatie (GPS, Galileo, QZSS, BeiDou). De RINEX-3-navigatieparser decodeert nu records van Galileo (E), QZSS (J) en BeiDou (C, MEO/IGSO) naast GPS (G); ze delen de Kepler-indeling en het gebruikersalgoritme en worden elk geëvalueerd met hun eigen gravitatieconstante en aardrotatiesnelheid (μ van Galileo/BeiDou, Ω̇ₑ van BeiDou). Een bestand met gemengde constellaties levert ze allemaal op, die als Propagator::Rinex door de constellatie-, zichtbaarheids- en integriteitspipeline stromen. Geostationaire BeiDou-satellieten gebruiken een andere coördinatenrotatie en worden overgeslagen tot er een referentiefixture is om tegen te toetsen. De recordlezer gebruikt regelaantallen per systeem, wat een sluimerende fout verhelpt waarbij GLONASS/SBAS-records van vier regels werden overgeslagen alsof ze acht regels lang waren. GLONASS (een toestandsvectormodel) volgt.
  • Lezer en schrijver voor SP3-c/d-precisie-efemeriden. Een nieuwe module sp3 leest SP3-precisiebaanbestanden van de IGS of analysecentra (parse_sp3), het nabewerkte ECEF-positie-/klokproduct dat PPP-engines (Ginan, RTKLIB, gLAB) als referentie beschouwen, in een gestructureerd Sp3File (header, tijdstipraster, positie per satelliet km→m, klok µs en snelheid dm/s→m/s voor V-producten), met behoud van de SP3-sentinelwaarden voor ongeldige waarden. De omgekeerde richting is ook gedekt: Sp3File::from_propagators bouwt een SP3 uit een gepropageerde constellatie (TEME→ECEF per tijdstip) en to_sp3_string serialiseert die, zodat Kshana-banen kunnen worden geëxporteerd in het formaat dat externe PPP-tools inlezen: de rondgang lezen↔schrijven. Tijdstipinterpolatie en een SP3-propagatorbron volgen.
  • RINEX-broadcast-efemeride als uitvoerbare constellatiebron. Een constellatie accepteert nu een inline blok rinex (RINEX-3-GPS-navigatietekst) naast de bestaande optie tle, zodat een echt broadcastbestand een scenario end-to-end aanstuurt vanuit de CLI, Python of de playground in de browser: RINEX erin, PNT-geometrie eruit. Het nieuwe scenarios/orbit-rinex.toml toont GNSS-beschikbaarheid en DOP voor acht GPS-satellieten die rechtstreeks uit broadcastrecords zijn opgebouwd. (Alleen GPS LNAV; multi-GNSS en SP3 volgen.)
  • RINEX-broadcast-efemeride als propagatiebron. Een geparste RinexEphemeris wordt nu omgezet naar een orbit::Propagator (Propagator::Rinex): de positie is de IS-GPS-200-broadcastbaan, geroteerd van ECEF naar het gedeelde inertiale TEME-stelsel (sv_position_teme, met schrikkelseconde-correcte GPS→UT1-tijd), de snelheid volgt uit een centraal eindig verschil en de omloopperiode is de Kepler-periode. Echte GPS-broadcastdata kunnen nu dezelfde geometrie-, zichtbaarheids- en integriteitspipeline (RAIM) aansturen als de analytische SGP4/Kepler-propagatoren. (Nog niet beschikbaar als scenariotype voor RINEX-bestanden; dat en multi-GNSS/SP3 volgen.)

0.9.2 - 2026-06-03#

Toegevoegd#

  • Archief-DOI. Releases worden nu bij Zenodo gedeponeerd en krijgen een citeerbare DOI.

0.9.1 - 2026-06-03#

Gewijzigd#

  • Documentatie. De README is bijgewerkt tot institutioneel niveau: een overzicht van de mogelijkheden van de volledige v0.9.0-stack, een sectie Versiebeheer en releases, een schone header met het nieuwe merkteken en een beknopte statusregel. Geen wijzigingen aan de engine.

0.9.0 - 2026-06-03#

Deze release voegt drie substantiële mogelijkheden toe bovenop het SGP4-fundament van 0.8.0: een echt driedimensionaal strapdown-INS, een losjes gekoppelde GNSS/INS-foutstatus-EKF met gesloten-lus-terugkoppeling, echte snapshot- en oplossingsscheidings-RAIM (ARAIM-stijl) met HPL/VPL en een uitvoerbaar scenario integrity, en de eerste stap naar interoperabiliteit van GNSS-formaten (inlezen van RINEX-3-GPS-efemeriden).

Toegevoegd#

  • Parser voor RINEX-3-GPS-navigatieberichten (src/rinex.rs). Eerste stap naar interoperabiliteit van GNSS-formaten: parse_nav leest een RINEX-3.x-navigatiebestand en decodeert elk GPS-broadcastefemeriderecord (G), het blok van acht regels SV/tijdstip + BROADCAST ORBIT, naar een RinexEphemeris met Kepler-elementen en klokcorrecties, met veldnamen en eenheden volgens IS-GPS-200. Verwerkt het Fortran-floatformaat met D-exponent (parse_d) en de kolomindeling met vaste breedte; records van niet-GPS-systemen worden overgeslagen en niet geweigerd, zodat een gemengd bestand toch zijn GPS-efemeriden oplevert. Vier tests: parsing van de D-exponent (inclusief lege velden en fouten), een volledig record gedecodeerd tegen bekende veldwaarden met een controle van de GPS-halve lange as (√A² ≈ 26.560 km), het overslaan van niet-GPS en het geval van een leeg bestand.
  • GPS-broadcastefemeride → ECEF-positie (src/rinex.rs). RinexEphemeris::sv_position_ecef(t_tow) berekent de aardvaste positie van de satelliet uit de geparste efemeride via het gebruikersalgoritme van IS-GPS-200 §20.3.3.4.3.1: een Newton-oplossing van de vergelijking van Kepler voor de excentrische anomalie, de tweede-harmonische correcties op argument van breedte, straal en inclinatie, en de rotatie naar ECEF met aardrotatie sinds het referentietijdstip (met de door de specificatie voorgeschreven GPS-μ en Ω̇ₑ, en een vouwing van tk bij weekovergang). Drie tests: de geocentrische straal blijft in de GPS-band (≈ 26.560 km), de aardvaste snelheid is ~3,9 km/s, en evaluatie een volle week verder reproduceert dezelfde positie.
  • GPS-SV-klokbias met de relativistische correctie (src/rinex.rs). RinexEphemeris::sv_clock_bias_s(t_tow) berekent het broadcast-klokpolynoom af0 + af1·Δt + af2·Δt² rond Toc plus de relativistische excentriciteitsterm F·e·√A·sin Ek (IS-GPS-200 §20.3.3.3.3.1). Een nieuwe EpochUtc::gps_time_of_week zet het kalendertijdstip van het record om naar GPS-tijd van de week via Juliaanse-dagrekenkunde vanaf het GPS-tijdstip nul (1980-01-06), en de Kepler-oplossing wordt gedeeld met de positieberekening. Tests: GPS-tijd van de week voor een zondag/dinsdag/zaterdag (weekgrenzen), en een klokbias die door af0 wordt gedomineerd met een aanwezige, begrensde relativistische term. De L1-groepsvertraging TGD is beschikbaar maar wordt bewust niet meegenomen. Eerlijke reikwijdte: een bron Propagator, Galileo/BeiDou/GLONASS en SP3 blijven vervolgstappen. (docs/CAPABILITY.md is hierop aangepast.)
  • Door gebruikers uitvoerbaar scenariotype integrity (scenarios/integrity-raim.toml). De beschikbaarheidsmogelijkheid van RAIM is nu net als elk ander pakket bereikbaar vanuit de CLI/TOML: kind = "integrity" parst een IntegrityScenario (gebruikersbaan, een of meer GNSS-constellaties, elevatiemasker en de integriteitsconfiguratie (sigma, P_fa, P_md, AL_H, AL_V)), voert constellation_raim_availability uit en geeft de HPL/VPL-beschikbaarheidskaart per tijdstip als JSON plus een zelfstandige SVG: beschermingsniveaus in de tijd ten opzichte van de alarmgrenzen, met een groen/rode beschikbaarheidsstrook. kshana scenarios/integrity-raim.toml schrijft de JSON, de grafiek en een HTML-rapport. Het meegeleverde scenario (Walker met 24 satellites, tweefrequente afstandsmeting van 1 m, APV-I-grenzen) geeft ~95 % beschikbaarheid; het documenteert dat RAIM met één frequentie niet voldoet aan de verticale APV-I-grens met één constellatie, en daarom wordt voor verticale geleiding SBAS/tweefrequent/ARAIM gebruikt. Tests dekken de aanroep, de JSON van de beschikbaarheidskaart en de SVG.
  • Uitvoerbare RAIM-beschikbaarheid over een constellatie (src/raim.rs). De integriteitsmodule had geen aanroeper; constellation_raim_availability maakt er een echt end-to-end toegangspunt van: op elk tijdstip van een tijdraster propageert het de zichtbare satellieten (dezelfde SGP4/Kepler-Propagators die de engine gebruikt), berekent het de foutloze beschermingsniveaus en beoordeelt het de beschikbaarheid aan de horizontale/verticale alarmgrenzen, en geeft het een met serde serialiseerbaar RaimAvailabilityReport terug (per tijdstip n_visible/HPL/VPL/available plus de beschikbaarheidsfractie). Een RaimConfig bundelt (sigma, P_fa, P_md, AL_H, AL_V) en de raim_availability_epoch per tijdstip is beschikbaar voor aanroepers die hun eigen geometrie oplossen. Drie tests: een tijdstip dat beschikbaar wordt bevonden onder APV-I-grenzen bij een geometrie van tien satellieten, onbeschikbaar gemaakt door een onmogelijk strakke grens, en None-niveaus onder vijf satellieten; en een end-to-end run over een Walker-constellatie van 24 satellieten die een eindige beschikbaarheidskaart oplevert en serialiseert. (Zes satellieten, de redundantiedrempel van residuele RAIM, voldoen eerlijk gezegd niet aan APV-I, zelfs niet bij afstandsmeting van 1 m; APV-I-beschikbaarheid vraagt de dichtere geometrie die de test gebruikt.)
  • Accumulator voor het Stanford(-ESA)-integriteitsdiagram (src/raim.rs). De standaardmanier om een integriteitsmonitor over veel tijdstippen samen te vatten: het zet de werkelijke positiefout (x) uit tegen het beschermingsniveau (y) en deelt elk tijdstip, via de diagonaal y = x en de alarmgrens, in bij Available (PL begrenst de fout, binnen AL), SystemUnavailable (PL begrenst de fout maar overschrijdt AL: veilig, onbruikbaar), MisleadingInformation (PL < fout ≤ AL) of HazardouslyMisleadingInformation (PL < fout en fout > AL: het onveilige falen). classify_stanford is de pure classificator; StanfordDiagram verzamelt (error, PL)-punten tegen een vaste alarmgrens en geeft gebiedstellingen, beschikbaarheid, totalen van integriteitsgebeurtenissen en met serde serialiseerbare punten voor plots/JSON-export. Vier tests: elk gebied (inclusief de begrensde grens error == PL), opbouw van tellingen/beschikbaarheid en JSON-rondgang. Dit is het rapportageoppervlak voor de RAIM-beschermingsniveaus; het aansluiten op het constellatiescenario en validatie met een openbare dataset blijven roadmap-onderdelen.
  • Oplossingsscheidings-RAIM (ARAIM-stijl) (src/raim.rs). Een integriteitsmonitor met meerdere hypothesen naast de bestaande residu-/pariteits-chi-kwadraat-snapshot_raim. Voor de kleinstekwadratenoplossing met alle satellieten in zicht en elke enkelvoudige satellietuitsluitings-deeloplossing vormt hij de scheiding Δ_k = x_k − x₀, nulgemiddeld Gaussisch zonder fout met covariantie Cov(x_k) − Cov(x₀) (de identiteit van geneste schatters, geldig omdat de oplossing met alle satellieten in zicht BLUE is), en zo detecteert hij een fout én identificeert hij de foute satelliet (degene waarvan de uitsluiting de grootste genormaliseerde scheiding geeft). Horizontale/verticale beschermingsniveaus volgen uit de standaard MHSS-toewijzing PL = max(K_md·σ₀, max_k[K_fa·σ_ss,k + K_md·σ_k]), met K_fa = Φ⁻¹(1−P_fa/2), K_md = Φ⁻¹(1−P_md). Nieuw, afhankelijkheidsvrij normal_cdf/normal_quantile, gebouwd op de bestaande geregulariseerde onvolledige gamma van de module (erf(x) = P(½,x²)). Vier met de hand afgeleide tests: normale CDF / kwantiel tegen leerboekwaarden (Φ(1,95996)=0,975, de staart van 1e-7 = 5,1993, symmetrie); een foutvrije geometrie die geen alarm geeft en eindige, positieve HPL/VPL oplevert; een bias van 60 σ op één satelliet die wordt gedetecteerd en correct geïdentificeerd (excluded_sv == 2); en de redundantiedrempel van zes satellieten. Sluit aan de algoritmekant het gat uit de audit "tautologische integriteit: geen echte RAIM/HPL/VPL" (P0); validatie met de gLAB-dataset en de Stanford-diagramaccumulator blijven roadmap-onderdelen.
  • Gesloten-lus GNSS/INS-integratie (src/fusion/closed_loop.rs). ClosedLoopInsGnss koppelt de foutstatus-EKF-kern aan de driedimensionale strapdown-mechanisatie: elk IMU-sample wordt gecorrigeerd met de lopende biasschattingen, voorwaarts gemechaniseerd, en de EKF-covariantie wordt in de tijd gepropageerd met de bijbehorende navigatiecontext; elke GNSS-positie-/snelheidsbepaling vormt de INS−GNSS-innovatie en voert de geschatte positie, snelheid, attitudefout (ψ, als quaternionrotatie) en versnellingsmeter-/gyrobiassen terug in de oplossing, waarbij het gemiddelde van de foutstatus wordt gereset. De attitude terugvoeren (niet alleen de biassen) is nodig voor stabiliteit: de kanteling en de versnellingsmeterbias vormen een gekoppeld paar, dus het corrigeren van de ene zonder de andere divergeert. INS en GNSS worden vergeleken in een lokaal raakvlak-NED-stelsel met de eigen kromtestralen van de mechanisatie (nieuw mechanization::radii_of_curvature; NavState::omega_ie_n/omega_en_n beschikbaar). Dit is de eerlijke vervanging van het reset-naar-referentie-mechanisme van het hybride pakket. Drie tests: een gesloten lus die een geïnjecteerde positiefout van 8 m / −5 m nult tot <0,1 m; een ondersteunde oplossing die op een rijdend traject binnen de meter blijft (<6 m) terwijl een vrijlopende INS boven 100 m divergeert; en de mijlpaalbenchmark: de Monte-Carlo-positie-RMS van de gefuseerde oplossing over een GNSS-uitval van 60 s is >2× beter dan die van een onondersteunde open-lus dode-rekening (≈4× over seeds). Gedocumenteerde eerlijke beperking in de module: in losjes gekoppelde modus zijn de versnellingsmeterbias en de kanteling slechts zwak scheidbaar (beide koppelen via de zwaartekracht), dus de geleverde waarde is de begrensde, gecorrigeerde toestand en een schone start bij uitval, geen nauwkeurige inertiale kalibratie; rijkere dynamica en de strak gekoppelde uitbreiding blijven roadmap-onderdelen.
  • Losjes gekoppelde GNSS/INS-foutstatus-EKF-kern (src/fusion/gnss_ins_ekf.rs). Een uitgebreid Kalman-filter met 15 foutstatussen, δx = [δp, δv, ψ, b_a, b_g], met de strapdown-foutdynamica uit Groves 2013 §14,2 (koppeling van specifieke kracht en kanteling, Coriolis, projectie van de bias van lichaams- naar navigatiestelsel, Gauss–Markov-biasmodellen), een discrete overgang van de eerste orde Φ = I + F·dt en een losjes gekoppelde meetupdate voor positie+snelheid (H = [I₃ 0 0 0 0; 0 I₃ 0 0 0]) in Joseph-vorm. Afhankelijkheidsvrije dichte lineaire algebra (Gauss–Jordan-inverse, Joseph-covariantie-update). Een cargo-feature tight_coupling schermt een gedocumenteerde, nog niet geïmplementeerde pseudorange-/Doppler-update af. 7 tests met met de hand afgeleide verwachtingen: de scheef-/kruisproductidentiteit, een geverifieerde inverse van 3×3, covariantie die symmetrisch/PSD blijft onder predictie (en positieonzekerheid die zonder ondersteuning groeit), een positiebepaling die de positiecovariantie verkleint, exacte terugvinding van een bekende positiefout bij de analytische Kalman-versterking P/(P+R), en kleinere correcties bij grotere meetruis. Dit is de kern die het reset-naar-referentie-mechanisme met open lus van het hybride pakket zal vervangen door terugkoppeling met gesloten lus (koppeling aan het pakket + NaveGo-validatie volgen).
  • Deterministisch IMU-foutmodel voor de 3-assige strapdown-navigator (src/inertial/imu_errors.rs). ImuErrorModel vervormt een ware paar (ω, f) in het lichaamsstelsel tot een gemeten paar via vijf systematische categorieën (IEEE Std 952-1997 §A.2; Groves 2013 §4,3, Tabel 4,1): schaalfactor (versterkingsfout per as in ppm), misalignment / kruiskoppeling (niet-orthogonaliteit van het drietal buiten de diagonaal), g-gevoeligheid (een gyrohoeksnelheidsbias evenredig met de specifieke kracht), kwantisatie (afronding op de uitvoer-LSB) en rate-ramp (een in de tijd lineaire drift: het derde Allan-gebied), plus een constante inschakelbias. Elke term staat standaard op nul, zodat ImuErrorModel::ideal() een transparante doorgifte is en bestaande scenario's niet worden beïnvloed. Elke foutbron heeft een isolatietest (schaal lineair tot <0,01%, misalignment tussen de assen boven de VRW-ondergrens, g-gevoeligheidsbias, LSB-raster, lineaire ramp), en een end-to-end test laat een navigatiefout via de mechanisatie ontstaan uit een vervormde IMU. Niet gemodelleerd: fout door trillingsrectificatie, drift door temperatuurgradiënt. (Het meegeleverde scenariopakket inertial draait nog steeds het oude scalaire 1-DOF-budget; dit model voedt de 3-assige bibliotheek.)
  • Coning- en sculling-compensatie voor de strapdown-integrator. Het attitudepad voegt de tweesamples-coning_increment toe (½ Δθ_prev × Δθ_cur); een integratie met grove snelheid (30 Hz, 5 samples/cyclus) van een coning-omgeving van 5 Hz volgt, zo is geverifieerd, de fijnsnelheidsreferentie ≥ 3× beter met de correctie dan met naïef optellen van incrementen. Het snelheidspad voegt sculling_increment toe (½ Δθ × Δv, Groves vgl. 5,82) en herleidt het snelheidsincrement in het lichaamsstelsel via een nieuwe incrementgebaseerde update NavState::step_increments met de lichaamsrelatieve rotatie Δθ_rel = Δθ_b − C_n^b ζ, zodat een aardvast platform geen valse sculling oploopt terwijl een echte trilling de volledige term activeert.
  • Volledige driedimensionale strapdown-mechanisatie in het NED-stelsel (src/inertial/mechanization.rs). NavState { q, v_ned, p_llh } wordt voortgezet met step(gyro_b, accel_f_b, dt) volgens de standaard NED-vergelijkingen in het aardse stelsel (Groves §5,4): attitude van lichaams- naar NED-stelsel gecorrigeerd voor de inertiaal-naar-navigatie-hoeksnelheid ω_in = ω_ie + ω_en (aardrotatie + transportsnelheid); specifieke kracht van lichaams- naar NED-stelsel herleid via de DCM; snelheid die v̇ = f_n − (2 ω_ie + ω_en) × v + g_n integreert (Coriolis/transport + zwaartekracht); en geodetische positie via de meridiaan- en dwarskromtestralen. De zwaartekracht is de gesloten vorm van WGS-84 volgens Somigliana, de normale (schietlood-)zwaartekracht, met een NIMA-vrije-luchtcorrectie voor de hoogte, nooit een hardgecodeerde constante. Dit is de echte driedimensionale navigator die het scalaire foutbudgetpad met 1 DOF vervangt. Geverifieerd met fysische invarianten: een platform dat aan de roterende aarde is bevestigd op 45°N (en de aardrotatiesnelheid + 1 g meet) blijft binnen 1 mm gedurende 60 s; een horizontale specifieke kracht naar het noorden geeft v_N ≈ a·t en een verplaatsing ½ a t²; de normale zwaartekracht komt overeen met de bekende oppervlaktewaarden op de evenaar, de pool en 45° en met de vrije-luchtgradiënt.
  • Driedimensionale attituderepresentatie voor strapdown-INS (src/inertial/attitude.rs). Een type Quaternion met eenheidsquaternion (scalar-first, Hamilton-conventie) dat de rotatie van lichaams- naar navigatiestelsel draagt, met een DCM-weergave (to_dcm/from_dcm via de methode van Shepperd), Hamilton-product, constructors voor as-hoek en rotatievector (exacte exp-map) en quaternionkinematica: zowel een RK-snelheidsupdate van de eerste orde (q̇ = ½ q ⊗ ω) als een rotatievectorupdate met coning-correctie. De tweesamples-coning_increment (Savage / Bryan–Lewantowski, ½ Δθ_prev × Δθ_cur) levert de kruiskoppelingsterm van de rotatiesnelheid die scalaire dode rekening weglaat. Dit is het attitudefundament voor de volledige 3-assige mechanisatie die het oude foutbudgetpad met 1 DOF vervangt. Geverifieerd met rotaties in gesloten vorm: propagatie met constante snelheid komt tot 1e-6 overeen met de as-hoek-quaternion, DCM's zijn orthonormaal met determinant één en coning verdwijnt bij beweging om één as. (src/inertial.rs is nu de moduledirectory src/inertial/; het openbare pad crate::inertial is ongewijzigd.)
  • Geodetisch correcte zichtbaarheid vanaf grondstations (src/frames.rs). elevation, is_visible en visible_count berekenen de elevatie van een satelliet boven de horizon van een grondstation ten opzichte van de normaal van de WGS-84-ellipsoïde (de ware lokale verticaal) en niet de geocentrische radiaal; die twee verschillen tot de geodetische afbuiging van ~0,19°, genoeg om satellieten dicht bij de horizon in of uit een elevatiemasker te laten vallen. Geverifieerd end-to-end (een Walker-constellatie gepropageerd, van TEME naar ECEF geroteerd en geteld vanaf een geodetische locatie) en tegen de geocentrische benadering.

Gewijzigd#

  • Betrouwbaarheid van CI. De job test-python-bindings bouwt het wheel nu met PyO3/maturin-action (manylinux-container) in plaats van met een ruwe maturin build op de host, wat een sporadisch rustup-conflict rustfmt-preview/cargo-fmt op het runner-image verhelpt. De job deny installeert cargo-deny als vooraf gebouwd binaryprogramma via taiki-e/install-action in plaats van via de op Docker gebaseerde cargo-deny-action, wat een time-out bij het ophalen uit het Docker Hub-register verwijdert. Geen van beide wijzigingen beïnvloedt de uitgevoerde controles.

0.8.0 - 2026-06-02#

Toegevoegd#

  • Inertiale snelheid wordt stroomafwaarts beschikbaar gesteld. Propagator::velocity_eci en Propagator::state_eci (die StateEci { r_m, v_m_s } teruggeeft) voeren de analytische TEME-snelheid die SGP4 al berekent, en die eerder werd weggegooid, in m/s door naar aanroepers; Orbit::velocity_eci geeft het Kepler-pad een consistente snelheid. De verificatietest van AIAA 2006-6753 controleert nu ook de snelheid voor elke referentierij (slechtste snelheidsfout 1.85e-9 km/s over alle 666 toestanden) en legt het aantal vergeleken rijen vast op precies 666.

  • Strengere TLE-parsing zonder panics. Regels moeten ASCII zijn en worden veilig gesneden (geen byte-indexpanics meer bij multibyte-invoer); elementen worden op bereik gecontroleerd (inclinatie, excentriciteit, gemiddelde beweging); de checksum in kolom 69 kan worden afgedwongen via ParseOpts { strict_checksum } / parse_propagators_opts en de nieuwe vlag strict_checksum op ConstellationCfg (standaard soepel).

  • Allan-deviatiecurve in de uitvoer. Elke klokrun geeft nu een adev_curve ([{tau_s, adev, n_samples}]) weer en de playground in de browser toont een log-log-grafiek "Klokstabiliteit (ADEV)".

  • Invoervalidatie van het tijdraster. TimeCfg::validate weigert een niet-eindig, nul, negatief of te groot tijdraster (een stap groter dan de duur, of meer dan MAX_TIME_STEPS samples) vóór enige allocatie, zodat een foutief scenario een fout teruggeeft in plaats van te paniekeren of het geheugen uit te putten.

  • Monte Carlo-ensembles voor het inertiale pakket. runs = N op een inertiaal scenario draait N seeds en geeft per metriek het gemiddelde, de standaarddeviatie, percentielen en een percentiel-bootstrap-betrouwbaarheidsinterval van 95% (ensemble). Elke inertiale run draagt nu een vlag monte_carlo, zodat een FoM uit één realisatie niet langer voor een verdeling wordt aangezien. (CEP/2DRMS worden bewust niet gerapporteerd; daarvoor is het 3-assige model nodig dat op de roadmap staat.)

  • Begeleide playground-modus. De playground in de browser zet u niet langer voor een muur van ruwe TOML: een strook "Begin hier" met scenariokaarten die met één klik een uitgewerkt voorbeeld laden en uitvoeren, schuifregelaars voor de universele instellingen (seed, tijdsynchronisatiedrempel) zonder de TOML aan te raken, een toelichting "Zo leest u dit" bij het resultaat, en de volledige TOML is één uitklapbaar paneel verder. Elke run is deelbaar: Deellink kopiëren codeert het hele scenario in het URL-fragment (er wordt niets geüpload), zodat een link bij het laden exact dezelfde run reproduceert. De codec is met unittests getest (web/share.test.mjs, uitgevoerd in CI).

  • N-dimensionale parametersweeps (src/sweep.rs). nd_sweep evalueert een metriek over het volledige cartesische product van meerdere bereiken SweepAxis (de afwegingsstudie met meerdere parameters), in rij-hoofdvolgorde, deterministisch. Additief: de bestaande 1-D-sweep-API is ongewijzigd. Betrouwbaarheidsintervallen via bootstrap per knooppunt en generalisatie voorbij het klokpakket blijven op de roadmap.

  • Echte snapshot-RAIM (src/raim.rs). Echte Receiver Autonomous Integrity Monitoring in het positiedomein: het bouwt de zichtlijngeometrie naar de zichtbare satellieten, vormt de kleinstekwadratenoplossing en de residuen, voert een χ²-residutest voor foutdetectie uit (exacte drempel uit een afhankelijkheidsvrije onvolledige gamma-χ²/niet-centrale-χ²) en berekent hellinggebaseerde horizontale en verticale beschermingsniveaus (HPL/VPL) met de bias bij gemiste detectie afgeleid voor de ingestelde P_fa/P_md. Dit staat los van, en is nog niet gekoppeld aan, de integriteitsmaat van de scenariopipeline die de interne consistentie van het filter beoordeelt; foutuitsluiting, budgettering van alarmgrens/P_HMI en ARAIM blijven op de roadmap.

  • Suite voor frequentiestabiliteit: MDEV, TDEV, HDEV + betrouwbaarheidsintervallen (src/allan.rs). Naast de overlappende ADEV: de gemodificeerde Allan-deviatie (scheidt witte van flicker-faseruis), de tijdsdeviatie (TDEV = tau/sqrt(3) * MDEV) en de Hadamard-deviatie (onderdrukt lineaire frequentiedrift exact en convergeert voor divergente roodruistypen). Op χ² gebaseerde betrouwbaarheidsintervallen (deviation_ci) gebruiken een afhankelijkheidsvrij paar normaal/χ²-kwantielen (Acklam + Wilson-Hilferty) met een conservatieve niet-overlappende edf; ruistypespecifieke edf en numerieke pariteit met Stable32 blijven op de roadmap.

  • Reductie van referentiestelsels (src/frames.rs). Op GMST gebaseerde TEME↔ECEF-rotatie (met dezelfde IAU-1982-sterrentijd als de propagator), exacte geodetische WGS-84↔ECEF met een iteratieve inverse die met Bowring is gezaaid (machineprecisie op alle hoogten, ook MEO/GEO), en een geodetische waarnemer op een grondstation die azimut / elevatie / afstand teruggeeft in het lokale East-North-Up-stelsel. Poolbeweging en nutatie onder de boogseconde worden niet toegepast (alleen GMST, onder de kilometer op het grondspoor); een ITRF-nauwkeurige CIO-keten staat op de roadmap.

  • Fundament voor tijdschalen (src/timescales.rs). Een afhankelijkheidsvrije API voor Juliaanse datums (Gregoriaans burgerlijk ↔ JD, MJD), de volledige IERS-geschiedenis van gehele schrikkelseconden (UTC↔TAI, 10 s in 1972 tot 37 s sinds 2017), de gedefinieerde TAI→TT-offset, de UT1-correctie via een aangeleverde DUT1 en de IAU-2000 Earth Rotation Angle. Dit is het tijdsubstraat waarop de reductie naar aardvaste stelsels (gepland) rust. Tijdstippen zijn Juliaanse datums met één f64 (~50 µs resolutie rond het huidige tijdstip; een JD in twee delen staat op de roadmap), en het tijdperk vóór 1972 met rubberseconden wordt niet gemodelleerd; beide zijn in de module gedocumenteerd.

  • Reproduceerbaarheid en herkomst. Een deterministische CycloneDX-SBOM-generator (scripts/gen-sbom.sh) en een SLSA-bouwherkomstverklaring op het release-binaryprogramma en de SBOM; de release-toolchain is vastgezet zodat hij overeenkomt met CI. Garanties van determinisme, het platformoverschrijdende voorbehoud bij libm en de aanpak van het vastzetten van golden-waarden zijn gedocumenteerd in docs/REPRODUCIBILITY.md.

  • Eigenschapsgebaseerde tests en fuzztests (tests/property.rs). Deterministische gerandomiseerde tests (zonder nieuwe afhankelijkheid) toetsen invarianten over duizenden invoeren: de TLE- en scenarioparsers paniekeren nooit op rommel, niet-ASCII, gemuteerde of afgekapte invoer; TimeCfg::validate paniekeert nooit op NaN/inf/negatieve rasters; de TLE-checksum is consistent en betreft alleen kolom 69; rondgangen geodetisch↔ECEF en de TEME→ECEF-rotatie behouden de norm over de hele wereld en een brede hoogteband.

Gewijzigd#

  • Golden-tests leggen nu de kwaliteitsmaten veld voor veld vast voor de vier referentiescenario's (met een tolerantie die platformoverschrijdende libm-jitter opvangt), ter vervanging van de eerdere controles met alleen ongelijkheden, zodat een stille numerieke regressie meteen wordt opgemerkt.
  • schema_version in resultaatartefacten is verhoogd van 0.1 naar 0.7 (hij was bevroren terwijl de engine verderging).
  • cargo-deny weigert nu (waarschuwt niet bij) ingetrokken (yanked) afhankelijkheden.
  • Nieuwe documentatie: CAPABILITY.md (kaart van de eerlijke reikwijdte), SCHEMA.md (naslag van resultaatvelden), INTEGRITY.md, QUANTUM-MODELS.md, REAL_TLE_GUIDE.md. Een CI-controle faalt als de versiebadge in de README afwijkt van Cargo.toml.

0.7.0 - 2026-06-02#

Toegevoegd#

  • SGP4/SDP4-baanpropagatie. Een volledige, afhankelijkheidsvrije implementatie van de standaard propagator met vereenvoudigde verstoringen: SGP4 voor banen dicht bij de aarde samen met de deep-space-uitbreiding SDP4 (lunisolaire seculaire en periodieke verstoringen en geopotentiaalresonantie van 12 h / 24 h). Hij is getoetst aan de officiële verificatievectoren van AIAA 2006-6753 ("Revisiting Spacetrack Report #3"): alle 666 referentietoestanden in de gevallen dicht bij de aarde, deep-space, resonant en foutcodes komen overeen met een positiefout in het slechtste geval van ongeveer 4 mm. Dit is het model waartegen two-line element sets zijn gedefinieerd, zodat het echte constellaties weergeeft, met name de GNSS-banen van ~12 h, die deep-space en resonant zijn en die het eerdere tweelichamen + J2-seculaire model niet kan vastleggen.
  • Een constellatie die als volledige two-line element sets (regel 1 + regel 2) wordt gegeven, wordt nu gepropageerd met SGP4/SDP4; een constellatie die als elementen met alleen regel 2 wordt gegeven, behoudt de analytische Kepler-tweelichamenpropagatie, ongewijzigd. De twee vormen kunnen in één blok worden gemengd. Nieuw referentiescenario orbit-sgp4-gps.toml (een GPS-achtige MEO-constellatie in echt two-line-formaat, gepropageerd met SGP4); voeg een actuele Celestrak-set "gps-ops" toe om de actuele constellatie te bestuderen.

0.6.0 - 2026-06-02#

Toegevoegd#

  • Demonstrator voor actieve spoofing-aanvallen. Een nieuw scenariotype spoof injecteert een oplopende valse-tijd-spoof en draait de kloksteunende integriteitsmonitor van elke klok, en meldt of en wanneer de spoof wordt gedetecteerd en of hij de operationele specificatie ongedetecteerd bereikt, waarmee de kwaliteitsmaat Security een concrete aanvals-/verdedigingsdemonstratie wordt. Nieuw referentiescenario spoof-attack.toml.
  • Beschikbaarheid met meerdere constellaties. Een baanscenario kan meerdere constellaties combineren (een lijst [[constellations]] naast de primaire [constellation]) voor multi-GNSS-beschikbaarheid en verdunning van precisie, bijvoorbeeld GPS plus Galileo. Nieuw referentiescenario orbit-multignss.toml.

0.5.0 - 2026-06-02#

Toegevoegd#

  • HTML-scorecardrapport. Elke run levert nu ook een zelfstandige scorecard in HTML met huisstijl op: de samenvatting in één regel, de grafiek (ingebed als inerte data-URI-afbeelding) en de volledige JSON, door de CLI geschreven naast de JSON en SVG. Een deelbaar bestand in één stuk voor een studieresultaat of bijlage.
  • Gezamenlijke sensorfusieschatter. Een nieuw scenariotype fusion draait één recursief Kalman-filter als navigatieoplossing: het fuseert de klokstatus [phase, frequency] en de positiestatus [position, velocity], gestuurd door GNSS (dat de frequentie-offset en snelheid leert) en ondersteund door optische tijdoverdracht tijdens de uitval, in plaats van onafhankelijke voorspellers samen te stellen. Het geeft gefuseerde holdover voor tijdsynchronisatie en positie en een integriteit op basis van de gezamenlijke covariantie. Nieuw referentiescenario fusion-pnt.toml.
  • Uitgebreider IMU-ruismodel. De versnellingsmeter modelleert nu de overige Allan-variantietermen naast de constante bias en de snelheidsrandomwalk: biasinstabiliteit (een 1/f-flickervloer bij de standaard Allan-biasinstabiliteitscoëfficiënt, met hergebruik van de flickersynthese van de klok) en versnellingsrandomwalk. Nieuwe optionele velden bias_instability en q_aa voor inertiale scenario's; een nieuwe GNSS-positiebepaling kalibreert de resterende biasdrift opnieuw.
  • Echte constellatiegeometrie uit TLE's. Een constellatie kan via een veld tle als blok two-line element sets worden gegeven (het standaardformaat van NORAD/Celestrak), zodat beschikbaarheid en verdunning van precisie de gepubliceerde geometrie van een echte constellatie gebruiken in plaats van een synthetisch Walker-patroon. De engine leest de gemiddelde Kepler-elementen van elke TLE en propageert ze als tweelichamenprobleem, niet met SGP4, wat deugdelijk is voor een momentopnamestudie vanaf een gemeenschappelijk tijdstip. Nieuw referentiescenario orbit-real-tle.toml.

0.4.0 - 2026-06-02#

Toegevoegd#

  • Parametersweeps voor afwegingsstudies. Een nieuw scenariotype sweep varieert één parameter (threshold_ns, duration_s, quantum_q_wf of classical_q_wf) over een lineair of logaritmisch bereik en legt op elk punt voor beide klokken een gekozen kwaliteitsmaat vast, wat de vergelijkingsgrafiek "hoe schaalt holdover met klokstabiliteit?" oplevert die een ontwerpafweging nodig heeft. Nieuw referentiescenario sweep-clock-stability.toml.
  • Monte Carlo-betrouwbaarheidsbanden. Het scenario voor klok-holdover kan veel realisaties draaien (nieuw optioneel veld runs): elke kwaliteitsmaat wordt dan gerapporteerd als gemiddelde met een spreiding tussen het 5e en 95e percentiel, en de grafiek arceert de foutenvelop van 5–95% rond de mediaan voor elke klok. Eén run blijft de standaard. Nieuw referentiescenario clock-ensemble.toml.
  • Excentrische banen en J2-drift. Het baantype is nu een volledige Kepler-baan (halve lange as, excentriciteit, inclinatie, RAAN, argument van perigeum, gemiddelde anomalie), gepropageerd door de vergelijking van Kepler op te lossen, met optionele seculaire J2-knoopregressie en apsidenprecessie. Nieuwe optionele scenariovelden eccentricity, argp_deg en j2, en een referentiescenario orbit-molniya.toml (een gebruiker op een sterk excentrische baan met kritieke inclinatie van 12 h). Cirkelbanen behouden het oorspronkelijke pad in gesloten vorm bit voor bit.
  • Het hybride pakket (gecombineerde PNT) geeft nu Integriteit en Security weer, zodat alle vier de pakketten de volledige set operationele kwaliteitsmaten dekken. Integriteit is de insluiting binnen de beschermingsgrens van het tijdsynchronisatiekanaal, afkomstig van een Kalman-schatter die op de referentie wordt gestuurd zolang GNSS nominaal is en (losser) opnieuw wordt verankerd bij elke optische hersynchronisatie; de grens omvat de meetruisvloer van de link, zodat een klok die veel beter is dan de link wordt beoordeeld aan de werkelijke ruis van de geleverde oplossing. Security is de score voor kloksteunende spoofdetectie ten opzichte van de tijdsynchronisatiespecificatie.

Gewijzigd#

  • Releasenotes worden nu gegenereerd uit de samengestelde sectie CHANGELOG voor de tag (scripts/changelog-extract.sh), zodat elke GitHub-release laat zien wat er is veranderd in plaats van ruwe commits op te sommen.

0.3.0 - 2026-06-02#

Toegevoegd#

  • Kwaliteitsmaat Security (voorheen niet ingevuld): een score voor kloksteunende spoofdetectie voor de pakketten voor klok-holdover en baan. Hij modelleert een integriteitsmonitor die over een coherent venster de uit GNSS afgeleide tijd vergelijkt met de eigen uitgelopen voorspelling van de klok; de detectievloer combineert de gemiddelde meetruis met de uitloponzekerheid van de klok, zodat een stillere klok kleinere, tragere tijdspoofs detecteert. De score wordt gerapporteerd in [0, 1] ten opzichte van de tijdsynchronisatiespecificatie, waarmee de zes operationele kwaliteitsmaten compleet zijn.
  • Uit de geometrie afgeleide positienauwkeurigheid voor het baanpakket: uit de zichtlijngeometrie naar de zichtbare satellieten vormt het de ontwerpmatrix en haar covariantiefactor Q = (HᵀH)⁻¹, wat de verdunningsfactoren van precisie oplevert (GDOP/PDOP/HDOP/VDOP/TDOP). Positienauwkeurigheid is de positie-DOP geschaald met een instelbare gebruikersequivalente afstandsfout (nieuw optioneel scenarioveld sigma_uere_m). Een baanresultaat bevat nu een geometriesamenvatting (fractie van de samples met een positiebepaling, beste en mediane PDOP en positiesigma).
  • Een playground in de browser (web/) die de engine aan de clientzijde als WebAssembly draait: kies een referentiescenario of bewerk de TOML, voer het uit en bekijk de samenvatting, de grafiek en de volledige JSON, zonder dat er iets wordt geüpload. Een workflow pages bouwt en publiceert hem op GitHub Pages, en een nieuwe WebAssembly-export summary ondersteunt de weergave.
  • Gelabelde y-assen op de SVG-grafieken: rasterlijnen, numerieke ticklabels en een astitel met eenheden (via een gedeelde helper chart), zodat grootheden leesbaar zijn.
  • Publicatieworkflow voor pakketten (publish) voor crates.io, PyPI en npm, elk afhankelijk van zijn registertoken en geactiveerd door een gepubliceerde release.

0.2.0 - 2026-06-02#

Toegevoegd#

  • Flicker-FM-vloer (1/f) voor het klokfoutmodel, gesynthetiseerd als som van logaritmisch gespreide Ornstein-Uhlenbeck-processen en zo gekalibreerd dat de vlakke Allan-deviatievloer op een instelbaar niveau ligt. Standaard uit; per klok in te schakelen via het optionele scenarioveld flicker_floor.
  • Gyrokanaal voor het inertiale model: resterende gyrobias en hoekrandomwalk veroorzaken een attitudefout (kanteling) die de zwaartekracht koppelt aan een horizontale fout in de specifieke kracht, het dominante foutgroeimechanisme van strapdown. Standaard uit; per sensor in te schakelen via de optionele velden gyro_bias en q_arw.
  • Kalman-klokschatter met twee statussen (fase, frequentie) met exacte discretisatie van procesruis volgens van Loan. Uitlopen vanuit een bekende toestand reproduceert de analytische groei van de holdoverfout (q_wf*T + q_rw*T^3/3) exact, en het filter levert bovendien een online onzekerheidsgrens van 1 sigma.
  • De klokrun geeft nu de kwaliteitsmaat Integriteit weer (voorheen niet ingevuld): het aandeel uitvalsamples waarvan de fout binnen de beschermingsgrens van 3 sigma van het filter blijft, weergegeven in het JSON-resultaat en de CLI-samenvatting.
  • Uit de geometrie afgeleide GNSS-beschikbaarheid: propagatie van cirkelbanen, een Walker-delta-constellatiegenerator en zichtlijnzichtbaarheid (aardocclusie plus elevatiemasker) leveren de beschikbaarheidstijdlijn uit echte baangeometrie. Nieuw scenariotype orbit en het referentiescenario orbit-gnss-challenged.toml (een ruimtevaartuig binnen de GNSS-schil met onderbroken dekking).
  • Optionele Python-extensie (PyO3, abi3) die run, run_full en version beschikbaar stelt, verpakt met maturin (pyproject.toml) en door een workflow wheels op release-tags gebouwd voor Linux, macOS en Windows. De binding is een optionele afhankelijkheid achter een feature-vlag: de standaardbuild, de tests en de poort voor afhankelijkheidsaudits worden niet beïnvloed.
  • Optionele WebAssembly-module (wasm-bindgen) die run, chart_svg en version beschikbaar stelt, gebouwd met wasm-pack onder de feature wasm; getrandom is per doelplatform afgeschermd zodat op wasm32 de entropiebron van de browser wordt gebruikt.
  • Gedeelde dispatch api::run_toml die de CLI en beide bindings gebruiken, zodat de opdrachtregel en de bindings niet uiteen kunnen lopen.

Gewijzigd#

  • Holdover-scoring is nu segmentbewust: uitvaltijdlijnen worden bij GNSS-heracquisitie in aaneengesloten segmenten verdeeld, en de gerapporteerde holdover is de uitloop in het slechtste geval (de kortste) over die segmenten. Scenario's met één uitval zijn ongewijzigd. Geldt voor de scorers voor klok, inertiaal en hybride.
  • De gerapporteerde kind van het inertiale model is nu inertial (was accelerometer), wat de gecombineerde kanalen van versnellingsmeter en gyro weerspiegelt.

0.1.0 - 2026-06-01#

Eerste release.

Toegevoegd#

  • Deterministische simulatie-engine voor hybride kwantum/klassieke PNT: een gemeenschappelijke foutmodelinterface, declaratieve GNSS-beschikbaarheidsscenario's, schatters voor holdover / dode rekening en scoring van kwaliteitsmaten aan de standaard operationele PNT-criteria. Resultaten zijn reproduceerbaar uit scenario + seed + engine version (versiebeheerde, zelfbeschrijvende JSON met een scenariohash) en worden weergegeven als SVG-grafieken. De CLI roept scenario's aan op kind.
  • Vier sensorpakketten, elk gekalibreerd op gepubliceerde data en getoetst aan de standaardrelatie:
    • Klok-holdover: witte FM, random-walk-FM en lineaire veroudering; getoetst met de overlappende Allan-deviatie (Riley, NIST SP 1065). Atoomklok op chipschaal versus optische strontiumroosterklok.
    • Inertiale dode rekening: resterende bias + snelheidsrandomwalk, tweemaal geïntegreerd tot positiefout; getoetst aan de foutgroeirelaties van Groves. Koude-atoomversnellingsmeter versus versnellingsmeter van navigatiekwaliteit.
    • Tijdoverdracht: tijdsynchronisatiejitter van optische versus RF-link → synchronisatieprecisie → eenwegafstandsmeting.
    • Hybride fusie (slotstuk): een gecombineerde PNT-suite die zowel tijdsynchronisatie als positie moet vasthouden, met optionele klokondersteuning door optische tijdoverdracht tussen satellieten.
  • Eén gedocumenteerd referentiescenario per pakket onder scenarios/, waarbij elke numerieke parameter een peer-reviewde provenance draagt.
  • Controles op reproduceerbaarheid en repositoryhygiëne; CI (opmaak, clippy, tests, controles, MSRV) en een door tags geactiveerde releasepipeline die alle controles opnieuw uitvoert.
  • Documentatie: README met architectuurdiagrammen, validatiestatusrapport, bijdragergids, beveiligingsbeleid en gedragscode; Apache-2.0-licentie; sjablonen voor issues/PR's en Dependabot-configuratie.
  • Overal leveranciersneutraal; peer-reviewde wetenschappelijke en metrologische bronvermeldingen blijven behouden.
  • Hygiëne van de Apache-2.0-licentie: SPDX-headers op alle bronbestanden, een NOTICE met merkvermelding, ondertekening volgens het Developer Certificate of Origin (DCO) voor bijdragen, en afdwinging van licenties en advisories van afhankelijkheden door cargo-deny in CI.
  • Open-core-positionering (README): een gratis Apache-2.0-engine plus beschikbare commerciële ondersteuning, integratie en eigen uitbreidingen van Ashforde OÜ, gedragen door diensten en niet door licentieopbrengsten.
  • CITATION.cff zodat de software kan worden geciteerd.