Ändringslogg
Alla anmärkningsvärda ändringar i Kshana dokumenteras här.
Formatet bygger på Keep a Changelog, och det här projektet följer Semantic Versioning. Så länge projektet är före 1.0 kan det publika schemat för scenario och resultat fortfarande ändras; brytande ändringar anges uttryckligen.
Oreleaserat#
[0.40.0] - 2026-10-29#
0,40 lägger till uppdragsflödet i Artemis-klass och dess månsegment, en evidensetikett på varje siffra och tabell som en körning skriver, inläsning och anpassning av uppmätta klockor, en kontroll av bidrag från datapartner, ett uppskattat sändarområde utifrån ADS-B- eller AIS-rapporter, omkampanjen 0,40 för benchmark, samt kommandoraden, rapporterna och Studio på sjutton språk vid sidan av engelska (maskindokument förblir på engelska). Verifieringsmatrisen växer från 388 till 401 rader: 176 VALIDATED (oförändrat), 221 MODELLED (tidigare 208) och 4 PARTNER. Ingen rad lyftes till VALIDATED. Scenariotyperna växer från 87 till 92. Varje tröskel som en förhandsregistrerad jämförelse missade redovisas nedan och förblir fastlåst; ingen luckrades upp. Det rådgivande utlåtandet är oförändrat: Kshana är rådgivande programvara, inte typgodkänd navigationsutrustning och inte en certifiering; operatören är fortsatt ansvarig.
Kända begränsningar#
- Körningar på andra språk än engelska tar ungefär dubbelt så lång tid, eftersom scenariot körs två gånger (en gång på engelska för maskinfilerna, en gång på det valda språket för personen).
- Vissa meningar i Studio sätts ihop av fragment och kan sakna artiklar på språk med grammatiskt genus.
- Översättningarna är maskinöversättningar som ingen modersmålstalare har granskat; engelska är referensen.
Tillagt#
- Sjutton språk vid sidan av engelska för motorns text riktad till människor samt webbplatsen och Studio: nl, pl, pt-BR, pt-PT, fi, sv, da, nb, cs, uk, ru, de, fr, es, et, ja, zh-Hans (
--lang,KSHANA_LANG, språkvariablerna;langi anropen mot biblioteket, Python, WebAssembly och MCP). Meddelanden och fel på kommandoraden, körsammanfattningar, diagramtext,report.html, beskrivningar av typer och de rådgivande uttalandena är översatta; maskindokument (JSON, CSV, felkoder, verifieringsmatrisen) förblir på engelska, och en körning på ett annat språk än engelska kör scenariot en gång på engelska för maskinfilerna och en gång på det valda språket för personen (docs/i18n.md). Översättningarna är maskinöversättningar som inte har granskats av modersmålstalare; engelska är referensen; varje språksREVIEW.mdlistar vad en granskare bör kontrollera först, och webbplatsens sidor bär ett meddelande som säger detta. Utfallsord, evidensnivåer och omfattningen av det rådgivande uttalandet ("inte typgodkänd", "inte en certifiering", "operatören är fortsatt ansvarig") behålls på alla språk. kshana interference-map locate: ett uppskattat sändarområde utifrån ADS-B- eller AIS-rapporter. En posterior över var en källa till försämrade positionsrapporter kan finnas (radiosikt på en 4/3-jordradie, sändarantennens höjd och effekt marginaliserade, påverkade flygplan som drar och opåverkade flygplan med sikt som trycker emot), skriven som områden på 50, 90 och 95 %, en tyngdpunkt med sin osäkerhetsellips (aldrig en enskild punkt), sessioner i tid (start, slut, varaktighet, påverkad yta, skilda flygplan över publiceringsminimum), en profil över dygnet och timmar per dag, med valfri fusion av en TDOA-positionsbestämning frångeolocation. Utdata: GeoJSON, JSON-sammanfattning, sessioner som CSV och en SVG-figur, var och en med licens, tillskrivning, metod-id, antaganden, begränsningar och sin evidensetikett. Bibliotekinterference_map::api::emitter_regions_from_*, Python och WebAssemblyinterference_emitter_regions. MODELLED (registerradVM-bc70cb57; matrisen har nu 401 rader, 176 VALIDATED, 221 MODELLED, 4 PARTNER); kalibrerad enbart på syntetiska data, med jämförelsen mot sändarplatserna i Jammertest 2025 förhandsregistrerad och körd en gång: ADS-B och AIS båda NOT ASSESSABLE (för få schemalagda sessioner i öppna data), så raden förblir MODELLED (docs/emitter-region/RESULTS.md). Neutral formulering, endast aggregerat; publicering av sändarområden i det publika observatoriet förblir avstängd. Ett syntetiskt exempel finns iexamples/emitter-region/(docs/INTERFERENCE-MAP.md).- Uppmätta klockloggar.
src/clock_log.rsläser in en uppmätt klocklogg som en fasserie: åtta format (RINEX clock, TimeLab, TICC, linuxptpptp4l,phc2sysochts2phc, chrony tracking och statistics), var och en en dokumenterad delmängd; allt utanför den avvisas med ett fel som namnger vad som hittades. Den används avtelecom-timing([series.clock_log]) och klocktypen ([clock_log], som lägger till ett blockmeasuredmed loggens SHA-256 och de överlappande ADEV, TDEV och MTIE), med det medföljande scenariotclock-measured-log(docs/CLOCK-LOG-FORMATS.md). Jämförd med allantools på verkliga offentliga data mot trösklar som fastställts i förväg: den första körningen missade B1 (5 av 11 fall, alla TICC-tidsstämplar lagrade somf64), B2, B3 (7 av 24 fall) och B4 (rubrikens version kontrollerades inte); efter rättelserna nås B1, B3 och B4 och B2 nås utom för ett MTIE-par, som är fastlåst och inte är ett motorfel (allantools 2024,6 tar bort medelfrekvensen innan det integrerar; mot dess MTIE i fasläge stämmer motorn inom 1e-10). Raden förblir MODELLED (tests/fixtures/clock_log_real/RESULTS.md). - En holdover som styrs av en anpassad uppmätt serie: klocktypens
[clock_fit]anpassar bruset i en uppmätt serie och styr holdovern med det (src/clock_fit.rs, medföljande scenarioclock-fitted-log). Jämförelse som fastställts i förväg: F1(b), F3 och F4 nåddes; F1(a) (återfinna den registrerade slumpvandrings-FM) NOT MET på C3-posterna (inte identifierbar till sin konstruktion) och på två av tre C4-poster (slumpvandrings-FM absorberad av flicker-FM och drift); F2 (identifiering av brus mot allantools) nåddes på elva av tolv poster och D3 och NOT MET på D2 som registrerat (nåddes på lika villkor). Alla missar är fastlåsta (tests/clock_fit_known_noise.rs); blocketfittedoch den holdover som styrs av det förblir MODELLED (tests/fixtures/clock_fit/RESULTS.md). - Omkampanjen 0,40 för benchmark, förhandsregistrerad med ägarens godkännande före varje körning: A3 (EXPLORATORY, den mappklustrade bootstrap-AUC för
agc_k_sigma, 2,5 %-kvantil 0,8502 mot 0,80), D3 (EXPLORATORY, tre av fem detektorer överstiger ett optimismgap på 0,05 vid skala 0,25), R3 (AUC 1,0) och R4 (P_fa 0,0, P_d 1,0): alla MET, alla MODELLED. A2, D1 och R1 är orörda och förblir NOT MET; ingenting här stänger dem (xval/bench/RESULTS-0.40.md, Bench). kshana partner check <submission.toml>: kontrollerar format och metadata i ett bidrag från en datapartner (kshana.partner-submission/1: enhet, datafil och SHA-256, hur den togs, de MODELLED-rader den erbjuds mot, licens, uttalanden) och läser data med motorns egna läsare för klocklogg eller IMU. Den poängsätter ingenting och validerar ingenting. Ett syntetiskt exempel finns iexamples/partner-submission/.docs/PARTNER-DATA.md: vilka MODELLED-registerrader uppmätta data kan lyfta, vilka format som accepteras, hur ett bidrag kontrolleras, poängsätts mot en tröskel som fastställts i förväg och tillgodoräknas, och vad PARTNER och VALIDATED vardera betyder; ett utkast till ett kontaktbrev åt ägaren idocs/drafts/PARTNER-OUTREACH.md(ingenting skickas).- Andra kampanjer för tröskeln som inte nåddes för
gnss-ssvochlunar-infrastructure, körda enligt förhandsregistreringen (xval/gnss-ssv/PREREGISTRATION-v2.md,xval/lunar-infra/PREREGISTRATION-v2.md; godkända före varje körning). Varje ursprunglig miss förblir NOT MET och fastlåst.gnss-ssv: kontrollen återger körning 1 cell för cell; fem ablationer med en enda avläsning för 2 av de 78 missade cellerna inom toleransen (EXPLORATORY, ingen tröskel); den nya tröskeln S7b (en sändarform med avrullning och golv anpassad på Classic IIR-paneler) är NOT MET på IIR-M-panelerna vid 3,83 till 3,95 dB mot 3 dB; kampanjen med undanhållen publicerad mottagning kördes inte (ingen källa fastlåst) (xval/gnss-ssv/RESULTS-v2.md).lunar-infrastructure: de nya trösklarna C3a, C3b (en detektionsgräns på omkring 3e-9 m/s2), Q3a, Q3b (en exakt normalfördelningsfunktion tar bort skillnaden på 1.7e-6) och G3'' nås som sina egna trösklar, och G3' med illustrativa a priori-fördelningar nås och märks EXPLORATORY (xval/lunar-infra/RESULTS-v2.md). Allt förblir MODELLED. Nya publika poster:kshana::lambda::{erfc_accurate, normal_cdf_accurate, bootstrap_success_rate_accurate}. - En evidensetikett på varje siffra och tabell som en körning skriver. Resultat-JSON har en nyckel
evidence, diagrammets SVG ett metadataelement och en rad under diagrammet, och CSV-tabellen# evidence:kommentarsrader: nivån (VALIDATED,MODELLEDellerPARTNER, den svagaste av raderna) och id:na för de rader i verifieringsmatrisen som körningen vilar på. Rader och statusar läses från matrisen, inte inskrivna; id:na är stabila (VM-och åtta hexsiffror, en ny kolumnIDidocs/VERIFICATION-MATRIX.md, en frusen lista itests/fixtures/evidence_ids.txt). Också på receiver-trust,jammertest score,iq acquire/sweep/track/monitor, rapporten om ruttexponering och, inuti den signeradeconfig.json, varje bevispaket (config_version1,1;kshana evidence verifyredovisar nivån; paket som gjorts före 0,40 verifieras oförändrat).tests/evidence_labels_doc_sync.rsmisslyckas om en siffra saknar etikett, om en etikett avviker från matrisen eller om en ny filskrivare varken är märkt eller förtecknad med ett skäl. Utdata som saknar etikett förtecknas idocs/SURFACES.md. De tre demodiagrammen i README renderades om med etiketten (om den tas bort återställs de gamla byten;docs/revisions/STUDIO15-evidence-label-0.40.md). Inget påstående ändrades. - Scenariotypen
mission-thread(scenarios/mission-thread-artemis-class.toml,docs/MISSION-THREAD.md): felbudgeten för navigering och tidssynkronisering för en kedja av faser från uppskjutning till återinträde, varje tal MODELLED och varje indata angiven. Åtta fastyper:launch-ascent,leo-rendezvous(relativ Clohessy-Wiltshire-kovarians över sensorsträckor, dockningsfönster),tli-and-cruise(Cowell-propagering med en tillståndsövergångsmatris av finita differenser, brännfel,gnss-ssvoch uppdateringar från markspårning, månen från ett valfritt utsnitt av en DE440-kärna),entry(sigma för banvinkeln, korridorsannolikhet, maximal retardation vid korridorkanterna, landningsområde) och de fyra månetyperna. Överlämningsregler (carry,inflate,reacquire), omvandlingar av referenssystem och tidsskalor som egna budgetrader, ett valfritt överlägg för markstationsnät som anger varje fas spårningsdrift, marginalen mot angivna krav och den svagaste länken. Exemplet följer sekvensen i en offentlig presentation om driftkoncept från NASA med ILLUSTRATIVE tal: ett helt Artemis-klassexempel över 11 faser, jord- och månsegment. Propageringen i cislunart rum jämfördes med den offentliga banan för Artemis I över en båge på 72 h mot en tröskel som fastställdes ixval/mission-thread/PREREGISTRATION.mdföre körningen: NOT MET (45,3 km och 0,25 m/s mot 5 km och 0,05 m/s). Diagnostiken placerar missen i fem små impulsiva händelser i referensen; mellan dem återger kraftmodellen timtillstånden med en median på 0,4 m. Raden förblir MODELLED (xval/mission-thread/RESULTS.md). - Månsegmentet i uppdragsflödet i Artemis-klass: fyra scenariotyper, var och en också en fastyp i gränssnittet
mission-thread(src/mission_thread/lunar/), alla MODELLED.lunar-orbit-rendezvous: relativ navigering till dockning i en cirkulär polär bana på 100 km eller en elliptisk polär på 100 km gånger 3000 km (scenarios/lunar-orbit-rendezvous.toml,...-elfo.toml). En Gauss-Newton-skattning i satser över bågen sammanför en absolut positionsbestämning per fordon från en illustrativ reläuppsättning i LCNS-klass, ett bestående signalfel i rymden (gemensamt för båda fordonen och oberoende) och ett avstånd över länken mellan fordonen, under cratens månkraftmodell. Den redovisar relativ position och hastighet i målets lokala axlar, tillgängligheten för positionsbestämning, det genomsnittliga normaliserade kvadratiska skattningsfelet mot sitt förväntade värde, kostnaden för att bortse från gravitationsharmonikerna, modellerna för den relativa sensorn i slutskedet bredvid siffran enbart med signaler, och den överlämnade 6x6-kovariansen.lunar-descent: budgeten för landningsspridning vid en plats nära sydpolen (scenarios/lunar-descent.toml;lunar-descent-lola.tomlläser LOLA-DEM från en utcheckning): en inertiell felmodell med fem tillstånd per axel, en AFS-positionsbestämning (fristående eller differentiell, med korrektionslänkens residual frånlunar-differential-pnt), en terrängrelativ positionsbestämning (matcharenterrain-navpå sitt syntetiska relief, eller Cramer-Rao-gränsen för matchning mot LOLA-DEM) och månens tid via fordonets klocka (lunar-time-offset). Den redovisar 3-sigma-landningsellipsen, varje kombination av stöd och en Monte Carlo-kalibrering av ellipsen.lunar-surface: tillgänglighet för positionering och tidssynkronisering per plats och årstid (scenarios/lunar-surface.toml;lunar-surface-terrain.tomllägger till LOLA-horisonten framräknad med strålmarsch): positioneringssiffran för en enda plats är lika medmoonlight-service-volumes, bit för bit; synligheten för jorden och solen från de analytiska efemeriderna är det som varierar med årstiden.lunar-ascent: stigningen till rendezvousbanan och kovariansen för position och hastighet som förs tillbaka till banan (scenarios/lunar-ascent.toml), med spridningen vid motoravstängning redovisad bredvid.docs/MISSION-THREAD-LUNAR.md; förhandsregistreringen, dess tillägg och varje resultat, missar inräknade, ixval/mission-thread-lunar/.
Evidens#
- Förhandsregistrerad i
xval/mission-thread-lunar/PREREGISTRATION.mdföre varje körning, med sex daterade tillägg (vart och ett gjort innan data hämtades, utom tillägg 6, som rättar ett aritmetiskt fel i ett tillståndsantal efter hämtningen och före varje A2-resultat; varje tillägg redovisas i filen). Ingen tröskel luckrades upp. - A1 (propagatorn mot den rekonstruerade LRO-banan från JPL Horizons, 24 h): MET, en största 3D-skillnad på 33 m mot en tröskel på 500 m och en radiell RMS-skillnad på 2,4 m mot 60 m.
- A2 (samma propagator mot CAPSTONE NRHO över ett varv på 6.5 dygn): NOT MET, en skillnad i slutposition på 136,8 km mot en tröskel på 25 km och en skillnad i oskulerande periapsisradie på 28,4 km mot 10 km. Raden förblir MODELLED, och missen är fastlåst av
tests/mission_thread_lunar_oracles.rs. - B1 (rendezvousskattningens konsistens med sin egen modell) är MET på den fjärde skattarutformningen, genomsnittlig NEES 5,85 till 5,93 mot ett band på [5,2, 6,8]; de tre tidigare utformningarna, ett utökat Kalmanfilter i tre varianter, missade den. En femte ändring, gjord sedan det levererade scenariot på 2 h visade sig skicka 4 av 50 försök in i ett lokalt minimum (genomsnittlig NEES 1e9), kör Gauss-Newton-anpassningen på en växande båge med stegfyrdelning; B1 påverkas inte av den och de levererade scenarierna ger 6,51 och 6,33. Historiken finns i
xval/mission-thread-lunar/RESULTS.md. - Ingenting här är VALIDATED: raderna med oberoende referens testar den delade propagatorn, inte något navigeringsfilter, någon signal eller budget.
[0.39.0] - 2026-10-22#
Inga nya funktioner: en rättning i kommandoraden, beroendeuppdateringar i verktygen för korsvalidering och dokumentation. Motorns resultat är oförändrade från 0.38.0.
Rättat#
- Kommandoraden avslutas tyst med status 141 när dess standardutdata stängs (
kshana kinds | head), i stället för att krascha med "failed printing to stdout: Broken pipe". 141 är 128 plus SIGPIPE, den status ett skal rapporterar föryes | head. Endast ett stängt rör hanteras: en full disk eller något annat skrivfel rapporterar fortfarande sig självt, och ett levande flöde som skriver till ett stängt uttag får fortfarande sitt skrivfel.tests/cli_closed_pipe.rsstänger läsaren innan programmet startar, så den första skrivningen misslyckas vid varje körning.
Säkerhet#
En beroendeuppdatering i det levererade biblioteket (den första posten), resten i verktygen för korsvalidering (xval/).
p256,p384ochp5210,13 till 0,14 (medelliptic-curve0.14.3,ecdsa0.17.0 ochcrypto-bigint0.5.5 till 0.7.10; även det direkta beroendetcrypto-bigint, nu 0,7) åtgärdar RUSTSEC-2026-0387, tidsvariation icrypto-bigint0.5.5. Kshana använder dessa crates bara för att verifiera publika signaturer (rotnyckeln för Galileo OSNMA och tidsstämpeltoken enligt RFC 3161) och signerar bara i tester med engångsnycklar, så den praktiska exponeringen var noll; uppgraderingen tar bort varningen utan en ignorera-post. Bibliotekets och MCP:s låsfiler flyttas båda; inget verifieringsresultat ändras (vektortesterna för OSNMA och tidsstämplar klarar sig oförändrade).- Lägsta Rust-version som stöds är nu 1,88 (krävs av korrigeringen för RUSTSEC-2026-0387).
memmap20.9.10 till 0.9.11 (RUSTSEC-2026-0186) i låsfilerna för ANISE-korskontrollen (xval/anise-lunar-od,xval/anise-mars-od); låsfilerna synkar också om sökvägsberoendetkshanai repositoryt.pillow12.3.0 till 13.0.0 ochcertifi2026.7.22 till 2026.10.19 i fastlåsningarna för referensmiljön (xval/oracles/requirements.lock,requirements.frozen.txt): de korrigerade versionerna för åtta pillow-säkerhetsmeddelanden och ett certifi-säkerhetsmeddelande.
Dokumentation#
docs/BENCH.md, README och den här filen listar varje kshana-bench-tröskel som är NOT MET, så som den är registrerad ixval/bench/RESULTS-v2.md: A2 (agc_k_sigmaAUC 0,766 mot minst 0,80 på testdelningen), D1 (största glapp 0,0301) och uppgift (b) R1 (överförd, inte körd om). Ingen tröskel har lättats.- Genomgång av README:ns fullständighet: en innehållsförteckning; scenariotyperna ordnade under familjer, var och en med en sida under
docs/kinds/by-kind/(motorns beskrivning och fält, indata och resultat från en exempelkörning, registerraderna och de oberoende referenserna, de begränsningar som körningens rapport anger och diagrammet som motorn skriver), ett översiktsblad per familj, alla indexerade avdocs/KINDS.md; varje kommando idocs/COMMANDS.md; varje yta, insticksmodulskommando, färdighet och Studio-sida idocs/ALL-SURFACES.md; varje förmågedomän idocs/CAPABILITY-DOMAINS.md; inbäddade Mermaid-diagram (systemöversikt, ytor, inre slinga, receiver trust, laboratorieringlopp, Studio, test- och releaseflöde, modulkarta, distribution). Skrivet avtools/gen_kinds_index.py,tools/gen_readme_blocks.pyochtools/gen_figures_038.py; granskat avtools/readme_audit.py; bevakat avtests/readme_completeness_doc_sync.rs, som också låser varje posts beskrivning och fält mot motorn. tools/render-diagram-chromium.sh: renderar ett Mermaid-diagram till SVG och PNG på Linux och uppdaterar renderingsposten.- README: figurerna för rymdanvändare och månen använde sökvägar relativa till
docs/, så de lästes inte in från README; en länk pekade på../../docs/JAMMERTEST.md. - Två föråldrade handkopierade diagramfiler togs bort (
docs/assets/clock-ensemble-band.svg,sweep-clock-stability.svg) som ingen sida använde och som inte längre stämde med motorn;docs/KINDS.mdbär de aktuella diagrammen.
[0.38.0] - 2026-10-19#
Tillagt#
- GNSS bortom konstellationen (
gnss-ssv). En ny scenariotyp för rymdfarkoster ovanför, runt och bortom GNSS-banorna (docs/SSV.md): tillgänglighet för en och fyra signaler, avbrottstider, C/N0, DOP samt huvudlob mot sidolobslänkar för GPS, GLONASS, Galileo, BDS, QZSS och NavIC på ett skal eller längs banor i LEO, MEO, GEO, HEO och månöverföring; sändarmönster från häfte, parametriska eller användarlevererade; en modell av limbstrålar för jonosfär, plasmasfär och atmosfär; en utformning av en mottagare för svaga signaler; ett utvidgat Kalmanfilter för GNSS ombord för HEO och månöverföring; samt relativ navigering i formation. Jämfört med ICG:s häfte om Space Service Volume under en förhandsregistrering incheckad före körningen: konstanterna för minsta utstrålade effekt och månens tröskel stämmer, de andra trösklarna är inte uppfyllda under den förhandsregistrerade läsningen (nästan alla på grund av häftets inkonsekventa stråle-vinkel för GLONASS), och den parametriska sidolobsersättningen återger inte de uppmätta GPS-panelmönstren. Allt förblir MODELLED (xval/gnss-ssv/RESULTS.md). - Månbana och månyta som navigations- och geodetisk infrastruktur (
lunar-infrastructure). En ny scenariotyp med fem studier valda medstudy(docs/LUNAR-INFRASTRUCTURE.md): konsistens hos en banbestämning ombord med Jord-GNSS i en nästan rätlinjig halobana mot en oberoende bestämning från marken med avstånd och avståndshastighet; gemensam dubbeldifferentierad bärvågsfas mellan ytstation och omloppsfarkost med heltalsfixering enligt LAMBDA; Fisher-information för månens datum med sju parametrar med och utan avstånd mellan omloppsfarkost och yta; avvikelser mellan tekniker för GNSS, VLBI och laseravståndsmätning mot den lokala kopplingen; samt känslighet för h2, k2, l2 och den fysiska libration. MODELLED, med ILLUSTRATIVE indata: numeriken kontrolleras mot oberoende numpy- och scipy-program, och inget jämförs med en mätning av någon månstorhet. Trösklarna fastställdes ixval/lunar-infra/PREREGISTRATION.mdoch två redovisade ändringar. Tre är NOT MET och var och en är fastlåst av ett test som hävdar missen: C3 (ett injicerat kraftfel upptäcks inte med den förhandsregistrerade frekvensen), Q3 (den bootstrappade framgångsfrekvensen skiljer sig från numpy-referensen med 1.7e-6 mot en tröskel på 1e-9, från LAMBDA:s normalfördelningsapproximation) och spårhalvan av G3 (att lägga till en avståndsfamilj sänker inte alltid spåret av pseudoinversen). Resten är uppfyllda (xval/lunar-infra/RESULTS.md). - En sjätte artikel i forskningstabellen. "Cislunar navigation is an observability problem: arc-length thresholds, Gramian conditioning, and the Doppler lever" (arXiv:2610,23871, eess.SP) visar att dilution of precision är odefinierat för cislunär spårning med enbart avstånd och använder i stället observerbarhetsgramianen på fyra plana avlägsna retrograda banor: enbart avstånd har rang 2 av 4 i ett ögonblick och behöver en båge på cirka 2,09 h, avståndshastighet (Doppler) ger rang 4 omedelbart, och samuppskattning av en station med satellittillstånd och klockor förblir rangdefekt med ett utan en extern interferometrisk observabel. Dess tal regenereras av typen
cislunar-observability(kshana scenarios/cislunar-observability.toml);cislunar-arc-recoverytestar tröskeln med en oberoende skattare. README:ns forskningskort, README-filerna för crates, npm och PyPI samt generatorn bär den. - Den neutrala domaren, gjord mätbar.
kshana jammertest importläser den publicerade NPRA Jammertest-katalogen och sändningsplanen som schemalagd referens (katalog-id:n bevarade) ochkshana jammertest scorepoängsätter en mottagarlogg mot den per test (detektionsfördröjning, missade larm, falsklarm, tid till återhämtning), som tillval som ett signerat bevispaket (docs/JAMMERTEST.md). Poängsättningens trösklar förhandsregistrerades före varje poängsatt körning (xval/jammertest-score/). På datamängden JammerTest 2024 (hämtad, aldrig medföljande) misslyckades den förhandsregistrerade regeln om minsta datamängd både i den första körningen och i revisionen av datahanteringen, så ingen tröskel kan bedömas och inget görs gällande; båda körningarna är registrerade och fastlåsta. MODELLED: schemat är datamängdens loggade fönster, inte registrerade sändningstider. NMEA-uppsättningen från SimulaMet 2025 är inte anpassad (ingen licens angiven på dess sida). - Mottagarens egna flaggor, bredvid Kshanas. UBX-NAV-STATUS
spoofDetStateoch UBX-SEC-SIG läses in iself_reportvid varje epok, och jämförelsenreceiver_self_reporti resultatet ställer dem mot Kshanas övervakare (båda, endast mottagaren, endast Kshana, ingen); den ger inget larm och ändrar ingen poäng. En Septentrio SBF-läsare (PVTGeodetic, MeasEpoch, RFStatus, skrivskyddad, på MIT-licensierade cratetsbf-tools) ochreceiver-trust live --serial(ett seriellt eller USB-NMEA-flöde, skrivskyddat; det skriver aldrig till en mottagare) hör till dem. - Tidssynkronisering och hårdvarusäkerhet (
docs/TIMING-HIL.md,docs/HARDWARE-SAFETY.md). Scenariotypenholdover-testpoängsätter ett holdover-test av ett tidssystem (GNSS borttaget av operatören, holdover, återhämtning) från en uppmätt tidsfelsregistrering, mätt mot ITU-T-masker från offentliga tabeller.clock_logläser loggar från linuxptp (ptp4l,phc2sys,ts2phc) och chrony (tracking,statistics).iq scene --format sdrxskriver ION GNSS SDR-metadata ochiq monitor --followövervakar en SigMF-inspelning medan den växer (endast mottagning).compliance-reportfår NIST IR 8323r1 Foundational PNT Profile (15 omskrivna rader, ger belägg för). Ett bevispaket kan registrera operatörenslab-attestationi sitt signerade manifest, aldrig verifierat; hårdvarustegen 0 till 4 och de juridiska anmärkningarna finns iHARDWARE-SAFETY.md(väntar på juridisk granskning). Det finns ingen sändningsväg av något slag. - kshana-bench v1 (
kshana bench,bench/SPEC.md,docs/BENCH.md): fasta uppgifter, delningar och mått för detektion av GNSS-störning i mottagarloggar (JammerTest 2024) och IQ, prediktion av holdover för tidssynkronisering (IGS-klockor) och optimismglappet utanför fördelningen; delningsmanifest med fastlåsta hashar och hämtningsskript (inga data medföljer), en undanhållen datamängd genom commit och avslöjande, ett schema för resultatfiler och en statisk topplistesida. Baslinjer under trösklar förhandsregistrerade ixval/bench/PREREGISTRATION.md: poängsättarens trösklar uppfyllda, C1 till C3 uppfyllda, D2 uppfylld; A2 NOT MET (agc_k_sigmaAUC 0,766 mot minst 0,80 på testdelningen), D1 NOT MET (största glapp 0,0301) och uppgift (b) R1 NOT MET (överförd, inte körd om), var och en fastlåst (xval/bench/RESULTS-v2.md). Varje poäng är MODELLED. Pythonbench_score,bench_leaderboard; WebAssembly detsamma; MCPscore_benchmark,render_leaderboard. - Störningsobservatorium (
kshana interference-map daily,sensitivity,docs/observatory/METHOD.md): en reproducerbar daglig GeoJSON, PNG och incident-rapport i JSON med tre tillstånd (degraded, not degraded, not observed), en minsta fördröjning på 24 h, celler på 0,5 grader eller grövre, ingen orsak tillskriven och OpenSky-data avvisade; en känslighetsstudie av de förhandsregistrerade parametrarna; ett bakåtriktat katalogmaterial för Östersjön över 30 dagar från adsb.lol. - Maskin- och sensorindata för
receiver-trust(docs/MACHINE-INPUTS.md). Nya värden för[log] format, alla skrivskyddade, MODELLED, med självskrivna fixturer och inga data medföljande:rtklib-pos(RTKLIB.pos-lösningsfiler),novatel(OEM7 ASCII och binärBESTPOS,RANGEC/No ochRXSTATUS; mottagarens jammer-flagga blir epokensself_report, ställd mot Kshanas larm av jämförelsenreceiver-self-report),rtcm3(MSM4 och MSM7 C/N0 för GPS, GLONASS, Galileo, SBAS, QZSS, BeiDou och NavIC; layouter från de BSD-licensierade pyrtcm-tabellerna, vars meddelande finns iNOTICE, inte från RTCM-standarden) ochgnss-sdr(GNSS-SDR Monitor- och PVT-monitor-meddelanden som JSON-rader, vidarebefordrade avintegrations/gnss-sdr/relay.py). - IMU-loggar som en andra sensor.
[log.imu](csvellereuroc) integrerar gyrots girhastighet till den färdriktning som övervakarenheading-courseläser; inbyggd på varje yta och förd vidare genom bevispaket.kshana imu-fit(Pythonimu_fit, WebAssemblyimu_fit, MCPfit_imu_log, insticksmodul/kshana-fit-imu, en JetBrains-åtgärd) anpassar accelerometerns och gyrots parametrar för scenariernahybridochfusionfrån en stillastående logg med Allan-avvikelse och skriver ut en tabell[accel_classical]med loggens SHA-256 i sin proveniens. - Integrationer: ett ROS 2-paket (
integrations/ros2/kshana_trust: NavSatFix ochublox_ubx_msgsin, förtroendeämnen ut; dess ROS-fria brygga testas mot den verkliga motorn, själva noden har inte körts på en levande ROS-graf), en bryggagnss_lib_py(integrations/gnss_lib_py, MIT-beroende, valfritt) och ett GNSS-SDR-relä. - Home Assistant MQTT-exportör för förtroendetelemetri:
kshana trust-telemetry --print-mqttoch--mqtt-tcp <host:port>(discovery-meddelanden och ett JSON-tillståndsdokument; endast publicering, inga inloggningsuppgifter eller TLS), ochformat = "mqtt"som text i Python, WebAssembly och MCP. - Sju MODELLED registerrader för ovanstående. Inget här är VALIDATED: ingen inspelning från en verklig mottagare, basstation, IMU, GNSS-SDR-körning, ROS-graf eller MQTT-broker lästes.
- Optisk länkmarginal över tid. Typen
optical-atmospheretar en valfri tabell[timeseries](duration_h,step_s,seed) och skriver då också, per plats, en frösatt realisering av den angivna platsmodellen genom tiden: molnepisoder, en vattenpelare i vätskefas per episod, ett gamma-gamma-scintillationssampel per steg, och utifrån dem länkmarginalen, moln- och scintillationsfädningarna och flaggan för länk uppe, med den realiserade tillgängligheten, molnandelen, antalet avbrott och det längsta avbrottet. MODELLED (en dragning ur modellen, inte klimatet; ingen extern oberoende referens). Utan tabellen är resultatet dokumentet från 0,37. De två medföljande optiska scenarierna bär tabellen (336 h, 600 s, frö 37). Trösklar förhandsregistrerade ixval/optical-atmosphere/PREREGISTRATION-timeseries.mdföre den första körningen. - Specifikation för testförhållanden och laboratorieringloppet.
kshana.test-conditions/1publiceras somdocs/spec/TEST-CONDITIONS.mdmed ett JSON-schema, och fårrecording.kind = "receiver-log".kshana bench-exportskriver också<base>.conditions.json.kshana evidence round-tripbygger ett signerat paket som länkar scenariots hash, hashen för de angivna förhållandena, mottagarloggens hash och poängen mot de angivna händelserna, och avvisar förhållanden som inte stämmer med poängsättningens händelser. Genomarbetat exempel med gps-sdr-sim som endast skriver en fil; uppspelning är operatörens ansvar och automatiseras aldrig. Pythonevidence_round_trip, MCPcreate_round_trip_pack, insticksmodul/kshana-evidence-pack. - Standardpaket (
kshana standards-pack,standards/): testprofilerna för nivåerna 1 till 4 i DHS Resilient PNT-ramverket, noggrannhetsnivåerna och integritetsutvärderingen i IMO MSC.1/Circ.1575 samt övervakning, bedömning och begränsning i ICAO Doc 9849 Appendix F, var och en en uppsättning scenarier poängsatta mot trösklar angivna före körningen, med de rader i compliance-report som de ger belägg för. Missar är registrerade och fastlåsta: DHS L4-T1 och de fyra noggrannhetstesterna i IMO. Doc 9849 i sig lästes inte (betalt); ICAO-paketet följer ICAO:s egen presentation av RFI Mitigation Plan.compliance-reportfår ett avsnitt för standardpaket. Alla MODELLED. - LunaNet Augmented Forward Signal (
docs/LUNANET-AFS.md): Gold-koder för AFS-I och Weil-koder för AFS-Q för PRN 1 till 210, signalernalunanet-afs-iochlunanet-afs-qikshana iq, SB1 BCH-koden, CRC-24Q och interfolieraren samtkshana lunanet-afs-check(spec,symbols,generate), fastlåst till LNIS V5 Applicable Document 1 Volume A (LSIS-AFS V1.0, 29 januari 2025). Koderna VALIDATED mot dokumentets tryckta tabeller (som det markerar TBC); en tryckt tertiär kolumn (PRN 147) är sannolikt ett tryckfel och missen är fastlåst. LDPC-kodning av underramarna 2 till 4 är inte implementerad. - Kursanteckningsböcker (
notebooks/course/): jamming, spoofing, holdover, integritet, OSNMA och störningskarta, var och en med övningar. - Studie av maximal URA i EU-US WG-C ARAIM Milestone 3 (
xval/araim-m3/,src/bin/gen_araim_m3_study.rs), som ersätter den tillbakadragna planen "Table A-3"; MODELLED under angivna avvikelser. - Utkast för ägargodkännande under
docs/drafts/: JOSS-artikel, ändring av TSC-stadgan, process för register över oberoende referenser och ett förslag om uppdelning avLICENSES/. Inget där är antaget. - Studio-vyer för funktionerna i 0,38 (kshana.dev/studio/). Brygguppspelning (två syntetiska körningar på en klocka: spår, förtroendepoäng, de satelliter loggen hör och utslaget, med mottagarens egna flaggor bredvid Kshanas larm); Optisk PNT (de två scenarierna
optical-atmosphere, med en valfri frösatt realisering av[timeseries], MODELLED); Holdover-test (resultatetholdover-testmätt mot ITU-T-masker, ritat från resultatets egenrecord.series); en vy för störningsobservatoriet som öppnar de filer du producerat och inte levererar några; på sidan Verktyg en Jammertest-poängsättare, en IMU-anpassning och MQTT som telemetriformat; och i Förtroende en väljare för loggformat (RTKLIB.pos, NovAtel OEM7, RTCM 3, GNSS-SDR, Septentrio SBF) med en valfri IMU-fil. Varje vy läser filer i webbläsaren och laddar inte upp något; varje tal behåller den etikett som registret har för det, och var och en bär den rådgivande försäkran. Webbplatssidan/benchmarkvisar fragmentetkshana bench leaderboard.
Rättat#
- Ärende #36: byteexakta fastlåsningslager. Byteexakta fastlåsningslager körs bara på en värd som deklarerats som baslinje (
KSHANA_EXACT_PINS=1, satt avscripts/gate.sh), inte på varje Mac med Apple-kisel, eftersom Apples matematikbibliotek skiljer sig mellan macOS-versioner; det portabla lagret körs överallt, ochtests/exact_pin_gate_guard.rshindrar att ett byteexakt lager åter grindas enbart på plattform. Själva jämförelserna med oberoende referenser passerar på macOS. Ingen literal togs om och ingen tolerans ändrades.scripts/oracle-triage.shochdocs/LOCAL-ORACLE-TESTS.mdbeskriver hur en skillnad utreds;.github/workflows/oracle-macos.ymlär en manuell och veckovis diagnostik, inte en grind. - CodeQL: ett ej förankrat mönster i Studios hjälpfunktion trust-open matchar nu hela headern (
web/studio/lib/trust-open.mjs). - CI: körarens disk. Jobbet
checkbygger profilerna för utveckling och test utan felsökningsinformation, så länkningen fyller inte längre disken. - Källskydd. Varje källfil som innehåller fixturer med fastlåsningar för test deklarerar sin fastlåsningsomfattning, och testerna som skriver temporära filer använder en unik sökväg per anrop, så parallella körningar inte kan kollidera.
docs/SCENARIOS.mdregenereras för det valfria fältettimeseriesi optical-atmosphere.- JetBrains-insticksmodul: ingen användning av föråldrat plattforms-API eller API som är planerat att tas bort. IntelliJ Plugin Verifier (
verifyPlugin) mot IntelliJ IDEA-bygget 263 (2026,3: 263.6800.24 och 263.7031.23) fann ett föråldrat anrop,FileEditorManager.openFile, i Insert Example; den öppnar nu den nya filen medOpenFileDescriptor. Insticksmodulen är kompatibel med och ren på 2024,3 (since-build, oförändrad) och båda 263-byggena. CI kör nuverifyPluginoch misslyckas vid kompatibilitetsproblem och vid varje användning av API som är planerat att tas bort.
[0.37.0] - 2026-10-17#
Tillagt#
- Optisk PNT genom atmosfären (scenariotypen
optical-atmosphere,docs/OPTICAL-ATMOSPHERE.md, designanteckningdocs/design/optical-atmosphere-0.37.md). För en optisk länk och en uppsättning markplatser redovisar den den våglängds- och elevationsberoende förlusten i klar luft, turbulenstillståndet enligt Hufnagel-Valley (Rytov-varians, scintillationsindex, gamma-gamma-fädningar, aperturmedelvärdesbildning), tillgängligheten mot länkmarginalen utifrån ett angivet molnklimat, den marginal som behövs för måltillgängligheter och taket som ingen marginal lyfter över, fördelningen av avbrottstider, tids- och avståndsfelet per avbrott genom klockans holdover-modell, avståndskorrelerad platsdiversitet samt vad-händer-om-vinster för ett byte av våglängd, en större apertur, scintillationsminskning med adaptiv optik och extra marginal.optical_linkbudgetfår en atmosfärsmedveten budget; utan en är dess utdata bitidentiskt med 0,36 (tröskel A5). Två medföljande scenarier bär ILLUSTRATIVE molnklimat. MODELLED: tre registerrader. Numeriken uppfyller trösklarna A1 till A6 förhandsregistrerade ixval/optical-atmosphere/PREREGISTRATION.mdmot ett oberoende mpmath-program; det kontrollerar implementeringen av de angivna formlerna, inte atmosfären, och ingen uppmätt tillgänglighetsregistrering har jämförts, så ingen rad är VALIDATED. Tröskeln A4 missades först med 3e-9 eftersom den normalfördelningsfunktion som användes var en approximation på 1.5e-7; fördelningsfunktionen byttes ut och tröskeln lämnades som registrerad. De inbyggda och WebAssembly-byggena returnerar byteidentiska dokument för båda medföljande scenarierna (A7, körd på integrationscommiten för 0.37.0).
[0.36.0] - 2026-10-16#
Tillagt#
ROC för detektion hos IQ-övervakarna (PRO-32,
docs/design/DETECTION-ROC.md). En kampanj med övervakare behåller varje teststatistiks maximum över fönster med angivna händelser (positiva) och uppdelade fönster utanför händelserna (negativa,roc_window_s). Rapporten poolar dem per larmtyp till en ROC med dess AUC och arbetspunkten vid den konfigurerade tröskeln, somroc.jsonoch ett rapportavsnitt. På syntetiska kampanjer är kontrollen av slumpnivån uppfylld. Tröskeln för C/N0-AUC (0,95) är inte uppfylld (0,79), eftersom de negativa fönstren direkt efter en händelse ärver CUSUM:ens avklingning från detektionen; detta är registrerat. MODELLED.IQ-övervakare i kampanjen för laboratorieuppspelning (PRO-31,
docs/design/MONITORS-IN-CAMPAIGN.md). En valfri tabell[monitors]i en kampanjfil kör IQ-övervakarna i körarens enda genomgång: effekt och spektral efter varje frontändkedja, samt C/N0, SQM och lås per spårad kanal. Deras larm poängsätts mot de angivna händelserna: detekterat eller missat, tid till detektion och falsklarm per exponeringstimme. Varje tests slutna form för falsklarm anges, inklusive ett nytt tvåsidigt gaussiskt tal för SQM-testerna (2Q(k)). Utan tabellen ändras ingenting. På syntetiska kampanjer är trösklarna för falsklarm för effekt och SQM samt för C/N0 uppfyllda; 18 av 18 dämpningar detekteras, men gränsen för tid till detektion, under ett detektorsampel per konstruktion, är inte uppfylld och är registrerad. MODELLED; registerraden "IQ monitors scored in lab-replay campaigns".Laboratorieanpassning från IQ-kampanjer, uppföljning (
tests/iq_labfit_followup.rs, CI-jobblabfit-iq-followup). Den testar de två hypoteser som § 13,6 idocs/design/LABFIT-FROM-IQ.mdlämnade öppna, mot trösklar förhandsregistrerade i 1e532f84. Den lägger till två syntetiska kampanjer: S, med ett stegvis J/S (frö 2026_1014), och R, en ny ramp (frö 2026_1015). Resultaten finns idocs/design/evidence/labfit-followup/RESULTS.md.- S1 uppfylld: med varje J/S-nivå hållen återfås
δ_effinom +0,185 dB. Rampkampanjernas fel på −1,1 dB är skattarens eftersläpning. - S2 inte uppfylld, fastlåst av ett test som hävdar missen: (d) som skrivet på den stegvisa kampanjen gäller för modellen med spårningsslinga (0,45 dB) men inte för den empiriska (6,42 dB).
- R1 uppfylld: på den nya rampkampanjen ligger (d) med de anpassade vilotiderna för fall gånger varje händelses ramphastighet inom 1 dB för båda modellerna.
- Missarna för (a′) och (d) återskapas på R.
- En kampanj kan nu ange sitt J/S som en profil
stepi testramen. - Inget utslag i § 13 ändras, och registerraden förblir MODELLED.
- S1 uppfylld: med varje J/S-nivå hållen återfås
Begränsad FLL-inlåsning, tillval (DS-LOOP-05): en ny nyckel
[design.carrier] fll_pull_in_max_s(s) för slingutformning, i RustLoopConfig::fll_pull_in_max_s. Underfll_assist = "pull-in"tvingar den fram överlämningen från FLL till PLL efter så lång tid, oavsett PLI. Osatt som standard, och då utanför utformningens hash; standardutformningen och dess hash är oförändrade.- Kontrollerad mot trösklar förhandsregistrerade i 58789af0, på injicerad referens. Kontrollen är uppfylld: standarden lämnar aldrig över i 9 av 10 frön vid 33 dB-Hz.
- Inte uppfylld: med ett tak på 1,0 s håller 16 av 20 körningar lås vid 33 dB-Hz och 8 av 20 vid 31 dB-Hz; de andra växlar mellan påtvingade överlämningar och FLL:ens återgång. Fasjittret är 1,8× enbart PLL vid 33 dB-Hz.
- Golvet för inlåsning på ~35 dB-Hz förblir standardens dokumenterade gräns.
- MODELLED; registerraden "Capped FLL pull-in below the default design's FLL-to-PLL hand-over floor (opt-in)".
Hysteres vid acquisition och frontändens kvantiserare i jamming-typen (CAP-06c): två valfria sektioner för ett
jamming-scenario.[acquisition]:acquisition_threshold_dbhz(dB-Hz, vid eller över spårningströskeln) ochreacquisition_delay_s(s, standard 0). En satellit acquireras vid eller över acquisition-tröskeln, när den har varit oacquirerad under fördröjningen. Den hålls så länge den ligger vid eller över spårningströskeln. Utdata:epochs[].sats[].acquired(true/false),epochs[].acquired(antal) ochfom.availability_acquired(1).[front_end]:adc_bits(1 till 16) ochbandwidth_mhz(MHz, standard dubbla chiphastigheten). Ger ett blockfront_end:agc_gain_reduction_db(dB,10·log10(1 + J/N)),quantiser_loss_db(dB, avdragen från varje länks effektiva C/N0) ochloss_model. Förlusten är den för gaussisk indata, flaggad som ogiltig för CW-, smalbandiga och svepande jammers.- Utan sektionerna är varje utdata byteidentiskt.
- Kontrollerad mot trösklar förhandsregistrerade i 70c72fcc. Kvantiseringsförlusten ligger inom 0,0007 dB från en oberoende Monte Carlo, och AGC-avläsningen inom 0,012 dB från IQ-lagrets AGC-slinga.
- De registrerade körningarna för hysteres var ointressanta (varje länk förlorad), så den tröskeln är NOT MET. En kompletterande körningsuppsättning registrerad i 37793290 uppfyller den: varje flagga är lika med en oberoende omräkning, och 732 av 1824 länkar visar hysteresen.
- Fynd: med en CW-jammer förlorar en 1-bitars ADC omkring 5 dB mer än det gaussiska talet.
- MODELLED; registerraden "Acquisition hysteresis and the front-end quantiser in the jamming kind against independent recomputations".
Terrängskuggning av jammern i jamming-typen (CAP-06b): en valfri sektion
[terrain]i ettjamming-scenario med en jammer. Fält:dem_hgt: en SRTM-ruta.hgt, relativt arbetskatalogen;samples_per_side,ll_lat_degochll_lon_deg(deg): rutans storlek och hörn;geoid_undulation_m(m, standard 0),k_factor(standard 4/3) ochprofile_step_m(m, standard 30).
Motorn samplar storcirkelns terrängprofil mellan jammer och mottagare och finner den dominerande knivseggen. Jammerns mottagna effekt, och därmed varje J/S, sänks av förlusten för en enda knivsegg enligt ITU-R P.526-15 § 4,1.
- Resultatet får ett block
jammer_terrain:nu_max(1),diffraction_loss_db(dB),obstacle_distance_m(m),obstacle_terrain_m(m),path_length_m(m) ochprofile_points(antal). - Utan sektionen är varje utdata byteidentiskt.
- Kontrollerad mot trösklar och tio placeringar förhandsregistrerade i 92cd2bfd, på den incheckade verkliga SRTM-rutan över Death Valley, mot en oberoende omräkning i numpy. Alla uppfyllda: sämsta skillnad 1.6e-10 på
νoch på förlusten (tröskel 1e-9), förlusten monoton i jammerhöjd, och förlusten når J/S exakt. - MODELLED; registerraden "Terrain shadowing of the jammer in the jamming kind against an independent numpy recomputation on a real SRTM tile".
CRPA-antennförstärkningar i jamming-typen (CAP-06a): en valfri sektion
[crpa]i ettjamming-scenario. Fält:elements_enu_m(elementpositioner i lokalt öst-nord-upp, m),weighting("null-steering"eller"mvdr") ochbandwidth_mhz(MVDR-brusbandbredd, MHz, standard dubbla chiphastigheten).- Varje kanal bildar en distorsionsfri stråle mot sin satellit. Länkens brus skalas med
‖w‖²och jammern med|wᴴa_j|²före den befintliga C/N0-ekvationen för anti-jam. - Varje länk får ett block
crpa:array_noise_gain_db(dB) ochjammer_gain_db(dB). - Utan sektionen är varje utdata byteidentiskt.
- En ogiltig sektion (en tom elementlista, en okänd viktning, en icke-positiv bandbredd) är ett fel, genom
kshanaochapi::run_tomlliksomjamming::run_jamming. - Kontrollerad mot trösklar förhandsregistrerade i 08d83b4d. Uppfyllda: additivitet (efter en rättning: det första bygget lade till de nya enheterna i enhetstabellen för varje jamming-körning); ett element är ingen grupp; brusförstärkning och effektiv C/N0 mot en oberoende omräkning i numpy inom 1e-9 dB; MVDR går mot nollan vid högt JNR.
- Inte uppfylld: MVDR:s jammerförstärkning på 194 av 456 länkar på bärbar matematik i 0,36 (202 på värdmatematik;
docs/revisions/STUDIO15-batch4-rebaseline.md) (sämsta 1.7e-6 dB). Residualerna på −100 till −188 dB ligger under float64:s upplösning vid den tröskeln, och numpy avviker från sig självt med samma storleksordning. - MODELLED; registerraden "CRPA antenna gains in the jamming kind against an independent numpy recomputation".
- Varje kanal bildar en distorsionsfri stråle mot sin satellit. Länkens brus skalas med
IQ-spårningsmotor mot GNSS-SDR 0.0.19 (PRO-33):
kshana iq trackoch GNSS-SDR spårar samma oberoende numpy-inspelningar av GPS L1 C/A vid 30 till 45 dB-Hz.- Trösklar förhandsregistrerade i 48edd4a5. Den registrerade kalibreringen misslyckades på en felaktig GNSS-SDR-överlämning (F3), så ändring 1 (1e4288c4) lägger till en FLL enbart för inlåsning i båda mottagarna, incheckad före varje testinspelning.
- Uppfyllda: bärvågs- och kodjitter samt Doppler stämmer inom 5 % vid varje C/N0.
- Inte uppfyllda: motorns NWPR-C/N0 läser 2,3–7,1 dB under GNSS-SDR:s SNV (F4, en känd gräns för skattaren; M2M4 ligger inom 0,06 dB från referensen); låsindikatorerna skiljer sig per definition (F5); en avvikelse i slirning vid 30 dB-Hz (F6).
- MODELLED; registerraden "IQ tracking engine against GNSS-SDR 0.0.19 on independent recordings".
Två VALIDATED rader för koder i IQ-lagret (DS-GIQ-06b, PRO-39).
- BeiDou B1I. Alla 63 primära B1I-koder stämmer med den oberoende generatorn i GNSS-SDR v0.0.19 chip för chip (tröskel förhandsregistrerad i 911106d1). Endast det programmets utdata är incheckat: de B1I PRN-koder som den offentliga ICD:n definierar, som ett prefix och en hash.
- GPS L1C. Alla 126 L1CP/L1CD-koder och 63 L1CO-överlägg stämmer med de kontrollkolumner IS-GPS-800J skriver ut, och den beräknade Legendre-sekvensen stämmer med dess Tabell 6.2-1 (trösklar förhandsregistrerade i fe372e26).
- Rader: "BeiDou B1I primary ranging codes against an independent generator" och "GPS L1C ranging and overlay codes against the IS-GPS-800J printed check columns".
Banden för GLONASS, BeiDou och Galileo E6 i spektrummodellen (CAP-12, signaler): nya bandnamn
glonass-l1ofochglonass-l2of(varje FDMA-kanal somglonass-l1of-k<K>, K = −7 till 6),beidou-b1i,beidou-b1c,beidou-b2a,beidou-b3iochgalileo-e6. Var och en bär sin ICD:s bärvåg, modulation och lägsta mottagna effekt. De är tillval med namn: standardbanduppsättningen och varje befintligt utdata är oförändrade.- Kontrollerad mot trösklar förhandsregistrerade i 5806f28b: ICD-värdena, nollställena, B1C-kompositen och C/N0-vägen är uppfyllda.
- Två trösklar var inte uppfyllda. Enhetsareatröskeln var ouppnåelig så som den var skriven (F1). IQ-lagrets vågformer för B1I och B1C stämmer med modellen endast bandmedelvärdesbildade, på grund av deras koders ojämna linjespektra (F2).
- MODELLED; registerraden "Spectrum model: GLONASS, BeiDou and Galileo E6 bands (opt-in)".
Alternativ med cellmedelvärdesbildande CFAR vid IQ-acquisition (PRO-37):
iq::acq::ca_cfarochca_cfar_cellsavgör på ett acquisition-rutnät genom att jämföra varje cell med medelvärdet av referensceller i dess Dopplerrad. Tröskeln kommer från den slutna formen för falsklarmssannolikheten i CA-CFAR förMicke-koherenta block (ca_cfar_pfa,ca_cfar_alpha), så beslutet beror inte på normaliseringen av sampeleffekten. Det är ett tillval; standarddetektorn och varje befintligt utdata är oförändrade.- Kontrollerad mot trösklar förhandsregistrerade i 3724aefa: den slutna formen mot Monte Carlo (18 av 18 fall), och en utformningsfrekvens på 1 % uppmätt till 0,97–1,01 % på gaussiskt och 2-bitars kvantiserat brus.
- En tröskel var inte uppfylld: på en brusfri 2-bitarssignal överskrider 1,28 % av cellerna utanför toppen tröskelvärdet, vid kodens korrelationssidolober (fynd F1).
- MODELLED; registerraden "Cell-averaging CFAR option in IQ acquisition".
Scintillationsmodell mot uppmätta data (PRO-34): IQ-kanalens Cornell-scintillationsmodell jämfördes med uppmätt 50 Hz GPS L1-intensitet och -fas från en ekvatorial scintillationsnatt (Zenodo-post 16941224, INGV, Malindi, CC BY 4,0), under trösklar förhandsregistrerade i b6ccb499. Uppfyllda: intensitetsfördelningen och fasscintillationen kopplad till S4. Inte uppfyllda: modellen fädar 2,4 gånger så ofta under −10 dB och 3,5 gånger så länge (fynd F1). Den registrerade bearbetningen läser modellens lindade fas (fynd F2); fasresultatet håller med den avlindad.
scripts/fetch_scint_malindi.shhämtar data. Raden förblir MODELLED: "IQ ionospheric scintillation channel (Cornell model) against measured 50 Hz GPS L1 scintillation".Korrigerad LuGRE-sampelläsare (MR-09):
realdata::lugre::parse_iqs_sdrxläser en LuGRE IQ-batch med I i den höga nibblen och mid-rise-nivåerna2v + 1(SdrLayout::mid_rise), vilket tar bort medelvärdet −½ som de nakna tvåkomplementsheltalen bär på I och Q.run_acq.py --correctedger GNSS-SDR samma läsning. Den generiska ION-läsaren och varje befintligt utdata är oförändrade: 149 scenarioresultat och en studie är byteidentiska före och efter, och de fastlåsta LuGRE-fynden läses som registrerade (xval/lugre-reader/RESULTS.md). Ingen registerrad ändras.BOC(1 1)-spårning som tillval (CAP-07 (a)):
LoopConfig::bocomskalar DLL-diskriminatorerna för sinus-BOC(1 1)-huvudtoppen och lägger till en bump-jump-övervakare (mycket tidiga och mycket sena korrelatorer vid ±0,5 chip, upp/ned-räknare,N = 8) som flyttar kod-NCO:n från en sidotopp;Channel::bump_jumpslistar hoppen. Av som standard, och varje befintligt utdata är oförändrat. Kontrollerad mot trösklar förhandsregistrerade i 6b68f6cc på en syntetisk BeiDou B1C-signal: en start på en sidotopp som utan tillvalet förblir 0,55 chip fel dras med det på huvudtoppen av ett hopp vid 0,08 s, och inget falskt hopp sågs från huvudtoppen. En tröskel var inte uppfylld: enhetstestrutnätet för skalningen når utanför diskriminatorernas linjära område (fynd F1 idocs/design/evidence/boc-bump-jump/RESULTS.md). MODELLED; registerraden "BOC(1 1) tracking: DLL scaling and bump-jump ambiguity resolution (opt-in)".Laboratorieanpassning från IQ-kampanjer (B7.1,
docs/design/LABFIT-FROM-IQ.md). En labfit-scenarios[input] campaign = "<out-dir>"anpassar en utdatamapp frånkshana iq campaigni CLI (kshana iq labfit), i Python (kshana.iq_labfit) och i MCP-verktyget labfit (endast mappar inom dess arbetskatalog). Den anpassar en enhet per signal, slingutformning, frontändkedja och jammertyp:- C/N0-modellen mot angivet J/S, med censurering;
- spårningströskeln, direkt och i sluten form;
- modellerna för spårningsslinga och empiriskt lås, kopplade genom C/N0-modellen, med deras vilotider;
- en frösatt klusterbootstrap över inspelningar, 90 % prediktionsintervall och undanhållna datamängder med utelämnande av en inspelning i taget;
- en förhandsregistrerad tabell
[validation], hashad, med PASS/FAIL per tröskel.
Rapporten är
kshana.labfit-iq/1som JSON, CSV och Markdown, med ett enhetsblock.Q_effär inte identifierbar från C/N0-data utan en oberoende effektmätning. Den anges, anpassas aldrig, och den anpassade parametern ärdelta_eff = delta - 10 log10 Q(utformningsändring 2026-10-12). En okänd jammertyp tar det mest skadliga angivnaQ(cw, 1). På syntetiska kampanjer från Kshanas egna scener passerar tröskeln för täckning i den undanhållna datan (c). Trösklarna fördelta_eff(a') och (b') (0 av 50 kampanjer täckta) och den slutna formens tröskel för tröskelvärdet (d) är inte uppfyllda: de är registrerade med sina värden. MODELLED; registerraden "Calibration of the open receiver's C/N0 and lock models to IQ campaign results, with stated prediction error". Sökvägen labfit för mottagarloggar och dess utdata är oförändrade.solar-systempå en JPL-kärna (CAP-31):planetary_kernel_pathtar varje kropp som SPK:n innehåller (med de440s: Merkurius, Venus, Jorden, Månen) från kärnan, etikettKERNEL, och lägger bara till ett blockkernelnär det är satt. Ny rad, VALIDATED mot SPICE (förhandsregistrerad f8e946ea; sämsta 3.3e-5 m, 1.0e-11 m/s). Standardrapporten är oförändrad.Porkchop på efemeriden DE440 (CAP-20b):
maneuver::porkchop_kernelsveper C3 och ankomst-V∞ på heliocentriska tillstånd från en DE440 SPK. Ny rad, VALIDATED mot SPICE-tillstånd- pykep 3.0.1 (förhandsregistrerad 2d857fb1; Jorden till Mars 2026-2028, 304 celler, sämsta 2.6e-14, samma cell med minsta C3).
Icke-gravitationell makromodell för LRO: NOT MET (DS-LRO-10, förhandsregistrerad e82047e2).
lunar_od::LunarMacroModel(tillval viaLunarForceModel::macro_model): direkt solstrålning på plana plattor med månens skugga, en solföljande panel samt månens albedo och termiska IR;LunarMacroModel::lro_genericär en märkt generisk LRO-approximation från publicerade fakta (inga bussplattor: plattabellen gick inte att få tag på). På LRO-bågen på 4 h lämnar den den reducerat dynamiska RMS på 6,668 m och den dynamiska på 11,94 m, med en orimlig strålningsfaktor (omkring +21 / −22), så alla tre trösklarna missas. Fyndet är fastlåst av ett test, och inget standardutdata ändras (docs/design/evidence/ds-lro-10-macro-model/RESULTS.md). Det valfria cannonball-SRP:et för månen använder nu månens koniska skugga i stället för jordens (forces::conical_shadow_body).Månens banbestämning: valfri fast tidvatten k2 och selenocentrisk relativitet (DS-LRO-11), av som standard (
LunarForceModel::lunar_tide,::relativity); en omkopplareKSHANA_LRO_DEGREEför ANISE-korsvalideringen (DS-LRO-04); en fixtur för en LRO-båge på 24 h och en enbart informativ anpassning över lång båge (DS-LRO-09). Informationskörningar registreras idocs/design/evidence/ds-lro-09-11-longer-arc/RESULTS.md; inget publicerat tal ändras.CR3BP 9:2 NRHO mot CAPSTONE (CAP-29d): ny MODELLED rad som mäter motorns cirkulära begränsade NRHO mot den bana CAPSTONE har flugit (JPL Horizons, mars 2023; förhandsregistrerad 4e868170): period 1,07 %, apolun 0,05 %, perilun 4,1 % från medelvärdena för CAPSTONE, inom de registrerade trösklarna 3 / 5 / 20 %. En mätning, inte en validering.
CR3BP roterande tillstånd till månencentrerad ICRF (RM-34, FUT-06):
cr3bp::to_moon_centred_icrf/from_moon_centred_icrf/to_moon_centred_icrf_de440avbildar ett dimensionslöst roterande Jord-Måne-tillstånd på den momentana DE440-linjen Jord-Måne, inklusive systemets rotationshastighet utanför planet. Ny rad, VALIDATED mot ett SPICE-tvåvektorsystem (förhandsregistrerad 2313eb1b, ändrad före varje körning d5ef79b3; 72 fall, sämsta 1.8e-7 m och 1.2e-9 m/s).CR3BP-familjemedlemmar mot JPL:s Three-Body Periodic Orbits API: NOT MET (RM-35, förhandsregistrerad a9074f65).
cr3bp_family(halo-, NRHO- och DRO-korrektion, monodromistabilitetsindex, pseudo-båglängdskontinuering) matchar 54 av 58 API-medlemmar för varje tröskel (tillstånd, period och Jacobi inom 1e-10 överallt). Ett L1-halo-stabilitetsindex (9.5e-2) och tre små DRO-slutningar (1.5e-8 till 3.3e-8 mot 1e-8) missar, så modulen är#[doc(hidden)]och ingen rad gör anspråk på den. Resultat:docs/design/evidence/cr3bp-families/RESULTS.md.Valfri DE440-månorientering och månmiljö (FUT-05, DS-LRO-08; standardvärden oförändrade):
lunar_frame::try_icrf_to_moon_pa_de440,lunar::try_mci_to_mcmf_de440/try_mcmf_to_mci_de440(epokförankrade, DE440-huvudaxlar) ochlunar_od::De440LunarEnvironment(inbäddad DE440 PA-orientering plus den geocentriska solen och månen från en användartillhandahållen DE440 SPK). Mot ANISE (förhandsregistrerad ea537710): orientering inom 3.5e-7 rad och LRO-anpassningar inom 1 mm, men efemeridledet missade sin tröskel (solen 30,7 m, månen 1,1 m, en tidsförskjutning på ~1 ms på ANISE-sidan), så det är inte någon validerad rad. Resultat:docs/design/evidence/fut05-de440-lunar-env/RESULTS.md.Datum för månens referenssystemskampanj, villkorsskalad NumPy-tröskel: NOT MET (förhandsregistrerad b887eb05; förblir MODELLED). Steg 0 utesluter reservlösningen med pseudoinvers som orsak till gapet på 0,30 för uppskattade stationer; NumPy stämmer inom tröskeln i sex av åtta scenarier, men stations_estimated missar den (6.8e-6 mot 5.9e-7), och för det nya datumet 2026-12-01 gör en oobserverad fyr vid sydpolen att fyrens information blir rangbristfällig, vilket den oförändrade oberoende referensen inte kan utvärdera. Resultat:
docs/design/evidence/mr05-lunar-datum-cond/RESULTS.md.Datum för månens referenssystem från en verklig observationskampanj (analytisk måne) VALIDATED på nya 2025 EDC-normalpunkter (förhandsregistrerad 31f5283 innan någon hämtades): den oförändrade SPICE- och NumPy-referensen stämmer i bokföring, rang och noll koppling, och inom 1.11e-3 på sigman (tröskel 1e-2), 8.95e-4 på konditionen och 1.79e-3 på kvoterna tvärs/längs (tröskel 2e-2). Enbart en biblioteksnivåkontroll av kovariansberäkningen; trösklarna skiljer inte mellan månmodeller. Resultat:
docs/design/evidence/mr06-llr-analytic-fresh/RESULTS.md.IAU-kroppsorientering och GM för de fjorton tillagda solsystemkropparna utbrutna ur raden "Fysikaliska konstanter för varje solsystemkropp" till en VALIDATED rad (förhandsregistrerad 154bc54):
Body::iau_rotation_etstämmer med SPICEpxformpå pck00011 inom 1e-9 rad på 574 matriser vid de ursprungliga epokerna och på 574 vid 41 nya epoker som aldrig jämförts tidigare (sämst Phobos 1.38e-10 rad), ochBody::muär lika med gm_de440 för alla fjorton kroppar. Resten av den ursprungliga raden (J2, medelradie, rapporten) förblir MODELLED. Resultat:docs/design/evidence/mr08-body-orientation/RESULTS.md.Lambert med flera varv (
maneuver::lambert_multirev): varje lösning med upp till tre varv, båda grenarna. Ny registerrad, VALIDATED mot pykep 3.0.1 (förhandsregistrerad a75de851; 382 fall, 1058 lösningar, största hastighetsskillnad 1.6e-13 mot 1e-8). Den interna Kepler-landningsspärren hittade en begränsning hosmaneuver::kepler_universalpå en båge med e = 0,994; den är dokumenterad idocs/design/evidence/lambert-multirev/RESULTS.md.Strålningstryck från solen med box-wing och ECOM2 (DS-PA-14), valfritt.
srp_boxwing: en box-wing-modell med plana ytor och Galileo FOC/IOV-tabeller från GSC:s satellitmetadata, med nominell GNSS-girstyrning, med strålningsfaktor och partiella derivator per panel, samt den empiriska ECOM2-modellen med sina partiella derivator. Väljs medForceModel::box_wing_srp/PreciseForceModel::box_wing_srp(fältensrp_boxwing, standardNone: kanonkulevägen och alla golden-värden är oförändrade); med en box-wing-uppsättning ärcrdess strålningsfaktor. Jämförd med Orekit 12,2 under en förhandsregistrering (xval/srp-boxwing-orekit/): varje tröskel nådd, cirka 1e-15 relativt; VALIDATED som modellutvärdering, men Galileo-SRP-prognosen förblir MODELLED.SRP-skugga för tillplattad jord och solkantsmörkning (FUT-09, RM-11). Ny modul
srp_shadow:oblate_conical_shadow(WGS-84 ockulterande ellipsoid),limb_darkened_shadow(Eddingtons lag) ochShadowModel, valt medForceModel::srp_shadow(standard: den befintliga sfäriska koniska skuggan, oförändrad);forces::srp_accel_with_lit_fraction. Den tillplattade skuggan stämmer med belysningsförhållandet i Orekit 12,2 inom 7.4e-9 över 2400 geometrier (VALIDATED,xval/srp-oblate-shadow-orekit/); kantmörkning har ingen extern oberoende referens (MODELLED).NRLMSISE-00-termosfär (FUT-08, RM-10, DS-PA-13).
nrlmsise00: en portning avgtd7ochgtd7d(växlar, dagligt Ap och 3-timmars ap-array-lägen) från C-versionen i public domain av NRL:s Fortran. Den är bitidentisk med den C-portningen och inom 1.9e-6 relativt pymsis 0.13.0 (NRL Fortran, enkel precision) på ett rutnät med 720 punkter, och den återger de 17 publicerade testfallen (VALIDATED;xval/nrlmsise00-pymsis/). Detta validerar portningen, inte modellens noggrannhet mot uppmätt densitet.Valfri NRLMSISE-00-nivå för luftmotståndsdensitet.
forces::DensityModel::{Exponential, Nrlmsise00 { f107a, f107, ap }},forces::drag_accel_with_density,density_atochpropagator::ForceModel::drag_density. Den statiska exponentialmodellen förblir standard, bit för bit. Rymdvädret är konstant per modell. VALIDATED på banivå mot det egna NRLMSISE-00-luftmotståndet i Orekit 12,2 över 24 h (sämst 0,03 m mot upp till 142 km luftmotståndsförskjutning;xval/drag-tier-orekit/).Valfri DE440-sol och -måne i Cowell-propagatorn (RM-33, FUT-10).
propagator::ForceModel::with_ephemeristar emot valfriEphemerisProvider(t.ex. en DE440KernelEphemeris) för tredjekropps- och SRP-termerna; den vägrar en leverantör som inte kan betjäna epoken, räknar återgångar till den analytiska serien och är avstängd som standard.EphemerisProvider::relative_position_jd2behåller tvådelad precision. Mot Orekit 12,2 på dess egen DE440-läsare stämmer banor över 24 h till 0,017 m; den förhandsregistrerade positionströskeln för sol/måne missades (6,4 m / 0,24 m; SPICE visar samma gap), så MODELLED (xval/propagator-de440-orekit/).Valfritt atmosfärstidvatten S1 (DS-PA-03).
tides::atmospheric_tide_s1ochs1_air_tide_acceleration(Biancale & Bode 2006, GFZ STR06/01 tabell 1 modell N1, grad 2–6), aktiverat medair_tide_s1()påpropagator::ForceModelochprecise_od::PreciseForceModel; avstängt som standard. MODELLED (koefficienterna kontrollerade på nytt mot den publicerade tabellen; ingen extern oberoende referens för kraftens effekt).Satsvis banbestämning med avståndshastighet och azimut/elevation med elevationsmask (RM-36, FUT-13).
orbit_determination::determine_orbit_batch_tracking,simulate_tracking,predict_tracking,propagate_with_stm(variations-STM med analytiska tvåkropps- + J2-derivator),is_visible,measurement_with_partials;batch_ls::gauss_newton_analytic. Vägen med enbart avstånd är oförändrad. Jämfört med minstakvadratanpassning i satser i Orekit 12,2 över 8 förhandsregistrerade scenarier: varje tröskel nådd utom den brusfria tillståndsöverensstämmelsen (≤ 1 cm), som missades i 2 av 4 scenarier vid 1,46 och 1,74 cm med kshana inom 1e-8 m från referensen; registrerat, MODELLED.Viktning av SP3-noggrannhet (DS-PA-06).
sp3::parse_sp3_accuracyochSp3Accuracy::position_sigma_mavbildar noggrannhetskoderna i huvudet och per post på observationssigman; en SP3-viktad Galileo-anpassningsvariant (nivå-2 3D-RMS 0,035 m mot 0,070 m oviktad) läggs till vid sidan av de oförändrade registrerade körningarna. MODELLED.Dispatch-jobb för full Swarm-A-båge (DS-PA-08) i
.github/workflows/agency-od-validation.yml.Planetär gravitation från PDS SHADR-tabeller (CAP-30, del av CAP-31).
SphericalHarmonicField::from_shadr(src/gravity_pds.rs) läser Mars GMM-3 (d/o 120) och GRAIL GL0660B (d/o 660);Body::with_gravity_fieldkopplar på valfritt inläst fält (standardvärden oförändrade). Beskärningar till grad 20 medföljer (NASA PDS, public domain;tests/fixtures/planetary_gravity/NOTICE.md); de fullständiga filerna hämtas avxval/planetary-gravity-pyshtools/fetch_data.sh. VALIDATED mot pyshtools 4.14.1 (inom 4e-15 av total gravitation vid d/o 120 över hela sfären, 5e-14 vid d/o 660 för |lat| ≤ 60°); kopplingen till kroppssystemet förblir MODELLED (varje fälts eget system är inte det IAU-system som används).Högradig gravitation till grad 2190 (RM-14, FUT-07).
SphericalHarmonicField::acceleration_hf/potential_hf(Holmes–Featherstone modifierad framåtkolonn, inget underflöde, ingen polsingularitet),prepare_high_degree, en strömmande ICGEM-läsarefrom_gfc_file/from_gfc_reader(kontroller av norm och maxgrad, tidvattensystem registrerat, tidsvarierande termer avvisade), ochscripts/fetch_egm2008.sh(full EGM2008, SHA-256 fastlåst, ej medföljande; tester styrda avKSHANA_EGM2008_GFC).propagator::FieldEvaluatorväljer den på den valfriaGeopotential. Stämmer med Orekit 12,2 till 7.3e-17 m/s² till och med grad 2190, och en bana över 24 h på 200×200 stämmer till 0,13 m. MODELLED: pyshtools missade den förhandsregistrerade tröskeln nära polen (spårad till pyshtools) och banans känslighetskontroll för grad 70 missades (0,73 m < 1 m); båda är registrerade ixval/.DOP853-integrator (FUT-11).
integrator::integrate_dop853,integrate_dop853_checked,integrate_dop853_dense(täta utdata av ordning 7),dop853_step,dop853_initial_step, med en stegspärr som stänger säkert vid fel (fail-closed);propagator::Integrator::Dop853,propagate_dop853,propagate_dop853_checked. Standarddrivrutinen är oförändrad. VALIDATED mot SciPy 1.18.1solve_ivp(method="DOP853"): enskilda steg inom 5.6e-15, matchande stegföljder, sluttillstånd inom 1.6e-12 (xval/dop853-scipy/).Robust Kepler-lösare (FUT-12). Ny modul
kepler:solve_kepler_markley(startvärde enligt Markley 1995, kancelleringsfri residual) för alla 0 ≤ e < 1, omsluten avpropagator::solve_kepler_robust. VALIDATED mot 50-siffriga mpmath-rötter till 0,9 ε·|E| upp till e = 0,999999 (xval/kepler-mpmath/).Valfri tesseral jordgravitation i Cowell-propagatorn (RM-09).
propagator::ForceModelfårgeopotential: Option<Geopotential>(with_geopotential,with_egm2008(nmax)). Den utvärderar ettSphericalHarmonicField(medföljande EGM2008 till grad/ordning 70, eller valfri ICGEM.gfc) i ett jordfast system som nås via jordrotationsvinkeln (EarthFixedFrame::Era) eller CIO GCRS-till-ITRS-kedjan (EarthFixedFrame::Cio). StandardNone: ingen befintlig utdata ändras. VALIDATED mot Orekit 12,2 Holmes–Featherstone över 24 h (6 fall, sämst 0,036 m), med trösklarna förhandsregistrerade ixval/cowell-tesseral-orekit/PREREGISTRATION.md.Tvådelade julianska datum genom jordrotation på banvägen:
jd2::gmst82,cio::gcrs_to_itrs_matrix_jd2,frames::teme_to_itrf_jd2/itrf_to_teme_jd2,orbit::Propagator::position_in_frame_jd2ochown_jd2_utc, konverteringar viaFrommellanjd2::Jd2ochtimescales::TwoPartJd, och en valfritwo_part_jd = trueför scenariotephemeris(ECEF, markspår och stationsvy; avstängd som standard och oförändrad, och nyckeln utelämnas ur scenariots hash när den är av). Ny registerrad, VALIDATED mot pyerfagmst82/c2t06a(förhandsregistrerad b10475ee; 40 datum: GMST bitidentisk, matris inom 2.7e-14, rotation över steg på 1 µs inom 1.1e-14 rad, där vägen med en endaf64missar dem). Cowells kraftmodellsepok förblir en endaf64; skälet finns i dess dokumentation.EOP-prognos bortom tabellen (
EopSeries::with_ls_ar_prediction,EopSeries::last_mjd): en valfri förlängning av en IERS jordorienteringsserie med LS+AR-prediktorn utfärdad vid dess sista rad, så att referenssystemsargumenten för en senare epok följer prognosen i stället för att låsas vid sista raden. Svar inom tabellen är bitidentiska (testat); serien låses fortfarande om detta inte anropas. Prognosens noggrannhet förblir det befintliga LS+AR-resultatet mot Bulletin A (MODELLED).Himmelspolsoffseten dX, dY på CIO-kedjan (
cio::gcrs_to_cirs_matrix_with_offsets), och direkta ERFA-vektorkontroller avprecession_matrix,teme_to_gcrs_matrixoch den nya funktionen. Ny registerrad, VALIDATED mot pyerfa (förhandsregistrerad 979c1e39; 40 epoker 1950–2100: precession och CIO bitidentiska, TEME→GCRS inom 1.1e-10 rad, den förväntade effekten av serien med två termer för jämdygnsekvationen). Befintliga funktioner är oförändrade.UTC före 1972 på den tvådelade tidsvägen (
timescales::tai_minus_utc_on_date, ochJd2::from_utc_calendar,jd2::utc_to_taiochjd2::tai_to_utcfrån 1960-01-01): eran med glidande takt ("gummisekund"), med SOFA:s glidtabell, bråkdelade steg vid dygnets slut och UTC-till-SI-skalningen av dygnsbråkdelen. Ny registerrad, VALIDATED mot pyerfadtf2d/utctai/taiutc(förhandsregistrerad 23c40661; 117 tidpunkter 1960–1971, sämst 2.9e-11 s mot en tröskel på 1 µs). Varje resultat från 1972 och framåt är bitidentiskt (kontrollsumma fastlåst före ändringen). Före 1960 är TAI − UTC 0, som i SOFA.timescales::tai_minus_utcmed en endaf64är oförändrad.Utsänd GLONASS-satellitklocka (
GlonassEphemeris::sv_clock_bias_s):−τn + γn·(t − tb)från RINEX-posten, vid en tid avläst på satellitklockan (två fixpunktsiterationer, RTKLIB-konventionen). De tolkade−τnochγnvar tidigare oanvända. Ny registerrad "GLONASS utsänd satellitklocka och propagering av utsänd bana", VALIDATED mot RTKLIB 2.4.2-p13geph2clk/geph2pos(förhandsregistrerad e099c42a; 292 fall på en verklig utsänd fil från 2013: klockskillnad 0 s, sämsta position 1,1 mm mot en tröskel på 1 cm). Biblioteksfunktion; inget scenarioutdata ändras. Ingen PZ-90.11 → ITRF-transformation tillämpas, och modulen säger det.PPP-tidslösning mot IGS stationsklocka (0,36, FUT-19): mottagarklockan i float-PPP-filtret på WTZR stämmer med IGS slutliga kombinerade klocka för stationen till 0,075 ns (standardavvikelse) med en konstant förskjutning på −0,66 ns över de konvergerade två timmarna. Trösklarna förhandsregistrerades i
xval/ppp-time/. VALIDATED (ny registerrad). Ny testfixturigs_2025055_WTZR_05m_0006.clk, stationsklockposterna i IGS slutliga klockfil som redan används för satellitklockorna.PPP-paritet med gLAB (0,36, WP-07, RM-31): gLAB 6.0.0 kördes på samma WTZR-indata som ett separat verktyg (Apache-2.0-kärna; nedladdningens kontrollsumma verifierad mot den publicerade listan), med kommandoraden från ett förfarandemässigt tillägg incheckat före körningen. Vid sin första registrerade körning stämmer Kshanas float-PPP och gLAB:s inom 0,05 m vid 240 av 240 epoker och till 5,0 mm vid den sista. SPP-tröskeln missades (median 1,187 m mot 0,50 m) och registreras som ett fynd: gLAB:s och RTKLIB:s egna SPP-lösningar skiljer sig från varandra med 0,852 m. Den registrerade regeln lämnar därför båda verktygens led som helhet ej nådda, medan PPP-pariteten håller.
Läsning av navigationsfiler i RINEX 4 (0,36, WP-07, PRO-41):
rinex::parse_navläser RINEX 4.00-4.02-navigationsfiler (> EPHGPS LNAV, Galileo I/NAV och F/NAV, BeiDou D1/D2, QZSS LNAV; andra poster hoppas över till nästa postrubrik), ochparse_nav_withtar emot alternativ. VALIDATED mot samma dygns sammanslagna IGS-fil i RINEX 3: varje avkodat fält identiskt och 0 m i position. Läsning av RINEX 2/3 är oförändrad.Utsända BeiDou GEO-positioner (valfritt):
NavParseOptions::include_beidou_geoochRinexEphemeris::sv_position_ecef_bds_geo(BDS ICD, lutning på −5 grader).parse_navhoppar fortfarande över GEO. MODELLED: den förhandsregistrerade jämförelsen med en precis bana är datastyrd och har ännu inte körts.Observationsfiler i RINEX 4: en verklig MGEX-observationsfil i RINEX 4,00 läses i tester (MODELLED, formatkontroll).
RTK med LAMBDA på verklig RINEX (0,36, WP-07 ★):
rtk_real::run_rtk, dubbeldifferenser på kort baslinje av tvåfrekvens-GPS-kod och -fas med ett float-Kalmanfilter och LAMBDA-heltalsfixering (kvottest). VALIDATED på IGS-stationerna WTZR och WTZZ (1,4 m ifrån varandra) mot deras ITRF2020-baslinje under förhandsregistrerade trösklar: fixerad vid varje epok efter de första tio minuterna, baslinjefel median 4,5 mm och 95:e percentilen 5,5 mm.RTKLIB-paritet för PPP med verkliga data (RM-31):
xval/ppp-parity/run.shochtests/ppp_parity_glab_rtklib.rsmed förhandsregistrerade trösklar. RTKLIB v2.4.2-p13 PPP på samma WTZR-indata stämmer med Kshana inom 5 cm vid varje epok under de två sista timmarna (9,7 mm vid slutet) i den tredje registreringen; de två första körningarna, registrerade som fynd, hade fastjordstidvattnet avstängt och mottagarantennen på RTKLIB:s basplats. Paritetströskeln för enpunktslösning missades (1,09 m median mot 0,5 m). gLAB-ledet har inte körts (datastyrt).Navigationsmeddelandekodare bortom LNAV (0,36, WP-07, PRO-40):
gnss_navmsgkodar GPS CNAV (meddelandetyper 10, 11, 30; CRC-24Q; kontinuerlig kodning med hastighet 1/2, K=7), Galileo I/NAV (ordtyper 1-5 i jämna/udda nominella sidor; 30x8-interfolierare; synk0101100000) och Galileo F/NAV (sidtyper 1-4; 61x8-interfolierare; synk101101110000), med testavkodare. MODELLED: rundturer och kända svar från ICD; en förhandsregistrerad kontroll att utsända Galileo-efemerider ligger på kodarens LSB-rutnät höll (sämst 3.6e-3 LSB) men missade sin tröskel för antal satelliter (15 av 20), registrerat. Kodarna är biblioteksfunktioner; kopplingen till scenen ingår inte i denna ändring.IONEX-filläsare (0,36, WP-07):
ionex::parse_ionex_filemedIonexFile,IonexHeader,IonexEpoch,IonexFileMapochIonexTimeInterp: en strikt läsare för IONEX 1,0 med fast kolumnformat, med epoker räknade från första kartans dygn,9999läst som saknat, RMS-kartor och formatets tidsinterpolationer med närmaste, på varandra följande och roterad karta; snedriktad TEC vid huvudets skalhöjd. Kontrollerad mot en incheckad syntetisk karta och, datastyrt (hämtad vid testtillfället med fastlåst SHA-256, inte medlevererad), mot ett utsnitt av en verklig CODE GIM: varje nod exakt; interpolationen stämmer med en formelreferens till 4e-13 TECU. RTKLIB:siontecstämmer till 3.6e-13 TECU i 6885 punkter (förhandsregistrerad B6). VALIDATED på datastyrt belägg (ägarbeslut, 2026-10-13): testet misslyckas på varje annan karta än den SHA-fastlåsta.Hatch-bärvågsutjämning (0,36, WP-07):
hatch::HatchFilterochpvt::assemble_epoch_precise_smoothed, den divergensfria (jonosfärsfria) formen i den precisa enpunktsammanställningen. MODELLED med ett registrerat fynd: på IGS-stationen WTZR sänker den medianfelet för enpunktslösning från 1,55 m till 1,12 m och 95:e percentilen från 3,47 m till 3,21 m, vilket ligger under den förhandsregistrerade minskningen på 40 % (det kvarstående felet är biasliknande, inte brus).Float-PPP på verklig RINEX (0,36, WP-07):
ppp_real::run_ppp, ett statiskt float-filter för precis punktpositionering på verklig tvåfrekvens-GPS-kod och -fas med IGS slutliga produkter (antennoffset och -variationer, fast jordtidvatten, fasuppvridning, Shapirofördröjning, uppskattad våt fördröjning, detektering av cykelslip), medparse_antex_receiver. VALIDATED på den undanhållna IGS-stationen WTZR mot dess ITRF2020-koordinat under förhandsregistrerade trösklar: efter 6 h är felet 1,5 mm horisontellt och 2,9 cm vertikalt, och varje epok under de två sista timmarna ligger inom 10 cm.Interpolering av precisa SP3-klockor (0,36, WP-07):
Sp3File::clock_sochclock_nodesinterpolerar de tabellerade SP3-satellitklockorna linjärt mellan de två omslutande giltiga noderna (markören för ogiltig klocka hoppas över), ochClockRinex::from_sp3matar dem tillPreciseProducts, så att den precisa kedjan kan köras från enbart en SP3. VALIDATED mot IGS slutliga klockor på 30 s från 2025-02-24 under förhandsregistrerade trösklar: 32 GPS-satelliter, RMS i mittpunkten 0,121 ns (tröskel 0,15 ns), 95:e percentilen 0,265 ns (tröskel 0,30 ns).RAIM vid sidan av klockans holdover-kvalitetsmått (CAP-05b): en valfri sektion
[integrity]på klocktypen rapporterar ett separat blockintegrity_fom(RAIM i ögonblicksbild på en förinställd himmel från en angiven plats: utfall per epok och skyddsnivåer, tillgänglighet; otillgängligt medan GNSS är nekat, aldrig extrapolerat). Holdover-måtten är oförändrade; utan sektionen är utdata byte-identiskt. MODELLED.Tröskelvärden för mottagarförtroende kalibrerade på JammerTest 2024 (CAP-13): en förhandsregistrerad kalibrering av monitorerna för C/N0-fall, AGC och jamming-indikator på den publika datamängden JammerTest 2024 (hämtas vid körning, aldrig medlevererad;
examples/jammertest_trust_calibration.rs), levererad endast som den valfria[monitors] profile = "jammertest-2024-calibrated"(1,5 dB, 3,5 sigma, 29). På undanhållna data: trösklarna för AGC, jamming-indikator och unionen klaras; falsklarmströskeln för C/N0 klaras inte (0,023 mot 0,02), så raden är MODELLED (xval/jammertest-trust/RESULTS.md). Standardvärden och utdata utan profilen är oförändrade.ARAIM-felhypoteser för flera satelliter (CAP-05a): ADD v4.2:s delmängdsregel generaliserad bortom par (
add_v42_subset_plan,add_v42_protection_levels_to_order; ordning 2 är exakt den befintliga MAAST-kontrollerade vägen) och en valfri avancerad RAIM över dessa hypoteser (araim_subset_raim), som rapporterar delmängden med störst separation när ett fel upptäcks. A priori-sannolikheter som kräver djupare delmängder avvisas, aldrig trunkeras. MODELLED.Skyline i mottagarförtroende (FUT-01): en mottagarförtroendesession kan ange
[skyline]; satelliter bakom den förloras för himlen (sky-blocked,behind_skyline,open_fraction) och deras förluster klassasgeometry, aldrigenvironment; utan en gäller reservlösningen med azimutglapp och alla utdata som tidigare. Besättningsutbildningsgeneratorn får en händelsenatural-degradation(en blockerad himmel, inte störning) och scenariotscenarios/training/fjord-natural-degradation.toml. UERE x DOP-Monte Carlo får utformningsanteckningens två maskerade skyline-geometrier, förhandsregistrerade separat: alla 26 kontroller klaras.Verifiering av tidsstämplar enligt RFC 3161 (CAP-14):
kshana::evidence::tsa::verify_tokenkontrollerar en tidsstämpeltokens signatur (RSA PKCS#1 v1.5, RSA-PSS, ECDSA P-256 och P-384), dess ESS-bindning till signeringscertifikat, signerarens timeStamping-användning och dess kedja till ett betrott ankare vid tokenens genTime, offline;kshana evidence verify --tsa-ca <anchors.pem>tillämpar det på ett paketstimestamp.tsr(valfritt; utan det är rapporten oförändrad). VALIDATED, snävt: alla 27 självgenererade fall stämmer med OpenSSL 3.0.13 i utfall och genTime, under en jämförelse förhandsregistrerad innan verifieraren skrevs. Återkallelse kontrolleras inte.Verifieringsnivåer per mått för varje typ (RM-04): resultatet för varje scenariotyp slutar nu med ett block
figure_tierssom namnger dess huvudmått, den rad i verifieringsmatrisen som äger vart och ett och den nivå som läses från den raden (mått som ingen rad äger listas som utan nivå). Blocket läggs till efter körningen och tas bort igen så att det föregående dokumentet återställs byte för byte (api::without_figure_tiers).lunar-station-coveragehar ingenfigure_tiersförrän en ny daterad prognos ersätter den frusna;leo-ppp,solar-system,sweepochsweep-ndhar inget skalärt huvudmått, ochlunar-attack-surfaceskriver kompakt JSON. Kampanjmedlemmar behåller sina dokument utan nivåer.Kvantförinställning
quantum-cai-coast(CAP-08c): ett medföljande tröghetsscenario där en accelerometer med kallatomsinterferometer, specificerad av sin interferometerfysik ([accel_quantum.cai]med en angiven vibrationsnivå för plattformen), glider mot en kvartsaccelerometer av navigationsklass genom ett GNSS-bortfall på 110 minuter. MODELLED.Greenhalls exakta ekvivalenta frihetsgrader (CAP-03):
allan::edf_greenhall, hela algoritmen av Greenhall och Riley (2003) (differensordningar 1 till 3, brusexponenter +2 till -4, överlappande och icke-överlappande, modifierade och omodifierade, med tabellerna för stora J), med omslag för ADEV, MDEV och HDEV. VALIDATED under en förhandsregistrerad jämförelse med allantools 2024,6: 4 876 rutnätspunkter inom 6.0e-13 relativt; allantools misslyckas vid 32 ytterligare punkter, som registreras utan värde från oberoende referens. Konfidensintervallen förassurance::uncertaintyär oförändrade bit för bit.Felbidrag för kallatomsinterferometer (RM-26/27/28): Raman-laserfasbrus (med termen för retroreflektionsfördröjning), vågfrontskrökningsbias för ett termiskt moln (ren defokusering, med en detektionsradie) och upplösning av fransosäkerhet (klassiskt stödd och två avfrågningstider), som biblioteksfunktioner i
src/inertial/cai_error_terms.rs, var och en med sluten form kontrollerad mot kvadratur eller Monte Carlo. MODELLED; ännu inte nåbar från en scenariotyp (docs/QUANTUM-MODELS.md).Klockloggformat (RM-03):
src/clock_log.rsläser RINEX-klockfiler, ASCII-fas- eller frekvensloggar i TimeLab-stil och TAPR TICC-räknarloggar till en normaliserad fasserie (tau0 angiven eller funnen, glapp räknade, en glapppolicy). Valfritt: en tidssynkroniseringsserie för telekom kan namnge en logg ([series.clock_log]), och tabellen[clock_log]i ett klockscenario lägger till ett blockmeasured(ADEV, TDEV, MTIE). Utan tabellen är båda typerna byte-identiska (docs/CLOCK-LOG-FORMATS.md). En förhandsregistrerad jämförelse på tre syntetiska loggar nådde sina fas- och kopplingströsklar; skattarna stämmer med allantools inom 2.5e-14 där den utvärderar, och den utvärderar inte MTIE-punkten för hela posten (registrerat). MODELLED.Wander-masker för frekvenssynkronisering (RM-01): typen
telecom-timingfår sju wander-genereringsmasker för MTIE och TDEV vid konstant temperatur, ITU-T G.811 PRC, G.812 typerna I till III, G.8262 EEC alternativ 1 och 2 och G.8262.1 eEEC, med de potenslagsdelar som tabellerna skriver, och referensscenariotscenarios/telecom-synce-eec.toml(en fritt gående OCXO mot EEC-maskerna: den misslyckas vid 1 000 s, där en slinga måste göra jobbet). Varje rad lästes om mot texten på itu.int; G.812 (06/2004) har ersatts av en förpublicerad utgåva 08/2026 som inte kunde läsas. MODELLED (en transkription); befintliga masker och utdata är oförändrade.Vägledning om filterprior för typen
gnss-ins(0,36, WP-09, fynd RM-21): paketets standardfilterprior passar en IMU av taktisk klass. Med en IMU av navigationsklass kan standardvärdet göra den fuserade drivningen sämre än fri INS: 52 m mot 11 m på en flygprofil med 70 m/s. Ställ in[imu_*.filter_prior]så att det motsvarar sensorns klass, som de nya paketen för sjö, järnväg och flyg gör. Inget medföljande scenario parar en IMU av navigationsklass med standardprioren: varje scenario som använder standardvärdet har kvarstående accelerometerbias på minst 0,015 m/s². Endast dokumentation; inga utdata ändras.Test-bench-export kontrollerad med en simulators egna läsare (0,36, WP-09, CAP-16): rörelsefilerna från
kshana bench-exportför 8 medföljande scenarier lästes tillbaka med gps-sdr-sims läsare för NMEA, latitud/longitud/höjd och jordfast rörelse (MIT, commit 28ca29a6, använd som ett separat verktyg viaxval/testbench-gpssdrsim/; ingen signalfunktion anropas). De återger den exporterade banan till 1,2 mm, 0,15 mm och exakt. FYND: den simulatorns jordfasta läsare kan inte ta CSV med full bredd, eftersom dess radbuffert på 100 tecken delar varje rad.docs/TEST-BENCH.mdanger nu de kolumnavskärningar som ska användas och simulatorns tak på 300 s. VALIDATED (ny registerrad); exportens bytes är oförändrade.GNSS/INS på KF-GINS-datamängden (0,36, WP-09, FUT-17): inläsare och körare för
fusion::kfginssamt mätmodellen för hävarm i det slutna EKF:et. På KF-GINS-demodatamängden (hämtad vid testtillfället, inte medlevererad) är Kshanas horisontella RMS mot referensbanan 1,09 cm mot KF-GINS egna 1,11 cm, och varje förhandsregistrerad tröskel höll. VALIDATED på datastyrt belägg (ägarbeslut, 2026-10-13): datamängden hämtas med SHA-256-fastlåsningar och återskapandevägen finns ixval/kfgins/PREREGISTRATION.md.Kopplat PNT-filter i fusionspaketet (0,36, WP-09, FUT-16): typen
fusiontar en valfri tabell[coupled]som kör ett staplat filter på pseudoavstånd med ett accelerometer-biastillstånd (fusion::coupled::CoupledPntBiasFilter), ochfusion::coupled::CoupledPnt3där den 3-D-version som har 8 tillstånd. Nytt medföljande scenariofusion-pnt-coupled: med biasade accelerometrar håller det kopplade läget kvantsviterns position till 18,7 m (95:e percentilen) med full integritet, där de frikopplade filtren når 430 m. Utan tabellen är bådefusionochhybridoförändrade (fastlåsta);hybridvägrar tabellen. MODELLED.GNSS/INS-paket för sjö, järnväg och flyg (0,36, WP-09, RM-21): medföljande scenarier
gnss-ins-maritime,gnss-ins-railochgnss-ins-aviationpå trajektoriebiblioteket, och en valfri tabell[tight]för typengnss-inssom fuserar pseudoavstånd från en SGP4 Walker-konstellation (alla satelliter när nominell, de högsta få när försämrad). På järnvägspaketet håller tät koppling lösningen av navigationsklass på 5,3 m genom en skärning och en tunnel, mot 12,9 m vid löst kopplad. Utan[tight]är paketet oförändrat (fastlåst). MODELLED.Tät koppling med bärvågsfas (0,36, WP-09, RM-25 / FUT-17):
fusion::carrier_tc, ett felstats-EKF med en explicit mottagarklocka med två tillstånd och float-bärvågsosäkerheter, driven av en SGP4 Walker-konstellation med Klobuchar- och Saastamoinen-korrektioner i mätslingan, slipdetektering med tidsdifferentierad bärvåg och ny initiering av osäkerheterna, och en körning med enbart kod på samma mätningar för jämförelse. MODELLED: på en figur-8-körning är bärvågslösningen 2,5 cm mot 47 cm med enbart kod, och NIS/NEES är samstämmiga över frön.GNSS/INS-trajektoriebibliotek (0,36, WP-09, RM-24): typen
gnss-instar en valfri tabell[trajectory]medprofile = "straight" | "figure8" | "stop_go" | "aircraft" | "uas" | "csv". Profilerna styr Eulervinkelhastigheter och acceleration längs spåret från referenstillståndet och härleder den sanna IMU:n ur stelkroppskinematik (koordinerade svängar, stigningar, Coriolis);csvimporterar en referenstrajektoria (t, lat, lon, alt, vn, ve, vd, roll, pitch, yaw) och löser den IMU som återskapar den. Utan tabellen flyger paketet sin historiska färd, bit för bit (fastlåst). MODELLED.DEM-brickor i latitud/longitud för månhorisonten:
[terrain] dem_tile_pathläser en textbrickarealdata::lola_dem(höjder över medelsfären på ett rutnät i latitud/longitud) i stället för det polära stereografiskadem_path, för bådelunar-station-coverageochmoonlight-service-volume; rapporten ekar brickan (terrain.dem_tile, med dess SHA-256).realdata::lola_demär nu kopplad in i strålstegningen för horisonten. En bricka omsamplad från den medföljande beskärningen ger stationen beskärningens horisont till 0,22 grader. MODELLED.Terräng på exportplatsen för servicevolymen: med en sektion
terrainbär varje rad i exporten av geometri per satellit förmoonlight-service-volumevärdetclears_terrain(satelliten klarar den platta masken och exportplatsens horisont vid dess azimut), rapporten bär platsens horisont (export_site_terrain), och körnings-CSV får kolumnen. Utan terräng är exporten oförändrad. MODELLED.Huvudfält från motorn (0,36, STUDIO-06):
kshana::api::HEADLINE_FIELDS,field_importance_json()och WebAssembly-funktionenfield_importance()anger, för tolv typer, vilka fält i ett scenario som besvarar dess fråga, bäst först, som punktade sökvägar (jammers[].eirp_dbw). Studio läser dem före sin egen rangordning. Endast visningsmetadata: motorn läser den aldrig, ingen scenariofil behöver den, inget resultat beror på den.tests/field_importance.rsmisslyckas om en typ inte kan skickas eller en sökväg inte finns i något av typens medföljande scenarier (det fångade två sökvägar som Studios tillplattade id:n hade stavat utan arrayparenteserna).Tabell från typ till modul från motorn (0,36, STUDIO-05):
kshana::api::KIND_MODULES,kind_modules_json()och WebAssembly-funktionenkind_modules()anger, för varje scenariotyp vars rader i verifieringsmatrisen namnger en annan modul än sin egen, modulnamnen. Studios förmågekarta använde sin egen handskrivna kopia;tests/kind_modules.rsmisslyckas om en typ i tabellen inte kan skickas eller en modul inte förekommer i någon matrisrad. Inga utdata ändrades.Kort IQ-körning i webbläsarbygget (0,36):
iq_signals()ochiq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed)i WebAssembly-modulen bygger en syntetisk scen, fångar in varje satellit och spårar de infångade, allt i minnet, begränsat till 0,25 s, 1 000 000 sampel och 8 satelliter. Scenbyggaren och uppslagningen av signal efter namn flyttades ut uriq::clisom bara finns i native-bygget (tilliq::scene::syntheticochiq::signals::by_name) så att båda byggen delar dem; kommandoradens utdata är oförändrad. Det native testet ochweb/smoke.mjsjämför samma begäran mot en golden (tests/fixtures/iq_short_golden.json), byte för byte: sedan ändringen med portabel matematik (STUDIO-15, nedan) ger webbläsarbygget och det native bygget samma bitar.Typade API:er för Python och TypeScript (CAP-34):
kshana.pyitypar de stängda vokabulärerna (ScenarioKind, varje typnamn;ErrorKind;ProvenanceClass) och ordböckernaKindMetaochFieldUnit;scenario_kinds()ocherror_kind()returnerar dem. WebAssembly-paketet lägger tillrun_typed(en körning som ett typat objektRunOutputmed det tolkade dokumentet somdata) ochscenario_kinds(de tolkadeKindMeta[]), och desskshana.d.tsbär samma vokabulär;error_kindär typadErrorKind | "".tests/typed_api_sync.rshåller båda listorna lika med motorns.Enheter för varje kolumn i
sweep-nd(FUT-28): ett resultat avsweep-ndbär nukey_unitsochmetric_units, enheten för varje svept nyckel och varje registrerat mått, läst från det svepta paketets egen enhetstabell. En axel kan deklareraunitför en nyckel som paketet inte ekar; en deklarerad enhet som strider mot paketets avvisas, och en enhet som ingen av dem anger ärnull, aldrig gissad.points[].coords[]ochpoints[].metrics[]beskrivs, så var och en av de 76 typerna täcks nu fullt av grinden för fältenheter (tak för icke täckta typer 1 -> 0).NumPy-arrayer från
RunOutput(FUT-26): Python-klassenRunOutputfårarray(path),columns(path)ochseries(), som returnerar objekt av typennumpy.ndarrayför en numerisk lista, de numeriska kolumnerna i en lista med poster eller varje postserie i dokumentet. Varje array är lika mednumpy.asarrayav samma värden fråndata()(dtype och bitar). NumPy importeras bara när en av dem anropas och står utanför körkraven. Typad ikshana.pyioch kontrollerad av stubtest.Kampanjoptimerare (CAP-32): typen
campaignfår en ny, valfri sektion[optimize]som söker bland en till tre scenarionycklar inom angivna gränser efter bästa värde för ett mått: minimera, maximera eller träffa ett mål. Den söker uttömmande på ett rutnät, eller med en deterministisk begränsad Nelder–Mead-simplex. Varje utvärdering är en verklig körning av den namngivna typen och listas i resultatetstrace. Exempel:scenarios/campaign-optimize-link-budget.toml. Trösklarna förhandsregistrerades (docs/design/evidence/cap32-optimize/):- Rosenbrock-funktionen når sin tröskel (f* = 1.7e-20);
- en 1-D-målslösning med sluten form når sin tröskel (6e-15 relativt);
- rutnätet är bitidentiskt med en oberoende uttömmande sökning;
- simplexen presterar minst lika bra som ett rutnät på 41 × 41 med 177 körningar.
Tröskeln för 1-D i rond 1 registreras som NOT MET, eftersom den förhandsregistrerade rutan uteslöt lösningen. MODELLED; registerrad "Begränsad optimering av ett mått över kampanjparametrar". Additivt: kampanjer utan sektionen är oförändrade.
Kalibreringsensembler (CAP-10): tre kontroller med ett enda frö omkörda över 200 oberoende frön mot förhandsregistrerade trösklar, i
docs/CALIBRATION-ENSEMBLES.md(genererade avgen_calibration_ensembles; värden per frö idocs/data/calibration-ensembles.csv).- Bootstrap-intervallet på 95 % för kampanjens Monte Carlo täcker det sanna medelvärdet i 192 av 200 ensembler, och dess chi-kvadrat-kontroll klaras i 196.
- Percentiltoleransen för ett enda frö klaras i bara 183 av 200: NOT MET, som förutsagt. Det är en tröskel på ungefär 2 sigma, registrerad och inte lättad.
- ADEV-kalibreringarna för vit FM klaras för varje frö, med sitt sämsta fel långt inom toleransen.
MODELLED.
Inbyggda typer genom traiten
Scenario(FUT-27, pågår): traitenBuiltinKind(api::BuiltinKind, med en nivåkrok per mått ochappend_figure_tiers), och de första typerna flyttade till den (inertial,spoof,passes,link-budget,jamming). Utdata är oförändrat: ett manifest över hela katalogen med SHA-256 för varje utdata är identiskt före och efter (tests/scenario_output_manifest.rs).No-fetch-kontroll för lekplatsen (RM-07):
tests/playground_no_fetch.rskontrollerar tre saker:- varje Studio-biblioteksscenario finns i webbläsarpaketet;
- paketet är byte-identiskt med
scenarios/; - varje webbläsarscenario körs från en tom arbetskatalog.
Alt-PNT-kartor: verkligt gravitationsfält, Monte Carlo av kartfel, SRTM i full upplösning (0,36, WP-10). Typen
gravity-maptar en valfri[reference]: en gravitationsanomali syntetiserad från de medföljande EGM2008-koefficienterna (eller en ICGEM-fil.gfcviagfc_path, endast native-byggen). Den syntesen stämmer med ICGEM Calculation Service till ungefär 1e-8 mGal över 794 noder i två regioner, mot förhandsregistrerade trösklar på 0,005 mGal RMS och 0,02 mGal max (VALIDATED; registerrad "Syntes av gravitationsanomali från en sfärisk-harmonisk modell"). Det nya medföljande scenariotgps-denied-gravity-nav-egm2008kör 60-minutersbenchmarken på det verkliga fältet av grad 70. Förhandsregistrerat utfall: matchat fel 3106 m, så tröskeln på < 500 m är NOT MET, som förutsagt (grad 70 är för slät), och den tiodubbla minskningen av driften är MET (MODELLED). En valfri[map_error_mc]kör om benchmarken över fröstyrda, gaussiskt korrelerade kartfel och rapporterar fördelningen av matchat fel (medföljande scenariogravity-map-error-mc). Utforskande och inte förhandsregistrerat: med ett kartfel på 2 mGal korrelerat över 0,2 grader (den storlek som matcharens egen sigmabudget räknar med) håller sig 1 av 20 realiseringar inom 500 m (median 2,9 km, p95 14,7 km), mot 144 m med en perfekt karta. Den syntetiska benchmarkens positionsbestämning under 500 m förutsätter att kartan är exakt. Utan något av alternativen är dokumentet byte-identiskt med tidigare utgåvor.combined-altpnttar en valfri[magnetic_grid](csv_path,column) som läser den magnetiska kanalen från en CSV i EMAG2v3-format. EMAG2 medföljer inte eftersom dess villkor inte är uttryckliga:tools/fetch_emag2_tile.pyhämtar den med en fastlåst SHA-256 och beskär en ruta. Inget navigeringsutfall hävdas på det verkliga EMAG2-rutnätet. Gemensam kartskattning (terrain SLAM, RM-18):altpnt::sequential::run_sequential_trn_on_mapflyger den sekventiella terrängnavigatorn över en lagrad karta som skiljer sig från referensen, antingen genom att lita på den eller genom att uppskatta en kartkorrektion per cell med ett Rao-Blackwelliserat filter i FastSLAM-stil. Förhandsregistrerat mot SITAN med känd karta på ett korrelerat kartfel på 15 m över 20 frön: en genomsnittlig förbättring på 1,5 %, bättre i 10 av 20, så båda förbättringströsklarna är NOT MET (10 % och 12 av 20), utan skada på en perfekt karta (MET). Ett enda pass utan återbesök låter inte kartan läras (xval/terrain-slam-rbpf/, MODELLED). Dokument förterrain-slamär byte-identiska. Testerna med verklig SRTM körs nu i CI på två incheckade beskärningar i full upplösning; alla förhandsregistrerade trösklar nås, med närmaste nod lika med GDAL 3.8.4 i 8 av 8 punkter (xval/srtm-ungate/).Interoperabilitet, WP-08 (0,36; varje punkt förhandsregistrerad och incheckad ensam före sin körning mot oberoende referens, var och en en ny VALIDATED registerrad utom telemetripunkten, som vidgar en befintlig rad):
- CCSDS Orbit Data Messages (
src/odm.rs): OPM 3.0/2.0, OMM 3.0/2.0 och OCM 3,0 (blocken TRAJ, PHYS, COV, MAN, USER) skrivna och lästa i KVN och NDM/XML, och ett OMM med full precision från en SGP4-elementmängd (OmmMessage::from_omm_file); utdata frånOmmFile::to_omm_kvnär oförändrat. Mot Orekit 13.1.8 åt båda hållen: 27 av 30 Kshana-meddelanden tolkas i Orekit och Kshana läser varje meddelande skrivet av Orekit, värden inom 1e-14 relativt och epoker inom 1e-9 s; fyra fynd fastlåsta (Orekit kräverELEMENT_SET_NO, avvisarCOMMENTi användardefinierade XML-parametrar, skriver inteBTERMutanBSTAR, och läser OCM:s relativa epoker under TDB i SI-sekunder). Den äldre OMM-skrivarensMETA_STARTavvisas av Orekit (registrerat). Rad "CCSDS Orbit Data Messages (OPM, OMM, OCM)". - CCSDS Attitude Data Messages (
src/adm.rs,src/ndm_xml.rs): AEM 2.0/1.0 och APM 2,0 i KVN och XML mot Orekit 13.1.8, varje tröskel nådd; Orekits APM-skrivare avvisar en manöver utanMAN_DELTA_MASS(fastlåst). Rad "CCSDS Attitude Data Messages (AEM, APM)". - SPICE SPK-export (
src/spk_writer.rs): skrivare och läsare för SPK-typerna 9 och 13 samt OEM till SPK-export; mot CSPICE N0067 är kärnorna byte-identiska med SPICE:s och utvärderas bitidentiskt. Rad "SPICE SPK-export (typerna 9 och 13)". - SPICE SPK-typerna 3 och 21 (
src/spk_writer.rs): segment av typ 3 (Chebyshev) och typ 21 (utökade differenslinjer) skrivna från givna poster och utvärderade som SPICE gör; mot CSPICE N0067 är kärnorna byte-identiska med SPICE:s och varje utvärdering stämmer bit för bit åt båda hållen. Rad "SPICE SPK-typerna 3 och 21 (Chebyshev, utökade differenslinjer)". - Utökningar av Space Packet (
src/space_packet.rs): sekundärhuvud med tidskoderna CUC/CDS, paketfelskontroll, segmentering och strömkontroller, mot ccsdspy 2.0.1, spacepackets-rs 0.18.0, spacepackets-py 0.32.0 och CPythoncrc_hqx, noll avvikelser. Rad "CCSDS Space Packet, sekundärhuvud, paketfelskontroll och segmentering". - Telemetrischema 1,3 genom verkliga konsumenter: en syntetisk ström i schema 1.3 med Prometheus-exposition och OTLP/HTTP JSON, inklusive geometriserien och etiketten
class, lästa exakt av prometheus_client och OTLP-proto, accepterade av promtool 3.5.0check metricsutan lintproblem, och vidarebefordrade oförändrade genom OpenTelemetry Collector contrib 0.135.0 (datastyrt: verktyg hämtade med fastlåst SHA-256, utdata incheckade).
- CCSDS Orbit Data Messages (
Banbestämning för Mars, körning 2 (0,36, WP-14, CAP-30):
mars_od::fit_dampedskalar normalmatrisen med dess diagonal och dämpar steget (Levenberg–Marquardt), efter att den registrerade Gauss–Newton-anpassningen misslyckats på en matris vars råa diagonal spänner över åtta storleksordningar. Registrerad separat (xval/mro-od/PREREGISTRATION-RUN2.md, samma båge, trösklar och redigering). På de poängsatta MRO-passagerna ligger banan inom 0,36 km RMS (0,53 km maximum) från MRO:s navigationsrekonstruktion, trösklar nådda. Doppler efter anpassning är 48,6 mHz mot tröskeln 30 mHz, inte nådd (fynd fastlåst). Ett ändringstillägg enbart för poängsättning, R2-A1, redovisas idocs/revisions. Raden förblir MODELLED.Mars rampad 2-vägs-Dopplermodell och banbestämning (0,36, WP-14, CAP-30 del, steg 2):
mars_odförutsäger DSN:s rampade X-band 2-vägs-Doppler från ODF-ramptabeller (ljustid, Shapiro, troposfär, stationstid, DSN-stationer via CIO-kedjan och IERS EOP) och anpassar en Mars-satellit (GMM-3, tredjekroppar, SRP, luftmotstånd).naif_kernelläser SPK-typ 1 (kontrollerad mot CSPICE) ochgravity_sh::from_shadrläser PDS SHADR-fält. Förhandsregistrerat mot MRO:s navigationsrekonstruktion på verkliga MRO-passager (datastyrt,scripts/fetch_mro_od.sh, månatlig CI): den förutsagda Dopplern matchar observationerna till 12,5 mHz (tröskel 30 mHz, nådd); den registrerade banpassningen misslyckades på den poängsatta bågen och gav ingen bana (fynd fastlåst). Raden förblir MODELLED.Läsare för DSN Orbit Data File (0,36, WP-14, CAP-30 del):
odf::parse_odfläser TRK-2-18-ODF:er. På en verklig ODF från Mars Reconnaissance Orbiter (NASA PDS, medföljande) stämmer läsaren med PDS-etikettens postantal, grupppositioner, stationer och tider, och alla dess datatyper är kända. Etikettens tabell vid filslut är en rad kortare än filen, en etikettinkonsistens registrerad som ett fynd. MODELLED. Banbestämning på dessa data är ännu inte gjord.TWSTFT-budget och stabilitet för tidsöverföring: typen
time-transfer-budget(0,36, WP-14, FUT-19).- Tvåvägsekvation:
twstft_budgetlöser den för T_A − T_B med stationsutrustningens fördröjningar, Ku-bandets jonosfäriska asymmetri upp/ner, skillnaden i transponderfördröjning och Sagnac-termerna, och återskapar framåtmodellen till 1e-15 s. - Osäkerhetsbudget: kombinerad kvadratiskt, med länkens TDEV som typ A-term.
- Länkbrus: tvåvägsserien får ett flickerfasbrusgolv, en dygnsvarierande icke-reciprocitet och en konstant reciprocitetsrest. Paketet
timetransfermed vitt jitter är oförändrat. - Verkliga serier: stabiliteten hos tillhandahållna serier från BIPM Circular T, CSV
MJD,nseller IGS stationsklockor.
MODELLED. Nytt medföljande scenario
time-transfer-budget. PPP-tidslösningen är VALIDATED separat mot IGS stationsklocka på grenen för verkliga GNSS-data.- Tvåvägsekvation:
Inträdesuppvärmning, EO-radiometri och uppstigningsförluster (0,36, WP-14, CAP-28): tre nya typer.
entry-heating: ett 3-DoF-inträde som punktmassa över en roterande jord eller Mars med Sutton–Graves stagnationspunktsuppvärmning.eo-radiometry: avbildares SNR, MTF vid Nyquist, relativ kantrespons och GIQE 4 NIIRS.ascent-losses: en uppstigning i flera steg med gravitationssväng och förluster från gravitation, luftmotstånd, styrning och mottryck, kontrollerad av den exakta identiteten ideal-dv minus förluster.
Inträdets maximala retardation kontrollerades mot den publicerade nominella för Stardust under en förhandsregistrerad tröskel: 35,44 g mot 33,4 g (+6,1 %, tröskel 10 %). Den raden är VALIDATED. Uppvärmning, radiometri och uppstigning är MODELLED. Nytt är också:
reentry::us76_pressure, medföljande scenarierentry-heating-stardust,eo-radiometryochascent-losses, samtdocs/ENTRY-EO-ASCENT.md.Attitydreglering med reaktionshjul: typen
aocs(0,36, WP-14, CAP-21). En tröghetsriktad vridning av ett stelt nav med tre eller fler balanserade reaktionshjul under MRP-återkoppling, med minimumnorm-hjulmoment begränsade till varje motors gräns (aocs). Den kan också sluta slingan på ett multiplikativt EKF från en simulerad gyro och stjärnkamera (aocs_mekf). Slingan med sant tillstånd jämfördes med Basilisk 2.9.1 på tre fall förhandsregistrerade innan koden fanns (tre ortogonala hjul, en fyrhjulspyramid, ett mättande fall). Varje MRP-komponent, kroppsvinkelhastighet, hjulhastighet och motormoment stämde vid varje sampel, sämst 2.4e-14 i sigma och 2.9e-11 rad/s i hjulhastighet. Denna rad är VALIDATED; MEKF är MODELLED (NEES-samstämmighet). Nya medföljande scenarieraocs-slewochaocs-slew-mekf, samtdocs/AOCS.md.Schemaläggning av markkontakter och DVB-S2 ACM (0,36, WP-14, CAP-22/23): två nya scenariotyper.
acm-linkger, för en satellit över en station, varje passages Es/N0 och den DVB-S2 MODCOD som väljs längs den (ETSI EN 302 307-1 trösklarna i tabell 13 plus en marginal). Den ger också den datavolym som ACM förflyttar jämfört med baslinjen med konstant kodning.contact-schedulegör detsamma för flera satelliter över flera stationer och bygger en konfliktfri kontaktplan (antennomställning, en station per satellit, prioritetsviktad leverans begränsad till varje kö). Den rapporterar en girig plan med marginalvärde, en baslinje enligt först till kvarn och det exakta optimumet på små mängder, med den giriga planens optimalitetsgap. Åtkomstfönster kommer från den VALIDATED prediktorn för skenbara passager. Nya medföljande scenarieracm-linkochcontact-schedule(illustrativa indata) samtdocs/CONTACT-SCHEDULING.md. MODELLED (två nya registerrader).Starlink-Dopplerpositionering mot ett publicerat experiment (0,36, WP-14, CAP-11 del, MODELLED). Detta är en förhandsregistrerad proxyjämförelse av Dopplerläget i
leo-pvtmed förinställningenstarlink-sopmot percentilerna i datamängd 3 i "Unveiling Starlink for PNT" (NAVIGATION 72(1), 2025, doi:10.33012/navi.685). Modellen använde 3 satelliter (en mask på 47 grader vald med en fast regel), ingen höjdhjälp och en Doppler-sigma på 30 Hz, över 200 frön. Dess 3-D-fel vid 90:e percentilen är 92,2 m vid 20 s och 870 m vid 8 s, mot de publicerade 2 m och 10 m, så båda trösklarna på en faktor två är NOT MET. Modellen är pessimistisk, inte optimistisk som förutsagt: tre fasta satelliter ger mycket mindre geometrisk mångfald än experimentets 63 satelliter över 10 minuter med kanalbyte var 15 s. Båda missarna fastställs i test (tests/starlink_doppler_published_proxy.rs).Impulsiv transferoptimerare på DE440 (0,36, WP-14, CAP-20c/d):
maneuver::optimise_transfer_kernelfinner avgångs- och ankomstdatum för en ballistisk tvåimpulstransfer med ett varv som minimerar avgångs-C3 eller ankomst-V-infinity inom typ I eller typ II. Den söker i ett rutnät på 2 dagar och förfinar sedan med 2-D Nelder–Mead, på heliocentriska tillstånd från DE440-kärnan; den bygger påporkchop_kernel. Jämförelsen förhandsregistrerades (bf0439e8) mot en oberoende optimerare med SPICE + pykep 3.0.1 + SciPy 1.18.1 på möjligheten Jorden–Mars 2026: alla fyra optimeringar stämmer till 8.7e-13 relativt, med datum inom 1e-5 dygn (VALIDATED, ny registerrad). Som sekundär publicerad referens matchas NASA/TM-2010-216764 (handboken för Jorden–Mars 2026-2045) för minsta C3 av typ II (9,182 mot 9,144) och minsta ankomst-V-infinity av typ II (2,564 mot 2,565). Dess minsta C3 av typ I matchas inte: 10,535 mot 11,11 (-5.18 %), där biblioteksreferensen stämmer med Kshana. Missen registreras och fastställs i test.Studie av månreferensstation (0,36, föranledd av publicerat material om en planerad referensstation vid månens sydpol; källor i
docs/LUNAR-REFERENCE-STATION.md): typenlunar-station-coverage, ett Monte Carlo-svep av den lunara differentiella PNT-modellen över ett sydpolärt användarrutnät och ett dygn av epoker, som ger per punkt och över regionen percentilfelet korrigerat och okorrigerat, tillgänglighet med skäl, täckning mot en angiven tröskel, skyddsnivåer, täckningsradien per azimut och korrektionslänkens budget. Den reduceras exakt tilllunar-differential-pntvid en punkt, en epok och ett försök; dess aritmetik beräknades om av numpy under en förhandsregistrerad tröskel (positioner och percentiler nådda; stationskorrektionerna missade sin på grund av avrundning i dubbel precision, registrerat). MODELLED; registerrad "Täckning och noggrannhetskarta för månreferensstation". Inte knuten till eller stödd av någon myndighet; inget uttalande om prestanda hos något verkligt system.Förhandsregistrerad prognos: täckning för månreferensstation (inte en validering; MODELLED).
docs/predictions/lunar-reference-station.mdfryser, vid commit c05dac1d, resultaten förlunar-station-coverageunder de offentligt angivna antagandena, med SHA-256-hashar av indata och resultat och ett poängprotokoll fastställt nu (faktor 2 för noggrannheter och skyddsnivåer, 10 procentenheter för tillgänglighet och täckning; ett ändrat antagande får en ny daterad prognos, aldrig en redigering; en miss publiceras lika framträdande som en träff). Varje värde domineras av den fyrsatellitkonstellationens opublicerade elementmängd, som är ILLUSTRATIVE, och säger det.tests/prediction_frozen.rsvaktar den;docs/VALIDATION.mdfår ett avsnitt "Förhandsregistrerade prognoser". Ingen registerrad.Utökningar för månreferensstation (0,36; begränsningarna 2 och 3 i stationsstudien och källornas lösningsstil), var och en valfri på
lunar-station-coverageoch frånvarande som standard, så att varje befintligt dokument, den frusna prognosen inräknad, är oförändrat:[receiver](flervägsutbredninga + b exp(-el / el0)hos användaren och stationen, stationens valfritt som Gauss–Markov över epoker, DLL-kodbrus från C/N0, interkanalbias; värden ILLUSTRATIVE på månen);orbit_err_growth_m_per_s(linjär tillväxt av det utsända banfelet över korrektionsfördröjningen, ILLUSTRATIVE);[solution](höjdbegränsning, ett minimum av tre satelliter med den, ett fönster för statisk användare över epoker). Två tillägg till jämförelsen med publicerade påståenden, vart och ett förhandsregistrerat ensamt före sin körning, ligger bredvid den oredigerade registrerade körningen: K5 med tillväxt misslyckas vid varje takt; med källornas lösningsstil misslyckas K1 till K5 och K6 klaras (1 av 6), där det korrigerade 3-D-felet vid p95 för R300 faller från 280,6 m till 2,11 m. MODELLED; tre registerrader.Horisontmasker för månterräng (0,36; den första begränsningen i studien av månreferensstation): en valfri sektion
[terrain]pålunar-station-coverage(stationen och varje användarpunkt) ochmoonlight-service-volume(varje rutnätspunkt) ger varje plats en azimutberoende horisont i skyline-tabellformatet för 0,36, från en angiven profil märkt med sin källa (station_horizon,user_horizon) och/eller en strålstegning över en polär DEM (dem_path) längs storcirklar på månsfären med exakt krökning. Medför en beskärning på 0,98 MB av den sydpolära DEM:enLDEM_75S_240Mfrån LRO LOLA (public domain), omsamplad med blockmedelvärde 5 x 5 till 1200 m (data/lunar-dem/, med dess NOTICE, SHA-256 ochscripts/make_lola_south_polar_crop.py), och scenariotscenarios/lunar-station-coverage-terrain.tomlsom endast finns i förrådet. Kontrollerad mot slutna horisonter (bar sfär, krater i en platå, rastrerad kon); MODELLED, registerrad "Horisontmasker för månterräng från en angiven profil eller en polär DEM". Utan sektionen är varje dokument, enhetsblocket inräknat, byte-identiskt.Geometrimedvetet förtroende (utformningsanteckningen för geometri i 0,36, avsnitt 4). Varje epok i
receiver-trust, statisk eller fartyg, batch eller live, bär sin satellitgeometri:good,degraded(skälfew-satellites,high-pdop,high-hdopoch informationensky-blocked) ellerunknowndär loggen inte ger någon satellitgeometri, med HDOP, PDOP, VDOP och använda satelliter. Den härleds från de elevationer och azimut som mottagaren rapporterar (NMEA GSV, UBX NAV-SAT) genom den befintliga kärnanorbit::dop, eller tas från NMEA GSA. Varje epok bär också en etikett,good,fairellerpoor, alltid rapporterad och aldrig poängsatt, och en notering med HDOP, PDOP, VDOP, antal satelliter och signalförlust i ord. Ett fartygs poäng får en monitorgeometrysom drar av ingenting om inte geometrin är dålig (HDOP över 4, PDOP över 6 eller färre än 5 använda satelliter), och sedan ramper upp till ett tak på 15 poäng; enbart geometri når högst det försämrade bandet, aldrig det opålitliga (inget larm). Varje avdrag får en klass,geometry,environmentellerinconsistency, så att en dålig himmel inte läses som en attack.loss-of-lockärgeometrynär de förlorade satelliterna alla låg under 15 grader vid sin senaste rapport; ett avdrag för dålig geometri ärinconsistencynär den HDOP mottagaren anger avviker från dess angivna himmel med mer än max(1,0, 25 % av den härledda HDOP), så att en förfalskad dålig himmel inte kan köpa etiketten. En ny tabell[geometry]anger varje tröskel med dess proveniens (HDOP 4, PDOP 6, minst 5 använda, sigma_UERE 1,5 m, en HDOP-tolerans på max(1,0, 25 % av den härledda HDOP) där 25 % är ett representativt val för mottagare med klockor per konstellation eller delmängdslösningar, 15 grader; siffrorna i IEC 61108-1 och GPS SPS som citerade, att kontrolleras mot standardernas text). Total signalförlust märks inte som himmel: när satelliter i sikte inte spåras och DOP för satelliterna i sikte är bra (och de ospårade inte är begränsade till en halva av horisonten), bär epokensignal_lossoch geometriavdraget ärenvironment. Ett angivet HDOP eller PDOP på 99 eller mer, GGA-kvalitet 0 och GSA-läge 1 läses som ingen positionsbestämning, inte som DOP. Taket (cap_points15), rampens slut (full_ratio1,5) och golvet (floor, som standard poängensdegraded_min) finns i[geometry], liksom etikettens goda nivåer (HDOP 2, PDOP 3, 6 satelliter, representativt); taket som gäller ärmin(cap_points, 100 - floor), så en tabell[score]som höjerdegraded_min(en på 0,35 inräknad) sänker taket i stället för att avvisas, och ett golv underdegraded_minavvisas. MODELLED; rådgivande programvara, inte typgodkänd navigationsutrustning (IEC 61108, IEC 61162): operatören är fortsatt ansvarig för fartygets navigering.Geometrin når varje yta: resultat-JSON (
epochs[].geometry,classpå varje avdrag,geometry_model,geometry_summary), de levande JSON-raderna (schema 1,3), Python- och WebAssembly-gränssnittenreceiver_trust,assess_vessel_logochreceiver_trust_replay, MCP-verktygenassess_*, bevispaket (epochs.json,config.json, ett geometrispår på sammanfattningssidan) ochtrust-telemetry(Prometheuskshana_trust_geometry*och en etikettclasspåkshana_trust_reason_active, OTLPkshana.geometry.*, anpassade CEF-fältcs6(geometristatus och klasser),cfp3(HDOP) ochcfp4(PDOP), kontrollerade mot båda CEF-referenstolkarna, och LEEFgeoStatus,geoHdop,geoClass). Geometrietiketten exporteras också, tillagd efter varje tidigare serie och fält och endast för indata som bär den: Prometheuskshana_trust_geometry_label{label}ochkshana_trust_geometry_vdop, OTLPkshana.geometry.labelochkshana.geometry.vdop, LEEFgeoLabel,geoPdop,geoVdop,geoUsed, och CEF ett tredje fältcs6(etiketten) ochcn1(använda satelliter); VDOP finns inte i CEF (flyttalsfälten för anpassade fält är upptagna). Båda CEF-referenstolkarna läser tillbaka etikettfallen som skrivna (tillägg 5: 176 rader, 172 tolkade av pycef, 176 av Logstash). Ett angivet HDOP som den angivna himlen inte förklarar flaggas på varje epok och räknas (geometry_summary.hdop_mismatch, en rad på bevissammanfattningens sida), och poängsätts endast när geometrin är dålig. Signalförlust exporteras för sig, eftersom geometristatusen förblirdegradedmedan den består: Prometheuskshana_trust_geometry_signal_loss, OTLPkshana.geometry.signal_loss, LEEFgeoSignalLoss=1; i CEF visas den som klassenenvironmentics6.orbit::dop_cofactor: kovariansfaktorn(HᵀH)⁻¹bakomorbit::dop, utbruten ur den med samma aritmetik.Registerrad "Positionsfel från geometri: RMS-fel = sigma_UERE x DOP" (MODELLED, intern samstämmighet): en fröstyrd Monte Carlo av motorns minstakvadratbestämning på 8 gnss_lib_py-matchade DOP-geometrier mot kovariansfaktorn i den validerade DOP-kärnan, med toleranser förhandsregistrerade före första körningen och två negativa kontroller som misslyckas som krävs; vid sidan av den, en tidigare kontroll på fyra handvalda himlar med chi-kvadrat-konfidensintervall, redovisad som körd före förhandsregistreringen.
Azimutberoende skyline-masker (
src/skyline.rs,docs/SKYLINE.md, utformningsanteckningens punkt 1): en elevationsgräns som beror på azimut, punktvis maximum av tabeller (var och en interpolerad för sig, omlindad vid 360°), en gatukanjon i sluten form (med valfria öppna ändar), skarpkantade sektorer och en terrängprofil med jordens krökning; den effektiva gränsen ärmax(mask_deg, skyline). Fyra REPRESENTATIVE förinställningar med angiven proveniens (city-street,harbour-approach,fjord,container-terminal), överskrivbara fält för fält. En valfri sektion[skyline]i träningsfilerna förgnss-sim,jamming,leo-pvt(varje läge, det polära svepet inräknat),leo-passochnmea-scenario, och iorbitochintegritygenom en ny användare på marknivå,user_site = { lat_deg, lon_deg, height_m }(geodetiska siktvinklar på den roterande jorden, med den geodetiska uppåtriktningen för ARAIM:s horisontella och vertikala uppdelning; varje sampel är ett absolut ögonblick,epoch + t, till vilket elementmängder, utsända efemerider och SP3-filer förs fram från sina egna epoker, daterade från den nyaste satellitepoken när ingenepochanges; en kretsandeuseravvisar en skyline). Resultat fårskyline { source, open_fraction, provenance }ochmasked_by_skylineper sampel. Utan sektionen är varje scenario byte-identiskt med 0.35.0, kontrollerat mot sammandrag från utgivningscommiten. Sex medföljande exempel:orbit-urban-canyon-skyline,integrity-harbour-approach,gnss-sim-container-terminal-skyline,jamming-harbour-approach-skyline,leo-pvt-fjord-skylineoch kampanjenleo-vertical-autonomous-vehicle-skyline(kanjonen för det autonoma fordonet som plan gräns och som gata; den befintliga kampanjen är oförändrad). MODELLED.Funktioner för himmelsgeometri (
src/geometry.rs, utformningsanteckningens punkt 2):sky_geometry(synliga och maskerade satelliter från en plats, en tid och konstellationsförinställningar, tvåradiga elementmängder (tle, högst 4 MiB, propagerade av motorns SGP4 till en UTC-epokepoch) eller givna satelliter;sky_sourceochsky_statementanger om himlen är representativ eller den himmel som elementmängderna ger vid den epoken, inte en mätning;tle_skippedlistar varje oanvänd rad med sitt skäl; indatagränser på 2000 satelliter över horisonten, kontrollerade innan en systemtabell byggs, och 16 mottagarklockor; de fem DOP-värdena; ENU-kofaktorn och kovariansen med en klocka per system eller en gemensam; den horisontella felellipsen vid en sigma och vid en angiven konfidens),sky_monte_carlo(fröstyrda minstakvadratfel, högst 5000),skyline_presets,skyline_profileochskyplot_svg.orbit::dop_covexponerar kovariansen bakomorbit::dop, som nu är dess reduktion (de kontrollerade skalärerna är oförändrade). Ytor:kshana skyochkshana skyline, Python- och WASM-funktioner med samma namn, och MCP-verktygetsky_geometry(40 verktyg), och notebookennotebooks/geometry.ipynb(med dess spegel.md; körs avtests/python/test_notebooks.py). Varje resultat bär etiketten MODELLED, uttalandet om felmodellen och den rådgivande texten.Register: fem rader för skyline och himmelsgeometri. VALIDATED, var och en i en jämförelse förhandsregistrerad innan dess oberoende referens kördes: Azimutberoende skyline-mask: synlig mängd, azimut och elevation, och DOP under masken mot Orekit 12,2 (
TopocentricFrame,ElevationMask) och gnss_lib_py 1.0.4 (get_dop), sämsta skillnader i siktvinkel och mask 1.1e-12° mot 1e-9°, identiska synliga mängder, DOP 3.3e-13 relativt (xval/orekit-skyline/); Horisontell felellips och kofaktor per system från geometrikovariansen mot numpylinalg.invochlinalg.eigh(standard P2), 270 fall, axlar 5.1e-13 relativt (xval/numpy-ellipse/). MODELLED: kanjon-, sektor- och terrängreduktionerna; förinställningarna; sammansättningen av himmelsgeometri (förinställd himmel, Monte Carlo-moln).Med raderna för geometriförtroende, skyline och månreferensstation har registret 274 rader: 134 Validated, 136 Modelled, 4 Partner.
Månreferensstation: stationens tidslaboratorium (MODELLED). Ett valfritt block
[time_lab]pålunar-time-budget(src/lunar_time_lab.rs). Det modellerar en stationsklocka (som standard miniRAFS-klassen, valfri namngiven klass, eller ett enhetskort anpassat till angivna stabilitetspunkter) styrd mot LTC, sedan fritt gående eller omstyrd var N:e sekund. Den ger tidsfelskurvan x(t), tiden till 1, 10 och 100 ns (bisektion bredvid sluten form) och den dominerande termen per horisont, alla med enheter. Styrresten är ILLUSTRATIVE. LTC-takten härleds inte på nytt och behåller sin egen VALIDATED rad. Nanosekundmålet i det offentliga materialet från ICG WG-B Lunar PNT (juni 2024) citeras som ett källuttalande, inte ett påstående. Klockordningen optisk < PHM < RAFS < miniRAFS gäller från 1 s till 7e5 s, och testet fastlåser korsningen mellan PHM- och RAFS-kurvorna nära 7.5e5 s. Den korsningen är en egenskap hos klockmodellerna med en enda brustyp (ren flicker-FM mot ren vit FM), inte ett fysikaliskt resultat. Utan blocket är rapporten, dess tabell och dess sammanfattning oförändrade. Exempel:scenarios/lunar-station-time-lab.toml. Lägger till en registerrad, märkt MODELLED.Månreferensstation: stationsgeodesi (MODELLED). Valfria indata
extra_reflectorsochextra_beaconspålunar-llr-datumlägger till ett blockstation_geodesy. Datuminformationen med fem arrayer från den arkiverade laseravståndsskivan kombineras med vad en tillagd retroreflektor och en tillagd VLBI-fyr på angivna platser skulle bidra med. Reflektorn avståndsmäts vid de arkiverade epoker den kan se, med sina arkiverade vikter. Fyren använder nätverket och schemat frånlunar-frame-campaign, med stationerna fasta. Blocket ger varje Helmert-1-sigma före och efter, och deras kvot. Dessa är Cramer–Rao-gränser för en reducerad parametermängd, på ett ILLUSTRATIVE schema och en illustrativ plats. Frånvarande eller tomma indata lämnar rapporten byte-identisk. Exempel:scenarios/lunar-station-geodesy-baseline.tomloch-with-station.toml. Lägger till en registerrad, märkt MODELLED.Månreferensstation: jämförelse med publicerade påståenden (MODELLED). Varje numeriskt påstående i fem offentliga källor listas med sin exakta formulering, sida och angivna antaganden, och klassas som jämförbart, delvis jämförbart eller inte jämförbart (
tests/fixtures/lunar_station_published/CLAIMS.md; källor med URL, hämtningsdatum, SHA-256 och licens itests/fixtures/lunar_station/SOURCES.md). De delvis jämförbara påståendena poängsattes under sex ensidiga trösklar förhandsregistrerade före körningen (PREREGISTRATION.md, revision 2, 05bf9a19): 1 av 6 påståenden inom den förhandsregistrerade tröskeln (förhandsregistrerad 05bf9a19). Täckningen är 0,00 mot >= 0,95 på båda sydpolära cirklarna, och det korrigerade p95 är 280,6 m mot <= 1,5 m. Orsaken är satelliternas banelement, som ingen källa publicerar: med de ILLUSTRATIVE elementen i källträdet är fyra satelliter i gemensam sikt i 8 % av epokerna, vid nästan singulär geometri. Körningen återger inte påståendena med dessa element och är inte belägg för att påståendena är fel. Fastlåst itests/lunar_station_published_oracle.rs. En registerrad, märkt MODELLED med fyndet.Månreferensstation: databeredskap för klockfiler.
realdata::clk::rinex_clock_seriesanger nu tidssystemet för sina epoker. Det är värdetTIME SYSTEM ID, eller, när det inte är deklarerat, standardvärdet för huvudets satellitsystem. Resultatet säger också om systemet deklarerades. Funktionen avvisar ett okänt tidssystem (en lunar tidsskala, till exempel), en odeklarerad fil med blandade system och filer som motsäger varandra, i stället för att läsa dem som GPS-tid. Den levereras med en syntetisk stationsklockfixtur. Inget format för korrektionsfiler definieras, eftersom inget offentligt finns.
Ändrat#
Moduldokumentationen för
fusion::ukf,fusion::tightly_coupledochfusion::gnss_ins_ekfkallar inte längre UKF-navigatorn med 17 tillstånd, den fulla INS-täta kopplingen och det explicita klocktillståndet framtida arbete; de pekar påhybrid_ukf,tightly_coupled17ochcarrier_tc.RINEX 4 avvisas inte längre (0,36, WP-07): en navigationsfil i RINEX 4 avvisades förr med avsikt; den läses nu (se Tillagt). För observationsfiler av version 4 och senare matchas rubriketiketter endast i kolumnerna 61-80, så att de nya fritextposterna inte kan passera som etiketter.
ionex::parse_ionexläser verkliga IONEX-filer (0,36, WP-07): en fullständig post med 16 värden fyller kolumnerna 61-80, vilka läsaren tog för en etikett, så den returneradeNonepå varje verklig IONEX-fil. Den läser nu en post vars etikettfält är numeriskt som värden. Ingen levererad utdata använde den.Mottagna effekter för Galileo E1 och E5a enligt OS SIS ICD Issue 2,1 (revision, 2026-10-14). Spektrumbanden
galileo-e1ochgalileo-e5a, och de GNSS-offer med LEO-signal som tar sin effekt från dem, använder nu minimimottagna effekterna i tabell 12 i Galileo OS SIS ICD Issue 2,1: −157,25 dBW (var −157,0) och −155,25 dBW (var −155,0).- Nio scenarioresultat flyttas: spektrumexemplen, spektrumkampanjen, tre LEO-resiliensvertikaler och tre LEO-signalutformningar. Effektivt C/N0 flyttas −0,25 dB och J/S +0,25 dB på dessa band.
- Varje flyttat värde (1766, gammalt → nytt) listas i
docs/revisions/CAP12-galileo-icd21-power-changes.mdoch dess CSV, med de dokumenttabeller som flyttats. Ingen registerrad ändrar status. - Andra delen, samma dag: LEO-signaloffren
galileo-e5b(−155,0 → −155,25 dBW, tabell 12 E5b) ochgalileo-e5-altboc(−152,0 → −152,24 dBW). ICD:n har ingen E5-rad för fullt band, så AltBOC-värdet är effektsumman av totalerna för E5a och E5b i tabell 12, byggd som det gamla värdet var. Tre resultat för LEO-signalutformning flyttas (64 värden: dessa mottagna effekter och C/N0-försämringen från LEO till GNSS på de två offren), listade i samma revision (§5) och CSV. Inget annat flyttas.
Korrigering av atmosfärstidvatten S2 (
tides::atmospheric_tide). S2-lufttrycksharmonikerna hos Ray (2001) är koefficienter för onormaliseradeP_nmmed cosinusfasfördröjningar; de användes som fullt normaliserade med fördröjningen som IERS sinusledning. De går nu in dividerade medN_nmmedε = 90° − ψ; den nyatides::s2_air_wavesåterskapar modell A2 i GFZ STR06/01 tabell 5 för alla 21 vågor (sämst 0,0005 cm, 0,05°; VALIDATED). Bara utdata där tidvatten är aktiverat flyttas: Galileo CI-anpassningen 0,132 → 0,133 m, Swarm-A-komponenter med 1–2 mm (förhandsregistrerat ixval/s2-air-tide-fix/).Endast dokumentation:
propagator::solve_kepler_checked,orbit::solve_keplerochephem::solve_keplerdokumenteras som äldre lösare, numeriskt oförändrade, med hänvisning tillkepler::solve_kepler_markley.D9 rond 3 (
utck_bound), status. BIPM Circular T 465 kom ut 2026-10-12. Den förhandsregistrerade prospektiva poängsättningen är fortfarande inte körd: utgåva 465 innehåller omkring 285 testvärden, och stoppregeln kräver 1000, alltså omkring utgåvorna 465–468. Körningen kräver också de arkiverade filerna per laboratorium från 2026-09-30, eftersom BIPM sedan dess har skrivit om 87 av 113. Registerraden och testhuvudet säger detta; testet, dess trösklar och dess uppdelning är oförändrade.Genomgång av dokumentationens sanning (0,36). Färdplan, förmågerader, statusrader i utformningsdokument och modulkommentarer bringade i linje med koden; inga utdata ändras. Punkter som redan är byggda men fortfarande listade som öppna är nu markerade som klara: ITU-T-maskkontrollerna, holdover-scenariot på 24 h och inläsning av klockloggar (telecom timing), snabbstarterna för första minuten, Lense–Thirring och korskontrollen av Orekit-propagatorn, den ITRF-precisa GCRS-kedjan, golden- och korsplattformshashar, proveniens, ARAIM med flera fel (ADD v4.2), FDE för en enda satellit, CRPA-biblioteket, gränsen för CAI-fransosäkerhet, dimensionering av streets-of-coverage och 3-D-banvyn, stelkroppsattitydsdynamik, OMM-skrivaren och läsaren för NAIF-kärnor, DE440-librationen för månen, meningen om körningens betydelse i playground,
PositioningFom, den tätt kopplade navigatorn med 17 tillstånd och typen för gravitationskarta. Raderna anger också exakt vad som fortfarande är öppet (till exempel tvådelat JD iorbit::Propagator, läsarensrc/ionex.rsmot en verklig produkt, och uteslutning av flera satelliter iraim). Den saknadedocs/design/evidence/cn0-m2m4/RESULTS.mdär skriven från en ny körning av dess tester (M1–M4 klaras), och det partnerriktade utkastet till IQ-validering har aktuella registerantal.Minneskoderna för Galileo E1 medföljer inte längre.
data/galileo-os-sis-icd/C7_E1B.txtochC8_E1C.txt(ICD Annex C.7/C.8) har tagits bort från förrådet och paketen. ICD:ns villkor (citerade iLICENSING.md) låter en användare lagra koderna med källan angiven och använda dem i en produkt, men tillåter vidaredistribution endast för icke-kommersiella ändamål, och Kshana erbjuds också under en kommersiell licens.galileo::e1b_table/e1c_tablereturnerar nu ettResultoch läser användarens egen kopia frånKSHANA_GALILEO_E1B/KSHANA_GALILEO_E1C, eller, i en källkodsutcheckning, fråndata/galileo-os-sis-icd/, där det nyascripts/fetch_galileo_e1_codes.shextraherar dem ur ICD-PDF:en (hashkontrollerat).galileo::E1B_TABLE_TEXT/E1C_TABLE_TEXThar tagits bort. Utan tabellerna returnerar Galileo E1-signalerna (galileo-e1b,galileo-e1c) ett fel som säger hur de ska tillhandahållas, och E1-testerna hoppas över med ett meddelande. Med tabellerna på plats är varje E1-utdata oförändrat. Inget scenario, ingen golden och ingen spektrumutdata använder kodtabellerna. Testfixturerna för E5a Annex C.3/C.4 (LFSR-referensen itests/iq_signals.rs) hanteras på samma sätt: hämtas av samma skript, git-ignorerade, och testet hoppas över utan dem.Portabel matematik överallt (0,36, STUDIO-15): varje transcendent funktion för
f64i biblioteket, och samplarna för normal-, gamma- och exponentialfördelning irand_distr, beräknas nu genom det rena Rust-biblioteketlibm(portable_math::PortableFloat,portable_distr), så att ett native bygge och WebAssembly-bygget ger byte-identisk resultat-JSON för alla 141 medföljande scenarier och för den korta IQ-körningen. Kostnaden är att de sista bitarna i resultat beräknade med värdens matematikbibliotek flyttades: 98 av de 141 medföljande scenarierna ändrades, 43 inte; 5 ändrades med mer än 1e-3 i sitt största fält, och resten med mindre. Varje flyttat värde listas gammalt -> nytt idocs/revisions/STUDIO15-portable-math-rebaseline.md(med en CSV över alla 136 127 flyttade tal); ingen tröskel, tolerans eller gräns ändrades. Publicerade tal som ändrades:europa-surface-pnttillgänglighet med jordavståndet 0,719 -> 0,713 och RMS-fel 86,147 -> 86,499 m (en epok på tillgänglighetskanten löses nu likadant överallt; den skrev ut 0,725 / 85,800 m på macOS arm64);lunar-joint-od-clockstationsfel 3,541350 -> 3,536885 m med VLBI och 2183,558 -> 2184,021 m utan;paper/crossover/inertial.json, åtta värden ivibration_psdmed 3 enheter på sista platsen (erratum i den tekniska rapporten); det utgivna dokumentetcislunar-observabilityi storheter vid avrundningsgolvet (åtta värden bortom sex gällande siffror, upp till 6.8e-5 relativt; ingen rang eller tröskel flyttades). De fastlåsta hasharna för byte-identitetsvakterna (skyline_scenarios,geometry_corpus_identity,geometry_trust_no_change) är omräknade till en namngiven baslinje "0,36 portable", med värdena från 0.35.0 bevarade som historisk dokumentation; den frusna prognosen för månreferensstationen är orörd och dess portabla omkörning lagras bredvid den (docs/predictions/*.portable-0.36.json).tests/lunar_joint_od_numpy_oracle.rs(den validerade raden för lunar joint OD): fixturer omexporterade och numpy-jämförelsen körd om med numpy 2.4.6, den registrerade versionen, skriptet och tröskeln oförändrade; alla sex nätverk klaras (docs/revisions/STUDIO15-lunar-joint-od-oracle-rerecord.md). Arbetet i omgång 2-3 som slogs ihop efter STUDIO-15 använder också portabel matematik (457 anropsplatser i 62 filer); vad det flyttade finns idocs/revisions/STUDIO15-batch4-rebaseline.md: 12 medföljande scenarier (största relativa ändring 5.2e-8, inget utskrivet värde flyttas), 28 skyline-vaktrader omfastställda, M2M4-sammandraget föriq_campaign, de äldre referenshasharna förgnss-ins, den oobserverade fyrens datumsigma (632,3769 -> 632,3772 m), och två registrerade fynd (CR3BP DRO-slutningar; CRPA A3, 194 av 456 länkar). Greenhalls exakta edf behåller sin validerade tröskel med en dubbel-dubbel-logaritm i sin kärna (docs/revisions/STUDIO15-greenhall-edf-portable.md), och test-bench-referensen för gps-sdr-sim kördes om på de flyttade NMEA-exporterna, varje tröskel höll (docs/revisions/STUDIO15-testbench-gpssdrsim-rerun.md).README: raden för månsviten anger varje delmängds evidensnivå (den sade att alla var MODELLED).
realdata::clk::rinex_clock_seriesreturnerarRinexClockSeries(serie, logg för rutnätsomsampling, tidssystem, om det deklarerades, posttyp) i stället för en tupel(PhaseSeries, GriddingLog). Den faller nu tillbaka från satellitposter (AS) till mottagar-/stationsposter (AR) med det begärda namnet.Inga poäng ändras om inte geometrin är dålig; etiketten rapporteras alltid. Med god eller acceptabel geometri (en GPS-enbart öppen himmel med 8 satelliter inräknad) eller okänd geometri (monitorn körs inte) är varje poäng som i 0,35:
tests/geometry_trust_no_change.rshåller båda exempelsessionernas utdata ochtests/geometry_corpus_identity.rsvarje incheckad NMEA-korpus för fartyg (även som GPS-enbart öppen himmel) och besättningsträningsscenarierna till bytes för 0.35.0 när de tillagda nycklarna tagits bort; i de två träningsscenarier där jamming gör geometrin dålig skiljer sig de dåliga epokerna enbart genom geometriavdraget. En logg med dålig geometri förlorar upp till 15 poäng som den inte förlorade i 0,35. Avsedda ändringar i övrigt, alla tillägg: nycklarna ovan i resultat-JSON och bevispaket (score_model.weightsär oförändrad); schemat för live-JSON-rader går från 1,2 till 1,3 (geometrytillagd,classi varje avdrag); utdragssammanfattningen fårgeometry; telemetrin får geometriserier, fält och etikettenclassendast för indata som bär dem, så en ström eller ett resultat från 0,35 renderas byte för byte som förr.geometryär det 17:e monitornamnet; det listas sist imonitors_runnär den avgjorde (ett fartyg vars logg ger geometrin; en lista från 0,35 behåller sin ordning och sammanfattningens monitorantal ökar med ett) och har ingen post[score.weights](att ange en avvisas: dess avdrag anges i[geometry]).tests/fixtures/dop/NOTICEangav licensen för gnss_lib_py som Apache-2.0; utgåvan 1.0.4 är MIT.NMEA-läsaren läser nu GSA (en kort GSA ignoreras, räknas inte som överhoppad) och behåller GSV-elevationer och -azimut, även för satelliter listade utan signal; UBX-läsaren behåller elevation och azimut för NAV-SAT. C/N0 läses exakt som förut.
Resultatändring: bredbands- och svepande jammers använder nu Q = 2. Anti-jam-ekvationen använder den läroboksmässiga justeringen Q för spridspektrum för dessa jammers, där den tidigare använde 1. Q = 2 är vitt brus över huvudloben med signaleffekten i bandet normaliserad; den är fastlåst i testerna mot den slutna formen från
navsignal.- Oförändrat: CW- och smalbandsjammers (Q = 1), en okänd jammertyp (Q = 1, det mest skadliga värdet) och
q_override. - Effekt: där en bredbands- eller svepande jammer verkar ökar effektivt C/N0 med upp till 3,0103 dB, härledda J/S-trösklar ökar med 3,0103 dB och radierna för nekande i fria rymden krymper med faktorn 0,7071.
- Ändrade medföljande scenarier: 12 av 144 ändras, alla som förhandsregistrerat (
xval/jammer-q/PREREGISTRATION.md, resultat ixval/jammer-q/RESULTS.md):jamming-demo: C/N0 +3,01 dB;jamming-harbour-approach-skyline:min_tracking6 → 7;lunar-jamming: förlorade satelliter 26 → 0, median för loss-of-lock-avstånd 27,4 → 19,4 km;tracking-loop: radie för nekande, slingdynamik 75,2 → 53,2 km;- och kampanjerna och spektrumkorskontrollerna som innehåller dessa.
- Berörda konsumenter: typerna
jamming,lunar-jamming,tracking-loopochimpairment-eval, spektrumtypernasjamming_kind_cross_check, IQ-kampanjens MODELLED referenskurva och labfit-standardvärdet Q, och interop-scenexport.
- Oförändrat: CW- och smalbandsjammers (Q = 1), en okänd jammertyp (Q = 1, det mest skadliga värdet) och
JetBrains-plugin: inget föråldrat eller för borttagning schemalagt plattforms-API. De fem valdialogerna använder en liten
DialogWrappermed en rullgardinsmeny i stället för den föråldradeMessages.showChooseDialog; enfilsväljare använder konstruktorn medFileChooserDescriptori stället för den föråldradeFileChooserDescriptorFactory.createSingleFileDescriptor(); animeringen öppnas medBrowserUtil.browse(Path)i stället förbrowse(File), som plattformen 2026,3 schemalägger för borttagning. Since-build förblir 243. IntelliJ Plugin Verifier rapporterar Compatible utan föråldrad eller för borttagning schemalagd användning mot 2024,3 (IC-243.21565.193), 2025,2 (IC-252.23892.409), 2026.2.3 (IU-262.10968.63) och 2026,3 EAP (IU-263.6259.32);verifyPluginkontrollerar 2024,3 som standard och varje lista som anges iKSHANA_VERIFY_IDES.gnss_sim::run_gnss_simochjamming::run_jammingreturnerarResult: en ogiltig sektion[skyline]är ett fel vid direktanrop, som den redan var viaapi::run_toml, i stället för en tyst reserv till den platta masken. Brytande ändring för Rust-anropare av dessa två funktioner.
Rättat#
Kampanjpoängsättare: en verklig falsklåsning i spåraren räknades aldrig (
iq::campaign). Spårarens falsklåskontroll flyttar en kanal från LOCKED till LOST när den slår till. Poängsättaren markerade kanalens nästa uppdatering i stället, som då var olåst och därför aldrig räknades. En händelsefalse-lockrapporterad från LOCKED är nu en episod vid sin tid, i körningen och i varje angiven händelse som innehåller den. En som hittas under inlåsning (pull-in), eller upprepas av en kanal som redan är LOST, är inte en ny episod. Ett nytt test driver en verklig falsklåsning: en legitim GPS L1 C/A-bärvåg som stegas med 1/(2T) medan den är låst (tests/iq_campaign_false_lock.rs).- I referenskampanjen i
tests/iq_campaign.rsändras endast PRN 11 för ramp/agc-3bit (falsklåsepisoder 0 → 1, 426 och 437 per låst timme). - Dess cell-DIGEST:er fastlåses på nytt.
- Den förhandsregistrerade fastlåsningen av poängsatta resultat är fortfarande aktiv och återskapar fortfarande exakt: i dess hash mappas endast de sex fälten, ändrade av denna korrigering gjord efter registreringen, tillbaka till sina värden före korrigeringen. De korrigerade värdena är fastlåsta för sig.
- Ingen tröskel ändrades, och ingen VALIDATED rad, siffra eller webbtal flyttades.
- I referenskampanjen i
lunar-frame-campaign: en fyr utan observation rapporteras nu (hittat av MR-05). Rapporten får
unobserved_beaconsochwarningendast när någon fyr saknar observation, och då kommer de observerade fyrarnas sigman från deras egen information i stället för att alla vara null. Datumet är oförändrat, och inget standardvärde, medföljande eller publicerat utdata flyttas (docs/revisions/BEACON-unobserved-cell-changes.md).Månens principalaxelsystem (
lunar_frame::icrf_to_moon_pa, använt avlunar_odoch LRO-anpassningen): DE421-offseten mellan medeljordsaxel och principalaxel imoon_080317.tftillämpades i fel riktning och med fel Eulerordning, så det analytiska PA-systemet låg cirka 208″ från PA i stället för på det. Den är nu transkriberad som SPICE:s Frames Required Reading definierar den och stämmer med SPICEpxform('MOON_ME','MOON_PA')till 2.6e-16 rad; det analytiska PA-systemet ligger 6″ till 8″ från DE440 PA (förhandsregistrerad e1ead19b, omregistrerad be33382e efter att den första föreslagna ändringen missade tröskeln 1e-12;docs/design/evidence/fut05b-me-pa-offset-sign/). Publicerade tal som flyttas: LRO-anpassningen (tests/agency_lro.rs) rå överlappning 53,8 → 39,9 m, dynamisk 12,6 → 12,05 m, reducerat dynamisk 6,65 → 6,67 m (trösklar oförändrade). Den analytiska stacken stämmer nu med ANISE-korsvalideringen på DE-nivå (12,0 / 6,67 m) på båda nivåerna; det tidigare gapet på den dynamiska nivån var detta fel.MCP-servern avvisar
[terrain] dem_hgt(uppföljning av CAP-06b). Terrängbrickans sökväg för jamming-typen finns nu iinline_only::FILE_SOURCE_KEYS. En inline-yta avvisar ett scenario som namnger en, med ett meddelande som varken innehåller sökvägen eller något operativsystemfel. Testet för filkällsvakten flaggar nu också fält som slutar på_hgt.Jd2::from_partsmed en bråkdelad dagsdel tappade bråkdelen i konverteringarna för UTC, TAI, UT1 och jordrotation (en timmes dagsdel gav jordrotationen 15° fel); dagsdelen normaliseras nu till ett heltal. Ingen motoranropare påverkades: alla skickar ett heltalsdygn, och varje levererat utdata är bitidentiskt.
Planerat#
- Geometrin från en angiven skyline (0,36 punkt 1, nu i motorn som
src/skyline.rs):sky-blockedochopen_fractionfrån skylinen där indata anger en (azimutglappet som reserv), en händelse för naturlig försämring (fjord eller terminal) inmea-scenario, och utformningsanteckningens två maskerade geometrier i raden sigma_UERE x DOP, förhandsregistrerade som tillägg. - Geometri för RINEX-loggar med navigation (från motorns egen positionsbestämning) och Android-loggar (från raderna
Status); båda läserunknowni dag. Geometri i$PKSHT(version 1 oförändrad i 0,36) och integrationerna med Signal K och OpenCPN. - Ett tidigare gap, inte infört i 0,36: när varje satellits SNR-fält är tomt utlöses varken något avdrag för
loss-of-lockeller för C/N0; total signalförlust syns endast genom geometrimonitornssignal_loss(klassadenvironment). Ett avdrag för den är planerat. - En ström i schema 1,3 i de externa telemetrireferenserna (Prometheus textformatsparser och OTLP-collectorn), som i dag endast täcker strömmar i 1,2.
- En tvåsidig obstruktion (en kanjon eller smal fjord) läses som signalförlust snarare än blockerad himmel tills skylinen är integrerad.
[0.35.0] - 2026-10-12#
Ett stycke som namnger AI-klienter från tredje part utelämnas här; det finns i CHANGELOG.md på GitHub.
Verifierare för Galileo OSNMA#
- Ny modul
kshana::osnmaochkshana osnma verify <input>: en öppen, rent Rust-baserad verifierare på mottagarsidan för Galileo OSNMA. Den läser I/NAV-sidor och rapporterar, per satellit och epok, om navigationsdata är autentiserade, med ett skäl för varje fel eller fördröjning: tolkning av HKROOT och MACK, återmontering av DSM-KROOT och DSM-PKR, Merkle-verifiering av den publika nyckeln, verifiering av TESLA-nyckelkedjan, MACSEQ- och taggverifiering för ADKD 0, 4 och 12 inklusive korsautentisering, och ett resultat i formen$PKSOSför mottagarförtroendemonitorn. Utdata bär ett rådgivande meddelande om att statusen inte är en tjänst för navigeringsintegritet.docs/OSNMA.mdanger vad som verifieras och inte verifieras, tidskravet, och att Kshana inte beviljar några rättigheter under EU:s IPR för OSNMA-ICD (användare förlitar sig på ICD:ns Annex E-auktorisation). Implementerad mot SIS ICD Issue 1,1 och Receiver Guidelines Issue 1,3. Sidor CRC-kontrolleras, och en byteström från u-blox UBX-RXM-SFRBX kan läsas direkt (--format ubx). Standardtester använder syntetiska data och publicerade kända-svar-test för primitiver; ett valfritt test läser en lokalt nedladdad kopia av de officiella vektorerna. Efter oberoende granskning hämtar verifieraren sin tid endast från verifierade TESLA-nycklar (en spoofad sub-frame långt i framtiden kan inte längre radera ett fel), låter en autentisering löpa ut och följa den IODnav som används, respekterar verifierade larmmeddelanden (vars Merkle-löv nu inkluderar det slumpmässiga NPK-fältet) och NMA-status "don't use", håller dummytaggar utanför satellitstatus, behåller kedjor per CID med återkallelse och förnyelse, kontrollerar KROOT-paddingens hash, och begränsar UBX-ramlängder och TESLA-verifieringsarbete. En satellit läses som autentiserad endast så länge de nyaste efemerid- och klockdata den sänder är, bit för bit, de data som autentiserades (inte bara under samma IODnav), en status eller återkallelse från den oautentiserade NMA-rubriken räknas endast när två satelliter är överens eller en verifierad KROOT bär den, en återspelad äldre KROOT kan inte ersätta en kedja, och en avstannad nyckelström rapporteras.
Tillagt (MCP-serverkanaler)#
kshana-mcp --http <addr>, streamable HTTP, självhostad. Loopback som standard; en adress som inte är loopback kräver--allow-remoteoch en bearer-token iKSHANA_MCP_HTTP_TOKEN; inget verktyg läser eller skriver en sökväg (IQ-filverktygen är avstängda); gränser för förfrågans storlek, tid och samtidighet; ingen CORS-header; kontroller av Host och Origin. Kshana tillhandahåller ingen slutpunkt (docs/deploy/mcp-http.md, med mallar för Docker, Fly.io och Cloud Run).
Ett stycke som namnger AI-klienter från tredje part utelämnas här; det finns i CHANGELOG.md på GitHub.
Tillagt (ytor)#
osnma_verifypå Python och WebAssembly. Verifieraren bakomkshana osnma verifypå bytes i minnet, som returnerar den JSON som--jsonskriver ut (rådgivande i sitt fältadvisory; endast autentiseringsstatus, inte en tjänst för navigeringsintegritet). Samma avvisningar som kommandoraden. Inte på MCP: indata är en lång rå mottagarström som betjänas bättre av CLI och Python.docs/SURFACES.mdochdocs/OSNMA.mdsäger detta.trust_telemetrypå WebAssembly, Python och MCP, med ett plugin-kommando och en JetBrains-åtgärd. Renderar en förtroendeström eller ett resultat frånreceiver-trustsom Prometheus-text, syslog-rader i CEF eller LEEF eller en OTLP JSON-nyttolast, med de kodare somkshana trust-telemetryanvänder (kshana::surface::trust_telemetry); ingen socket och ingen klocka. Plugin:/kshana-trust-telemetryoch skillentrust-telemetry. JetBrains: Render Trust Telemetry. Funktionernawasmochpythonoch MCP-servern aktiverar nu ocksåotlp, som inte lägger till någon crate.Paritetssvep. JetBrains-åtgärder Validate Scenario, List Scenario Kinds och Assess Receiver Stream;
kshana --helplistar nureceiver-trust evidence,evidence,trust-telemetryochnmea-scenario; notebookencompliance-and-test-bench(compliance mapping och test-bench-export); och varje återstående JetBrains-cell "CLI only" idocs/SURFACES.mdär nu ett explicit N/A med sitt skäl.
Ett stycke som namnger AI-klienter från tredje part utelämnas här; det finns i CHANGELOG.md på GitHub.
Tillagt (bevispaket)#
kshana receiver-trust evidenceochkshana evidence verify: signerade, verifierbara bevispaket för en GNSS-förtroendehändelse. Ett paket samlar det råa loggutsnittet och hela loggens SHA-256, konfigurationen med varje tröskel, resultaten och skälen per epok, motorversionen, ett hashkedjat manifest och en fristående HTML-sammanfattning, signerat med Ed25519 (en nyckel frånkshana evidence keygeneller din egen fil; nycklar lagras aldrig i ett paket och*.evidence-keyär git-ignorerat).verifykontrollerar varje hash, kedjan och signaturen och namnger exakt vad som misslyckas; med--pubkeyfastlåser den signeraren. En token enligt RFC 3161 kan bifogas och läses och binds till manifestet (utfärdarens egen signatur kontrolleras inte av detta bygge;openssl ts -verifytäcker det). Loggutsnittet är fönstrets exakta bytes där läsaren rapporterar källintervall (NMEA, UBX, RINEX 3, Android), annars hela loggen, och manifestet anger vilket. Skapande och verifiering är rena publika funktioner (kshana::evidence) som byggs förwasm32. Paketen anger att de är en teknisk dokumentation, inte ett juridiskt utlåtande. De nya beroendena är trädeted25519-dalek(BSD-3-Clause och Apache-2.0/MIT, minimala funktioner) och en direktzeroize(redan i det trädet) för att radera nyckelmaterial. Sedocs/EVIDENCE-PACKS.md.
Tillagt (förtroendetelemetri)#
kshana trust-telemetry: GNSS-förtroende som säkerhetstelemetrikälla. Läser den ström av förtroende per epok (JSON-rader: poäng 0-100, band, skäl) eller ett batchresultat frånreceiver-trustoch matar en Prometheus-slutpunkt/metrics(localhost som standard), syslog-händelser i CEF eller LEEF i ett kuvert enligt RFC 5424 (UDP eller TCP), och, bakom den som standard avstängda funktionenotlp, OTLP/HTTP JSON-export. Leverans körs på arbetartrådar med tidsgränser för anslutning och skrivning, begränsad återanslutningsbackoff och en räknarekshana_trust_syslog_send_failures_total, så att en död eller stillastående insamlare inte kan stoppa den levande bedömningen eller frysa/metrics; skäletiketter begränsas till 64 serier. Inga nya beroenden. En exempelinstrumentpanel för Grafana finns ideploy/grafana/. Måttnamn, etiketter och CEF/LEEF-fältmappningen finns idocs/TRUST-TELEMETRY.md. Strömformatet är isolerat isrc/telemetry/sample.rs.
Tillagt#
- Maritimt förtroende: en levande förtroendepoäng 0-100 för ett rörligt fartygs positionsbestämning, från den NMEA 0183 som mottagaren redan ger ut, med en valfri grind.
kshana receiver-trusttar en tabell[platform](kind = "static"eller"vessel", fartygets maximala fart, acceleration och svängtakt, antennhöjd över vattenlinjen och en valfri kursgivare; varje standardvärde dokumenterat med sitt skäl). För ett fartyg ersätts monitorn för statiskt positionshopp, som mäter avstånd från kalibreringsmedelvärdet och är fel på ett fartyg i fart, av kausala monitorer för rörliga plattformar: kinematisk konsistens hos positionen mot rapporterad fart och kurs och mot fartygets gränser, gyrokurs mot kurs över grund, loggfart mot fart över grund, antennhöjd mot angiven höjd över vattenlinjen, C/N0-spridning som kollapsar och stiger tillsammans mot kalibreringens baslinje, och tidskonsistens (även mot den här datorns klocka, i live-läge). Den läser också en rapporterad autentiseringsstatus, övergripande eller per satellit (endast en rapporterad status: ingen OSNMA-kryptografi). Varje tröskel anges i en tabell[maritime]före körningen. Varje epok får sedan en poäng från 0 till 100 genom en deterministisk, förhandsregistrerad avbildning (ingen inlärning, inget anpassat till händelser; vikter, bandkanter och evidensen anges i en tabell[score]), avbildad på de befintliga förtroendetillstånden, med de monitorer som drog av och deras poäng. Statiska scenarier är oförändrade och hashas som förut.kshana receiver-trust live <session.toml>läser stdin, en fil som läggs till, TCP eller UDP och skriver en JSON-rad per epok och en proprietär sats$PKSHT; med--gatesläpper den igenom strömmen oförändrad medan positionsbestämningen är betrodd och markerar positionsbestämningen som ogiltig (GGA-kvalitet 0, RMC- och GLL-statusV, GNS- och VTG-lägeN) medan den inte är det. Grinden är av om den inte begärs;--listen tcp:<port>serverar den grindade strömmen till valfritt antal TCP-klienter (loopback som standard, en långsam klient kastas ut i stället för att blockera de andra). Detta är rådgivande programvara, inte typgodkänd navigationsutrustning (IEC 61108, IEC 61162); operatören är fortsatt ansvarig.examples/maritime-trust/är en syntetisk logg från Tallinn till Helsingfors, skriven endast som text, med ett bortdrag av positionen en bit in under vilket mottagaren fortsätter rapportera en giltig positionsbestämning; dess förväntade utdata är fastlåst av ett test. Handledning:docs/MARITIME-TRUST.md. Kontrollerna kan inte se en spoofer vars positionsbestämning är konsistent med allt på bussen; handledningen säger detta.
Störningskarta#
kshana interference-mapochkshana route-exposure: en offentlig bild av var flygplan och fartyg rapporterade försämrade navigationsdata, och hur mycket av en rutt den berör. Indata är lokala CSV-filer gjorda av data med öppen licens från ADS-B (adsb.lol, ODbL 1,0) och AIS (NOAA MarineCadastre, Kystverket under NLOD 2,0); varje utdatafil är en källa och ett UTC-dygn av GeoJSON som bär metoden, dess trösklar, datalicensen, attributionen och källans täckningsbias. ADS-B-metoden aggregerar NIC och NACp på ett fast rutnät och kallar en cell försämrad utifrån andelen distinkta flygplan, med skydd för utrustning som aldrig rapporterar noggrannhet, låg höjd och orsaker över stora områden. AIS-metoden kör fem detektorer: positioner på land (mot en användartillhandahållen kustlinje), cirkulära spår, orimliga hopp, orimliga hastigheter och många fartyg på en position. Trösklar är förhandsregistrerade konstanter för en namngiven metodversion. Endast aggregat: identifierare hashas i minnet och skrivs aldrig, och celler med färre än 5 distinkta flygplan eller fartyg publiceras inte. En försämrad cell är inte ett fynd av störning. Standardkommandona använder inget nätverk; en valfri hjälparefetch-land --allow-networkladdar ned Natural Earth-landpolygoner från en commit-fastlåst adress och behåller filen bara om dess SHA-256 stämmer. ADS-B-indata är en CSV eller adsb.lol:s readsb-historikfiler direkt (nytt beroende:flate2med dess rena Rust-backend, för gzip). Båda metoderna är version 2: ett anrop om försämrad eller onormal kräver minst 5 flygplan eller fartyg (publiceringsminimum), varje antal per cell under 5 undanhålls somnull, och ett dygn vars bakgrund inte kan skattas undanhåller sina anrop. Utdatafiler namnges<source>-<dataset>-<date>.geojsonoch skrivs aldrig över; indata strömmas rad för rad; ruttexponering hanterar antimeridianen. Tester använder endast syntetiska data. Sedocs/INTERFERENCE-MAP.mdoch licensgranskningen idocs/data/INTERFERENCE-DATA-SOURCES.md.
Tillagt (träningsströmmar)#
kshana nmea-scenario: syntetisk brygga med NMEA 0183 för besättningsträning i att känna igen GNSS-jamming och spoofing. Från en scenario-TOML skriver den en fil eller strömmar över TCP eller UDP (unicast eller broadcast; i realtid, accelererat eller så fort som möjligt) hela bryggsatsen GGA, RMC, VTG, GSV, GSA, GNS, ZDA, HDT och VBW för ett fartygsspår med gränser för girhastighet, acceleration och havsström, med satellitgeometri från motorns egna nominella konstellationer. Skriptade händelser på en tidslinje: jamming, positionsdrift (en giltig positionsbestämning som driver iväg), tids-spoofing och en replay-fördröjning, var och en med ramper för inträde och återhämtning. En instruktörslogg (JSON och text) registrerar vad som injicerades när, med det sanna spåret mot det rapporterade. Ett bibliotek iscenarios/training/(jamming på öppet hav, drift vid kusten, tids-spoofing vid hamninlöp, kombinerat) innehåller instruktörsanteckningar. Utdata har giltiga kontrollsummor och är deterministiska per frö; tester låser ett golden-utdrag per scenario och läser varje mening med NMEA-läsaren ireceiver-trust. Endast text: ingen RF-, IQ- eller vågformsutdata; strömmar är till för träning och test och får aldrig matas in i ett fartygs levande navigationssystem. Sedocs/NMEA-TRAINING.md.
Marina integrationer (0.35.0, arbetsström B)#
- Signal K-plugin (
integrations/signalk/, inte publicerat på npm): kör eller ansluter tillkshana receiver-trust live(serverns egen NMEA-ingång, egna ingångsargument, ett JSON-lines-TCP-flöde eller$PKSHT-meningarna i en gate-ström), publicerar förtroendepoäng, band, skäl, larm och gate-tillstånd undernavigation.gnss.kshana.*(inklusive den av mottagaren rapporterade positionen som kontext, aldrignavigation.position), och skickar en Signal K-notis (warnvid degraded,alarmvid untrusted, med tröskelvärden för hold, clear och inaktualitet, alla i konfigurationsschemat). Inga npm-beroenden. Testat på inspelad syntetisk utdata. - OpenCPN: NMEA i gate-läge serveras direkt av
kshana receiver-trust live --gate --listen tcp:10110(rekommenderas); ett beroendefritt TCP-relä (integrations/opencpn/nmea-tcp-relay.mjs) är det valfria alternativet. Oavsett väg ser OpenCPN en ogiltig positionsbestämning när förtroendet kollapsar och$PKSHTi sitt NMEA-felsökningsfönster; tester spelar upp den syntetiska gate-strömmen genom en riktig TCP-socket och kontrollerar vad en konsument tar emot. Ett inbyggt plugin med poängpanel (integrations/opencpn/plugin/, plugin-API 1,18, CMake) läser$PKSHTfrån OpenCPN:s egen NMEA-ström och larmar vid bandet untrusted; det byggs, dess logik är enhetstestad och det kördes inuti OpenCPN 5.8.4 under en virtuell skärm (evidens och ett reproduktionsskript iintegrations/opencpn/evidence/); det är inte paketerat för plugin-hanteraren. - Referensbygge (
deploy/reference-build/): generisk delslista, OS-konfiguration, systemd-enheter för den rådgivande övervakaren och det valfria gate-läget (kontrollerade medsystemd-analyze verifyavcheck-units.sh), ett containeralternativ, Signal K-koppling. - Signal K-pluginet accepterar det levande JSON-schemat 1,2 (en nyckel
positionoch därefter en nyckeladvisoryläggs till; okända tillagda nycklar ignoreras), kontrollerat på verklig utdata av version 1,2 och mot en riktig signalk-server. - Fixar efter granskning: systemd-enheterna startar alltid om och körs i sandlåda (inget skal, inget nätverk där det inte behövs), ett logrotate-utdrag,
check-units.shmisslyckas vid varje fynd; containern kör gaten från miljövariabler med en hälsokontroll och digest-fästa basavbildningar; Signal K-poängmetadata, den inaktuella notisen ersätts när data återkommer, fel i barnprocesser bevaras och avslut eskalerar, osäkrainputArgsvägras, och notisen ligger pånotifications.navigation.gnss.kshana.trust; reläet begränsar en kvarhållen ofullständig rad; parsrarna för$PKSHTavvisar poäng utanför 0 till 100; en kontroll av dokumentationslänkar; ett CI-arbetsflöde (marine-integrations.yml) som kör allt detta, inklusive den riktiga binären från början till slut. docs/MARINE-INTEGRATIONS.md. Rådgivande programvara, inte typgodkänd utrustning; operatören är fortsatt ansvarig. Endast programvara: inget sänder, och inga detekterings- eller falsklarmssiffror hävdas.
Tillagt: compliance-mappning och export för test-bench#
docs/compliance/ochkshana compliance-report. En mappning från Kshanas utdata till fem ramverk och standarder för resiliens (US DHS Resilient PNT Conformance Framework v2.0, IMO-vägledning för fartyg, EASA-vägledning för luftfart, NIS2 artikel 21, EN 16803, en betald standard som citeras per del och med de få klausulnummer som syns i katalogtexten), en tabell per ramverk: referensen, vad den kräver i vår parafras, de utdata som ger belägg för den, och luckan. Källversioner, URL:er och vad som lästes och inte lästes antecknas.kshana compliance-report <result.json>...fyller mappningen från de angivna körningarna och markerar varje radevidenced,partly-evidenced,not-evidencedellerout-of-scope, som Markdown och JSON, med luckan kvar på varje rad. Formuleringen är "ger belägg för"; ingenting betygsätts eller godkänns. Tester använder syntetiska körningar och misslyckas när en incheckad tabell avviker från koden.kshana bench-export <scenario.toml>. Skriver fordonsrörelsen och händelserna för ett scenario av typengnss-ins,jammingellergnss-simför en GNSS-simulator i laboratorium: en CSV med användarrörelse med dokumenterade referenssystem och en metadata-sidfil, NMEA 0183GGA/RMC, waypoint-text, och händelserna som CSV och somreceiver-trust[[events]]-block (src/interop/testbench.rs). Endast rörelse och händelser: ingen signal skrivs. Varje fil läses tillbaka itests/interop_testbench.rsoch jämförs inom sin angivna tolerans.docs/TEST-BENCH.mdbeskriver metoden för att spela upp exporten genom en simulator och poängsätta mottagarens logg medkshana receiver-trust.- Vad som räknas som evidens. Ett resultat räknas för en förmåga endast när det bär de fält som dess typ skriver; enbart en typetikett räknas som ingenting. Okända typer, ett resultat som motsäger sitt syskonscenario, icke-hex-hashar och felaktiga antal för receiver-trust listas som oanvända, med skälet. Rapporten maskerar Markdown-celler och kan inte krascha på en icke-ASCII-hash.
compliance::run_from_textochassess_textstar texter, inte sökvägar. - Export för test-bench.
--epochintervallkontrolleras (UtcEpoch::parse_iso); waypoint-filen kontrollerar varje intervall och kommandot anger varför när ett utelämnas; dokumentationen anger att rubriken (heading) ignss-insär kroppens girvinkel och inte kursen, platshållarfälten iGGAoch scenariots egen höjdändring.bench-exportochcompliance-reportfinns i användningstexten. fusion::pack::truth_trajectoryexponerar den sanna tillståndshistoriken för körprofilen ignss-ins(samma stegning som typens egen referens använder), ochUtcEpochfår fält för NMEA-datum och -tid.
Validering av störningskartan#
- Störningskartans avkodningssemantik och geometri kontrolleras mot oberoende implementationer på syntetiska indata. Betydelserna hos NIC- och NACp-koder mot pyModeS-avkodning av syntetiska ADS-B-ramar, AIS-värdena för ej tillgänglig mot pyais-avkodning av syntetiska AIVDM-meningar, tilldelning av rutceller mot shapely, ruttlängd per cellstatus mot shapely och GeographicLib, och maskning av inlandet mot shapely och pyproj, var och en med en tolerans som fastställdes före den första jämförelsen (
tests/fixtures/interference_map_ref/PREREGISTRATION.md). Detta validerar hur koder och fältvärden läses och geometrin, inte att en flaggad cell är störning. Läsaren av landpolygoner sluter nu en ring som inte upprepar sin första hörnpunkt, vilken den tidigare läste utan sin sista kant. Dokumentationen anger tröskelvärdena för låg noggrannhet hos NACp och NIC som den gräns varje kod står för (NACp 6 är en EPU-gräns på 556 m, NIC 5 en inneslutningsgräns på 1 NM).
Tillagt (validering av telemetriformaten och bevispaketen)#
- Externa kontroller av bevispaketens kryptografi, paketverifieraren och telemetrins trådformat. Testvektorerna för Ed25519 i RFC 8032 avsnitt 7,1 (1, 2, 3 och 1024) och SHA-256-exemplen i FIPS 180-4 körs genom paketets egna funktioner för signering, verifiering och hashning, till exakt likhet. En verifierare skriven i Python enbart utifrån det normativa avsnittet i
docs/EVIDENCE-PACKS.md(hashlib ochcryptography) stämmer med Rust-verifieraren på 71 intakta och manipulerade paket: utfall, felmängd, signaturutfall och båda kedjehuvudena. Vår Prometheus-exposition läses av den officiella Python-klientens parser och vår OTLP JSON av det officiella meddelandetopentelemetry-proto, strikt, och båda stämmer med det tillstånd de skapades från. CEF och LEEF saknar oberoende öppen validerare och förblir modelled.docs/EVIDENCE-PACKS.mdfick det normativa paketformatet och verifieringsförfarandet som verifieraren i ren miljö (clean-room) skrevs utifrån;VerifyReportficksignature_valid. Oberoende referenser och fixturer:scripts/gen_ed25519_rfc8032_ref.py,scripts/gen_evidence_pack_ref.pymedscripts/evidence_verify_cleanroom.py,scripts/gen_telemetry_formats_ref.py; testerevidence_crypto_reference,evidence_pack_referenceochtelemetry_formats_reference. CI behöver ingen Python.
Tillagt (validering av CEF-händelserna)#
- Telemetrins CEF-händelser läses tillbaka korrekt av två oberoende parsrar med öppen källkod.
pycef1,11 och Logstash CEF-kodeken (logstash-codec-cef6.2.7 i Logstash 8.15.3) tolkar 157 CEF-rader (varje bandändring och varje epok i den incheckade telemetriströmmen, plus motstridig text som innehåller=, omvända snedstreck, rörtecken, radbrytningar, tabbar och text med flera byte) och återskapar varje huvudfält, allvarlighetsgraden, den exakta uppsättningen tilläggsnycklar och varje värde exakt. Logstash-kodeken läser också fyra rader vars huvudtext behöver escape-tecken, vilketpycefinte klarar. Tröskeln (fastställd i förväg) registrerades innan någon av parsrarna kördes (tests/cef_reference.rs); fixturer itests/fixtures/cef/, skript för de oberoende referensernascripts/gen_cef_ref.pyochscripts/gen_cef_logstash_ref.py; CI behöver varken Python eller Logstash. LEEF har ingen underhållen öppen parser och förblir modelled. CEF-händelserna bär nu förtroendepoängen och epokförskjutningen i CEF-ordlistans flyttalsfält för egna värden (cfp1,cfp2) i stället för heltalsfältencn1ochcn2, som passade för inget av värdena; CEF är nytt i den här utgåvan, så inget som levererats ändras.
Ändrat#
- MCP:
assess_receiver_logaccepterar loggen somtextellerbase64; verktygsindata begränsas till 4 MiB. - Jamming-diagrammet hämtar också sina färger från paletten.
src/jamming.rsvar den enda modul som revisionen av Observatory-paletten lämnade kvar med egna färger medan arbetet med jammer-Q landade; dess*.chart.svg(scenariernajamming,maritime-strait-jammingoch andra scenarier av typenjamming) läser nusrc/palette.rs, och tillåtelselistan itests/palette_sync.rsär tom. Endast färger och typsnitt: diagrammenjamming-demoochmaritime-strait-jammingär lika med sina tidigare registrerade renderingar när färg,font-familyoch versionsfoten har normaliserats. Inget ritat värde ändrades. De inspelade Studio-kopiorna underweb/studio/recorded/spelades in på nytt vid omportningarna 0.33.0 och 0.34.0 (endast versionsstämpel): de bär fortfarande jamming-diagrammets gamla färg och får palettfärgen vid nästa omportning.
Rättat#
- Klockensemblens 3-sigma-gräns täcker nu flicker-golvet, och filterhälsokontrollen ser det. Med ett
flicker_floorbar referensklockan flicker FM men filtret med två tillstånd som levererar integritetsgränsen gjorde det inte, så det levererade scenariotclock-ensemblehade 3-sigma-täckning på 0,41 (klassisk) och 0,33 (kvant), och NIS/NEES-kontrollen, som drog sin egen referens från filtrets modell, rapporterade identiska värden med och utan golvet. Gränsen är nu variansen för de två tillstånden plus den exakta variansen hos flicker-fasen ackumulerad sedan senaste synkronisering, beräknad från samma bank som referensklockan använder; NIS/NEES-kontrollen drar sin referens från den utökade modellen med den banken och kör det matchade utökade filtret (och filtret med två tillstånd mot flicker-referens rapporterarconsistent = false). Utdataändring, endast för klockor med ettflicker_floorskilt från noll:integritypåclock-ensemblegår från 0,40866 / 0,33026 till 0,99970 / 1,0 (klassisk / kvant) och NIS/NEES förfilter_healthinkluderar nu flickern; tidsfelet,holdover_sochtiming_p95_nsär oförändrade, och scenarier utan golv är byte-identiska.scenarios/orbit-gnss-challenged.toml(typ orbit, frö 7, golv 1e-16 / 2e-11) flyttas också:fom.integrityklassisk 0,7734 till 1,0 och kvant 0,9796 till 1,0, och NIS/NEES förfilter_healthoch deras band ändras. Dessfilter_health.consistentför kvant växlar fråntruetillfalse: en stickprovshändelse i flicker-ensemblen om 16 frön gånger 60 steg (NIS 0,8815 mot ett band på [0,9125, 1,0914]), inte en defekt. Bandet är ett band på 95 %, så ungefär 5 % av fröna flaggar ett matchat filter per konstruktion (40 nya frön för det här scenariot: kvant 1 och klassisk 2 flaggade); vid 64 gånger 200 ligger samma frö inom bandet för båda klockorna (NIS 0,990 och 1,001). Känd uppföljning: fusion-typen har samma lucka (klassisk integritet 0,80 med golv); hybrid-typen stannar över 0,99.
[0.34.1] - 2026-10-10#
Säkerhet#
- Indata till MCP-servern härdade. MCP-serverns scenarioverktyg accepterar nu endast infogat innehåll och vägrar fält för filkälla; indatastorleken begränsas. Säkerhetsmeddelande: GHSA-8wpf-hqg5-6xjr.
[0.34.0] - 2026-10-09#
Lab replay: en spårningsmotor, detekteringsmonitorer och en kampanjkörare för GNSS-IQ-inspelningar, med slingutformningarna, C/N0-estimatorerna och poängsättningen som hör till. Evidensklass: allt nedan är MODELLED eller kontrollerat för intern konsistens mot slutna uttryck och simulering med fast frö; inget av det lägger till en VALIDATED-rad, och verifieringsregistret är oförändrat (251 rader: 124 Validated, 123 Modelled, 4 Partner). Det är ett analyslager i programvara: inget här syntetiserar en jammer- eller spoofer-vågform, och ingenting sänder.
Tillagt#
Lab replay: testvillkor, kampanjkörare och poängsättning (0.34.0).
kshana iq campaign <campaign.toml>spelar upp inspelningar × front-end-kedjor × slingutformningar (kshana.loop-design/1) och poängsätter varje cell mot en testvillkorsfil per inspelning (kshana.test-conditions/1, TOML eller JSON). Filen anger vad ett laboratorium vet om inspelningen: de förväntade satelliterna, och för varje händelse dess typetikett, start och slut, påverkade satelliter och angiven J/S- eller jammereffektprofil. Den är enbart metadata. Poängen per satellit, för hela körningen och per händelse, är:- tillgänglighet, tid till förlorat lås och angiven J/S vid förlusten;
- tid för återinfångning, från händelsens slut och från förlusten;
- uppmätt C/N0-försämring per angivet J/S-intervall;
- falsklåsningsepisoder per låst timme (spårarens flagga, eller Doppler mot en referenssidofil);
- PLL- och DLL-diskriminatorjitter.
Bredvid varje uppmätt försämringskurva ritas en analytisk referens för spektral separation (
jamming::effective_cn0_dbhzmed typensQ), betecknad MODELLED var den än förekommer.Celler körs parallellt genom spårningssessionens tillståndsmaskin för lås, och varje cell skrivs atomärt under en nyckel av innehållshash. Nyckeln omfattar inspelningens SHA-256, hasharna för villkor, front-end, utformning, körning och poängsättning, den obligatoriska
data_class(synthetic|client-confidential) och motorversionen. Medrun.epochssatt behålls också varje cells strömkshana.track-epoch/1och låshändelser, namngivna efter cellnyckel och hashade in i cellen.cell_keyochreport::digestär publika, så en konsument kan härleda varje nyckel och sammandraget på nytt. En omkörning hoppar därför över färdiga celler, och utdata beror aldrig på antalet arbetare. Körningen skriverscorecard.csv/.json, en friståendereport.htmloch ettDIGEST. Trösklarna för pass/fail ([scoring.bars], kan åsidosättas per inspelning) tillämpas när rapporten byggs.[scoring] cn0_estimator = "m2m4" | "nwpr"(standard"m2m4", del av poängsättningens hash) väljer den C/N0 som ligger bakom den rapporterade C/N0 och försämringskurvan. Båda skattningarna poängsätts och rapporteras alltid (median för hela körningen och för baslinjen, och per J/S-intervall), och cellen och poängkortet registrerar estimatorn. NWPR läser ungefär 8 dB × Bn·T lågt under slingans egen jitter; M2M4 gör det inte.
Också nytt:
kshana iq campaign report <dir>bygger om poängkorten, rapporten och sammandraget från cellerna;kshana iq conditions <file>kontrollerar en testvillkorsfil mot sitt schema;events_from_sigmf = trueimporterar annotationernakshana:test_eventi en SigMF-inspelning som händelser;- Python får
iq_test_conditions,iq_campaignochiq_campaign_report; kshana-mcpfåriq_campaign, som är inkrementell och återupptagbar under provbudgeten per anrop med varje fil begränsad till arbetskatalogen, ochiq_campaign_status.
Tester:
tests/iq_campaign.rskör en syntetisk kampanj med 3 inspelningar × 2 front-ends × 2 utformningar. Dess scener har angivna C/N0-profiler, och den täcker:- varje mått kontrollerat mot den injicerade referensen;
- återupptagning efter en partiell körning med en arbetare och en korrupt cell, byte-identisk med en oavbruten körning med fyra arbetare;
- epokfiler per cell;
- en regression för återinfångning av tre satelliter över 20 s: med
reacquirepå är varje kanal tillbaka inom 2 s efter ett glapp på 2 s; utfallet medreacquireav är låst; - trösklar som bedöms om utan att köra om;
- CLI:t;
- ignorerade kontroller av genomströmning och minne i release-läge, inklusive en inspelning på 4 GB (5,45× realtid, toppminne 2 MB över start-RSS; mätningar på en maskin, inte trösklar).
Endast programvara: inget sänder, och ingen störnings- eller spoofing-vågform syntetiseras. Anteckningar om utformning och som-byggt:
docs/design/LAB-CAMPAIGN.md.Spårningsmotor för lab replay (0.34.0: B3.1, B3.2, B3.3, B6.1).
Filer för slingutformning:
kshana.loop-design/1TOML (docs/design/LOOP-DESIGN-TOML.md; parseriq::track::design). En eller flera namngivna utformningar anger varje slingfält:- bärvågstyp (PLL, FLL eller FLL-assisterad PLL), ordningar och bandbredder;
- diskriminatorer för PLL/FLL/DLL och bärvågsstöd;
- korrelatoravstånd och integrering;
- låströsklar och C/N0-fönster, och bitsynkronisering;
- tillståndsmaskinen för lås;
- infångningen vid överlämning (
"auto"eller uttrycklig).
Utformningar kan utvidga varandra via
extends. Okända nycklar vägras. Varje löst utformning har en SHA-256-hash över en kanonisk JSON-form (nycklar sorterade på varje nivå, fast talformatering), så hashen beror inte på fältordning; varje utdata registrerar den. Gränssnitt:kshana iq track --design <file> [--design-name], där uttryckliga flaggor åsidosätter utformningen och registreras;kshana iq sweep --design <file>, som kör varje utformning i filen;- Python
iq_track(design=, design_name=, reacquire=),iq_loop_designs; - MCP
iq_trackdesign/design_name.
M2M4 C/N0 (
EpochOutput.cn0_m2m4_dbhz, spårepokskolumnencn0_m2m4_dbhzeftercn0_beaulieu_dbhz; Python-epokordlistor). Skattningen med andra och fjärde momentet över samma fönster som NWPR, enbart från prompteffekt: NWPR läser lågt under slingans egen bärvågsjitter (ungefär 8 dB × Bn_PLL·T) och M2M4 gör det inte. På GPS L2C CM (20 ms, nominellt 40 dB-Hz, PLL 1 till 10 Hz) läser den 39,93 dB-Hz vid varje bandbredd medan NWPR faller från 39,55 till 38,22; på L1 C/A vid 45 dB-Hz läser den 45,34. NWPR och alla andra utdata är oförändrade (en bit-för-bit-låsning). Den binära posten förblir 184 bytes (värdet tar den reserverade flyttalsplatsen och flaggbit 6).Extra korrelatorpunkter (multikorrelator / SQM).
[design.integration] extra_taps_chips = [..](förskjutningar i chips från prompt, positiva tidiga; högst 16, var och en inom ±2) korrelerar extra repliker vid sidan av E/P/L och returnerar dem somEpochOutput.extra((offset, value)i utformningsordning). Slingorna använder dem aldrig. Nyckeln utelämnas ur den kanoniska JSON-formen när den är tom, så standardutformningens hash och varje utdata utan punkter är oförändrade (kshana.track-epoch/1kvarstår; CSV/JSONL/binär utan punkter är bit-identiska). Med punkter: CSV-/JSONL-kolumner, och en binär post på184 + 16 × tapsbytes vars huvud bärextra_taps_chips, så att en gammal läsare vägrar filen i stället för att tolka fel.--extra-taps(CLI),extra_taps(Python) ochextra_taps_chips(MCPiq_track). Utformningarna i en körning måste vara överens om punkterna.Parallella kanaler (
iq track/iq sweep --threads <N|auto>; RustTrackSession::with_threads). Varje delblocks kanaler körs på upp till N trådar (std::thread::scope;wasm32förblir seriell). En kanals korrelation och tillståndsmaskin för lås rör bara den kanalen; dess epoker och händelser buffras och skrivs till utdatamottagarna i kanalordning, så utdata (CSV, JSONL, binär, händelser, sammanfattning) är byte-identisk med den seriella körningen för varje N. Standard förblir 1 tråd. Uppmätt på en inspelning med 12 kanaler, 4 s, 4,092 MHz på 4 kärnor: 19,5 s seriellt, 11,5 s med 2 trådar, 6,3 s med 4 (3,1×; den initiala infångningen är seriell).Export av infångningsyta (
kshana.acq-surface/1;iq::acq_surface,docs/design/ACQ-SURFACE.md).iq acquire --surface <path>(en PRN; CSV, JSON eller binär), Pythoniq_acq_surfaceoch MCPiq_acquiresurface_outskriver hela korrelationseffektytan över Doppler × kodfas som sökningen beräknar (dess celler är identiska bit för bit med dem frånacquire) med toppen och två finförfiningar av Doppler: en parabolisk skattning och en finsökning på 1/16 intervall (≈5 Hz vid 4 ms koherent, mot intervall på 167 Hz).acquiresjälvt och alla standardvärden är oförändrade.Strömmande epokutdata (
kshana.track-epoch/1;iq::track::sink). Varje slinguppdatering bär:- korrelatorerna tidig/prompt/sen;
- alla tre diskriminatorutdata;
- NCO-tillstånden för PLL/FLL/DLL och bärvågsfasen;
- PLI- och låsflaggorna;
- båda C/N0-skattningarna och bitarna;
- låstillståndet.
Den skrivs medan den sker, som CSV, JSON Lines eller en versionshanterad binär form med läsare i Rust (
BinaryEpochReader) och Python (iq_read_epochs).iq trackfår--epochs,--eventsoch--summary(kshana.track-summary/1), ochiq sweepfår--epochsoch--events. MCPiq_trackfårepochs_out/events_outoch bygger sitt svar från sammanfattningen med begränsat minne.- En körnings heap växer inte längre med inspelningens längd:
tests/iq_track_memory.rsmäter det med en räknande allokerare (6× längden, samma topp inom 64 KiB), med en kontroll som visar att sökvägen i minnet växer. - Strömmande utdata är bit-identiska med uppspelningen i minnet.
Tillståndsmaskin för lås (
iq::track::lock,TrackSession): intagning → låst → förlorad → återinfångning → intagning, eller avförd när en förlust varar längre änreacq_window_s(standard 30 s). Misslyckade sökningar görs om med intervalletreacq_interval_s(0,1 s), jämnt fördelade, så att omförsöksschemat lägger till högst 0,1 s till en uppmätt återinfångningstid. Ett valfritt ökande intervall (reacq_max_interval_söverreacq_interval_s) är avstängt som standard, ochmax_reacq_attemptsär ett valfritt tak (0, inget, som standard). Ett avbrott på 2 s på tre PRN vid 4,092 MS/s slutar nu med att varje kanal är återinfångad och låst. Under en budget på 3 försök var varje kanal avförd inom 0,2 s efter förlusten.- Trösklar (
loss_dwell_s,pull_in_max_s, Dopplerfönstret för återinfångning) kommer från utformningen. Varje övergång är en händelse med sitt skäl. - Falsklåsningskontrollen söker det spårade Dopplervärdet mot dess ±1/(2T) FLL/PLL-alias. Den fångar den falsklåsning som PR #38 mätte (−2400 Hz spårat 500 Hz fel). Med återinfångning på slutar kanalen låst vid det injicerade Dopplervärdet.
- Ett signalglapp på 0,8 s deklareras som förlorat och återinfångas inom 0,3 s efter att signalen återvänder.
--summaryfinal_state(och tabellens kolumn) är tillståndet efter den sista övergången, så en kanal som avförts efter sin sista slinguppdatering läserRETIRED.- FLL-stöd endast under intagning (
[design.carrier] fll_assist = "pull-in", standard;"always"behåller det tidigare beteendet bit för bit). FLL lämnar över till PLL när den utjämnade PLI har hållit sig vid eller överfll_off_pli(0,8) ifll_gate_dwell_s(0,1 s), och återgår underfll_on_pli(0,6). Lämnad på bröt FLL-vägen på 10 Hz faslåsningen under ungefär 38 dB-Hz på rena signaler: vid 35 dB-Hz var andelen faslåsning 10–16 %, med ett verkligt fasfel på 38–41°. Med grind håller standardutformningen 100 % vid 35 dB-Hz med 4,5°, samma som en PLL ensam. Intagning från ett överlämningsfel på 100 Hz är oförändrad. Evidens med trösklar fastställda i förväg:docs/design/evidence/carrier-lock/. Standardslingorna är därför inte bit för bit lika tidigare körningar av standardutformningen. Användfll_assist = "always"för att återskapa dem. Känd gräns: vid 35 dB-Hz sker överlämningen 1,9–2,6 s in i spåret, och vid 33 dB-Hz håller FLL på 10 Hz kvar PLI under överlämningströskeln, så intagningen slutförs aldrig. - Nya nycklar för slingutformning och nytt API, uppräknade:
[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, därmax_reacq_attemptsändrats från standardvärdet 3 till ett valfritt tak (standard 0);- Rust:
LoopConfig.fll_assist(FllAssist,FllGate),LoopCore::set_fll_enabled,EpochOutput.fll_active,ChannelSummary.final_state.
- Utformningens hash är över en kanonisk JSON-form, och den inbyggda standardutformningens hash är
33261cd171a53803a6c262686e878e01f37d902a93d5918c20a44297b8ef8e80(låst av ett test). - Anteckningar om kompatibilitet för utdata:
- tabellen
iq trackhar en avslutande kolumnfinal_state; - CSV för
iq sweephar en avslutande kolumndesign_hash, och dess JSON hardesign_hashochwarnings; - svepets
mean_cn0_dbhzär nu medelvärdet över varje uppdatering som har en NWPR-skattning (sammanfattning med begränsat minne), inte längre över körningens andra hälft.
- tabellen
- Återinfångning är av i den inbyggda standarden, där tillståndsmaskinen bara observerar och slingorna körs bit för bit som utan den. (Standardslingorna själva ändrades dock: se FLL-stöd ovan.) Slå på den per utformning (
[design.lock] reacquire = true), med--reacquireeller medreacquire=True. - En varning för
commensurate_sampling: när fs ligger inom 1e-6 från en multipel av halva chiphastigheten (iq::track::commensurate_samples_per_chip), varnariq track/iq sweep(utdata,--summary, svepets JSON), MCP-svaret fråniq_trackoch Python-resultatet fråniq_trackför att kodslingans jitter och bias inte är representativa. Grundorsaken är dokumenterad med trösklar fastställda i förväg idocs/design/evidence/dll-jitter/. Vid exakt 2 sampel per chip med avstånd på 0.5 chip är S-kurvan för DLL ett enda steg och slingan pendlar (dither): ≈ 0,09 chip RMS-kodfel (≈ 26 m) vid 45 dB-Hz, mot ≈ 0,004 chip vid en inkommensurabel hastighet. Den ~2 dB låga NWPR C/N0 vid den hastigheten har samma orsak. Vid exakt 0 Hz kod-Doppler och 4 sampel per chip korsar koden aldrig dödzonen på ±0.21 chip, så en kodfasbias på upp till omkring 0,2 chip kan bestå utan att synas i jittret (uppmätt: avstånd på 0.5 chip ger 2,0× kontrollens kodfel med ett medelvärde på +0,011 chip; avstånd på 0.25 chip ger +0,125 chip); varningen gäller hastigheten. - Känd gräns: standardutformningen lämnar inte över FLL→PLL under ungefär 35 dB-Hz (ett golv för intagning på ~35 dB-Hz; se FLL-stöd ovan och
docs/design/evidence/carrier-lock/). - En falsklåsnings- eller återinfångningssökning som inte kan köras (en hastighet utan helt antal sampel per kodperiod) stoppar inte längre spårningen.
- Tester:
tests/iq_track_engine.rs,tests/iq_cli.rs,iq::track::design::tests,tests/pythonoch MCP IQ-rundturen.
- Trösklar (
C/N0-profiler i syntetiska scener (0.34.0).
iq::channel::cn0_profileschemalägger tidsvarierande C/N0 per satellit i Kshanas egna scener, som dB-förskjutningar relativt scenens C/N0. Former: steg, ramp, styckvis linjär och scintillationsliknande Rice-fädningar med fast frö och angivet S4 och dekorrelationstid. De tillämpas genom den befintliga kanalkroken i scenen (Cn0ProfileChannel, i samverkan med effekterna från jonosfär, troposfär, scintillation och flervägsutbredning), utan ändring av scenkärnan. Referenssidofilenscn0_dbhzföljer profilen.- Gränssnitt:
kshana iq scene … --cn0-profile <toml>ochkshana.iq_scene(…, cn0_profile="<toml>"). - Vad den är till för: slingor, monitorer och kampanjpoängsättning kan stresstestas mot en känd referens. Den ändrar endast styrkan hos de legitima signalerna.
- Kontroller (
tests/iq_cn0_profile.rs). Trösklar: fädningens medelintensitet inom 5 % av 1, S4 inom 8 % av målet (vid S4 = 0,3, 0,7 och 1), intensitetskorrelation över 0,9 vid 0,05 τ och under 0,05 vid 5 τ; referens exakt det angivna C/N0 plus profilen; ett spårat NWPR C/N0-fall inom 0,7 dB av ett steg på 6 dB. Uppmätt: S4 inom 1,3 % av målet, och ett spårat fall på 6,26 dB.
- Gränssnitt:
Detekteringsmonitorer för IQ-vägen (0.34.0 "Lab replay"). Ny modul
iq::monitor, kommandokshana iq monitoroch bindningkshana.iq_monitor(path, ...). De observerar en inspelning och rapporterar tidsserier plus flaggade händelser (start-, larm- och sluttider, topp, tröskel). De detekterar och mäter endast; inget här genererar en signal.- Totaleffekt / AGC: blockeffekt och den förstärkning en idealisk AGC skulle tillämpa; flaggar ökningar och minskningar.
- Spektrum före korrelation: Welch-PSD per block mot en inlärd baslinje. Överskottströskeln kommer från ett mål för falsklarm. Även komplex kurtosis och en pulsdetektor. Pulsdetektorn räknar sampel över en tröskel i varje block och utlöser en händelse när den exakta binomiala övre svansen för det antalet ligger under
pulse_pfa(standard 1e-4 per block), inte när ett z-värde passerar en gräns: vid de små förväntade antalen i korta block är ett enda sampel redan flera sigma. - C/N0 per kanal: två ensidiga CUSUM-ändringsdetektorer (fall och ökning), matade med oberoende skattningar (steget sätts utifrån slingans C/N0-fönster).
- SQM från korrelatorerna: delta
(I_E − I_L)/I_Poch kvot(I_E + I_L)/(2 I_P), plus asymmetritester från extra korrelatorer när en kanal levererar dem. - Låsindikatorserier: PLI och en frekvenslåsindikator från på varandra följande prompts, som råsignaler. Besluten om lås och låsförlust ligger kvar hos spårningsmotorns tillståndsmaskin för lås.
Ett strömmande pass (
iq::monitor::run::run_monitors) kör allt, med en TOML-/JSON-inställningsfil (MonitorConfig); kampanjköraren använder samma ingång. Allt MODELLED. Varje statistik kontrolleras mot sin slutna form genom simulering med fast frö (tests/iq_monitor.rs):- överskridanden av blockeffekt mot Gamma-svansen;
- kurtosis medelvärde 2 och spridning
2/√N; - pulsandel
e^{−t}; - CUSUM-körlängder mot Siegmunds approximation (uppmätt 330 och 8,46 sampel mot 338 och 8,34);
- faslåsindikatorn mot medelvärdet för Rice-fas;
- på en spårad C/A-signal avviker SQM-delta och kvotspridningar med omkring 6 % från de slutna formerna av första ordningen (uppmätt 5,97 %; testtröskel 12 %).
Formeln för falsklarm vid spektralt överskott är en approximation; den uppmätta frekvensen var 1,3× formeln. Från början till slut flaggar monitorerna:
- ett C/N0-steg på 6 dB (ändringstid inom en skattning);
- en reflekterad väg som uppträder mitt i inspelningen (kvottest);
- ett signalbortfall (PLI faller från 0,999 till −0,3 och FLI från 0,93 till 0,03 under det);
- en smalbandig ton och glesa sampel med hög amplitud (spektral-, puls- och kurtosistester). Det är generiska DSP-testindata, inte störningsmodeller.
Ändrat#
iq track/iq sweepströmmar genom den nya sessionen (se Tillagt).--csvbehåller sina kolumner från 0,32 men strömmas nu, så rader från flera kanaler interfolieras i tidsordning i stället för att grupperas per kanal.--jsonbehåller sin form från 0,32 och håller fortfarande varje epok i minnet: använd--epochsför långa inspelningar.iq sweepmäter jitter över uppdateringarna under andra hälften av körningens varaktighet (tidigare andra hälften av antalet uppdateringar), och dess CSV/JSON får en kolumndesign_hash.- Spårtabellen får en kolumn
final_state. - Användningstexten påstår inte längre att
iq tracktar front-end-flaggorna; baraiq acquiretillämpar dem. - För Python-funktionen
iq_trackharacq_noncoherentochdoppler_maxnu standardvärdetNone(utformningens värden, 1 och 5000 Hz i den inbyggda utformningen). Dess epoker får de tidiga/sena korrelatorerna,carrier_phase_cycles,bit_edge,bitochstate, och resultatet fårdesignochevents.
Rättat#
Standardsteget för infångning lämnar inte längre Galileo E1-spårning med en rest som FLL inte kan dra in. Steget
2 / (3 · N · T_code)lämnar upp till1 / (3 · N · T_code)Dopplerfel vid överlämning, men den tvåkvadrants FLL som är standard drar bara in1 / (4 T_track). För varje kod på 4 ms eller längre (N = 1), inklusive Galileo E1-B och E1-C, låg resten (83,3 Hz vid 4 ms) utanför intagningen på 62,5 Hz och spårningen falsklåste vid +125 Hz, med en faslåsindikator på 0,97 som dolde det. Standardsteget begränsas nu också till0.2 / T_track(kshana::iq::acq::default_step_hz), 0,8 av intagningen, så att överlämningen håller sig inom den även när det angränsande intervallet vinner. (0,4 prövades först: det falsklåste 1 körning av 42 på E1-B, och en koherent sökning på 1 ms på GPS L1 C/A valde ett intervall 350 Hz fel och låste vid +500 Hz; 0,25 och 0,2 hade inga i samma körningar.) Kostnad: Galileo E1-B/E1-C går från intervall på 166,7 Hz till 50 Hz, 201 intervall över ±5 kHz i stället för 61; koderna på 1 ms (166,7 Hz,N = 4) är oförändrade."auto"i en slingutformning betyder detta; ett uttryckligtdoppler_step_hzeller--doppler-stepanvänds som skrivet, ochiq acquire(ingen spårningsöverlämning) behåller lärobokssteget. Epokhuvudet och--summaryregistrerar nu det lösta steget och slingbandbredderna för varje kanal (resolved). Standardutformningens hash är oförändrad. Utdataändring: detekteringar på koder på 4 ms och längre kan hamna i andra Dopplerintervall.GPS L2C CM (slinguppdatering på 20 ms) håller lås med standardutformningen. Standardens PLL på 15 Hz och FLL på 10 Hz har
Bn · Tpå 0,3 och 0,2 vid T = 20 ms, och slingan tappade låset även från en perfekt start (PLI −0,08, M2M4 15,8 dB-Hz). Ny utformningsnyckelcarrier.bn_t_max(standard 0,1) begränsar brusbandbredderna för PLL och FLL tillbn_t_max / Tnär slinguppdateringstiden är längre än 4 ms (Design::loop_config_for): 5 Hz och 5 Hz vid 20 ms, 10 Hz och 10 Hz vid 10 ms för BeiDou B1C; koderna på 1 ms och 4 ms behåller 15 och 10 Hz. Den gäller också uttryckliga bandbredder;bn_t_max = 0stänger av den. Nyckeln utelämnas ur den kanoniska formen vid sitt standardvärde, så standardhashen är oförändrad; en utformning som anger något annat värde har en annan hash. Vid 45 dB-Hz ger L2C CM nu PLI 0,996, Dopplerfel 0,00 Hz och M2M4 42,71 dB-Hz. Känd öppen punkt: NWPR C/N0 läser 1,76 dB lågt där (och 2,45 dB lågt på B1C vid 10 ms), så matrisens T5 för L2C förblir ett ignorerat fynd.docs/assets/clock-ensemble-band.svgåtergenererad: den incheckade figuren var inaktuell mot sitt eget scenario (en dataändring, inte en omritning). Diagrammet ritades 2026-06-02 frånscenarios/clock-ensemble.toml; två dagar senare angav 67fed19e golven för flicker FM i det scenariot (kvantflicker_floor = 1e-16, CSACflicker_floor = 2e-11) och figuren ritades aldrig om. Den visade körningen före golven: y-axel 0 till 47 ns, CSAC p95 för avbrott per körning på 10,5 till 47,6 ns (medelvärde 25,2 ns), klassisk holdover 4050 s i medel. Scenariot som levereras (och som handledningen och CLI-sammanfattningen redan anger) ger y-axel 0 till 407 ns, CSAC p95 per körning 40,8 till 374,0 ns (medelvärde 167,0 ns), klassisk holdover 844 s [220 till 2130 s]; specifikationslinjen på 20 ns ligger vid samma 20 ns på en ungefär nio gånger högre axel. Motorn är oförändrad: dagens motor på scenariofilen från juni återger den gamla figurens axel exakt. Figuren refereras inte från README eller dokumentationen.
Kända begränsningar#
- NWPR C/N0 läser lågt vid högt C/N0·T per prompt, och BOC(1 1) vid 5 MS/s förlorar omkring 1 dB. NWPR är väntevärdesriktig på ideala prompts, men slingans egen PLL-jitter kostar omkring en anpassad 8 dB × Bn·T (en scen, fyra punkter: −0.24/−0.44/−0.77/−1,58 dB vid 1/2.5/5/10 Hz och 20 ms; omkring −1 dB vid standardvärdet
bn_t_max = 0.1); M2M4 är okänslig. BeiDou B1C-data vid 5 MS/s förlorar också omkring 1 dB prompteffekt till bandbegränsning (använd 10 MS/s eller mer). Inget av detta är ett fel i estimatorn; raderna T5 i signalmatrisen för GPS L2C och BeiDou B1C förblir ignorerade fynd med dessa orsaker.
[0.33.1] - 2026-10-08#
Säkerhet#
- Diagramtext och Studios övertagande av diagram härdade. Text som ett scenario för in i ett genererat diagram maskeras nu konsekvent av en gemensam rutin, och Studio övertar bara ritmarkering från ett diagram. Studios adressparametrar, nyckelstyrda uppslag och scenariohämtningar begränsas till kända värden. Medföljande diagram, inspelade resultat och publicerade siffror är oförändrade. Uppgradering rekommenderas för alla som öppnar scenariofiler från opålitliga källor i Studio eller bäddar in genererade diagram på webbsidor. Säkerhetsmeddelande: GHSA-h25h-cg9f-v2cg.
[0.33.0] - 2026-10-08#
Dokumentation#
- Störnings- och spoofing-omfattningen för IQ-lagret, korrekt angiven. Posterna för 0.31.0 och 0.32.0 nedan säger att IQ-lagret lägger till "ingen syntes av störnings- eller spoofing-vågformer". Det stämmer för själva IQ-lagret (
iq::scenegenererar endast legitima GNSS-signaler), men det lästes som ett påstående om hela motorn, och det är det inte: sedan 0.29.0 skriver sektionen[iq]i typenspectrumen SigMF-ögonblicksbild av sin analytiska modell med de konfigurerade jammers i den (brusliknande jammers frekvensintervall för frekvensintervall, toner och chirps som vågformer), ochspoof_capturesummerar en autentisk signal och en spoofer-replikasignal i minnet för att testa slingfångst (kompositen skrivs aldrig ut). Motorn har också haft en programvarumottagare för GNSS sedan 0.20.0 (sdr: infångning och spårning; sedan 0.31.0 äveniq::acqochiq::track). Ingenting i Kshana sänder eller styr radiohårdvara. Statusraden i README,docs/POSITIONING.md,docs/SPECTRUM.mdoch IQ-anteckningarna om utformning säger nu detta; de utgivna posterna lämnas som de publicerades. Inget beteende ändras. - Känd begränsning: kommensurabel sampling. Vid en samplingshastighet som är en heltals- eller halvtalsmultipel av chiphastigheten ligger samplen på samma chipfaser i varje chip, och kod-diskriminatorn blir en trappa. På en syntetisk GPS L1 C/A-signal vid 45 dB-Hz med avstånd på 0.5 chip ger 2,046 MHz (2 sampel/chip) ≈ 0,09 chip (≈ 26 m) RMS-kodfel och en bias på −0,09 chip, mot ≈ 0,003 chip vid en inkommensurabel hastighet. NWPR C/N0 läser ≈ 2,4 dB lågt där. Vid 4,092 MHz beror det på avståndet och kod-Dopplern. Vid 0,5 chip är det ofarligt vid 1500 Hz Doppler men 2× med en bias på 0,011 chip vid 0 Hz, och vid 0,25 eller 0,1 chip är det 8–10× kodfelet. Bärvågsspårning påverkas inte.
docs/design/iq-notes/receiver.mdhar mätningarna.
Tillagt#
GNSS-IQ-lager på MCP-servern (fas B.1).
kshana-mcpfår sex verktyg som styr lagretkshana iqfrån en agent:iq_signals(de accepterade signalnamnen och IQ-uppsättningen),iq_info(beskriv en inspelning),iq_scene(generera en scen med angiven profil eller broadcast-efemerid, med den valfria kanalen på signalnivå),iq_acquire(FFT-infångning, valfritt bakom front-end-steg),iq_track(infånga, sedan DLL/PLL/FLL-banken) ochiq_frontend(bandpass, notch, blankning, excision, AGC, kvantiserare). IQ-sampel passerar aldrig protokollet: varje verktyg tar filsökvägar inom en arbetskatalog som anges avKSHANA_MCP_IQ_DIR(om den inte är satt är IQ-filverktygen av och alla andra verktyg opåverkade), vägrar sökvägar som löses utanför den och utdata som redan finns om inteoverwriteär satt, tillämpar en samplingsbudget per anrop (KSHANA_MCP_IQ_MAX_SAMPLES, standard 50 000 000) innan något arbete görs, vägrar okända argument och svarar med en kompakt JSON-sammanfattning (detekteringar, C/N0, låstillstånd och varje skriven fil med sitt antal byte). Utdata per epok går bara till filer som anroparen namnger. Verktygen kör samma kodväg som CLI:t genom en ny publik söm,kshana::iq::cli::execute, som returnerar CLI:ts meddelande i stället för att skriva ut det (stdout är MCP:s JSON-RPC-kanal);iq::cli::build_codeochiq::cli::signal_namesär nu också publika. Endast programvara och additivt: IQ-lagret lägger inte till någon störnings- eller spoofer-syntes, ingenting sänds någonsin och det finns inga nya beroenden.server.jsondeklarerar de två miljövariablerna. Rundturstester imcp/kshana-mcp/tests/iq_round_trip.rsgenererar en kort scen med två satelliter och kontrollerar infångning mot scenens egen referenssidofil, spårningslås och C/N0, front-end, SigMF-utdata, budgeten, sökvägsbegränsningen och det avstängda tillståndet.GNSS-IQ-lagret i valideringsregistret. En kontroll fastställd i förväg mot gps-sdr-sim (en oberoende GPS L1 C/A-basbandsgenerator, MIT, commit 28ca29a6) ingår nu i den alltid påslagna testsviten (
tests/iq_gpssdrsim_cross_generator.rs). Dess incheckade referensutdata (tests/fixtures/iq_gpssdrsim_cross_generator/: 20 ms av gps-sdr-sims egen 8-bitars I/Q, dess kanallista och kanaltillståndet bakom den från ett testharness länkat mot samma bygge) återskapas avscripts/gen_iq_gpssdrsim_ref.sh. Inget vid testtillfället behöver nätverk eller det externa verktyget. Två registerrader läggs till (251 rader: 124 Validated, 123 Modelled, 4 Partner):- GNSS-IQ-scenens signalgeometri mot en oberoende basbandsgenerator: Validated. Scenens referens (synlig mängd, pseudoavstånd, kodfas, Doppler, siktvinklar) för en scen med broadcast-efemerid stämmer med gps-sdr-sims kanaltillstånd på alla 11 kanaler: sämst 1,6 mm, 5.5e-6 chip, 7.4e-5 Hz, 4e-9 grader, mot trösklar på 0,05 m, 2e-4 chip, 0,02 Hz och 1e-4 grader som fastställdes före körningen.
- GNSS-IQ-infångning på oberoende genererade I/Q-sampel: Modelled, med ett fynd.
iq::acqhittar varje simulerad satellit i gps-sdr-sims sampel inom de registrerade trösklarna (kodfas inom 0,195 chip, Doppler inom 72 Hz). Den registrerade tröskeln "ingen annan PRN detekterad" misslyckas dock: på gps-sdr-sims brusfria utdata korsas tröskeln för gaussiskt brus av de andra satelliternas korskorrelation för alla 21 frånvarande PRN. Det strikta testet behålls, ignorerat med fyndet, och ett låst test registrerar det. Ingen motorkod eller publikt API ändras. I/Q-sampel jämförs inte sampel för sampel: gps-sdr-sims heltalssinustabell, förstärkningar, nollstartfas för bärvågen och trunkerade LNAV-fält är inte storheter som en mottagare behöver vara överens om. Jämförelsen görs på de observabler som en mottagare mäter.
Ändrat#
iq tracklämnar som standard över från en infångning på ≈4 ms (beteendeändring). Infångningen som initierar varje spårningskanal integrerar nuceil(4 ms / T_code)kodperioder koherent i stället för en, därT_codeär kodens hela period (primär gånger sekundär längd för en skiktad kod, den enhet som infångningen integrerar över). De oskiktade koderna på 1 ms (GPS L1 C/A, BeiDou B1I, GLONASS L1OF) söker nu 4 perioder (4 ms), så standardsteget för Doppler2 / (3 · N · T_code)är ~167 Hz i stället för ~667 Hz. Varje kod vars hela period redan är 4 ms eller längre behåller 1 period: Galileo E1-B (4 ms), BeiDou B1C (10 ms), och de skiktade GPS L5-I/L5-Q, Galileo E5a-I/E5a-Q och E1-C (10 till 100 ms med sina överlagringskoder), och GPS L2C. Varje signal integrerar därför minst ~4 ms. En sökning på en period kunde lämna över en kanal upp till ~333 Hz fel, utanför intagningen för FLL, och den spårade då en falsklåsning ~500 Hz bort medan den rapporterade ett rent spår. På ett svep med fast frö av 180 GPS L1 C/A-kanaler (Doppler över ±5 kHz, 38 till 47 dB-Hz, hälften med navigeringsdata;docs/design/evidence/iq-track-acq-default/, kan köras om) minskar falsklåsningarna från 27 av 180 till 1 av 180 och missade infångningar från 102 till 11, för ~40 ms mer sökning per PRN på GPS L1 (11 → 52 ms). Den enda kvarvarande falsklåsningen är vid 38 dB-Hz, 36 Hz fel. Varje gränssnitt är överens:kshana iq trackochkshana iq sweep(--acq-coherent), Pythonkshana.iq_track(acq_coherent=Noneär nu auto; stub uppdaterad) och MCP-verktygetiq_track. Användare som förlitade sig på den gamla standarden kan angeacq_coherent=1(--acq-coherent 1). Standardvärdet 1 för--coherentikshana iq acquireär oförändrat. Nya publikaiq::acq::auto_coherent_periodsochiq::acq::AUTO_COHERENT_S; regressionstesttests/iq_cli.rs::track_default_handoff_does_not_false_lock_where_one_period_did.- Varje genererad grafik följer nu sajtens Observatory-tema: varje diagrams byte ändras. Detta är en avsiktlig revision av de publicerade figurerna, endast färger och typsnitt; inget ritat värde, ingen koordinat och ingen etikett flyttades. Varje scenarios
*.chart.svg(och därmed Studios diagramexporter och demodiagrammen i README), körningsrapportens HTML (*.report.html), tidslinjeanimationen (--animate), HTML-sidorna för scenarioresultat och studier, valideringssammanfattningen och dokumentationens figurer och diagram använde den varmt mörka julipaletten (#0c0b08botten,#e0bd84guld) och ett varmt pappersaktigt rapporttema. De hämtar nu varje färg och typsnitt från en enda modul,src/palette.rs, som speglarweb/theme.css: diagram ritas instrumentmörka på Observatory-botten (#060A14) i typsnittsstacken Geist; rapporten, animationsspelaren och resultatsidorna följer betraktarens ljus/mörk-inställning med Observatorys tokens för ljust och mörkt. De sex felområdena behåller en färg var (störning korall, spoofing magenta, tidssynkronisering blå, banor cyan, integritet lime, navigering bärnsten), och evidensnivåerna läses validated lime, modelled bärnsten, partner magenta. Vattenfallsrampernas perceptuella (inferno) ordning behålls, förankrad på nytt vid den nya botten.tests/palette_sync.rsbinder modulen tillweb/theme.cssi båda teman, kontrollerar attdocs/assets/palette.jsonochdocs/diagrams/mermaid-config.json(båda genererade från modulen, för Python-figurverktygen och mermaid-cli) är aktuella, och misslyckas om en hex-färgliteral förekommer isrc/utanför paletten.tests/published_figures_still_reproduce.rsfår en tredje diagnos, "endast färger och typsnitt flyttades", så att en palettrevision kan skiljas från ett flyttat ritat värde. Varje omrenderat README-diagram kontrollerades vara lika med sin föregångare under den normaliseraren.tools/gen_validation_figures.pyläser paletten och genererar nu också de tre resultatfigurerna i README som saknade incheckad generator (domain-coverage-map,scenario-fom,sgp4-regime-bars), med riktiga textelement, frånweb/capabilities.json, resultatetclock-holdoverochtests/fixtures/sgp4_comparison.md.tools/gen_readme_assets.pyläser samma palett, vilket rättar dess drift i ljust tema från sajten. Värdena försgp4-regime-barsär värstafallskolumnenkshana↔refi den fixturen (7.31e-9, 8.05e-9, 8.18e-9 och 4.12e-6 km), oförändrade från Matplotlib-figuren, ochtests/figures_doc_sync.rsmisslyckas nu om den incheckade figuren och fixturen inte stämmer med varandra.
docs/assets/figures/domain-coverage-mapuppdaterad till aktuella data (en dataändring, inte en omritning). Figuren angav 28 förmågor över 8 områden (11 validated, 17 modelled), inaktuellt mot sin egen angivna källa; ritad nu av sin nya generator frånweb/capabilities.jsonläser den 46 förmågor över 8 områden (17 validated, 29 modelled).
Rättat#
Q för CW-/smalbandsjammer är nu 1,0, inte 1,5. Lärobokens värde för en ton på bärvågen är 1 (en ton behåller signalens spektrala topp,
κ = T_c,Q = 1/(R_c κ)); det gamla 1,5 gjorde en ton mindre skadlig än bredbandsbrus vid samma J/S. Utdataändring: omkring −1,8 dB effektivt C/N0 under CW-/smalbandsjammers vid högt J/S i typernajamming,lunar-jammingoch interop (tonen i det medföljande exempletspectrum: 17,98 dB-Hz från tabellen, var 19,74). Q för bredband förblir 1,0 (konservativt, omkring 3 dB under lärobokens ~2) i väntan på granskning i 0,34. Sättq_overrideför att behålla det gamla 1,5.Heltalsutdata från
kshana iq sceneanvänder heltalsintervallet. Med enhetseffektbrus och en skrivarskala på 1 blev scener ici8/ci16ungefär {-1, 0, 1} och scener med 2 bitar hade sina trösklar vid 2,8 sigma. Heltalsformat skalas nu så att den förväntade RMS per komponent är en fjärdedel av full skala (31,75 LSB i ci8, 8191,75 i ci16) eller 2 LSB med 2 bitar. Skalan och antalet klippta element skrivs ut och skrivs till sidofilen. Flyttalsutdata är oförändrade.Åtta fixturlåsningar i sju testfiler misslyckas inte längre på macOS på grund av skillnader i sista biten (del av issue #36). Låsningarna som kontrollerar att motorn fortfarande bygger de incheckade indata för en oberoende referens (jakobianer, en tillståndstabell, uppskjutningsazimut) jämfördes bit för bit och misslyckades på macOS arm64 med 2 till några tusen enheter i sista decimalen (ulp). De jämför nu inom 1e-12 av en skala hämtad från fixturen; heltal, nycklar och längder jämförs fortfarande exakt, och ett mutationstest visar att en relativ ändring på 1e-6 fortfarande misslyckas. Låsningen för uppskjutningsazimut jämför
sin azoch den stigande/fallande grenen i stället för själva azimuten, eftersomasinförstärker en ulp i sitt argument till omkring 3e-9 rad där en inklination är lika med en plats kolatitud. Ingen tolerans för en oberoende referens och ingen tröskel fastställd i förväg ändrades. Två tester (gemensam banbestämning på månen, observerbarhet på månen) täcks inte: på macOS flyttar sig deras jämförelser som fastställdes i förväg själva, och det lämnas till en uppföljning.kshana iq trackochkshana iq sweeptillämpar front-end-flaggorna. Användningstexten annonserade--bandpass/--notch/--blank/--excise/--agc/--bitspåtrack, mentrackochsweepbyggde aldrig kedjan: flaggorna ignorerades tyst, och en flagga utan värde som--notchsvalde flaggan efter sig. Båda kommandona tolkar dem nu somiq acquiregör och sätter en ny front-end-kedja framför infångningspasset och spårningspasset. Utdata är lika med att köra kommandot på filen somiq frontendskriver för samma flaggor.IQ-scenens data placeras per signal.
kshana iq scene --data(ochNavData::Seeded) lägger bitar på 50 bit/s på varje signal, piloter inklusive, och med GPS LNAV-hastigheten på Galileo och BeiDou. Data följer nu varje signals egen symboltakt, angiven av den nyaSpreadingCode::data_modulation()(DataModulation, satt av varje konstruktor iiq::signals). Det är 10 ms på L5-I5, 4 ms på E1-B, 2 ms på BeiDou B1I GEO (D2), och bitar på 20 ms med en meander på 10 ms på GLONASS L1OF. Data vägras på piloter, på GPS L2C som en enda CM/CL-ström, ochNavData::Lnavpå allt utom L1 C/A. Egna koder behåller den tidigare tidtagningen på 20 ms som standard. En programmatiskScenesom bad omNavData::Lnavpå en kod som inte är L1 C/A, ellerNavData::Seededpå en pilot, genererade tidigare tyst och returnerar nu ett fel vid första läsningen.GLONASS L1OF-kanaler infångas och spåras på sin egen FDMA-bärvåg.
iq::acq::acquireoch spårningskanalerna blandade ned varje kod från enbartif_hz. I en GLONASS-inspelning med flera kanaler hittade en sökning efter kanal +3 därför signalen från kanal 0 (alla kanaler delar en spridningskod) och tittade aldrig 1,6875 MHz högre. Båda använder nuSampleSpec::baseband_hz(carrier) = if_hz + (carrier − center_hz). Bärvågstermen är noll för varje inspelning centrerad på signalens egen bärvåg och utelämnas när centrum är okänt, så CDMA-bearbetningen är oförändrad. Om du kringgick det gamla beteendet genom att lägga incarrier − centeriif_hzi sidofilen: ta bort den termen, förskjutningen tillämpas nu utifrån bärvågen och centrum, så att lämna kvar den tillämpar den två gånger. Känd begränsning, oförändrad här: en GLONASS-scen identifierar varje satellit med sin frekvenskanalk, och satellit-id:t av typenu32omsluter en negativ kanal. Referenssidofilen skriverk = -7somsat_id4294967289 (k + 2^32). Läs tillbaka den somkmed en cast tilli32.
[0.32.0] - 2026-10-05#
Tillagt#
- GNSS-IQ-lagret i CLI och Python (0.32.0 fas A). Den befintliga modulen
iqgår nu att använda utan att skriva Rust. Fem nya kommandon ikshana iqansluter till gruppen för datahantering:scenegenererar en lång IQ-scen med flera satelliter till en fil med en referenssidofil;acquirekör FFT-infångning av en eller flera PRN över en inspelning och rapporterar varje detektering (PRN, Doppler, kodfas, statistik, tröskel);trackinfångar och kör sedan DLL/PLL/FLL-banken över en inspelning och ger spårningsutdata per epok (CSV/JSON) med konfigurerbara slingbandbredder, integrationstid och korrelatoravstånd;sweepspelar upp en inspelning över flera slingutformningar och rapporterar resulterande jitter- och lågmått per utformning; ochlabfitanpassar modellen för låsförlust i spårningsslingan till en tidslinje för mottagarförtroende. Samma kärna exponeras för Python (kshana.iq_scene,iq_acquire,iq_track,iq_labfit,iq_signals) och returnerar NumPy-vänliga listor och ordlistor. Endast programvara och additivt: inga nya beroenden, ingen sändning, ingen syntes av störnings- eller spoofing-vågformer; motorn, infångningen, spårningen och slingutformningarna är cratets egna, så en anropare från CLI eller Python får samma bitar som Rust-testerna. Ny moduliq::cli; scenens egen referenssidofil är den oberoende referensen itests/iq_cli.rs(infångningen återskapar varje injicerad kodfas och Doppler, spårningen konvergerar mot det injicerade Dopplervärdet). Inget publicerat antal scenariotyper och ingen rad i verifieringsmatrisen ändras. - Återstående funktioner i GNSS-IQ-biblioteket i CLI:t
iqoch Python (0.32.0 fas A.2). Bygger på fas A och gör resten av lagretiqtillgängligt utan att skriva Rust:- Utbredningskanal i
iq scene(och Pythonsiq_scene): en jonosfär av första ordningen (--iono-stec/--iono-vteceller--iono-klobuchar), Saastamoinen/Niell-troposfären (--tropo), Cornells scintillationsmodell (--s4,--scint-tau0,--sigma-phi), spekulär markflervägsutbredning (--multipath-height/--multipath-ground), den landmobila kanalen med tre tillstånd (--land-mobile) och ett block för förhållanden utan fri sikt (--nlos) tillämpas på varje satellit genom en ny crate-intern brygga (iq::channel::SceneChannelAdapter) som omvandlar kanalmodellernas absoluta vägar till scenens form med överskott över geometrin. - SigMF-utdata i
iq scene(--format sigmf): skriver samplen som ett par.sigmf-data/.sigmf-metamed en capture och annotationer per satellit;acquire/trackläser redan SigMF, så en scen gör en rundtur. - Front-end-DSP: ett nytt kommando
iq frontend <in> <out>och samma flaggor påacquire/track(--bandpass,--notch,--blank,--excise,--agc,--bits1/2/3/8/14) kör stegen iiq::frontend(bandpass-FIR, adaptiv notch, pulsblankning, excision i frekvensdomänen, AGC, kvantiserare); speglat i Python somiq_frontend. - Scener med broadcast-efemerid:
iq scene --nav <rinex_nav> --rx-pos lat,lon,alt(med--start/--window/--prn) placerar varje frisk GPS-satellit i dess sanna broadcast-geometri med motorns RINEX-läsare, så att referenssidofilen bär verkligt avstånd, Doppler och kodfas per satellit; speglat i Python somiq_scene_broadcast. Endast programvara och additivt: inga nya beroenden, ingen sändning, ingen syntes av störnings- eller spoofing-vågformer (kanalens utbredningseffekter verkar bara på den legitima signalen). Varje numeriskt påstående testas mot en oberoende referens (sluten form eller injicerad referens) i enhetstesterna för kanal/front-end ochtests/iq_cli.rs.
- Utbredningskanal i
[0.31.0] - 2026-10-04#
Tillagt#
- GNSS-IQ-lager: simulering på signalnivå och bearbetning i programvarumottagare. En ny modul
iqtar Kshana från en front-end för L1 C/A med en satellit och korta block till ett fullständigt lager på signalnivå, nåbart från kommandogruppenkshana iq. Den genererar långa IQ-scener i råformat med flera satelliter och en referenssidofil per epok (iq::scene); tillämpar utbredning på signalnivå — jonosfär med kod-bärvågsdivergens, troposfär, amplitud- och fasscintillation (Cornell-modellen), Fresnel-flervägsutbredning och en landmobil kanal med tre tillstånd, samt förhållanden utan fri sikt (iq::channel); infångar och spårar med FFT-infångning och en DLL/PLL/FLL-bank med flera kanaler, och spelar upp en inspelning genom många slingutformningar (iq::acq,iq::track); modellerar front-end — FIR-/IIR-filtrering, kvantisering på 1 till 14 bitar, AGC, notch, pulsblankning och excision i frekvensdomänen (iq::frontend); strömmar stora inspelade datamängder med begränsat minne — int8-/int16-/float32-/packade 2-bitars- och reella IF-format, SigMF med flera filer, omsampling, en datamängdsinventering med SHA-256 per fil och en batchkörare (iq::io); lägger till spridningskoder för GPS L5/L2C, Galileo E1 (CBOC, riktiga minneskoder från ICD) och E5a, BeiDou B1C/B1I och GLONASS L1OF, var och en kontrollerad mot sitt gränssnittskontrolldokument (iq::signals); och anpassar modellen för låsförlust i spårningsslingan till en verklig mottagares observerade beteende i labbkörningar, med fel för leave-one-run-out i undanhållen datamängd och extrapolering betecknad som prediction (iq::labfit). Varje numeriskt påstående testas mot en oberoende referens (en ICD-tabell, en sluten form eller en oberoende mottagare som återskapar den injicerade referensen); kanal- och slingmodellerna i fysiken förblir MODELLED. Detta är enbart ett programvarulager: det skriver IQ-filer för programvarumottagare och syntetiserar inte störnings- eller spoofing-vågformer och styr inte radiohårdvara. Inget publicerat antal scenariotyper och ingen rad i verifieringsmatrisen ändras. Utformning:docs/design/GNSS-IQ-PLAN.md. - Mottagarförtroende: bedöm en verklig GNSS-mottagarlogg.
kshana receiver-trust <scenario.toml>läser en logg från u-blox UBX, RINEX 3 (med en valfri broadcast-navigeringsfil), Android GnssLogger eller NMEA 0183 till en enda tidsstämplad tidslinje och kör förtroendemonitorer över den: fall i bärvågsbrustäthet (C/N0), förlust av lås, automatisk förstärkningsstyrning (AGC), u-bloxs jamming-indikator, positionshopp och, med RINEX och navigering, motorns egen enpunktsbestämning med RAIM (receiver autonomous integrity monitoring) med paritet och den klockstödda monitorn. Varje epok är nominal, degraded eller untrusted, och resultatet anger när och varför. Händelser och förutsagda C/N0-fall som anges i scenariot poängsätts mot toleranser som anges i samma fil: detekterad, sen eller missad, och överens eller oense. Utdata är resultat-JSON, en CSV per epok och ett diagram; resultatet bär loggens SHA-256 och varje tröskel. Nås också från Python (kshana.receiver_trust), WebAssembly-paketet (receiver_trust, loggar infogade) och det nya verktygetassess_receiver_logi servern för Model Context Protocol (MCP). Guide:docs/RECEIVER-TRUST.md; exempel:examples/receiver-trust/. På spoofing-loggarna från JammerTest 2024 återskapar motorvägen det första larmet i pipelinen för den oberoende referensen som fastställdes i förväg vid varje publicerad start (tests/receiver_trust_jammertest.rs). Monitorerna förblir MODELLED; ingen rad i verifieringsmatrisen ändras.
0.30.0 - 2026-10-03#
En mindre utgåva. Valideringsrunda 2 och paket i wave 1 tar verifieringsmatrisen från 223 rader (93 VALIDATED) vid 0.29.3 till 249 rader (123 VALIDATED, 122 MODELLED, 4 PARTNER); varje uppflyttning kontrollerades mot en oberoende referens vid en tolerans fastställd före körningen, och varje avvikelse publiceras som ett fynd. Nytt: en inbyggd läsare för NAIF-kernel och en DE440-väg, en validerad väg för propagering och tid från SGP4 till ITRS, ett uppmätt klockbibliotek, en referensgenerator för LunaNet AFS, lösare med utökad precision och kvadratrotsinformation, och verklig bearbetning av IQ från månen på LuGRE-data. Publicerade siffror som flyttades listas som revisioner nedan.
Tjugosju rader i verifieringsmatrisen blir VALIDATED efter att en oberoende referens stämde inom en tolerans fastställd före den första jämförelsen (uppflyttningsregeln i docs/VALIDATION.md): tio i en första valideringsrunda och sjutton i en andra. Femtioen MODELLED-rader ställdes mot en extern oberoende referens i den första rundan och de återstående rader som gick att ta vidare i den andra; varje avvikelse antecknas nedan som ett fynd i stället för att trimmas bort. Tre rader delades så att en validerad del inte bär en ovaliderad rest, vilket tar matrisen från 223 till 226 rader; valideringspaketen som lagts till sedan dess tar den till 249. Siffrorna läses från den genererade docs/VERIFICATION-MATRIX.md.
| 0.29.0 | efter runda 1 | Oreleaserat | |
|---|---|---|---|
| Rader i verifieringsmatrisen | 223 | 223 | 249 |
| varav VALIDATED mot en extern oberoende referens | 83 | 93 | 123 |
| varav MODELLED | 136 | 126 | 122 |
| varav PARTNER | 4 | 4 | 4 |
Förkortningar som används i den här posten
| Förkortning | Betydelse |
|---|---|
| ADD, ARAIM, MAAST | Airborne Design Document (för ARAIM); avancerad autonom integritetsövervakning i mottagare; Matlab Algorithm Availability Simulation Tool från Stanford University |
| ADEV, VRW, ARW | Allan-avvikelse; slumpvandring i hastighet; slumpvandring i vinkel |
| ANISE, SPICE, NAIF, PCK | ett astrodynamikverktyg med öppen källkod (Nyx Space); NASA:s verktygslåda Spacecraft, Planet, Instrument, C-matrix, Events från dess Navigation and Ancillary Information Facility; kernel med planetkonstanter |
| BCRS, TDB, TT | Barycentric Celestial Reference System; Barycentric Dynamical Time; Terrestrial Time |
| BIPM, UTC(k) | Internationella byrån för mått och vikt; ett laboratoriums realisering av koordinerad universell tid |
| CCSDS, OEM, LTC, TCL | Consultative Committee for Space Data Systems; Orbit Ephemeris Message; månens tidssystem som skrivs i meddelandets fält TIME_SYSTEM |
| CRLB | Cramér–Rao-gränsen (undre gräns) |
| CW | Clohessy–Wiltshire-relativrörelse |
| DE440 | Development Ephemeris 440 från Jet Propulsion Laboratory |
| DOP, PDOP | geometrisk försämring av precision; positionens geometriska försämring av precision |
| EKF, UKF, INS, GNSS, IMU | utökat Kalmanfilter; unscented Kalmanfilter; tröghetsnavigeringssystem; globalt navigationssatellitsystem; tröghetsmätenhet |
| EMT, VPL, HPL | effektiv monitortröskel; skyddsnivå i vertikal och horisontell led |
| EOP, IERS, PCC, MAE | jordorienteringsparametrar; International Earth Rotation and Reference Systems Service; Prediction Comparison Campaign; medelvärde av absolutfel |
| ERFA, SOFA | Essential Routines for Fundamental Astronomy; Standards of Fundamental Astronomy |
| GMAT | NASA:s General Mission Analysis Tool |
| NTN, SSB | icke-terrestriskt nätverk (3GPP); synkroniseringssignalblock |
| IGS, ILRS, ITRF2020 | International GNSS Service; International Laser Ranging Service; International Terrestrial Reference Frame 2020 |
| ILS, LAMBDA | heltalsminstakvadrater; Least-squares AMBiguity Decorrelation Adjustment |
| ISB | bias mellan system |
| LEO | låg jordbana |
| MHSS, PL, TPL | lösningsseparation med flera hypoteser; skyddsnivå; skyddsnivå för tid |
| PSD, IQ, SigMF | effekttäthetsspektrum; sampel i fas och kvadratur; Signal Metadata Format |
| QPN | kvantprojektionsbrus |
| RAIM | autonom integritetsövervakning i mottagare |
| SBAS, WAAS, DFMC, GEO | satellitbaserat kompletteringssystem; USA:s Wide Area Augmentation System; dubbla frekvenser och flera konstellationer; en geostationär SBAS-satellit |
| RMS, SISRE | kvadratiskt medelvärde; signal-i-rymden-avståndsfel |
| RTKLIB | ett positioneringsbibliotek för GNSS med öppen källkod |
| TCXO | temperaturkompenserad kristalloscillator |
| VLBI | interferometri med mycket lång baslinje |
Validated#
Varje rad nedan anger sin typ av referens (Library: ett oberoende tredjepartsbibliotek som beräknar en entydigt definierad storhet; Measured: verkliga uppmätta data; P2: ett oberoende numeriskt bibliotek som räknar om en linjäralgebrastorhet på incheckade indata), referensen, toleransen som fastställdes före körningen och resultatet. Varje uppflyttning kördes om av en andra granskare, som återskapade fixturen byte för byte och visade att en avsiktlig mutation i motorn gör testet rött.
- GNSS/INS-sensorfusion (Library), avgränsad till det löst kopplade EKF med 15 felstillstånd: NaveGo v1.4 (LGPL-3.0, körd under GNU Octave) på dess egen verkliga körning med Ekinox IMU/GNSS. Kshanas RMS i horisontell led, vertikal led och positionsinnovation är 0,912, 0,940 och 0,861 av NaveGos (tröskel 1,2) och dess normaliserade medelinnovation är 0,395 (tröskel 1,5). GNSS finns under hela körningen, så inget bortfall testas. Det hårt kopplade UKF och det kopplade klockfiltret ligger utanför påståendet.
- Attityd i 3 frihetsgrader och budget för pekfel (Library), avgränsad till toppen i gravitationsgradientmomentet: Basilisk 2.9.1 GravityGradientEffector, 40 fall, inom 1e-12 relativt (sämst 2.1e-15). RSS-pekbudgeten är en summa av tal som anroparen levererar och ligger utanför.
- Gemensam geometri för kommunikation och navigering på månen (Library), avgränsad till platsplacering, azimut, elevation och avstånd: ANISE 0.10.2, 768 sampel, inom 1e-6 grader och 1 mm (sämst 2.2e-12 grader och 5.6e-9 m). Parametern för avståndsnoggrannhet är en utformningsindata utanför påståendet.
- Momentfri dynamik för attityd hos en stel kropp (Library): rymdfarkostens hub i Basilisk 2.9.1, 1e4 s på två allmänna tröghetsmoment, kvaternion och vinkelhastigheter inom 1e-9 (sämst 3.3e-11 och 3.4e-12 rad/s).
- Heltalsosäkerhet i bärvågsfas för GNSS (LAMBDA) (Library), avgränsad till ILS-lösningen och dess två bästa normer: RTKLIB v2.4.2-p13
lambda(), 300 kovarianser, 0 avvikelser i heltalen, normer inom 1e-9 relativt (sämst 5.6e-13). Den bootstrappade framgångsfrekvensen kontrolleras fortfarande bara internt. - Sammansatt skyddsnivå för tid, skalär MHSS (P2): numpy 2.3.5 och scipy 1.18.1 på 300 incheckade indata, PL inom 1e-9 relativt (sämst 1.2e-10), drivande delmängd identisk.
- GLS-whitening av gemensam mod och Mahalanobis-identiteten (P2): numpy 2.3.5 LAPACK på 201 incheckade kovarianser, inom 1e-12 relativt (sämst 7.9e-16); konditionstal upp till 19,3.
- Leverantör av orientering för månens huvudaxlar enligt DE440 (Library): SPICE
pxformpå den binära PCK vid 2 000 epoker utanför noderna, inom 1.7e-5 rad (sämst 1.7e-6 rad, omkring 3 m vid ytan), efter rättningen som listas under "Åtgärdat". - SigMF-inspelning in och ut, och Welch-spektra (Library), avgränsad till läsning och skrivning av SigMF och
welch_psd: scipy 1.18.1signal.welchinom 1e-12 relativt per intervall (sämst 6.0e-14); inspelningar med sigmf-python 1.13.0 avkodade bit-identiskt; cratets metadata giltig mot schemat för SigMF v1.2.6. IQ-syntes och dess modelljämförelser ligger utanför. - Anpassning av LEO broadcast-efemerid och SISRE mot anpassningsintervall (Measured), avgränsad till Kepler-anpassningen med 16 parametrar och dess SISRE enbart för banan: precisionsbanor från TU Graz ITSG för fyra satelliter mot statistiken hos Liu et al. 2025, komponenter inom 1.5x (0,804 till 1,087) och SISRE inom 1.5x (0,716 till 0,809).
Fynd#
Den oberoende referensen stämde inte med dessa rader, så de förblir MODELLED. Varje fynd skrivs också in i radens referenstext (och därmed i docs/MODELLED-RATIONALE.md), med ett test som låser det.
- Skattning av klocktillstånd ombord: på undanhållna IGS-klockor för 11 GPS Block IIF-satelliter är filtret med tre tillstånd konsistent ett steg framåt men överoptimistiskt vid en timme på 9 av 11 (periodiska termer och flicker-termer finns inte i modellen).
- Detektering av spoofing: på JammerTest 2024 larmade ingen monitor på observabelnivå inom 10 s för någon av de 8 publicerade starterna, och tre fönster före start bar falsklarm.
- Skyddsnivå för tid under spoofing: det uppmätta oupptäckta tidsfelet överstiger TPL vid 3 av 8 detekterade starter (1.9x till 5.3x); en klockkalibrering på 60 s täcker inte vandringen hos mottagarens TCXO.
- Uppskjutningsfönster och stigningsgeometri: mot Orekit 12,2 stämmer geometrin till avrundning, men hastigheten hos platsen på grund av jordens rotation missar 1e-6 relativt vid 62,9 graders latitud (1.12e-6, den polrörelse som den sfäriska modellen utelämnar). Runda 2: hastigheten med sann pol och epok stämmer, standardhastigheten utan epok missar fortfarande (se nedan).
- Ballistisk korridor vid återinträde (Allen–Eggers): den förutsagda toppretardationen för Stardust-återinträdet är 61,8 g mot rekonstruerade 32,89 g (+88 %, tolerans 15 %).
- Gemensamt fel i UT1 och polrörelse: mot noggrannhetsformeln som skrivs ut i 178 nummer av IERS Bulletin A stämmer polen inom 1.5x men UT1 gör det inte (0,48 vid 10 dagar, 1,59 vid 40 dagar). Ersatt i runda 2: raden är nu VALIDATED (se nedan).
- Offline standardindata för jordorientering: astropy bekräftar radantalet, men de 12 rader som craten kallar Bulletin A-prediktioner är flaggade som uppmätta (I), inte förutsagda (P). Samstämmighetssiffrorna för raden för den operativa prediktorn var därför mot uppmätta rader. Ersatt i runda 2: motorn klassar rader efter flagga och raden är VALIDATED.
- Fel i prediktion av jordorientering i operativ stil: prediktorns UT1-fel är 2.4x till 12.6x Bulletin A:s vid 1 till 10 dagar och 5,32 ms vid 10 dagar, utanför intervallet 0,36 till 3,13 ms för 2:a EOP PCC.
- VLBI för månens geodesi: mot ljustider från ANISE genom DE440 ligger ingen fördröjning inom 1 ps; det största gapet är 24 µs, mestadels månens analytiska centrum (omkring 200 km från DE440). Runda 2: kernelvägen är VALIDATED i en egen rad; den analytiska vägen förblir MODELLED.
- Interoperabilitetsexport för månen: Orekit 12,2 vägrar tidssystemen LTC och TCL, så utbyte av månens OEM-filer med en andra läsare är inte etablerat.
- Clohessy–Wiltshire-relativrörelse: mot Orekits olinjära rörelse vid 100 m är gapet 1,2 till 6,3 mm, över 1 mm; det skalar som den utelämnade termen av andra ordningen, så toleransen som fastställdes i förväg låg under linjäriseringsfelet. Ersatt i runda 2: korrektionen av andra ordningen är VALIDATED mot samma tröskel.
- Felväxt vid INS/TRN utan stöd: mot en fritt tröghetsbaserad Monte Carlo i NaveGo håller tillväxtlagarna inom 5 % till 600 s och överskattar bortom det (2.2x till 8x vid en timme), eftersom de utelämnar Schuler-återkopplingen. Ersatt i runda 2: Schuler-felmodellen är VALIDATED.
- Servicevolym på månen från verklig konstellationsgeometri: 4 av 12 publicerade tillgänglighetsstatistiker skiljer sig med mer än 2 procentenheter (upp till 22,5).
- Övre gräns för bias i spårbarhet för heterogen UTC(k): på 105 024 BIPM-rader överskrids den övre gränsen av 50,8 % av raderna; den publicerade osäkerheten avgränsar BIPM:s mätning av förskjutningen, inte själva förskjutningen.
- Klassificering av nollrum för månens datum: på den publicerade geometrin med fem reflektorer är korrelationen -0.78 mot -0.97, och CRLB för origo är 96 till 98 % under artikelns.
- Substrat för månens LLR-datumgeometri: mot 192 ILRS-normalpunkter för månen från 2024 var RMS för enkelriktat residual 96 m med den tidigare orienteringsinterpoleringen och är 22,7 m efter rättningen nedan, fortfarande över tröskeln på 10 m (avrundade stationskoordinater, ingen polrörelse). Orienteringsserien klampar tyst utanför 2024-2025. Runda 2: modellen för uppmätt avstånd är VALIDATED i en egen rad (2,81 m); serien täcker nu 2014-2030 och ger fel utanför den.
- Koppling mellan relativistisk klockhastighet och ramen: självpotentialtermen är 3.18e-4 över det publicerade värdet (tolerans 1e-4); artikeln utvärderar en annan potential, så inget publicerat värde finns för denna slutna form. Ersatt i runda 2: ekvatorialpotentialen av grad 2 är VALIDATED mot samma artikel.
- Fysikaliska konstanter för varje kropp i solsystemet: 12 av 84 konstanter för de tillagda kropparna skiljer sig från NAIF pck00011 och gm_de440 (äldre element för Mars månar; andra GM-lösningar för Uranus, Neptunus och Pluto). Runda 2: konstanterna följer nu NAIF (en transkription, räknas inte), och den beräknade orienteringen stämmer med SPICE; raden förblir MODELLED.
- Valbara efemeridmodeller för LEO: anpassningen med 22 parametrar lämnar 1.71x och 1.86x det publicerade felet längs banan på bågar på 20 min, över 1.5x. Ersatt i runda 2: modellen med 22 parametrar och dess anpassning är VALIDATED i en egen rad.
- Gemensam positionsbestämning med GNSS och LEO: bias mellan system stämmer med RTKLIB, men 93,2 % av epokerna ligger inom 3 m från ITRF2020 mot 95 %; RTKLIB själv når 88,2 % på data (93,6 % efter rättningen av gruppfördröjning i runda 2).
- Blindhet för gemensam mod i integritet och täcknings- och DOP-kartor: båda jämförelserna lyckades men avvisades vid granskning eftersom en medvetet felaktig motor också klarar dem (den första kontrollerar bara en intern identitet; de publicerade golven för den andra kan inte se en fördubblad PDOP). Runda 2: blindhet för gemensam mod i integritet är VALIDATED på indata med paritet; täckningskartorna förblir ett fynd (se nedan).
Valideringsrunda 2#
Den andra rundan tog varje rad som den första rundan lämnat som möjlig att ta vidare, med nya förhandsregistreringar incheckade innan någon fixtur hämtades eller någon oberoende referens kördes, en motstridig andra granskare som körde om varje jämförelse och en avsiktlig mutation i motorn som måste göra varje test rött. Ägaren godtog den rättade formuleringen för raden om gränsen utanför Omega den 2026-10-02 innan den flyttades upp (dess gamla text motsade koden).
Uppflyttade till VALIDATED (17). Typ av referens inom hakparentes; tolerans fastställd före körningen.
- Koppling mellan relativistisk klockhastighet och ramen (Reference): Ashby och Patla 2024 L_m inom 2.8e-6 (tröskel 1e-4) från ekvatorialpotentialen av grad 2 för de två fält som artikeln citerar; pyshtools gravitation av grad 350 för den radiella posten (8.3e-5); DE441 månens hastighet (2.5e-3).
- Offline standardindata för jordorientering (Library): astropy 8.0.1 och IERS Bulletin A nr 039 bekräftar de 30 slutgiltiga, 54 snabba och 90 förutsagda raderna i det omskurna utdraget.
- Gemensamt fel i UT1 och polrörelse (Library): fulla rotationer i astropy och pyerfa återskapar den gemensamma tabellen (UT1 och pol inom 6e-16, kombinationen inom 1.9e-7); de realiserade felen i IERS Annual Report 2019 ger kvoter 1,001 till 1,100.
- Fotavtryck och täckning för EO-nyttolast (Library): Orekit 12,2 och GeographicLib 2,1 vid varje tröskel fastställd i förväg, med J2-nodregressionen nu i nodavståndet.
- Clohessy–Wiltshire-relativrörelse (Library): med en korrektion av andra ordningen i sluten form, inom 1.2e-7 m från Orekits olinjära rörelse mot 1e-3 m; enbart den linjära matrisen förblir karakteriserad (1,2 till 6,3 mm).
- B-plansstyrning och gravitationsassistans med patched conic (Library): GMAT R2026a B-plan, asymptoter, C3 och heliocentriska element; sbpy 0.6.0 och Kasuga och Jewitt 2019 för Tisserand-parametern.
- Felväxt vid INS/TRN utan stöd (Library): en Schuler-felmodell med nio tillstånd inom 5 % från korrigerade körningar utan stöd i NaveGo vid alla 48 punkter (sämst 3,70 %).
- Blindhet för gemensam mod i integritet (P2): numpy
lstsqpå 1464 indata med paritet inom 1e-12 (sämst 1.06e-14). - Gemensam banbestämning och klocka på månen med flera tekniker (P2): numpy räknar om varje Gauss-Newton-steg, sigma och stationsfel på sex nätverk (inom 2.4e-11) efter en rättning av QR-lösningen.
- Kovarians för stationskoordinater vid VLBI på månen (Library): en Jacobian byggd med SPICE återskapar schemat, spektrumet, sigman och nollrummet inom 1 % och 0,1 grader; numpy till 2e-13.
- Oupptäckbar gräns för gemensam mod för residual utanför Omega (P2, formulering rättad genom ägarbeslut): numpy LAPACK på 256 fall inom 1e-12, sex exakta oändligheter.
- Basinvariant klassificering av nollrum (P2): SciPy och NumPy med snitt av underrum på 72 konstruerade matriser, heltal exakta, projektornorm inom 6.0e-15.
- Enfrekvens-jonosfärs- och UTC-tjänster i ett LEO-navigeringsmeddelande (Library): GNSSTk 15.3.1 för Klobuchar, Az och UTC-driften; ERFA för de tre skottsekundsfallen.
- Positioneringsgräns för 5G icke-terrestriskt nätverk (P1): Bachl, Lei och Nabeel 2026 gränser för enkel SSB inom en halv utskriven siffra; numpy för kovarianserna för positionsbestämningen.
- Modell för uppmätt avstånd vid LLR (Measured, ny rad utbruten ur LLR-datumsubstratet): 192 ILRS-normalpunkter för månen vid 2,81 m RMS mot en tröskel på 10 m, med barycentrisk ljustid enligt IERS 2010; komponenterna under tröskeln löses inte upp en och en, och raden säger det.
- VLBI för månens geodesi, kernelväg (Library, ny rad utbruten ur raden för VLBI på månen): SPICE konvergerade ljustider inom 1 ps och partialer inom 1e-6 vid epoker nära J2000; den analytiska standardvägen förblir MODELLED.
- Liu et al. 2025 LEO-efemeridmodell med 22 parametrar och dess anpassning (Measured, ny rad utbruten ur raden för valbara modeller): verkliga precisionsbanor inom 1.5x av den publicerade statistiken på artikelns dagar och undanhållna dagar (0,683 till 1,186); skalkonventionen för n_dot är transkriberad och inte validerad av denna jämförelse, och stoppregeln är Kshanas regel om parameterkonvergens, inte artikelns regel om RMS-förändring. ATOMIC-polynomet och tabellen med fem höjder förblir MODELLED.
Befintliga VALIDATED-rader med ny grund (ingen ändring av antal).
- Planetpositioner från JPL Standish-elementen och ljustid mellan kroppar i solsystemet: de efterhandsfastställda trösklarna på två gånger nominellt ersätts av jämförelser fastställda i förväg med JPL Horizons DE441 (RMS högst värdet i tabell 8.10.1 i Explanatory Supplement, sämst 0,778, inklusive jorddelningen och ICRF-rotationen; ljustider inom 1e-6 s från Horizons på DE441-positioner, sämst 6.7e-9 s). Deras flaggor "gräns satt efter jämförelsen" tas bort.
- Integritet (RAIM/ARAIM/SBAS): raden vilar inte längre på rimlighetskontroller. Den säger nu: lösningsseparationen med flera hypoteser för ARAIM i ADD v4.2 stämmer med Stanford MAAST för ARAIM 2 på 270 verkliga fall (sämsta VPL-skillnad 2.2e-3 m mot 0,05 m); detektering och exkludering i ögonblicksbilds-RAIM stämmer med RTKLIB
raim_fdei 2016 av 2016 beslut, med skyddsnivån för lutning inom 2.7e-12 m; SBAS DO-229E L1-skyddsnivåerna stämmer med Stanford MAAST på verkliga WAAS-sändningar (2868 par inom 1.6e-5 m). Den anger tydligt att funktionerna med enhetlig sigmaraim::araim_raimochraim::araim_dual_raimINTE är ADD-konforma (gap vid matchade indata 0.75/4.04 m och 0.39/1.93 m VPL/HPL, ett fynd), att jämförelsen för DFMC L5 SBAS är ett fynd (308 par utan GEO i sikte skyddas av Kshana och inte av MAAST) och attraim::solution_separation_raimsaknar extern jämförelse. Dess självflagga tas bort. - Anpassning av broadcast-efemerid för LEO: den integrerade referensbanan läggs till i den validerade delen (Orekit 12,2 inom 4,55 mm över 6 h, tröskel 2 cm); korrektionspolynomen, klockanpassningen och avvägningen för uppdateringsperiod förblir modelled.
Fynd och blockerade rader (förblir MODELLED). Varje rads referenstext bär fyndet och dess låsta test.
- Modulation av navigeringssignaler (Betz 2001, Hein 2006): spektra och korrelationer stämmer; sidolober vid 24 MHz och varje flervägsbias (11 till 15 % låg) gör det inte, orsaken olöst.
- TDOA/FDOA-geolokalisering: gränserna stämmer med Ho och Chan och Ho och Xu, och med författarnas kod till 3e-12; Ottawa-faktorerna som skrivs ut från en Monte Carlo skiljer sig med 1,3 % och 4,4 %.
- GNSS från jorden på månavstånd: GENESIS medelvärden i zenit stämmer med Montenbruck et al. 2023 på 5 av 6; medelvärden i nadir är 1,0 till 2,4 satelliter för höga.
- Täcknings- och DOP-kartor: utformningar för jorden stämmer med Orekit, gnss_lib_py och numpy vid varje tröskel; utformningar för månen och Mars överskrider 1e-9 bara på nära singulära celler.
- Gemensam GNSS-positionering: dubbla frekvenser 79,9 % och precisionsprodukter 94,2 % inom 3 m mot 95 % (RTKLIB 67,9 % och 94,1 %); ISB-gapet för precisionsprodukter beror på att RTKLIB ignorerar antennförskjutningar.
- Spårningsslingor (GNSS-SDR 0.0.19): stämmer vid 35 till 45 dB-Hz; vid 30 dB-Hz PLL +21 %, DLL -32 %, trösklar +1,5 dB; tider för cykelglapp 0,5 till 2 dekader kortare.
- Servicevolym på månen (Orekit och Hipparchus): 155 av 160 värden stämmer; kravet för sämsta sampel misslyckas på nära singulär geometri hos LNCSS B.
- Kvanttröghetssensor: golvet med endast QPN är 21 till 31 % under Gauguet 2009 uppmätta brus (tröskel 30 %, missad med 0,5 punkter).
- Oscillatorförinställningar: uppmätta enheter överskrider förinställningarna för holdover hos rubidium, kort sikt hos cesium och CSAC för sämsta enhet; förinställningen för OCXO har ingen uppmätt post.
- Densitet från rymdväder: Jacchia 1971 ligger inom en faktor 2 från accelerometerdensiteter vid solmaximum men omkring 1.7x för tät i minimet 2008.
- Geometrifri sned TEC: 33 av 36 bågar inom 3 TECU från CODE-kartan (sämst 6,84).
- Detektering av spoofing och TPL mot den officiella loggen från JammerTest 2024: 4 av 10 starter detekterade i tid; TPL överskrids vid 4 av 10.
- Klockfilter på nya IGS-klockor: två av 11 satelliter misslyckas med kriteriet för innovationssumma.
- Prediktor för EOP med minsta kvadrater plus autoregression: UT1 1,73 till 2.11x Bulletin A vid 2 till 10 dagar.
- Övre gräns för realiserad förskjutning hos UTC(k): sammanlagd frekvens av överskridanden 0,0333 mot 1e-2.
- Datum för månens ram från en kampanj: SPICE-delen stämmer; delen P2 med skattade stationer missar 1e-9 på ett problem med kondition 2.1e8.
- Datum för månens ram från verklig LLR: 15 av 16 siffror stämmer med SPICE; sigma för z-translationen är 1,03 % hög mot 1 %.
- Återinträde (Allen-Eggers): lösningen med punktmassa stämmer med myndigheters rekonstruktioner (enbart en korskontroll); jämförelsen med accelerometer är blockerad i väntan på en läsbar källa för Hayabusa2.
- ITU-T-masker: de utskrivna räknade värdena stämmer; klassgränserna i G.8273.2 har inga (blockerad).
- Geometri för uppskjutningsfönster: hastigheten hos platsen med sann pol och epok stämmer med Orekit (4.9e-8); standardhastigheten utan epok missar fortfarande (1.12e-6). Inte uppflyttad; uppföljning väntar.
- Fysikaliska konstanter för varje kropp: nu skiljer sig 0 av 84 från NAIF (en transkription), och den beräknade orienteringen stämmer med SPICE till 1.4e-10 rad. Inte uppflyttad; uppföljning väntar.
- Blockerade i väntan på ett avgränsningsbeslut av ägaren, var och en med sin stämmande jämförelse incheckad: absolut observerbarhet för stationer på månen, DOP för beacon på ytan, exporten utanför boresight, detekteringseffekt över modaliteter, konsistensstatistiken för gemensam mod och polär LEO-täckning.
- Blockerade i väntan på data: felbudgetering för tidsöverföring (kräver en reduktion av verkliga data), C/N0 i JammerTest (antennposition och effektfördelning är inte dokumenterade).
Revisioner (publicerade siffror som flyttades, gammalt -> nytt).
- Skyddsnivåerna i
snapshot_raimligger nu på den geodetiska lokala nivån i stället för den radiella: upp till 0,31 m HPL och 0,14 m VPL vid ABMF (16 grader N); inget golden flyttades, men den inspelade sammanfattningen i handledningengnss-simflyttas från medel-HPL 22,1 m / VPL 40,0 m till 22,2 m / 39,9 m (docs/tutorials/scenarios/gnss-sim.toml). - Standardvärden för koppling mellan månens hastighet och ramen: d_alpha/d_scale 3.139807e-11 -> 3.138801e-11; d_alpha/d_radial 1.807187e-17 -> 1.806185e-17 per meter.
- Offline standardkörning för EOP (
realtime-frame-eop, celler listade idocs/revisions/M035-default-eop-recut-cell-changes.md): predicted_rows 12 -> 90; polgolv 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; raderna i tabell 2 itests/golden/realtime-frame-eop.csv; samstämmighet hos den operativa prediktorn 0.256/0.695/1.252/3.885 ms -> 0.133/0.421/0.839/2.786 ms. - SISRE för liu22 i
docs/LEO-NAVMSG.mdbana/med klocka: 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-höjdtabell, Kshana (kvot): 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).
- Skalan för
nDoti LEO-navigeringsmeddelandet 2^-60 -> 2^-58 (inte fastställd i förväg, redovisad; utanför anpassningsjämförelsen); ramens CRC för liu22-exemplet 0x62373A -> 0xDED99C. - Verifieringstabell i
docs/LEO-NAVMSG.md: raden för Liu och ATOMIC delades i en VALIDATED rad med 22 parametrar och en MODELLED rad för ATOMIC och fem höjder. - Radtext för orienteringen av månens huvudaxlar enligt DE440: spann 2024-2025 / 731 rader -> 2014-2030 / 6 209 rader; "klampar tyst" -> ger fel utanför sitt spann.
- Scenariot
eo-coverage: equatorial_ground_track_spacing_km 2756,37 -> 2752,17 km; nya fält inclination_deg (98,19) och nodal_period_min (98,893). constellation-multi-gnss-coverage(referensklockan för TDOP/GDOP är nu den lägst numrerade konstellationen i sikte): globalt GDOP max 2,2236 -> 2,1205, medel 1,122 -> 1,131, median 1,115 -> 1,125, p90 1,255 -> 1,265, p95 1,305 -> 1,315, p99 1,41 -> 1,42, och GDOP-kartan per cell; mean_visible_by_constellation summerad som heltal (omkring 1e-12 relativt, osynligt vid 4 decimaler).- Gemensam GNSS-positionsbestämning med en frekvens efter rättningen av gruppfördröjning i broadcast: 93,2 % -> 93,6 % inom 3 m; ISB-median -0.351 -> -0.114 ns.
tracking-loopjitter_table log10_mean_time_to_cycle_slip_s (Costas-slinga SNR rho/4): vid tröskeln 25,47 dB-Hz 11,58 -> 2,10; vid 25 dB-Hz 9,55 -> 1,60; vid 22 dB-Hz 2,24 -> -0.14.ins-trn-coast: varje utdata flyttas med Schuler-felmodellen; TRN-toppen i det levererade scenariot 52,932679 -> 44,711834 m (tests/conflict_resilience_architecture_guard.rs).- Rapporten
lunar-vlbi: ny nyckel geometry_path ("analytic" i standardkörningen, inget numeriskt värde ändrat); nya valfria fält planetary_kernel_path, earth_orientation_kernel_path och moon_orientation_kernel_path, med epoch_partials på kernelvägen; typens beskrivning är omskriven. Den oberoende referensen för kernelvägen i verifieringsraden är SPICE (0,06 ps); ANISE (0,12 ps) blir en korskontroll av kernelutvärdering. - Kroppskonstanter: 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); Phobos ekvatorialradie 13,1 -> 13,0 km; Phobos och Deimos pol och nollmeridian från pck00011; prime_meridian_deg för solsystemet innehåller nu de kvadratiska och periodiska termerna.
europa-surface-pnt(body-pntpå Europa), från den fullständiga orienteringen av Europa i pck00011 (7cfd66b4; orienteringen stämmer med SPICE pxform till 1.4e-10 rad), vilket flyttar landaren i tröghetsrummet: tillgänglighet endast reläer / med jordavståndet 0,485 / 0,725 -> 0,480 / 0,719 (83 -> 82 av 171 epoker endast reläer), median-PDOP 5,266 -> 5,360, RMS för positionsfel 129,516 / 100,983 m -> 112,742 / 86,147 m, median för formell sigma 5,266 / 4,272 m -> 5,360 / 4,239 m. Tabellen idocs/SOLAR-SYSTEM.mdoch låsningen imcp/kshana-mcp/tests/round_trip.rsföljer;mars-orbit-pntär oförändrad.space-weather(f107 180, f107a 165, kp 4), den kalibrerade faktorn ersatt av Jacchia 1971: activity_density_kg_m3 vid 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 borttagen, mean_exospheric_temperature_k tillagd (1186,7 K);tests/space_weather_reference.rs: solcykelsvängningen vid 800 km är nu 10.4x (NRLMSISE-00 13.6x) och höjdpåståendet följer NRLMSISE:s ökning till 500 km och fall vid 800 km.ntn-5g-positioningtoa_median_sigma_3d_m: NR 5 MHz 2,0903959 -> 2,0903962 m; NB 200 kHz 25,938613 -> 25,938839 m (sammanfattningstexten oförändrad vid 2,09 / 25,94 m).lunar-joint-od-clock(QR-lösning): 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.jsonsänds ut på nytt för de nya och borttagna fälten ovan.
Valideringspaket#
D12, utökad precision och en kvadratrotslösare (två nya VALIDATED-rader: 226 -> 228 rader, 110 -> 112 validated).
Del 1, oberoende referens med utökad precision:
- Datum för månens ram med stationerna skattade: en oberoende referens med utökad precision på 50 siffror i mpmath (förhandsregistrerad 804662d5, konditionsskalade trösklar från en a priori-formel för bakåtfel) stämmer på ett nytt kampanjdatum (2026-03-18) och på det ursprungliga scenariot 2024-01-01; ny VALIDATED-rad under P2. Den avgör den tidigare tvisten med dubbel precision: motorns datumsigman avviker med upp till 9.7e-6, NumPys vägar med invers och egenvärden med upp till 6.2e-6, och dess vägar med Cholesky och QR med omkring 1e-8. Motorn ligger inom sin felgräns men är omkring tusen gånger mindre noggrann än en väg med faktorisering.
- Referensmiljö: mpmath 1.3.0 tillagd.
- Revisioner: inga. Ingen golden-fil och ingen publicerad figur ändras; raden "Datum för månens ram från en observationskampanj" förblir MODELLED (grundarbeslut 2026-10-02, alternativ A: den lånar inte den separata radens status); dess testtext hänvisar till det nya testet och dess fynd.
Del 2, datumlösare med kvadratrotsinformation:
- Ny valfri lösare med kvadratrotsinformation (
linalg_sr;solver = "srif"i scenariot lunar-frame-campaign): Householder-QR, marginalisering genom den triangulära faktorn, en Jacobi-SVD för spektrumet och kompenserade produkter enbart från korrekt avrundade operationer. Mot den oberoende referensen på 50 siffror (fastställd i förväg b41908c9) stämmer dess datumsigman till 3e-13 på ett nytt datum (2026-06-09); på indata från 2026-03-18 och 2024-01-01 avviker standardlösaren med upp till 1e-5. Ny VALIDATED-rad under P2. Standardlösaren och dess utdata är oförändrade. Trösklarna som fastställdes i förväg kan bara styrka fel över omkring 2e-7 relativt: de förkastar standardlösaren men inte ett vänt Householder-tecken, en okompenserad skalärprodukt eller en spektral slutinvers, och raden säger det. - Valfria kvadratrotsvägar vid sidan av de oförändrade standardvärdena:
fim::crlb_srif,batch_ls::gauss_newton_srif,orbit_determination::determine_orbit_batch_srif,lunar_combination::formal_covariance_srif,precise_od::fit_srifochcislunar_srif::srif_cross_validation_sqrt, på nyalinalg_sr::weighted_lstsqochcovariance_from_sqrt_information. Var och en stämmer med sin standard där båda är noggranna (en intern kontroll, ingen rad; ingen validering påstås för dem).precise_od::fitdelegerar nu till en gemensam rutin; dess utdata och varje scenarios standardutdata är oförändrade. - Rangbeslut i månens ramkampanj: en kontroll med utökad precision som fastställdes i förväg över 40 dagar bekräftar varje avgörbart stationsblock och varje Helmert-beslut med full rang. A priori-gränsen kan inte styrka de 20 rangdefekta Helmert-dagarna; i exakt aritmetik är deras defekt geometrisk, med tröskeln 1e-9 inom kampanjens naturliga intervall av egenvärdeskvoter. Ingen rad.
- Påståendet för raden om kampanjen med utökad precision begränsas till "inom värstafallsgränsen", och dess kontroll av svagaste riktning med fasta stationer mäter nu en verklig vinkel (6.6e-16 rad; jämföraren ändrades från acos till en korda, tröskeln gjorde det inte).
- Revisioner: inga. Ingen golden-fil och ingen publicerad figur ändras; raden "Datum för månens ram från en observationskampanj" är oförändrad och förblir MODELLED (grundarbeslut 2026-10-02, alternativ A).
D4, JPL:s kärna av efemeridkärnor, fas 1 (fyra nya VALIDATED-rader: 228 -> 232 rader, 112 -> 116 validerade).
- NAIF-kärnläsaren har en egen rad.
naif_kernel(DAF-behållare, SPK typ 2, binär PCK typ 2) stämmer med SPICE Toolkit (CSPICE N0067 till och med spiceypy 8.2.0) och med ANISE 0.10.6 för alla 600 DE440-tillstånd och 200 rotationer av månens orientering i ett slumpmässigt rutnät som dragits ur förhandsregistreringens egen incheckningshash (abcd9133), inom trösklar som härletts i förväg ur Chebyshev-evaluering med dubbel precision (sämsta 0,6 % av tröskeln, 1.95e-3 m). Raden hävdar att motorn läser JPL-kärnor korrekt, inte att DE440 eller den analytiska serien är noggrann (tests/naif_reader_spice_oracle.rs). ephem_provider::KernelEphemeris: DE440 (eller valfri SPK av typ 2) positioner genom motorns egen läsare, med tvådelade TDB-epoker och kärnans SHA-256 sparad för rapporter; den ersätter aldrig en planet med ett systemets masscentrum.LunisolarSourcelåter en geometrisökväg välja den analytiska serien (standard) eller en kärna.- Frivillig kärn-måne för
lunar-llr-datumochlunar-vlbi-fim: en nyckelplanetary_kernel_pathläser månens geocentriska centrum ur kärnan; inget annat ändras, och rapporten får ett blockmoon_ephemerissom anger kärnan och dess SHA-256. Utan nyckeln är båda rapporterna byte för byte identiska med tidigare. - Kovarians för en punkt på månytan på kärnsökvägen (ny VALIDATED-rad): med alla stationer fasta och fyrens position på DE440-månen stämmer fyrens kovarians med en SPICE-ljustidsjakobian (sämsta 1.7e-3 mot en tröskel på 1 %) och en NumPy-invers (4e-14 mot 1e-9), förhandsregistrerad 4a51256 (
tests/lunar_vlbi_surface_point_spice_oracle.rs). Raden för den analytiska sökvägen förblir MODELLED: på den analytiska månen ligger fyrens minsta sigma 3,9 % under den oberoende referensen. - Månens referenssystemsdatum från en verklig kampanj, kärn-månens centrum (ny VALIDATED-rad): på 447 osedda normalpunkter från 2019-Q2, förhandsregistrerade 830d945a innan någon av dem hämtats, stämmer datumkovariansen på kärnsökvägen med den oförändrade SPICE- och NumPy-referensen inom 7.6e-5 mot trösklar på 1 % och 2 % (
tests/validate_llr_datum_kernel_moon_fresh.rs). Grundaren beslutade att den här raden endast befordras på nya punkter; diagnostiken på redan sedda data (c51f8b2) är ett fynd, inte belägg. Tröskeln skiljer inte mellan månmodeller: den analytiska månen klarar också samma urval (sämsta 3.8e-3), den planerade mutationen (kärn-månen en timme för sen) upptäcktes inte, och vid vikningen klarade även ett månens centrum som var cirka 4 650 km fel (månen tagen kring jord-måne-masscentrum) tröskeln. Raden hävdar kovariansen på den sökvägen, inte månens centrum, och säger så. - Solens, månens, Merkurius och Venus positioner från DE440 vid UTC-epoker (ny VALIDATED-rad):
KernelEphemeris::relative_position_utcstämmer med Skyfield 1,54 för 600 positioner mellan 1973 och 2026, sämsta 2,96 m, inom en förhandsregistrerad tröskel (0bfafe6d) som sätts av tvåtermsserien TDB − TT (tests/kernel_ephemeris_skyfield_oracle.rs). Planetpositioner får nu den nya kärnraden; Standish-raden och raden för planeternas månar är oförändrade, och månarna väntar på ett scenario som behöver dem (grundarens beslut). - Fynd: det enda missen i jämförelsen av LLR-datum (z-translationens sigma 1,025 % mot 1 %) sjunker till 0,049 % när bara månens centrum läses ur DE440, på redan sedda data (
tests/validate_llr_datum_kernel_moon.rs); på det nya urvalet från 2019 klarar även den analytiska månen tröskeln, så missen från 2015 var marginell för det kvartalets geometri. De analytiska raderna "Lunar frame datum from a REAL observing campaign" och "Lunar-surface-point coordinate covariance … kept distinct from the Earth-station one" förblir MODELLED; deras texter om oberoende referens pekar nu på kärnsökvägens rader. lunar_ephemerissäger inte längre att motorn saknar en läsare för binära kärnor; den pekar på läsarraden och förklarar varför rymdfarkostkärnor (typerna 13 och 21) fortfarande kommer via Horizons.- Ändringar: inga. Ingen golden-fil, publicerad siffra eller befintligt testvärde ändras; de analytiska rapporterna
lunar-llr-datum,lunar-vlbi-fimochlunar-vlbi-fimmed alla stationer fasta är byte för byte identiska med tidigare (prefix för resultatets SHA-256 9927aac2, cf1d2671, 25c357e4).
D9, uppmätt klockbibliotek "Clock Atlas" (tre nya rader, en VALIDATED: 232 -> 235 rader, 116 -> 117 validerade).
- Uppmätt klockbibliotek (
clock_library). Enhetskort (vit fas, vit, flicker- och slumpvandringsfrekvensmodulation, en linjär frekvensdrift och, som tillval, fasterm med en till fyra perioder per varv) anpassade till en namngiven uppmätt klockregistrering och bedömda på undanhållna data; luckmedvetna Allan- och Hadamard-varianser; en konditioneringsdetektor som loggar varje lucka, fasutstickare, fassteg, skur och frekvenssteg och inte vet något om fil- eller dygnsgränser; omvandling av ett kort till brusmodellen för slottidtagning, den utökade Kalman-klockmodellen och brusnivåerna för spoofing-övervakaren. Läsare för RINEX- och IGS-klockfiler, BIPM:s laboratoriefiler och Circular T avsnitt 1 (realdata::clk); en poolad, hierarkisk åldringsgräns för UTC(k) (utck_bound, ännu inte bedömd). - Identifiering av brus med lag-1-autokorrelation (
allan::lag1_noise_id, Riley och Greenhall 2004), ny VALIDATED-rad (Library): stämmer med allantools 2024,6autocorr_noise_idpå 140 fall, heltalen identiska, sämsta skillnad 9.6e-13 mot en tröskel på 1e-9 (förhandsregistrerad 2ec76864;tests/clock_library_lag1_noise_id_allantools.rs). - Uppmätta enhetskort med förutsägelse på undanhållna data, ny MODELLED-rad (ett fynd): anpassa på en tredjedel, förutsäg Allan-deviationen för de andra två tredjedelarna inom en faktor 1,5 (förhandsregistrerad 2ec76864). GPS Block IIF på ett nytt IGS-fönster (2026-03-01 till 14): 10 av 11; G27 är optimistisk på tvåtimmarsskalan (sämsta faktor 1,510). Cesium (inom, 1,070), OCXO (utanför, 2,348) och strontium (inom) redovisas, inte blint. Mottagarkortet för JammerTest samt korten för Galileo-masern och Deep Space Atomic Clock är blockerade. En modellklass för ZED-F9P-mottagarens TCXO på 12 statiska stationer i Wroclaw (Zenodo 6488497) misslyckas: 1 av 11 blinda stationer i en redovisad rättad omkörning (
tests/clock_library_device_cards_oracle.rs,tests/clock_library_f9p_cards_oracle.rs). - GPS Block IIF-kort med termer per varv, ny MODELLED-rad (ett fynd): på ett andra nytt fönster (2026-04-01 till 14) klarar 9 av 11 tröskeln; G03 (1,947) och G25 (1,581) är optimistiska eftersom deras undanhållna registreringar är brusigare än anpassningstredjedelarna; om de periodiska termerna tas bort misslyckas alla 11 (förhandsregistrerad fb475550;
tests/clock_library_periodic_cards_oracle.rs). - M002, tillståndsskattning av klockan ombord, runda 3 (ett fynd, förblir MODELLED): efter den frysta konditioneringsdetektorn uppfyller det utökade filtret från runda 2, med oförändrad inställning och oförändrade kriterier, (a) och (c) för alla 11 satelliter för första gången; (b) misslyckas för G09 (0,894) och G26 (0,876) (förhandsregistrerad fb475550;
tests/clock_state_ext_igs_conditioned_oracle.rs). - M010, upptäckt av spoofing, rundorna 3 till 4b (förblir MODELLED): runda 3 blockerades (167 träningsepoker från JammerTest-enhetens övriga sessioner mot 3600); med ett modellklasskort för ZED-F9P (rundorna 4 och 4b) ger klockövervakaren noll falsklarm före start vid alla 10 loggade starter (runda 2: 86) och 6 av 10 starter upptäcks inom 10 s (runda 2: 4); samma fyra förblir sena (
tests/clock_library_tcxo_card_jammertest_oracle.rs). - M083, överbound för UTC(k), runda 3: förhandsregistrerad prospektivt (fb475550) på Circular T-utgåvor från 465, ännu inte körd (
tests/utck_bound_prospective_oracle.rs). - Miljö för oberoende referens: Wroclaw ZED-F9P-registreringen är datastyrd under
$KSHANA_ORACLES/data/wroclaw_f9p(CC BY 4,0, cirka 1,5 GB); IGS-klockfixturerna medföljer (IGS-produkter, med erkännande av källan). - Ändringar: inga. Ingen golden-fil, publicerad siffra eller befintligt testvärde ändras; M001 (återförankring av holdover) åtgärdas inte eftersom ingen klockklass befordrades.
D8, en validerad sökväg för propagering, referenssystem och tid (tre nya VALIDATED-rader och M131 befordrad: 235 -> 238 rader, validerade 117 -> 121).
De jordbaneslag som tidigare hade egna modeller för tvåkroppsproblem, sekulär J2 eller enbart sideral tid delar nu en sökväg: SGP4/SDP4-elementuppsättningar med tvådelade juliska datum, förda till GCRS och ITRS (International Terrestrial Reference System) genom IAU-kedjan (International Astronomical Union) 2006/2000A, med valfria parametrar för jordens orientering.
- Ny
sgp4::MeanElementSet,sgp4::SgpOrbit,sgp4::Eop,sgp4::teme_to_itrs_matrix[_eop]ochsgp4::gcrs_to_itrs_matrix[_eop];Sgp4::new_atochSgp4::propagate_attar tvådelade epoker. Nyjd2::Jd2::from_utc_calendar(SOFA-konventionendtf2dför skottsekunddagar),jd2::utc_to_tai,tai_to_utc,utc_to_ut1(via TAI, som SOFAutcut1),tai_to_ttoch en tvådeladjd2::earth_rotation_angle. - Polarläget i
leo-pvtpropagerar med SGP4 vid 2026-01-01T00:00:00 UTC på IAU-kedjan (leo_fusion::polar::latitude_sweep_attar valfri epok); SGP4-Walker-generatorn roterar till det jordfasta systemet genom IAU-kedjan. - Slaget
passeskör en ny prediktor för skenbara överflygningar (passes::predict_passes_apparent,apparent_look_angles): SGP4 på IAU-kedjan, refraktion enligt ITU-R P.834-9 och nedlänkens ljustid (nya brytarerefractionochlight_time, påslagna som standard), parametrar för jordens orientering (ut1_minus_utc_s,xp_arcsec,yp_arcsec, standard 0), passeringar lösta till 1e-7 s och kulminationen med gyllene-snittet-sökning. Den geometriskapasses::predict_passesär oförändrad. tests/no_private_models.rshindrar paketets geometri-, tids- och propageringskärnor från att bära en privat keplersk propagering, sekulära J2-takter eller en rotation som bara bygger på sideral tid; namngivna snabba nivåer och fysik som är en rads ämne är motiverade undantag.- Ny VALIDATED-rad "Two-part Julian dates and leap seconds on the Earth-orbit time path": pyerfa 2.0.1.5
dtf2d/utctai/taiutcpå 224 tidpunkter kring alla 27 skottsekunder inom 1e-6 s (förhandsregistrerad e947e69d); sämsta 1.9e-11 s. - Ny VALIDATED-rad "One Earth-orbit path": TEME-positioner för 232 elementuppsättningar mot python-sgp4 2,24 (Vallados referens-SGP4) inom 6.1e-8 m (tröskel 1 cm), samt rotationerna GCRS -> ITRS och TEME -> ITRS mot ERFA
c2t06a,pnm06aochee06ainom 2.9e-6 mas och 0,41 mas (trösklar 0,1 och 2 mas), med parametrar för jordens orientering (förhandsregistrerad 72ea9eb0). Redovisat: den första körningen misslyckades vid 2016-12-31T23:59:59,5 med en sekunds rotation; UT1 hade tagits från UTC:s kvasijuliska datum på en skottsekunddag, motorn går nu via TAI, och den andra körningen stämmer vid oförändrade trösklar. - M131 "LEO coverage and dilution of precision for polar and Arctic users against MEO GNSS" blir VALIDATED: Orekit 13.1.8 tar motorns GCRS-tillstånd, roterar dem och beräknar sikt och DOP (NumPy för grupper med flera klockor); positioner inom 6.8e-5 m (tröskel 0,2 m), antal satelliter i sikte identiska för 4040/4040 prover, median-DOP inom 2.3e-11 relativt.
- Ny VALIDATED-rad "Apparent ground-station pass prediction with refraction and light time": Orekit 13.1.8 propagerar samma elementuppsättningar i ett TEME som det bygger enligt den angivna definitionen, med refraktion enligt ITU-R P.834 och dess mätmodell för ljustid, över 60 fall vid stationer på havsnivå: 1210 passager, passeringstider inom 3.4e-6 s (tröskel 5 ms), maximal elevation inom 5.5e-7 grader, skenbar riktning inom 8.8e-7 grader (tröskel 1e-4 grader).
- Fynd, hålls fastlåsta: de första jämförelserna av hela påståendet mot Orekit från början till slut missade sina trösklar för position och riktning, inte på grund av motorn utan för att Orekit 13.1.8:s SDP4 avviker från referens-SGP4 för cirkulära (e = 0) djuprymdsbanor (upp till 67 m) och dess standard-TEME bygger på IERS 1996-nutationen (IAU 1980), cirka 72 millibågsekunder från IAU-kedjan 2006/2000A (2,7 m i LEO). Orekits ITU-R P.834-koefficient för h*theta0^2 är 0,011380 där rekommendationen anger 0,01380; jämförelsen sker vid havsnivå, där termen försvinner, och skillnaden ovanför är fastlåst.
- "Ground-station pass prediction (ground segment)" förblir VALIDATED med sitt påstående avgränsat till den geometriska
passes::predict_passes; slagetpasseshör till den nya raden. - Miljö för oberoende referens: Orekit 13.1.8 med Hipparchus 4.0.3, pyerfa 2.0.1.5, python-sgp4 2,24 (
xval/d8-orekit13/setup.sh). - Ändringar: medföljande
scenarios/passes.tomltotal åtkomsttid 1675 s -> 1659 s (fem passager som tidigare; bästa maximala elevation 73,25 grader -> 70,08 grader), och varje utdata frånpassesflyttas med den nya sökvägen (den utskrivna raden idocs/examples/multi-tool-pipeline.mdoch postenpassesidocs/CAPABILITY.mdsäger nu det); medföljandepolar-arctic-leo-coverageGNSS-VDOP vid ekvatorn 1,19669 -> 1,19710, vid 89,9 grader 1,50645 -> 1,50590, fusionerad VDOP vid 89,9 grader 1,14388 -> 1,14250 (de publicerade siffrorna med två decimaler 1,20, 1,51 och 1,14 är oförändrade). Ingen golden-fil ändras. - Ännu inte dirigerat:
leo_pass, lägena för doppler, gemensam lösning och tidssynkronisering ileo-pvtsamt referensbanan ileo_navmsg(deras modeller finns ileo_link::geometryochleo_fusion::geom), och jordutformningar iconstellation-design(en namngiven snabb tvåkroppsnivå).
D6, LunaNet AFS-referensgenerator, LSIS V1.0 (fyra nya rader, två VALIDATED: 238 -> 242 rader, validerade 121 -> 123).
- LunaNet Augmented Forward Signal (AFS)-referensgenerator (
lunar_afs), fastlåst till LunaNet Signal-In-Space Recommended Standard (LSIS) V1.0 från 29 januari 2025 och med den versionen angiven i varje utdata: bärvågen 2492,028 MHz; AFS-I BPSK(1)-datakanalen med 500 symboler per sekund och dess Gold-kod på 2046 chip; AFS-Q BPSK(5)-pilotkanalen med primärkod av Weil-typ på 10230 chip, sekundärkod på 4 chip och tertiärkod på 1500 chip; ramidentifierare 0-ramen (synkroniseringsmönster, BCH (51, 8) delram 1, CRC-24, LDPC-delramar med kodhastighet en halv 2 till 4, blockinterleaver 60 gånger 98) med en uttömmande avkodare för delram 1 och en min-sum-LDPC-avkodare skriven enbart utifrån paritetskontrollmatrisen; samt basbands-IQ-syntes med sanningsetiketter skriven som en SigMF-inspelning. Koderna genereras ur standardens skiftregister och Legendre/Weil-konstruktioner. Inget som kopierats ur standarden vidaredistribueras (den har inga villkor för återanvändning): AFS-Q:s primärindex kommer från IS-GPS-800J, och det som bara standardens bilagor definierar (AFS-I G2-fördröjningar, tertiärkoder, LDPC-delmatriser) läses vid körning från ett lokalt cacheminne somxval/lunar-afs/fetch_lsis.shfyller från den NASA-värdade PDF-filen, varje fil kontrollerad mot en fastlåst SHA-256 (lunar_afs::lsis). Modellen är en formatreferens, inte en kanal-, propagerings- eller länkbudgetmodell. sigmf::meta_to_json_with_extensionsochsigmf::annotation_extension_fields: en inspelning kan bära tilläggsfält med namnrymd som deklarerats icore:extensions.- Ny VALIDATED-rad "LunaNet AFS baseband rendering against an independent generator, given its channel state": mot LANS-AFS-SIM (BSD-2-Clause, incheckning 480c6bf3, S-bandsbygge) noll chipavvikelser över koderna för PRN 1 till 210, noll symbolavvikelser över körningens tre ramar och en normaliserad komplex korrelation på 0,999990 över 23,9 s av dess egna sampel (sämsta block på 2 ms 0,999948), inom trösklar som fastställts före jämförelsen (förhandsregistrerad 986ac280). Den driver renderaren med simulatorns eget kanaltillstånd och täcker inte effektfördelningen utifrån bärvåg-till-brustäthet eller SigMF- och 8-bitarsskrivningen.
- Ny VALIDATED-rad "LunaNet AFS frame channel coding, FID 0": de 6000 symbolerna långa ramarna är lika med LANS-AFS-SIM:s symbol för symbol (förhandsregistrerad 986ac280); koden för delram 1 återger det genomarbetade exemplet i LSIS figur 8 och CRC-24 kontrollvärdet i katalogen för CRC-24/LTE-A.
- Båda befordrade raderna är datastyrda av LSIS-cachen: deras test för oberoende referens hoppas över med ett meddelande tills
xval/lunar-afs/fetch_lsis.shhar körts. - Fynd (ny MODELLED-rad), "LunaNet AFS spreading-code generation": av 2 937 232 genererade chip och bitar som jämförts med standardens tabeller och filerna i bilaga 3 skiljer sig en, de "sista 24 chipen" som tabell E-5 anger för tertiär PRN 147, vilken dubblerar cellen för PRN 151 medan standardens egen bilagefil 3 stämmer med generatorn. Kriteriet noll avvikelser missas.
- Fynd (ny MODELLED-rad), "LunaNet AFS closed-loop decodability": tre förhandsregistrerade körningar mot PocketSDR-AFS; den tredje uppfyllde sina trösklar för spårning och avkodning fullt ut men inte sitt skydd om att ett mottagarbygge som bara skriver ut återger det fastlåsta byggets logg, eftersom två körningar av den oförändrade mottagaren redan skiljer sig åt i sina inhämtningsregistreringar.
- Rättat: standardbärvågen för
lunar_service(export_antenna.carrier_hz),lunar_jammingochattack_surfacevar avrundade 2,4 GHz; den är nu LSIS-020 AFS-bärvågen, 2492,028 MHz. Vid den gamla standarden var fritt-rymd-förlusten underskattad med 0,327 dB. - Ändringar: inga. Varje medföljande scenario anger sin bärvåg, och resultaten för alla 138 scenariofiler är byte för byte identiska med föregående main.
D7, verklig lunar IQ och GPS LNAV (sju nya rader, ingen VALIDATED: 242 -> 249 rader, validerade 123 oförändrat).
portable_math::FftPlan: en blandad-radix snabb Fouriertransform (FFT) vars utdata är samma bitar på varje plattform; en SHA-256-fastlåsning av transformerna med 8000 och 24000 punkter klarar sig på x86_64 och på wasm32-wasip1 (körare ixval/portable-fft-wasm/).acquisition: parallell kodfassökning på samplad IQ (pcps_acquire,pcps_grid) med koherent vikning, icke-koherent ackumulering, ett chi-två-tröskelvärde för en falsklarmssannolikhet över hela sökningen och en cellmedelvärdesstatistik för bandbegränsat brus;refine,prompt_seriesmed kod-Doppler samt M2M4- och rutnätstoppsestimatorerna för bärvåg-till-brustäthet (C/N0).gps_lnav: en kodare för IS-GPS-200:s äldre navigeringsmeddelande (LNAV) för delramarna 1 till 3, med paritet enligt tabell 20-XIV och en fältavkodare.realdata::ion_sdr: en läsare för ION GNSS SDR Metadata Standard (.sdrx) och dess samplefiler, medto_mid_riseför nivåer i tvåkomplement.realdata::lugre: LuGRE-filerna (Lunar GNSS Receiver Experiment) för IQS-batchhuvud, RAW-, ACQ- och NAV-telemetri samt CLK, och en kontroll som listar var metadata i.sdrxmotsäger det binära huvudet.antenna::GainPattern2Doch, iearth_gnss_lunar, kroppssystemet med girstyrning, sändningsazimut och vinklar från nadir, samttransmit_side_dbför relativ C/N0 med uppmätta mönster.Kodning av GPS LNAV-navigeringsmeddelanden (ny rad, förblir MODELLED efter integratorns efterkontroll): på IGS-sändningsfilen från 2 mars 2025, tolkad och avkodad av RTKLIB v2.4.2-p13, klarar alla 960 ord paritetskontrollen, alla 96 delramar avkodas och alla 608 sända heltal är lika med Kshanas (
tests/gps_lnav_rtklib_integer_oracle.rs), men förhandsregistreringen (d4d9eb9d) nådde den publika grenen två sekunder efter incheckningen med resultatet, så ordningen "registrerad innan filen hämtades" kan inte visas och raden befordras inte.realdata::ion_sdrfyller ord från den mest signifikanta biten (I i den höga halvbyten i en LuGRE-byte; den tidigare läsningen gav den konjugerade signalen), behåller den gamla läsningen somSdrLayout::fill_lsb_firstoch läser sampel som är bredare än ett ord.acquisition::refine_doppler_coherent: faskoherent Doppler-förfining (0,2 Hz RMS vid 30 dB-Hz över 200 ms i simulering).GPS L1 C/A mot gps-sdr-sim: chip och paritetsbit bitexakta; 230 av 1152 LNAV-fält skiljer sig med en enhet eftersom gps-sdr-sim trunkerar där det sända heltalet kräver avrundning.
LNAV avkodat av RTKLIB: all paritet och alla delramar klarar sig och varje parameter ligger inom ett halvt kvantum; 41 skalade värden skiljer sig med några enheter i sista siffran genom RTKLIB:s decimala konstant 2^-43, över den registrerade tröskeln.
LuGRE-inhämtning mot GNSS-SDR 0.0.19: 266 av 266 beslut stämmer, 250 placerade i samma cell; de flesta positiva är artefakter av ett medelvärde på −0,5 i de nakna 4-bitarsnivåerna; C/N0-grenen hade inga samtida flygdata. Två batchar (OP5, OP12) uteslöts av misstag: deras metadata stämmer med deras huvuden, men läsaren kunde då inte läsa ett sampel som var bredare än ett ord.
LuGRE-inhämtning mot banprognosticerad Doppler: med beslut utifrån samplets effekt korsar varje sökning på bandbegränsat brus; med beslut utifrån cellmedelvärde stämmer de starkaste paren i storlek med omvänt tecken, vilket visar att den registrerade I/Q-ordningen är konjugatet av data.
Blind inhämtning på batcharna från månytan: fyra batchar inhämtar var sin satellit (förutsedd synlig, inget falsklarm vid 1e-7), ingen två, så tröskeln för Doppler-differens har inget par att bedöma.
Relativ C/N0 på månavstånd (M039 omformulerad): 15 Block IIR/IIR-M-registreringar och ett par, för få för den registrerade tröskeln.
Ändringar: inga; ingen publicerad siffra, golden-fil eller dokumentationssiffra ändrades.
M039-raden "Earth-GNSS at lunar distance" omformulerar sitt påstående på månavstånd som den relativa C/N0 mellan satelliter vid en epok plus sikt (absolut C/N0 hävdas inte); den förblir MODELLED. Den övergripande NOTICE innehåller LuGRE:s erkännande enligt CC BY 4,0.
Rättat#
- Orientering av månens huvudaxlar från DE440 interpoleras nu längs geodeten mellan dagliga noder. Den tidigare elementvisa interpoleringen hade ett fel på upp till 2.0e-4 rad (340 m på månytan) nära kvartspunkterna för varje dygn, inte de "cirka 14 m" som raden angav. Dess användare (geometri för lunar laseravståndsmätning, lunar datum, observerbarhet av lunara fel) får den rättade orienteringen.
- Motorrättningar i runda 2, var och en omkörd mot sin oförändrade förhandsregistrerade tolerans: IERS-årgången för en EOP-rad läses ur dess I/P-flaggor i stället för ur ett tomt Bulletin B-block;
snapshot_raimanvänder geodetisk lokal nivå; den lunara kopplingen i takt- och referenssystemet använder ekvatorialradien, J2 och rotation; liu22-anpassningen startar vid noll korrektioner utan förkunskap och använder artikelns medelrörelsetakt; EO-nodavståndet bär J2-nodregressionen; Costas-cykelglidningstiden använder rho/4; den gemensamma lösningen tillämpar parets sända gruppfördröjning; den lunara gemensamma lösningen använder ett QR-steg; NTN-gränsen utvärderas vid den sanna positionen; klockreferensen i konstellationsutformningen är den lägsta konstellationen i sikte; DE440-orienteringsserien spänner över 2014-2030 och ger fel utanför den i stället för att klippa.
Tillagt#
leo_navmsg::truth::TruthOrbit::from_ecef_states, en referensbana byggd av tabellerade jordfasta tillstånd, som används av jämförelsen med anpassning av verkliga banor.- Testfilerna och fixturerna för jämförelserna ovan, var och en med sin generator och en
NOTICE.mdsom anger källa, licens, hämtningsdatum och SHA-256. - Runda 2:
araim_reference::add_v42_protection_levelsoch_ecef(ADD v4.2-feldetektering, efter Stanford MAAST för ARAIM 2, BSD-3-meddelande i källkoden);raim::snapshot_raim_fde;cw_dynamics::second_order_correctionochpropagate_second_order; INS-felmodellen med nio tillståndinertial::coast::ErrorDynamics; partialer förlunar_vlbi::KernelGeometryoch indata förlunar-vlbipå kärnsökvägen;naif_kernel, en läsare för SPK typ 2 och binära PCK-kärnor;lunar_llr_geometry::llr_bcrs_one_way_mmed ITRF2020-stationer; Jacchia 1971-densitet;solar_system::link_onöver valfri efemeridleverantör;launch::site_rotation_speed_at;eo_payload::j2_nodal_periodochground_track_spacing_equator_j2;batch_ls::gauss_newton_qr;precise_products(läsare för RINEX-klocka, ANTEX och DCB).
[0.29.3] - 2026-10-01#
En korrigeringsversion på 0.29.2. Kshana Studio är ombyggd kring två vyer: en enkel vy som svarar först och förklarar med vanliga ord, och en avancerad vy med hela instrumentpanelen. Två små rättningar på kshana.dev följer med. Motorn ändras inte: varje medföljande scenario ger ett byte för byte identiskt resultat med 0.29.2 förutom versionsstämpeln.
Ändrat#
- Kshana Studio har en enkel vy. Det är den Studio öppnas på.
- Svaret kommer först: ett scenario öppnas på sitt resultat, angivet i en enda vanlig mening. Varje medföljande scenario har sin egen mening, skriven för det scenariot mäter.
- Högst fem inställningar visas, de som ändrar svaret mest. Resten finns under "Advanced settings", ihopfällda tills du öppnar dem.
- "How this is computed" förklarar metoden på några rader, och "For researchers" ger motorns egna siffror, scenariofilen och belägget bakom resultatet.
- Hela instrumentpanelen är den avancerade vyn. Varje panel, diagram, export och rapport från den tidigare Studion finns där.
- En växlare flyttar mellan de två vyerna och behåller din plats. Scenariot, vyn du var i och alla inställningar du redigerat följer med. Studion kommer ihåg vilken vy du använde senast. Länkar från webbplatsen och dokumentationen öppnar den enkla vyn; en länk med
view=advancedöppnar den avancerade vyn, och varje tidigare Studio-länk öppnar fortfarande samma scenario och vy. - En snabbare första vy på långsamma anslutningar. Det inspelade svaret för ett scenario ritas innan resten av Studion har lästs in, så på en långsam mobilanslutning visas svaret efter cirka två sekunder i stället för cirka nio.
- Bättre sökning. En sökning listar nu först scenarier vars område eller titel matchar orden, före scenarier som bara nämner dem i filnamnet eller texten.
Rättat#
- Globen på startsidan blir inte längre tom med minskad rörelse påslagen. Med systeminställningen för minskad rörelse påslagen kunde en ändring av fönsterstorleken lämna hjälteglobet tomt tills sidan rullades. Globen ritas nu om i samma bildruta som storleksändringen.
- L-bandskonsolen på startsidan förklarar sitt tomma band. I "Watch a jammer take the band" förblev panelen GPS L5 / Galileo E5a mörk under hela minuten, vilket såg ut som ett fel. Ingen jammer sänder i det bandet i det här scenariot, och satellitsignalerna ligger under brusgolvet, så ingenting där höjer sig över det. En diskret etikett säger nu det i varje panelavsnitt där inget ligger över golvet (panelen L5 / E5a, och panelen L2C innan dess brusjammer startar), med varje bands C/N0 och låsningstillstånd från samma körning. Den placeras bara där inget ligger över golvet, så den täcker aldrig jammer-energi.
0.29.2 - 2026-10-01#
En korrigeringsversion på 0.29.1. Den tar bort duplicerad kod i modulerna för LEO-navigeringsmeddelande, fusion och spektrum, lägger till ett ljust tema på kshana.dev, flyttar Kshana Studio till en egen adress, gör webbplatsen läsbar för sökmotorer och AI-assistenter, rättar flera småsaker i Studion och låter npm-utgåvor publiceras utan en lagrad token. Inget motorutdata ändras: varje medföljande scenario ger ett byte för byte identiskt resultat med 0.29.1 förutom versionsstämpeln.
Tillagt#
- Ett ljust tema för kshana.dev. Varje sida kan läsas ljus eller mörk. Webbplatsen följer läsarens systeminställning och har en växlare för att ändra den.
- Sökmotorer och AI-assistenter kan läsa webbplatsen. Varje sida har nu en egen titel, beskrivning, kanonisk adress, taggar för sociala kort och strukturerad schema.org-data, samt ren text för de avsnitt som ett skript ritar. Webbplatsen publicerar
robots.txt, ensitemap.xmlmed datum för när varje sida senast ändrades,llms.txtochllms-full.txt(en kort och en fullständig guide i ren text för AI-assistenter) samt en IndexNow-nyckel så att en driftsättning kan tala om för sökmotorer vad som ändrats. - npm-utgåvor kan publiceras utan en lagrad token. npm-jobbet kör nu Node 24 och npm 11.5.1 eller senare, som stöder npm trusted publishing: npm byter utgivningsjobbets GitHub-identitet mot en kortlivad behörighet. Hemligheten
NPM_TOKENfungerar fortfarande och används så länge den är satt, så ingenting ändras förrän trusted publishing slås på för paketet på npmjs.com.docs/RELEASING.mdlistar stegen.
Ändrat#
Rubriken på startsidan är läsbar över globen. En mjuk skugga ligger nu bakom rubriken och dess text och tonar ned banlinjerna och satellitprickarna på det animerade globen där de korsar den.
Kshana Studio har en egen adress: https://kshana.dev/studio/. Varje länk på webbplatsen och i dokumentationen pekar dit. Den gamla adressen,
/playground/, fungerar fortfarande och vidarebefordrar till den nya med scenariot, vyn och övriga inställningar i länken bevarade.Rättningar i Studion. Motorfilen hämtas en gång i stället för två. Medan den hämtas visar Studion scenariots inspelade resultat direkt, märkt som inspelat, i stället för en tom skärm. På en telefon är sidhuvudet en kompakt rad. Nyckeltalen bryts två per rad, så inget döljs utanför skärmkanten. Fältetiketter använder scenariots egna ord, med fältnamnet bredvid, och sökningen hittar fält med båda.
Mindre duplicerad kod. Enhetstabellen för LEO-navigeringsmeddelandet skrev samma tio SISRE-statistikrader för fyra anpassningssammanfattningar. Ett makro skriver dem nu en gång. De två spektrumvattenfallsdiagrammen delar en tidsaxel, en färgskala och en panel för C/N0-staplar. Huvudrutnätets nedsampling återanvänder
downsample_grid, och Simpson-integralen återanvändernavsignal::simpson. LEO-passagens två ingångspunkter delar ett uppsättningssteg.leo_link::geometryimporterar vektorhjälparna ileo_fusion::geomi stället för att kopiera dem. Den avancerade rapporten importerar API-rapportens HTML-escape i stället för att kopiera den. Var och en av de 139 scenariofilerna iscenarios/kördes på 0.29.1 och på den här koden, och varje utdatafil är byte för byte identisk.Enhetstabellerna för leo-navmsg och leo-pvt har egna filer. De flyttades ut ur moduler som också innehåller logik, till
src/leo_navmsg/units.rsochsrc/leo_fusion/pvt_units.rs.PVT_UNITSbehåller sin publika sökväg. Bara dessa två tabellfiler ansluter till undantagen från kopieringsdetektering för deklarativa kataloger isonar-project.properties, vilkatests/sonar_cpd_exclusions_are_justified.rskontrollerar.
Rättat#
- README:s CI-märke visar resultatet av push till main. Märket räknade körningar av alla händelser på main, så det kunde visa "failing" medan varje push-körning var grön; det frågar nu bara efter push-körningar (
event=push).
0.29.1 - 2026-10-01#
En korrigeringsversion på 0.29.0: den uppmätta täckningssiffran, projektets namnrad på kshana.dev, ett snabbare täckningsjobb och en uppfräschad README. Inget motorutdata ändras: varje scenario ger samma resultat som på 0.29.0.
Ändringar av publicerade siffror#
- Radtäckning: ~96 % → ~95 %. Täckningsjobbet mätte om den utgivna koden för 0.29.0 (incheckning
db796dd, CI-körning 36809850252, 2026-10-01): 95.35 %, 55 970 av 58 697 rader isrc/. Den publicerade siffran var 95,63 % (37 697 av 39 419 rader), uppmätt påb1d350dföre 0.28.0; den avrundades till ~96 %. Den nya siffran avrundas till ~95 %, så varje yta somtests/coverage_figure_doc_sync.rsfastlåser flyttas tillsammans:docs/COVERAGE.md, README-märket, Evidence-raden och CI-tabellen, märkena för crates.io, PyPI och npm, den tekniska rapporten och täckningssidan på kshana.dev. Golvet på 85 % är oförändrat.
Tillagt#
- Namnraden på kshana.dev. "Kshana · क्षण · the precise instant" öppnar nu startsidans hjälteavsnitt och ligger under varumärket i varje sidas sidfot. kshana.dev gör fortfarande ingen begäran till någon annan värd: devanagari är en egenhostad Noto Sans Devanagari-delmängd med de tre bokstäverna i क्षण (1 692 bytes,
web/fonts/, med dess SIL Open Font License-text och dess SHA-256 iweb/fonts/FONTS.json).web/tools/fetch_third_party.pylärde sig att spara en Google Fonts-delmängdtext=under ett innehållsadresserat filnamn.
Ändrat#
- Webbplatsens länkar landar där de pekar, på rena adresser. En länk till ett avsnitt lägger nu avsnittet strax under sidhuvudet, på telefon och på dator: en länk till en Missions-sektor öppnar den sektorn med sin panel överst; länkar till Capabilities och Editions håller sin plats medan diagrammen ovanför ritas; Editions lägger inte längre till en andra förskjutning för sidhuvudet; och en länk in i en ihopfälld del av en dokumentationssida öppnar den. Varje sida länkas med sin rena adress (
/evidence#research,/docs/changelog,/för startsidan), och de kanoniska länkarna, webbplatskartan och omdirigeringarna från gamla adresser anger samma; adresserna.htmlfungerar fortfarande. Research har en egen länk i sidhuvudet, mellan Evidence och Developers, och i sidfoten. Dokumentationen visar inte längre färdplanen (ROADMAP.mdfinns kvar i förvaret): gruppen Project är Changelog, Licensing, Security, Contributing, Governance och Code of conduct, och Glossary flyttades till Get started. - Täckningsjobbet är snabbare. På 0.29.0 tog det 143 minuter mot friska 91 till
- Fuzzern
tests/property.rs, orsaken förra gången, tog 4 av dem. Det medföljande korpuset växte från 74 till 139 scenarier, och tre testbinärer gick igenom allt en fil i taget (determinismtvå gånger,advanced_reportochanimationen gång): 37 minuter tillsammans under täckningsinstrumentering, mot 3 på 0.27.2. De delar nutests/support/corpus.rs, som kör arbetet per scenario på varje kärna och lämnar tillbaka resultaten i sorterad ordning; varje scenario och varje assertion finns kvar. På en arm64-bärbar, debugbygge:determinismtar 143 s på 14 kärnor mot 612 s medKSHANA_CORPUS_THREADS=1(den gamla seriella genomgången).
- Fuzzern
- README, uppfräschad. Den öppnar med samma namnrad som webbplatsen; Studio-skärmbilderna är tagna på nytt från Studion i 0.29.1, med en ny av Studion på en telefon och dess stegfält längst ned; en ny remsa "The site" visar tre sidor av kshana.dev från bygget 0.29.1 (
tools/capture_site_shots.mjs, sammansatt avtools/readme_shots.pyoch registrerad idocs/assets/readme/site/SHOTS.json); täckningssiffran är ~95 %; och alt-texten till forskningsfiguren, som upprepade arkitekturfigurens, beskriver nu artiklarna. Märkena i sidhuvudet är mindre och kortare (18 px höga; "~95%", "83/223", "quality", "AGPL-3.0", "zenodo.20528627"), så att alla elva ryms på två rader; varje länk och alt-text behåller sin fulla betydelse. - Containerbildsjobbet får 90 minuter. Vid v0.29.0 nådde bilden
kshana-mcpmed emulerat linux/arm64-bygge den gamla gränsen på 45 minuter när den kompilerade sin sista crate, så bilden, posten i MCP-registret och kanalkontrollen publicerades inte. Gränsen är nu 90 minuter; bilden är oförändrad. - Åtta flyttalsliteraler omgrupperade i
src/ephem.rsochsrc/sgp4.rs(0.323_273_64→0.323_273_640): SonarQube Cloud tolkade en sista grupp_64eller_32som ett saknat suffixf64ellerf32(regel S7454). Värdena är samma tal, så varje resultat är oförändrat.
0.29.0 - 2026-10-01#
Tolv nya scenarioslag och tre nya sätt att läsa en körning. Motorn täcker nu radiospektrumet, hela solsystemet, konstellationer kring vilken kropp som helst, kampanjer som kopplar ihop scenarier till ett enda uppdrag, samt positionering, navigering och tidssynkronisering (PNT) från låg jordbana (LEO) från signalen till positionsbestämningen. Varje körning kan också skrivas som en animation, en fullständig rapport och en uppsättning interoperabilitetsfiler för andra verktyg.
Kring motorn: en omgjord kshana.dev (en webbplats med flera sidor och en ny instrumentpanel, Kshana Studio, som kör varje förmåga i webbläsaren), en omskriven README, fjorton verktyg i Model Context Protocol-servern (MCP), ett webbläsarbygge som ger samma siffror som det inbyggda och en publik sida för Kshana Pro.
| 0.28.0 | 0.29.0 | |
|---|---|---|
| Scenariotyper | 63 | 75 |
| Scenariofiler (plus ett svitmanifest) | 77 | 138, varav 132 medföljer för kshana example |
| Rader i verifieringsmatrisen | 174 | 223 |
| varav VALIDATED mot en extern oberoende referens | 66 | 83 |
| varav MODELLED (angiven modell, kontrollerad för intern konsistens) | 104 | 136 |
| varav PARTNER (kräver en partners maskinvara eller data) | 4 | 4 |
Varifrån tillväxten kommer:
| Område | Slag | Scenariofiler | Matrisrader (validerade + modellerade) |
|---|---|---|---|
| Spektrum | 1 | 1 | 3 (1 + 2) |
| Solsystemet och positionering kring vilken kropp som helst | 2 | 3 | 6 (2 + 4) |
| Konstellationsutformning | 1 | 3 | 3 (2 + 1) |
| Kampanjer | 1 | 5 | 3 (0 + 3) |
| Scenarier för sjö, väg och järnväg | 0 | 5 | 0 |
| Animation, rapporter, interoperabilitetsexporter | 0 | 0 | 0 |
| LEO-signalutformningar och multibandsspektrumet | 1 | 4 | 4 (2 + 2) |
| LEO-passage och länkbudget | 1 | 6 | 9 (6 + 3) |
| LEO-navigeringsmeddelande | 1 | 5 | 9 (3 + 6) |
| LEO-positionering, tidssynkronisering och fusion | 3 | 8 | 8 (1 + 7) |
| LEO-kedja från början till slut | 1 | 3 | 1 (0 + 1) |
| LEO-motståndskraft, fokusområden och slutanvändarscenarier | 0 | 18 | 3 (0 + 3) |
| Totalt tillagt | 12 | 61 | 49 (17 + 32) |
LEO-förmågan är systemoberoende: den körs på generiska, angivna parametrar och behöver inget namngivet system. Namngivna system är valfria förinställningar, var och en i sin egen fil med sin publika källa. En förinställning, Celeste IOD (demonstration i omloppsbana), använder siffror som presenterades vid ESA NAVISP LEO-PNT-workshopen, 2026 (ESA är European Space Agency; NAVISP är dess Navigation Innovation and Support Programme); den finns i en enda fil, src/celeste_iod.rs, med sina fem scenarier som bara finns i förvaret, så den kan hållas tillbaka utan en källkodsändring, och ingen av dess workshopsiffror upprepas i den här ändringsloggen.
Läs "Revisions to published numbers" innan du uppgraderar. Ett motorutdata ändras (inertialsystemskolumnerna för slaget ephemeris, efter en teckenrättning i nutationsmatrisen), och dokumentationsgranskningen rättade siffror som tidigare dokument hade skrivit ut.
Förkortningar som används i den här posten
Status: VALIDATED betyder kontrollerad mot en oberoende extern referens (en publicerad tabell, en annan grupps programvara eller uppmätta data); MODELLED betyder en angiven modell som bara kontrollerats för intern konsistens; PARTNER betyder att kontrollen kräver en partners maskinvara eller data.
| Förkortning | Betydelse |
|---|---|
| 3GPP, 5G, NTN | 3rd Generation Partnership Project; femte generationens mobilnät; icke-terrestriskt nät |
| AD, BC | tideräkningar (anno Domini, före Kristus) |
| AIAA | American Institute of Aeronautics and Astronautics |
| AltBOC, BOC, BPSK, MBOC | alternativ binär offsetbärvåg; binär offsetbärvåg; binär fasskiftsmodulering; multiplexad binär offsetbärvåg (signalmoduleringar) |
| ATOMIC | Autonomous Time and Orbit Determination for Microsatellite Constellations (en publicerad LEO-efemeridmodell) |
| C/A, L1, L2, L2C, L5 | grov-/inhämtningskoden samt bärvågs- och civilsignalnamnen i Global Positioning System |
| C/N0 | förhållandet mellan bärvåg och brustäthet |
| CIO | Celestial Intermediate Origin |
| CLI | kommandoradsgränssnitt |
| CRC-24Q | cyklisk redundanskontroll på 24 bitar (Qualcomm-polynom) |
| CSAC | chipskalig atomklocka |
| CSS, HTML, SVG, XML | Cascading Style Sheets; HyperText Markup Language; Scalable Vector Graphics; Extensible Markup Language |
| CSV, JSON, PDF, TOML, URL | kommaseparerade värden; JavaScript Object Notation; Portable Document Format; Tom's Obvious Minimal Language; uniform resource locator |
| CW | kontinuerlig våg |
| CZML, KML, GeoJSON | Cesium Language; Keyhole Markup Language; Geographic JSON (format för kartor och glober) |
| DE441 | Development Ephemeris 441 från Jet Propulsion Laboratory |
| DOI | digital objektidentifierare |
| DOP, GDOP, PDOP, HDOP, VDOP | utspädning av precision: geometrisk, position, horisontell, vertikal |
| E1, E5, E5a, E5b | Galileos signalnamn |
| E3F | ett platsnamn i konstellationstabellen för Global Positioning System |
| ECEF | jordcentrerat, jordfast |
| EE | ekvinoktieekvationen |
| EGM2008 | Earth Gravitational Model 2008 |
| EIRP | ekvivalent isotropiskt utstrålad effekt |
| ERFA, SOFA | Essential Routines for Fundamental Astronomy; Standards of Fundamental Astronomy (referensbibliotek för astronomi) |
| ESA, NAVISP | European Space Agency; dess Navigation Innovation and Support Programme |
| FDMA | flerfaldig åtkomst med frekvensdelning |
| GCRF, GCRS | Geocentric Celestial Reference Frame; Geocentric Celestial Reference System |
| GLONASS | Rysslands Global Navigation Satellite System |
| GNSS, GPS | globalt satellitnavigeringssystem; Global Positioning System |
| IAU | International Astronomical Union |
| ICD, OS SIS ICD, OS SDD | gränssnittsspecifikation; Galileo Open Service Signal-In-Space Interface Control Document; Galileo Open Service Service Definition Document |
| ICRF | International Celestial Reference Frame |
| IMO | Internationella sjöfartsorganisationen |
| INS, MEMS | tröghetsnavigeringssystem; mikroelektromekaniskt system |
| IOD | demonstration i omloppsbana |
| IQ | i fas och kvadratur |
| IS-GPS-200 | gränssnittsspecifikationen för Global Positioning System |
| ISS | Internationella rymdstationen |
| ITRF, ITRS, PEF, TEME | International Terrestrial Reference Frame; International Terrestrial Reference System; pseudo-jordfast; sann ekvator, medelekvinox (referenssystem) |
| ITU, ITU-R | Internationella teleunionen; dess radiokommunikationssektor |
| J/S | förhållandet mellan jammer och signal |
| J2 till J6, J2000 | zonala harmoniska i tyngdkraftsfältet; epoken 2000-01-01 12:00 |
| JPL | Jet Propulsion Laboratory |
| LEO, MEO | låg jordbana; medelhög jordbana |
| MBSE | modellbaserad systemteknik |
| NEES | normaliserat skattningsfel i kvadrat |
| NeQuick-G | Galileos jonosfärmodell |
| OEM, SP3, TLE | Orbit Ephemeris Message; Standard Product 3 (precisa banor); tvåradig elementuppsättning |
| PNT, PPP | positionering, navigering och tidssynkronisering; precis punktpositionering |
| PSD, SSC | effekttäthetsspektrum; spektral separationskoefficient |
| RAIM, SQM | autonom integritetsövervakning i mottagaren; signalkvalitetsövervakning |
| RINEX, RTCM | Receiver Independent Exchange Format; Radio Technical Commission for Maritime Services |
| RMS | kvadratiskt medelvärde (rotmedelkvadrat) |
| RTKLIB | ett GNSS-positioneringsbibliotek med öppen källkod, som används här som oberoende referens |
| SGP4 | Simplified General Perturbations 4 (banmodellen för tvåradiga elementuppsättningar) |
| SHA-256 | Secure Hash Algorithm, 256 bitar |
| SigMF | Signal Metadata Format |
| SISRE | avståndsfel för signal i rymden |
| SPS PS | Standard Positioning Service Performance Standard |
| SRTM | Shuttle Radar Topography Mission |
| STK | Systems Tool Kit (dess efemeridfilformat .e) |
| STL | Satellite Time and Location |
| SVID | identifierare för rymdfarkost |
| T/P/F | en Walker-konstellations totala antal satelliter, plan och fasning |
| TEC | totalt elektroninnehåll |
| UHF | ultrahög frekvens |
| UTC | koordinerad universell tid |
| WGS 84 | World Geodetic System 1984 |
| X1, X5 | signalnamn i systemet Xona Pulsar |
Ändringar av publicerade siffror#
En ändrad publicerad siffra är en revision och registreras, aldrig rättad i tysthet. Den här utgåvan innehåller en revision av motorutdata och flera av siffror som skrivs ut i dokumentationen.
Motorutdata
- Reduktionen TEME→GCRS vreds med 2·Δψ: nutationsmatrisen hade fel tecken på Δψ.
nutation::numatbyggdeRx(−(ε̄+Δε))·Rz(Δψ)·Rx(ε̄)där SOFA:siauNumatbyggerRx(−(ε̄+Δε))·Rz(−Δψ)·Rx(ε̄), sånutation_matrix,nutation_matrix_2000a,teme_to_gcrsochgcrs_to_temeroterade med dubbla nutationen i longitud, cirka 25 bågsekunder. Varje kontroll av kedjan var ett egenskapstest (korrekt rotation, rundtur, ett nollskilt nutationsbidrag) som ett teckenfel klarar; Vallado-testet från början till slut täckte TEME→PEF, TEME→ITRF och GCRS→ITRS men inte TEME→GCRS. På Vallado-exemplet (AIAA 2006-6753, 2004-04-06) missade kedjan det publicerade GCRF med 1 145 m; den hamnar nu 0,11 m från det, och matrisen är lika med ERFA:snumatinom 1e-14.tests/frame_reference_vectors.rs::teme_to_gcrs_matches_vallado_gcrfochnutation::tests::nutation_matrix_matches_erfa_numatmisslyckas båda med det gamla tecknet. Konsistenstestet för CIO (Celestial Intermediate Origin) isrc/cio.rshade förklarat den resulterande avvikelsen på ~130 m som "≈ 2·EE"; resten är nu 5 cm och dess gräns är skärpt från 250 m till 1 m. Detta flyttar publicerade siffror, vilket registreras här som en revision: kolumnernagcrs_r_mochgcrs_v_m_sför slagetephemeris(cirka 0,8–1,0 km för det medföljande ISS-scenariot (International Space Station); dess kolumner för TEME, jordfast, markspår, siktvinklar och Doppler ändras inte), ochPropagator::position_in_frame/state_gcrsför referenssystemen GCRS och ITRS. Inget medföljande scenarios sammanfattningsrad, diagram eller golden-hash läser de här kolumnerna. De nya interoperabilitetsexporterna använder den rättade kedjan: den första satelliten iorbit-sgp4-gpshar en CZML-position som stämmer med en ERFA-reduktion av samma TLE (propagerad av Python-paketetsgp4) inom 2,3 cm. - Slaget
leo-navmsg, inbyggt och i webbläsarbygget. Slaget beräknar nu varje transcendent funktion genom ett portabelt matematikbibliotek, så dess ram är samma bytes på varje plattform och i varje bygge (under Fixed). Varje siffra förleo-navmsgflyttas med det, och likaså stegetnavmsgileo-pnt-chain. Slaget är nytt i den här utgåvan, så ingenting från en tidigare utgåva flyttas, men siffror som skrevs ut före rättningen gör det: kontrollvärdet idocs/LEO-NAVMSG.mdför scenariot med kodning och avkodning var0x110315och är0x19105F, och det avkodade meddelandets SISRE är 0,129 cm. På kshana.dev visade Missions-kortet förleo-navmsg-fit-interval-tradeett sämsta avståndsfel på 1,6 mm med en anpassning på 60 s och 40,3 mm med en anpassning på 900 s; webbplatsen byggs nu från den här utgåvans motor och visar 1,8 mm och 46,6 mm. - Kartan över jammingens täckning på kshana.dev (Missions). Var och en av dess 875 celler är en körning av
maritime-strait-jammingdär bara mottagarens position ändrats. Cellerna beräknas nu utifrån samma koordinater med tre decimaler som cellens länk "open this run" ger Kshana Studio, så en cell visar exakt det som dess länk återger. Medelvärdet av jammer-till-signal-förhållandet (J/S) för 30 celler flyttas med 0,1 dB, uppåt eller nedåt; ingen cells spårningstillgänglighet ändras. Motorn ger identiska resultat för varje cell i 0.28.0 och 0.29.0. - Seedad omsampling i WebAssembly-paketet (WASM). Webbläsarbygget drog andra bootstrap- och blandningsindex än det inbyggda bygget från samma frö (under Fixed). Intervallet för
quantum-anomaly-detectav arean under kurvan i webbläsaren var[0.9901265, 0.9938305]och är nu det inbyggda[0.99035875, 0.993861]. Inget inbyggt tal flyttas.
Siffror som skrivs ut i dokumentationen
Dokumentationen granskades ord för ord mot körningar av den här utgåvans motor. Där en utskriven siffra inte stämde med körningen rättades dokumentet, och varje rättning listas här, gammalt → nytt. I varje fall nedan ändrades inte motorns utdata; dokumentet hade läst fel, avrundat fel eller överlevt det.
- Dokumentationsgranskning av sidorna om spektrum, konstellation, kampanj, animation, rapport och interoperabilitet, samt en ny
docs/SOLAR-SYSTEM.md. Varje siffra kördes om med den här motorn. Två publicerade tal flyttas:docs/CONSTELLATION-DESIGN.mdangav täckningstestet med 5 000 satelliter som "cirka 0,13 s i ett debugbygge"; det gick inte att återskapa (1,24 s på en belastad bärbar), så sidan anger nu den andel för förfiltret som testet skriver ut (9,9 % av 19 440 000 parprov) och släppbinärens 0,14 s för den medföljandeleo-pnt-mega-shell. Samma sida angav E3F:s passage som "off by 0,050 deg"; inget test skriver ut den siffran, så sidan anger nu bara tröskeln på 0,06 grader som testet upprätthåller och härledningen 7,30 mot 7,36 grader bakom den. Inget motorutdata ändras. - LEO-PNT-dokument: reviderade publicerade siffror (omkörda på den här utgåvans motor).
docs/LEO-SIGNAL.mdbandavvägning: den förstaordningens jonosfärsfördröjning förgeneric-sär 3,24 m (skrevs ut som 3,25 m) och förgeneric-c-wide0,77 m (var 0,78 m).docs/LEO-NAVMSG.mdkodning och avkodning: det avkodade meddelandets SISRE skrevs ut som 0,119 cm där körningen gav 0,122 cm; sidan skriver nu ut 0,129 cm, siffran efter rättningen för plattformsoberoende under Fixed nedan.docs/LEO-PASS.mdLEO jämfört med GNSS-passage: 32 dB mindre fritt-rymd-förlust vid passagens topp (var "26 till 32 dB"). För signal- och passagesiffrorna ändrades inte motorns utdata; dokumenten hade läst fel eller avrundat fel. - Handledningar, det genomarbetade pipelineexemplet och kommandot
/kshana-run, granskade mot den här utgåvans motor. Revisioner av publicerade siffror, gammalt → nytt: slagen som skriver<scenario>.table.csvär sex, inte fyra (leo-navmsgochtelecom-timingsaknades;docs/tutorials/README.md,commands/kshana-run.md); passagen för det kalla atomernas ½bT² i handledning 3 är 18 443 s, inte 18 440 s; rundtursfelet föroem-interopidocs/examples/multi-tool-pipeline.mdär det uppmätta 4.88e-7 km, inte "~1e-7 km"; CSAC-holdoverbandet i handledning 2 är de 2000–3200 s som testet kräver, inte "~2600–4400 s"; handledning 1 anger SP3-raderna och geometriblocket med den precision som motorn skriver dem. Inget motorutdata ändrades. - Sidorna om validering, kvantteknik, SGP4, animation, påståenden och integritet.
docs/VALIDATION.md: den upprätthållna gränsen för den simulerade Allan-deviationen på en sekund för en klocka med vitt frekvensbrus är 20 % (skrevs ut som 25 %; gränsen på 25 % är den för kurvan vid 1, 10 och 100 s); raden för slumpvandring i hastighet anger nu sin upprätthållna gräns på 20 % bredvid de cirka 12 % som observerats; och det chipskaliga atomurets tillgänglighet iorbit-gnss-challengedär cirka 0,73 (skrevs ut som cirka 0,83).docs/QUANTUM.md: det vibrationsbegränsade bruset per skott i sidans genomarbetade exempel med kalla atomer är cirka 46 gånger dess skottbruksgolv (var "~45×"; 46,49 omräknat), och intervallet "1–50 µg/√Hz" för enheter i fält, som motsade en enhet som sidan själv anför, ersätts av de två anförda enheternas publicerade siffror.docs/SGP4-VALIDATION.md: den sämsta positionsskillnaden är 4,12 mm (var "≈ 4 mm"), med satelliten namngiven.docs/ANIMATION.md: exemplet med videokodare läste ramarna på 24 bilder per sekund som 12; det använder nu 24, den takt som rammanifestet anger.docs/CLAIMS-VS-REALITY.md: störningsmodellen har 10 tester (var 8), och det kopplade filtrets "2,97 m against 48,8 m" ersätts av det som dess test kräver (det kopplade positionsfelet under 0,6 gånger det frikopplade, och vinner i minst 90 av 100 försök).docs/INTEGRITY.md: stämpeln "Today" angav v0.22.0; den anger nu den här utgåvan, och två förmågor som byggts sedan dess (felläget för hela konstellationen och integritetsstödmeddelandet) lämnar sin lucklista.
Tillagt#
Spektrum
- Scenarioslaget
spectrum: en L-bandsspektrummodell och ett vattenfall (src/spectrum.rs,src/sigmf.rs,docs/SPECTRUM.md). Hela GNSS L-bandet som ett enda effekttäthetsspektrum (PSD): GPS L1 grov-/inhämtningskod (C/A) och L2 civil (L2C) (BPSK(1)), Galileo E1 (multiplexad binär offsetbärvåg, MBOC(6,1,1/11), eller BOC(1 1)), GPS L5 och Galileo E5a (BPSK(10)), ett kT-brusgolv med en mottagares brusfaktor, samt jammer av typerna kontinuerlig våg (CW), smalband, chirp och matchat brus på en skriptad tidslinje. Varje jammer bedöms per band med sin spektrala separationskoefficient (SSC), vilket ger jammer-till-signal-förhållandet (J/S) och effektiv bärvåg-till-brustäthet (C/N0) per band och rad. Diagrammet är ett SVG-vattenfall med C/N0-staplar; result.json innehåller rutnätet blockmedelvärdesbildat i effekt. Valfri[iq]ritar modellen som IQ-sampel, skriver och läser en inspelning i Signal Metadata Format (SigMF) (cf32_le,ci16_le) och jämför en Welch-skattning med modellen; valfri[recording]skattar en verklig SigMF-fil. Medföljande exempelscenarios/l-band-waterfall-jamming.toml: en chirp tar L1 C/A och E1 vid 10 s, en CW-ton på L1-bärvågen håller C/A vid 17,98 dB-Hz efter att chirpen upphör medan E1, vars spektrum har ett nollställe där, återhämtar sig; L5 och E5a är orörda.- Ny VALIDATED-rad: signalernas PSD och SSC, mot BPSK(n)-huvudloben på 2n x 1,023 MHz, BOC(1 1)-loberna centrerade vid +/-1.023 MHz, de slutna Parseval-formerna bakom de publicerade SSC-värdena -61.8 / -64.8 / -67.8 dB/Hz och läroboksvärdena Q = 1 (CW) och 1,5 (matchat). Maximum för BOC(1 1)-PSD ligger vid +/-0.759 MHz, inte vid lobens centrum; testet fastlåser båda.
- Två nya MODELLED-rader: vattenfallet och C/N0-tidslinjen, som reduceras exakt till kedjan för slaget
jamming(korskontrollerat i varje rapport), samt SigMF-kodeken och Welch-skattaren. Ingen inspelning från tredje part finns i förvaret. navsignal: en MBOC-variant ochspectral_separation_coeff_offset.- Rapporten skriver ut den C/N0 som slagets
jammingrepresentativa Q-tabell skulle ge bredvid den spektrumhärledda; för en CW-ton på C/A-bärvågen skiljer de sig med 1,8 dB. Tre nya matrisrader: en validerad (signalspektra och spektrala separationskoefficienter) och två modellerade.
Solsystemet
- Efemerid för solsystemet och positionering kring vilken kropp som helst. Två nya scenarioslag.
solar-system: Solen, de åtta planeterna, Pluto, månen, Phobos, Deimos, Io, Europa, Ganymedes, Callisto och Titan vid en epok: heliocentrisk position och hastighet i International Celestial Reference Frame (ICRF), gravitationsparameter, radier, J2 (den andra zonala harmoniska) där den är publicerad, sideral rotation, polen och nollmeridianen enligt International Astronomical Union (IAU), ett banspår över ett varv, samt ljustid, enkel och dubbel avståndsmätning, solens Shapiro-fördröjning och solavstånd från en observatörskropp och för varje extra länk. Planeterna kommer från de keplerska elementen från Jet Propulsion Laboratory (JPL) av Standish och Williams (tabell 1, 1800 e.Kr. till 2050 e.Kr.; tabellerna 2a/2b, 3000 f.Kr. till 3000 e.Kr.); månarna från JPL:s medelelement med IAU:s synkrona rotationstakt, och Titan från IAU:s rotationsmodell. Exempel:scenarios/solar-system-tour.toml.body-pnt: en omloppsfarkost eller en landare på ytan kring någon av dessa kroppar, som navigerar med pseudoavstånd från en Walker-konstellation kring kroppen och en klockfri dubbel avståndsmätning från jorden; utspädning av precision, formell osäkerhet och seedade minstakvadratlösningar med och utan jordlänken. Exempel:scenarios/mars-orbit-pnt.toml,scenarios/europa-surface-pnt.toml.Bodyfår Merkurius, Venus, Jupiter, Saturnus, Uranus, Neptunus, Pluto och de sju månarna, en namnuppslagning och en fysisk post;AnalyticSolarSystemger vilken kropp som helst i förhållande till vilken annan som helst genom den befintliga skarvenEphemerisProvider.- VALIDATED mot JPL Horizons (Development Ephemeris DE441; fixturer och frågor i
tests/fixtures/solar_system/): Merkurius till Saturnus och jorden från tabell 1 inom två gånger det angivna nominella felet (sämsta 1,87 gånger), alla åtta planeter från tabellerna 2a/2b (sämsta 1,71 gånger), och ljustiden jorden till Mars och Jupiter. MODELLED: Uranus och Neptunus från tabell 1, som överskrider det angivna felet mot DE441 (2,0 och 5,2 gånger), Pluto, månarna, kroppskonstanterna och resultaten frånbody-pnt. - Fynd: Montenbruck & Gills månserie i
src/ephem.rsär redan hänförd till J2000-ekvinoktiet genom sin egen precessionsterm (0,05 grader från Horizons), så den används utan ytterligare precessionsrotation. Sex nya matrisrader: två validerade (planetpositioner, ljustid) och fyra modellerade.
Konstellationer kring vilken kropp som helst
- Konstellationsutformning i stor skala (slaget
constellation-design,src/constellation.rs). Walker delta- och Walker star-mönster (T/P/F), explicita elementlistor och utformningar med flera skal, flera konstellationer per körning, kring jorden, månen, Mars eller vilken annan planet, Pluto eller större måne som helst utifrån de kroppskonstanter som slagetsolar-systemlade till. Förinställningar från publicerade nominella element: baslinjen för Global Positioning System (GPS) och den utbyggbara konstellationen med 24 platser (Standard Positioning Service Performance Standard, SPS PS, 2020), Galileo Walker 24/3/1 (Open Service Service Definition Document utgåva 1,1), BeiDou medelhög jordbana Walker 24/3/1 plus geostationära och lutande geosynkrona satelliter (Open Service Performance Standard 3,0) och GLONASS 24/3/1 (Interface Control Document 5,1). Täckning och utspädning av precision (DOP) över ett rutnät i latitud och longitud: satelliter i sikte, GDOP, PDOP, HDOP och VDOP (geometrisk, position, horisontell, vertikal) samt tillgänglighet per cell, globalt och på den sämsta platsen, med en mottagarklocka per konstellation. Ett siktförfilter (täckningshalvvinkel plus ett band i sub-satellitlatitud, exakt på en sfärisk kropp) kör 5 000 satelliter på ett rutnät på 10 grader på cirka 0,13 s i ett debugbygge.- VALIDATED: Walker-generatorn återger Galileo OS SDD tabell 23 och GLONASS ICD:s platsformel; GPS-förinställningen återger kolumnen för ekvatorspassager i SPS PS (35 av 36 platser inom 0,0108 grader; E3F inom 0,06 grader, tabellens egen rad är inkonsekvent); den globala HDOP-fördelningen för GPS-baslinjen stämmer med SPS PS bilaga B (median 0,940 mot 0,94, 95 % 1,255 mot 1,25, medelvärde 0,965 mot 0,96; tröskel 0,03).
- MODELLED: godtyckliga utformningar, andra kroppar, faserna och de lutande geosynkrona noderna för BeiDou, tvåkroppsbanor med valfri J2, enbart geometri.
- Scenarier:
constellation-multi-gnss-coverage(102 satelliter, tillgänglighet 100 %, median-PDOP 0,95, 31,0 i sikte över 10 grader),leo-pnt-mega-shell(5 000 satelliter, tillgänglighet 99,22 % vid PDOP 3 eller lägre över 20 grader, 0 % vid polarkalotterna, förfiltret behåller 11,5 % av parproven),lunar-relay-constellation(14 satelliter kring månen, tillgänglighet 21,33 % totalt och högst över sydpolsområdet). Alla tre medföljer förkshana example. Anteckningar:docs/CONSTELLATION-DESIGN.md. Tre nya matrisrader: två validerade (Walker-generatorn och GNSS-förinställningar, global DOP för GPS) och en modellerad.
- En kampanj driven av spektrummodellen, och konstellationer kring vilken kropp som helst.
scenarios/campaign-spectrum-holdover-integrity.tomlkopplar ihop slagetspectrummed en klockas holdover och en integritetsövervakare (en chirp tar L1 C/A och E1; en CW-ton håller sedan C/A nere medan E1 återhämtar sig och mottagaren faller tillbaka på en himmel med bara Galileo), fastlåst mot det fristående vattenfallsexemplet itests/campaign_composition_reference.rs.constellation-designlöser nu sin centralkropp genomBody::by_name, så en konstellation kan läggas kring vilken planet, Pluto eller större måne som helst med de konstanter som slagetsolar-systemanvänder.
Kampanjer
- Kampanjer: många scenarier sammansatta till en körning. Ett nytt slag
campaign(src/campaign.rs, dokumenterat idocs/CAMPAIGNS.md) kör medlemmar av befintliga slag genom samma utskick som kommandoraden och läser tillbaka tal ur deras resultat. Fyra avsnitt, i valfri kombination:[[phases]]: ett kedjat uppdrag på en tidslinje. Förinställningar per slag läser klockans tidsfel mot dess skyddsgräns, det genomsnittliga effektiva förhållandet mellan bärvåg och brustäthet (C/N0) mot spårningsgolvet, den vertikala skyddsnivån mot larmgränsen, positionsfel, spårande satelliter och larmflaggor, hållna på ett gemensamt rutnät med fasgränser och händelser. Tillståndet förs vidare avcarry,handoffochend_at.[sweep]: en till tre punktseparerade nycklar av valfritt slag, eventuellt med en seedad ensemblekörning vid varje nod.[monte_carlo]: realisering k vid basfrö + k, med medelvärde, spridning, percentiler och ett bootstrap-konfidensintervall på 95% med fast frö.[compose]: delade värden bundna till flera medlemmar, med en sammanfattning av bästa och sämsta. Varje resultat bär en kampanjhash och en sammanfattning över varje medlemsresultat. Fyra medföljande scenarier:campaign-jam-spoof-holdover-integrity(nominellt, jamming, spoofing som avslutades vid klockövervakarens detektion efter 370 s, holdover som bär den spoofade förskjutningen på 37,0 ns med en tröghetsenhet som rullar fritt, ett integritetslarm, återhämtning),campaign-sweep-jammer-power,campaign-shared-jammer-sea-roadochcampaign-monte-carlo-clock-holdover.tests/campaign_composition_reference.rsfastlåser sammansättningsidentiteterna: en kampanj med en fas återger den fristående körningen bit för bit på tre slag, en ensemble med fast frö är byte-stabil, och på en klocka med vitt frekvensbrus ligger ensemblens medelvärde inom det rapporterade intervallet med spridningen inom chi-två-intervallet för sqrt(q_wf * tau) = 16,459 ns. Tre nya modellerade matrisrader.
Animation
- Animationsexport (
--animate svg|html|frames|all,src/animation.rs,docs/ANIMATION.md). Varje körning vars resultat bär en tidsserie kan nu skrivas som en animerad SVG-fil (Scalable Vector Graphics; Cascading Style Sheets-nyckelbilder, inget skript: kurvorna ritas in bakom en rörlig tidsmarkör), en enda fristående HTML-spelare (HyperText Markup Language; spela och pausa, skrubba, hastighet, varje panel på en synkad markör, händelsemarkörer som söker vid klick; ingen extern resurs), eller en numrerad SVG-bildsekvens med enmanifest.jsonsom anger bilder per sekund, längd och bildtider för en videokodare. En kampanj spelas som sina faser med sina larm markerade; en spektrumkörning animerar sitt vattenfall rad för rad. Spelaren följerprefers-color-scheme, och underprefers-reduced-motionvisar både SVG-filen och spelaren den färdiga bilden i stället för att röra sig.--animate-fpsoch--animate-durationanger uppspelningen;kshana::api::animate_tomlochkshana::animation::animate_resultär bibliotekets ingångspunkter, ochresult.jsonfår ett blockanimationbara när--animatekörs. Utdata är en ren funktion av resultatet och alternativen, byte för byte identiskt vid omkörning, utan tidsstämpel. Ett slag utan en samplad tidsaxel avvisas med "no time series to animate" och ingenting skrivs. Exportören ritar körningens egna sampel och lägger inte till något tal, så den är MODELLED (intern konsistens) och har ingen rad i verifieringsmatrisen; ingen publicerad siffra ändras. Tester:tests/animation.rs(determinism, antal bilder, ingen extern adress, välformad XML, sökvägen för minskad rörelse och varje medföljande scenario med en tidsserie som animeras).
Rapporter
- Avancerade körningsrapporter (
src/advanced_report.rs, docs/REPORTS.md). Varje körning från kommandoradsgränssnittet (CLI) skriver nu<scenario>.report.html, en utskrivbar HTML-rapport (HyperText Markup Language), och<scenario>.report.json, samma innehåll som ett maskinläsbart JSON-dokument (JavaScript Object Notation). Avsnitt: en sammanfattning för ledning; varje scenarioindata med sin enhet, läst ur schemat för fältenheter (resultatets blockunits), annars ur fältnamnets suffix, annars angivet som inte angivet; resultaten med körningens diagram, varje skalär och en sammanfattning av varje numerisk kolumn; för en kampanj nodtabellen för svepet, Monte Carlo-medelvärdet, standardavvikelsen, 5:e / 50:e / 95:e percentilerna och bootstrap-konfidensintervallet med ett histogram per mått, kedjans fastabell, eller sammansättningens medlemmar och gemensamma sammanfattning (och rutnätet för en körning avsweepellersweep-nd); en händelsetidslinje; etiketten VALIDATED / MODELLED / PARTNER, referens och testbelägg för varje rad i verifieringsmatrisen som körningens slag använder, läst ur matrisen genom en korstabell mellan slag och rad (en rad som bedömer en indatasökväg, till exempel sökvägen Simplified General Perturbations 4 (SGP4) förorbiteller sökvägen med uppmätt registrering förslot-timing, listas bara när körningen tog den sökvägen, och raden för läsaren av Shuttle Radar Topography Mission (SRTM) listas för inget slag, eftersom inget scenariofält läser en SRTM-ruta); uttalandena om vad som inte modelleras och antagandena, var och en citerad med sin källa; och en reproducerbarhetspost (motorversion, källincheckningen när bygget sätterKSHANA_GIT_COMMIT, Secure Hash Algorithm 256-bit (SHA-256)-sammanfattningar av scenariofilen och resultatdokumentet, frö, plattform och det exakta kommandot). Rapporten läser ingen klocka: samma scenario, frö och motorbygge ger en byte för byte identisk rapport, och den enda tidsstämpel den kan visa är den som--study-nameredan skriver. En utskriftsstilmall passar A4 och US Letter, upprepar tabellhuvuden och håller rader och figurer hela över sidbrytningar; en PDF-fil (Portable Document Format) skapas med webbläsarens "Save as PDF". Det finns inget alternativ--report pdf, eftersom rendering av diagrammen till en PDF skulle kräva ett nytt, tungt beroende. Tester:tests/advanced_report.rsrapporterar varje medföljande scenario (inget tomt avsnitt, ingen platshållartext, etiketter lika med matrisen, scenariosammanfattningen lika med filens, byte för byte identisk vid omkörning) ochtests/advanced_report_cli.rskör om det registrerade kommandot i en ny katalog och kräver en byte för byte identiskresult.json. Ingen publicerad siffra ändras, och antalen slag, scenariofiler och matrisrader är oförändrade. - Rapporten, animationen och exporterna fungerar tillsammans. Den avancerade rapporten får ett avsnitt "Animation and exports": körningens animerade ritning inbäddad som en overksam bild (eller skälet till att det inte finns någon), länkar till animations- och exportfilerna som skrivits bredvid den, och varje interoperabilitetsformat med om det gäller, varför inte, och dess specifikation;
report.jsonbär samma blockcompanions. HTML-animationsspelaren listar exportfilerna som skrivits bredvid den. Kommandoradsgränssnittet (CLI) renderar nu exporterna innan det skriver rapporten, så båda kan nämna filerna.
Interoperabilitetsexporter
- Interoperabilitetsexporter och -importer (
--export,src/interop/, docs/INTEROP.md).kshana <scenario.toml> --export <format>skriver scenariots geometri som CZML (Cesium Language), KML (Keyhole Markup Language 2,2, en standard från Open Geospatial Consortium, medgx:Tracktidsmärkta spår), GeoJSON (Internet Engineering Task Force Request for Comments 7946) och Ansys STK (Systems Tool Kit).e-efemerider (EphemerisTimePosVel, meter, en fil per rörligt objekt), och slagetspectrum:s syntetiserade IQ-ögonblicksbild (i fas och kvadratur) som ett SigMF-par (Signal Metadata Format) genom den befintligasrc/sigmf.rs.--export allskriver varje format som gäller och skriver ut varför de andra inte gör det;--export listrapporterar utan att köra. Rörliga objekt skrivs i Geocentric Celestial Reference System (CZMLINERTIAL, STKICRF) och jordfast WGS 84 (World Geodetic System 1984) longitud, latitud och höjd (KML, GeoJSON); fasta platser i CZML ärFIXED. Slagetjamminglägger till två jammerfotavtryck från sina egna länkekvationer.--import-route <file.geojson>skriver en GeoJSON-LineStringi spårindata förterrain-nav,terrain-slam,gravity-mapochcombined-altpnt. Exporterna är byte-deterministiska och bär ingen tidsstämpel.tests/interop_formats.rsvaliderar varje export mot dess publicerade specifikation, jämför exporterade satellittillstånd med motorns egna inom 1 mm, och kör varje medföljande scenario genom varje format, där var och en antingen exporterar eller anger varför inte (tabellen i docs/INTEROP.md). Ingen publicerad siffra ändras: IQ-syntesen för slagetspectrumflyttades till en delad funktion och dess resultatdokument är byte för byte identiskt, ochPassesScenariofårpropagator()ochepoch_calendar()som används av dess egen körning. Antalen slag, scenariofiler och rader i verifieringsmatrisen är oförändrade. Ett bana- eller integritetsscenario utanepochdateras av sina satelliters egna data:t = 0är den tidigaste epoken för TLE (tvåradig elementuppsättning), sänd efemerid eller SP3 (Standard Product 3), och varje sådan satellit roteras till GCRS och jordfasta system vid sitt eget ögonblick; 2000-01-01T00:00:00Z används bara när ingen satellit bär en epok. SP3- och OEM-exporterna (Orbit Ephemeris Message) behåller sin etikett 2000-01-01. För att stödja detta läggsSgp4::epoch_jd_utc,Sp3Interpolator::jd_ut1ochPropagator::own_jd_utctill; inget som fanns läser dem.
Navigering i låg jordbana: signal
- LEO-PNT-signalutformningar och ett multibandsspektrum. Ett nytt slag
leo-signaloch ett slagspectrumsom når bortom L-bandet: ett slag, fyra scenariofiler (tre medföljer; filen Celeste IOD finns bara i förvaret) och fyra matrisrader (två VALIDATED, två MODELLED).leo-signal: parametriserade signalutformningar för positionering, navigering och tidssynkronisering (PNT) från låg jordbana (LEO) för vilket system som helst (band, sändningsbandbredd, ITU-tilldelning; komponenter för inhämtning, data och pilot med BPSK(n), BOC(m,n), MBOC eller platta spektra, effektandelar, FDMA-underbärvågor, kodlängder och datatakter), från inkompilerade publika förinställningsfiler underdata/leo-signals/(Xona Pulsar X1/X5, Iridium STL, en Starlink-signal av tillfälle, CentiSpace, en representativ C-bandsutformning och representativa utformningar för UHF/L/S/C/bred C, var och en med sin käll-URL) eller skrivna inline. Per signal: det bandbegränsade PSD och de bandinterna effektandelarna, Gabor-bandbredd, bandbegränsad tidig-sen-kodspårningsjitter mot C/N0 och avstånd (Betz & Kolodziejski 2009) och avståndsmätningens noggrannhet, inhämtningens sökrum, detektionssannolikhet och genomsnittlig seriell och kodparallell inhämtningstid, SSC in i och från GPS L1 C/A, Galileo E1, GPS L5, Galileo E5a, E5b och AltBOC med C/N0-förlusten, tolerans för CW, bredband och matchad J/S från spektrumslagets SSC-kod, en bandavvägning (jonosfärsfördröjning, fritt-rymd-förlust, avståndsmätning vid lika C/N0 och lika EIRP, jammertolerans), och valfria formkontroller mot en beskriven mätning. Exempel:scenarios/leo-band-trade.toml,scenarios/xona-pulsar-signals.toml,scenarios/celeste-iod-classical-pilot-signals.toml(de Celeste IOD-band och den signalkonfiguration som presenterades vid ESA NAVISP LEO-PNT-workshopen, 2026; hålls tillbaka med förinställningen Celeste IOD, se "LEO-PNT end to end" nedan). Anteckningar idocs/LEO-SIGNAL.md.spectrum: band kan nu vara en förinställd signalutformning (varje komponent ritad, bandbegränsad, C/N0 och J/S hänförda till den spårade komponenten) eller en egen bärvåg och modulering;[[panels]]lägger till vattenfall över andra frekvensområden på en tidslinje; enwideband-jammer (barriär) ansluter till de fyra vågformerna. Rapporten lägger tillbands[].tracked_power_dbw,bands[].designochpanels, och en postnot_modelled. Vanliga band ger samma tal som tidigare. Exempel:scenarios/multi-band-jamming-waterfall.toml.navsignalfår sinusintegralen, de slutna formerna för BPSK:s effekt i bandet och bandbegränsad Gabor-bandbredd, den bandbegränsade tidig-sen-jittern för vilket spektrum som helst och dess Gabor-gräns, den slutna formen för SSC för offset-BPSK, Galileo E5 AltBOC(15 10)-spektrumet och en tolkare för modulationsetiketter;Modulation::labelskriver ut BPSK(1/3) som en bråkdel.- Fyra matrisrader: VALIDATED bandbegränsade slutna former (90,3 % av BPSK-effekten i huvudloben, jittern som reduceras till Kaplan & Hegartys koherenta form, 0,0039564 chip vid 45 dB-Hz, B_L 1 Hz, d 1 chip, T 20 ms, och till sin Gabor-gräns, samt BPSK:s själv-SSC 2/(3 R_c); den slutna Gabor-formen och offset-SSC mot dess Parseval-form anges som interna korskontroller); VALIDATED maximal LEO-Doppler (Xona X1 33,2 kHz inom de publicerade 32 till 34 kHz, Iridium inom 0,5 kHz från 36 kHz); MODELLED
leo-signal; MODELLED multibandsspektrum.
Navigering i låg jordbana: länk
- LEO-PNT-passage och länkbudget per band: slaget
leo-pass. LEO-PNT är positionering, navigering och tidssynkronisering från satelliter i låg jordbana (LEO). En användare (mark, sjö, luft eller inomhus, stillastående eller rörlig) och en eller flera LEO-satelliter från en utformad passage, explicita element, en tvåradig elementuppsättning (TLE) genom SGP4, eller en Walker-konstellation från kodenconstellation-design. Per satellit, band och epok: siktvinklar, avstånd, sluten avståndshastighet och avståndsacceleration (kontrollerade vid varje körning mot centrala differenser), Doppler och Doppler-takt, fritt-rymd-förlust, EIRP (ekvivalent isotropiskt utstrålad effekt) med ett isoflux-, Gauss-lob- eller platt satellitmönster, en patchantenn för användaren, gasdämpning enligt ITU-R P.676, regndämpning enligt ITU-R P.838/P.618, troposfärisk scintillation enligt P.618, byggnadsinträdesförlust enligt ITU-R P.2109 för en användare inomhus, polarisationsfel, systembrustemperatur och C/N0 (bärvåg-till-brustäthet); den förstaordningens jonosfärsfördröjning per band från ett Klobuchar- eller vertikal-TEC-snedat TEC (totalt elektroninnehåll) under satelliten, och jonosfärsfria bandpar med deras brusförstärkning. Galileo- eller GPS-satelliter utvärderas med samma mottagare utifrån sina mottagna effekter i gränssnittsdokumenten, så den klockformade LEO-passagen och de platta MEO-bärvågorna (medelhög jordbana) delar ett diagram. Ett avsnitt[iot]ger tid till första positionsbestämning, energi per positionsbestämning och batteritid mot driftcykel (MODELLED).- Systemoberoende: motorn behöver ingen förinställning. Valfria förinställningar, var och en i sin egen fil och märkt PUBLIC (med URL), REPRESENTATIVE eller WORKSHOP: generisk multiband (UHF, L, S, C), generiskt C-band, Xona Pulsar X1/X5 (arXiv 2509,19551), Iridium STL, Starlink som en signal av tillfälle med enbart Doppler, CentiSpace, och Celeste IOD (demonstration i omloppsbana), vars signalparametrar presenterades vid ESA NAVISP LEO-PNT-workshopen, 2026, och finns i
src/celeste_iod.rsså att de kan hållas tillbaka (se "LEO-PNT end to end" nedan). - Publika byggstenar i
src/leo_link/(geometri, antenn, itu, iono, energi, förinställningar) som andra moduler kan anropa. - Scenarier:
leo-pass-vs-gnss-cn0,leo-indoor-uhf,leo-iot-energy,leo-pass-xona-pulsar,leo-pass-iridium,leo-pass-celeste-iod-multiband. - Nio matrisrader. VALIDATED (6): ITU-R P.838-3-koefficienter mot dess tabell 5; regndämpning och scintillation enligt P.618-14 mot valideringsexemplen från ITU-R Study Group 3; byggnadsinträdesförlust enligt P.2109 mot arbetsboken från Study Group 3; förstaordningens jonosfärsskalning mot förhållandet för gruppfördröjning i IS-GPS-200, med fritt-rymd-förlusten; den maximala Dopplern för en stillastående användare i en cirkulär bana mot arXiv 2509,19551 tabell 1. MODELLED (3): passagen och länkbudgeten, förinställningarna och budgeten för energisnål positionsbestämning. Ett slag och sex scenariofiler. Anteckningar i
docs/LEO-PASS.md.
- Systemoberoende: motorn behöver ingen förinställning. Valfria förinställningar, var och en i sin egen fil och märkt PUBLIC (med URL), REPRESENTATIVE eller WORKSHOP: generisk multiband (UHF, L, S, C), generiskt C-band, Xona Pulsar X1/X5 (arXiv 2509,19551), Iridium STL, Starlink som en signal av tillfälle med enbart Doppler, CentiSpace, och Celeste IOD (demonstration i omloppsbana), vars signalparametrar presenterades vid ESA NAVISP LEO-PNT-workshopen, 2026, och finns i
Navigering i låg jordbana: navigeringsmeddelande
- LEO-navigeringsmeddelande (slaget
leo-navmsg,src/leo_navmsg/). Det sända efemerid- och klockmeddelandet från en satellit för positionering, navigering och tidssynkronisering (PNT) i låg jordbana (LEO), för vilken bana, bärvåg och modell som helst; namngivna förinställningar är valfria data och varje förmåga körs utan dem. Ett slag, fem scenariofiler och nio matrisrader (tre VALIDATED, sex MODELLED). Sedocs/LEO-NAVMSG.md.- Meddelandets innehåll: SVID, datautgåva, band och signalhälsa; vecka, tid på veckan och ett andragradsklockpolynom; efemeriden i en av fyra modeller — Galileo OS SIS ICD:s keplerska uppsättning med 16 parametrar, den uppsättningen plus korrektionspolynom längs banan, tvärs banan och radiellt, modellen med 22 parametrar av Liu et al. 2025 (doi 10.3390/rs17162894), eller ATOMIC:s nollklocke-ECEF-polynom — och en Klobuchar-uppsättning, NeQuick-G-koefficienter med den effektiva joniseringsnivån, och parametrar för systemtid till UTC med ICD:s skottsekundsfall.
- Anpassare: en referensbana integrerad med zonal J2–J6- eller EGM2008-gravitation och luftmotstånd, en seedad fri eller styrd klocka, en Levenberg–Marquardt-anpassning på icke-singulära element, därefter linjära minstakvadratkorrektionspolynom och en klocka anpassad netto efter användarens relativistiska term.
- Fyra analyser och scenarier:
leo-navmsg-fit-interval-trade(avståndsfel för signal i rymden (SISRE) mot anpassningsintervall och uppdateringsperiod),leo-navmsg-model-comparison(fyra modeller, bitar, och Kshanas anpassning med 22 parametrar vid Liu et al.:s höjder bredvid de publicerade siffrorna, MODELLED),leo-navmsg-midpass-update(kontinuitet vid varje meddelandebyte i en passage) ochleo-navmsg-encode-decode(Kshanas egen dokumenterade binära ram med CRC-24Q och en kvantiseringsbudget, ett block i RINEX-4-stil märkt som ett Kshana-tillägg, och en CSV-tabell). - VALIDATED: de globala medelvärdesvikterna för SISRE mot den publicerade tabellen för medelhög bana och geostationär bana av Montenbruck et al. 2018; Galileo-användaralgoritmen mot RTKLIB på fyra verkliga sända Galileo-efemerider (
tests/leo_navmsg_reference.rs); CRC-24Q mot katalogens kontrollvärde och exempelramen RTCM 10403 1005. - Förinställningar, en fil var med källor: Xona Pulsar och Pulsar-0, Iridium, Starlink, CentiSpace, ett representativt C-bandssystem, ATOMIC, och Celeste IOD (den enda förinställning som använder material presenterat vid ESA NAVISP LEO-PNT-workshopen, 2026, förvarat i
src/celeste_iod.rsmed sina scenarier så att det kan hållas tillbaka).
Navigering i låg jordbana: fusion
- Fusionerad MEO + LEO-positionering, -navigering och -tidssynkronisering:
leo-pvt,leo-pppochntn-positioning. Tre nya scenarioslag isrc/leo_fusion/, systemoberoende: varje konstellation är Walker-skal, elementuppsättningar eller en GNSS-förinställning, varje signal en bärvåg, en chiptakt och ett hölje för bärvåg-till-brustäthet (C/N0), varje felbudget en explicit enkel sigma, och namngivna system i låg jordbana (LEO) är valfria förinställningar, en fil var med sina källor märkta publik, workshop eller härledd (Xona Pulsar X1/X5, Iridium Satellite Time and Location (STL), Starlink-signaler av tillfälle, CentiSpace, ett representativt C-bandssystem, efemeridmodellen ATOMIC med nollklocka, och en förinställning för ESA Celeste-demonstration i omloppsbana vars workshophärledda parametrar finns isrc/celeste_iod.rsså att de kan hållas tillbaka).leo-pvthar fyra lägen: Doppler-positionering (minsta kvadrat i omgångar på avståndshastighet med tillstånd för klockdrift och hastighet, ett läge med signaler av tillfälle med enbart Doppler, den enskilda passagens noggrannhet längs och tvärs banan, och höljet för Doppler, Doppler-takt och ryck); gemensam viktad minsta kvadrat för GNSS + LEO med en klocka per system (intersystembiasen) eller en känd förskjutning, sigma per mätning som indata, och DOP mot antalet LEO-satelliter; polär och arktisk täckning mot latitud; samt tidsöverföring från LEO till koordinerad universell tid (UTC) mot C/N0 och mottagaroscillatorn med uttrycket för systemtid till UTC i IS-GPS-200.leo-ppp: ett flyttals Kalman-filter (utökat) för precis punktpositionering (PPP) på jonosfärsfri kod och fas, med enbart GNSS och med LEO-förstärkning, med sin konvergenstid och ett Monte Carlo-konsistenstest av NEES (normaliserat skattningsfel i kvadrat). Det medföljande scenariot ger 7,4 min med fyra MEO-system och 4,8, 3,2, 2,7 och 2,3 min med 60, 96, 192 och 288 LEO-satelliter, bredvid de 9,6, 7,0, 3,2, 2,1 och 1,3 min som Li et al. (J. Geod. 93:749, 2019) anger, som en MODELLED jämförelse av trenden.ntn-positioning: 5G-positionering i icke-terrestriskt nät (NTN) i det mobila satellit-S-bandet 3GPP n256 utifrån Cramér-Rao-gränsen för ankomsttid och Doppler.- Scenarier:
leo-doppler-positioning,starlink-sop-doppler-positioning,meo-leo-fused-pvt,leo-ppp-convergence,ntn-5g-positioning,polar-arctic-leo-coverage,leo-timing-utc(medföljer) ochceleste-iod-fused-pvt(finns bara i förvaret, hålls tillbaka med förinställningen Celeste IOD). - Åtta matrisrader: höljet för LEO-Doppler VALIDATED mot de publicerade siffrorna för Iridium (±36 kHz: 35,9 kHz, inom 5%) och Xona Pulsar X1 (32 till 34 kHz: 33,6 kHz från skalet på 97 grader, utan någon breddning) (
tests/leo_doppler_reference.rs); Doppler-positionering, gemensam pseudoavståndspositionering, PPP-konvergens, NTN-gränser, LEO-tidssynkronisering, polär täckning och förinställningarna MODELLED. Tre slag och åtta scenariofiler. Dokumentation:docs/LEO-PNT-FUSION.md.
- LEO-PNT från början till slut: slaget
leo-pnt-chain, och LEO-stegen sammankopplade. Ett enda positionerings-, navigerings- och tidssynkroniseringssystem (PNT) i låg jordbana (LEO) följt från sin signalutformning till användarens position, varje steg motorns eget slag på sin egen scenariotabell, med värden som förs vidare i kod (docs/LEO-PNT.md):- Band i
leo-passkan namnge en utformningleo-signal(signal = "xona-x5"): bandet tar utformningens centrum, sändningsbandbredd och chiptakt för den spårade komponenten, delar sin EIRP (ekvivalent isotropiskt utstrålad effekt) mellan utformningens komponenter, och rapporterar varje epoks C/N0 (bärvåg-till-brustäthet) för den spårade komponenten och bandbegränsade kodspårningsjitter (avståndsfelet; bruset för paretiono_freeanvänder det också). Ett band utan utformning ger samma utdata som tidigare. leo-pnt-chainkör signal -> passage -> navigeringsmeddelande -> fusionerad gemensam lösning medleo-pvt-> valfrileo-ppp. Varje LEO-system i positioneringssteget som lämnar dem osatta får en C/N0-linje i sin(elevation) anpassad till passagen, meddelandets avståndsfel för signal i rymden (SISRE: dess representationsfel vid passagesatellitens bana, med en angiven banbestämningstermod_sisre_mi rotsumma av kvadrater), samt utformningens bärvåg och chiptakt; fallen med precis punktpositionering (PPP) tar SISRE. Varje överlämning listas med sitt värde och sin enhet, ochtests/leo_pnt_chain.rskontrollerar att var och en är lika med uppströmsutdata och att ändringar uppströms flyttar siffrorna nedströms.LeoNavmsgScenario::broadcast_sisreär den nya ingångspunkten för meddelandet.- Scenarier:
leo-pnt-end-to-end(en generisk konstellation på 1080 km och den representativa signalengeneric-l),xona-pulsar-end-to-end(den publika X5-signalen), båda medföljer, och den valfriaceleste-iod-end-to-endsom bara finns i förvaret. - Förinställningarna för Celeste IOD (demonstration i omloppsbana) för områdena passage, meddelande och fusionerad positionering finns nu i en fil,
src/celeste_iod.rs, sombuild.rsbara kompilerar in när den finns (konfigurationsflaggankshana_celeste). Dess fem scenarier (scenarios/*celeste-iod*.toml) finns bara i förvaret, så att radera den filen och de scenarierna håller tillbaka varje siffra som presenterades vid ESA NAVISP LEO-PNT-workshopen, 2026, utan någon källkodsändring;tests/workshop_preset_isolation.rskontrollerar vilka filer som får nämna förinställningen eller bära dess siffror för bandplanen. - Varje LEO-slag i den avancerade rapportens korstabell, med sina sökvägsspecifika rader listade bara när körningen tog den sökvägen (en regnintensitet, en byggnad, en analys eller ett läge som kördes). Dopplerfönstren för
leo-pvtfårt_soch fallen förleo-pppfårt_min, så båda animeras;leo-passochleo-pnt-chainexporterar CZML-, KML-, GeoJSON- och STK-efemerider, och de andra LEO-slagen anger varför ett format inte gäller.
- Band i
Navigering i låg jordbana: motståndskraft, fokusområden och slutanvändarscenarier
- LEO-PNT-motståndskraft, ett scenario per fokusområde i experimentet och ett per slutanvändarvertikal, och
docs/LEO-PNT.mdsom översikt över varje LEO-slag och scenario. Varje scenario körs utan några Celeste-data och medföljer.leo-passfår ett avsnitt[spoofer]: en spoofer förfalskar, självkonsekvent i avstånd och avståndshastighet, signalerna från en påstådd position som hoppar och/eller förskjuts från den sanna efter en start (per LEO-band, och MEO GNSS-signalen), med eller utan jonosfären. Två övervakare körs vid en angiven falsklarmssannolikhet: konsistens i Doppler och passagegeometri (uppmätta avståndshastigheter mot de som förutsägs ur banorna och en oberoende förhandsposition och -hastighet; ett generaliserat minsta kvadrat-chi-två över ett fönster, på GNSS-, LEO- och alla kanaler, frekvenslåsslingebrus från C/N0) och konsistens mellan band (steget i varje LEO-bandpars modellkorrigerade geometrifria kombination). Resultatet ger statistiken per epok (så den animeras), varje par, och när varje övervakare detekterar. Byggstenar ileo_link::spoof. Saknat avsnitt, oförändrat utdata.- Varje bandpar i
leo-passrapporterar också det snedade totala elektroninnehåll (TEC) som dess geometrifria kombination återger vid passagens topp och den skattningens kodbrus-sigma (jonosfärssondering). Detta lägger till två fält i varje multibandsresultat frånleo-pass; inget befintligt tal ändras. - Tidssynkroniseringsläget i
leo-pvttartrace = true: varje rad rapporterar då sitt tidsfel och sin förutsagda sigma vid varje epok, med samma dragningar, så radstatistiken är oförändrad och körningen animeras och kedjas i en kampanj. - En kampanj exporterar nu varje medlemsscenario som har geometri (fasernas körningar, basscenarierna för svepet och Monte Carlo, sammansatta medlemmar med sina delade värden bundna) som sin egen filuppsättning, med medlemsetiketten i filnamnet; tidigare exporterade en kampanj ingenting. Interoperabilitetstabellen i
docs/INTEROP.mdändras i enlighet med detta. - En svepnyckel i en kampanj kan indexera en matris av tabeller efter position (
system.2.sisre_m). - Scenarier för motståndskraft:
leo-resilience-multiband-diversity(en barriär på 50 MHz i L5-bandet svept i effekt: varje L-bandssignal faller, LEO-signalerna i UHF-, S- och C-banden behåller sin C/N0),leo-resilience-js-margin(J/S-marginal utifrån mottagen effekt: GPS L5, Galileo E5a och Xona X5 förlorade vid -105, -100 och -95 dBW, en generisk LEO-signal på -135 dBW spåras fortfarande vid -90 dBW),leo-resilience-spoof-doppler(ett hopp på 30 m som missas av Doppler-testet med enbart GNSS och upptäcks av testet på alla kanaler 105 s efter starten),leo-resilience-spoof-monitors(fyra spoofers mot båda övervakarna) ochleo-resilience-gnss-jammed-leo-carries(GNSS störd, LEO-lagret i S- och C-banden spåras, autonom integritetsövervakning i mottagaren (RAIM) på enbart LEO-lagret larmar vid 2 av 30 epoker). - Scenarier för fokusområden:
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(motståndskraft i L, S och C ärleo-resilience-multiband-diversity). - Vertikala kampanjer, var och en animerad och med export av sina LEO-passager:
leo-vertical-autonomous-vehicle,leo-vertical-rail-maritime(de medföljande scenarierna för sjö och järnväg plus LEO),leo-vertical-critical-infrastructure-timing,leo-vertical-polar-arctic,leo-vertical-5g-network-timing,leo-vertical-asset-tracking-iot. Enradsresultat idocs/LEO-PNT.md. - Tre MODELLED matrisrader: övervakaren för spoofing med Doppler och passagegeometri, övervakaren för spoofing mellan band och jonosfärssondering.
tests/leo_resilience_verticals.rskontrollerar övervakarna (tysta före starten, Doppler-statistiken kvadratisk i ett hopp, jonosfärssteget för en markspoofer och inget från en som är medveten om jonosfären), sonderingsidentiteten, tidsspåret mot radstatistiken, och att en kampanjs export är lika med varje medlems egen. - Sidan
leo-passflyttas tilldocs/LEO-PASS.md;docs/LEO-PNT.mdär översikten.
Scenarier för sjö, väg och järnväg
- Scenarier för sjö, väg och järnväg. Fem medföljande exempel på befintliga slag, så att fartyg, vägfordon och tåg har ett genomarbetat fall var. Varje siffra är MODELLED; ingen är validerad mot uppmätta data.
scenarios/maritime-strait-jamming.toml(jamming): en bredbandsjammer på 50 W på en mast på 30 m, 30 km över öppet vatten från ett fartyg. Genomsnittligt jammer-till-signal-förhållande (J/S) cirka 48 dB, och tillgängligheten faller från 1,00 till 0,00.scenarios/maritime-port-approach-coast.toml(ins-trn-coast): ett tröghetsnavigeringssystem (INS) av navigeringsklass vid 12 knop med förlorad GNSS och ingen stödjande information. Det passerar 10 m efter 281 s och 100 m efter 833 s, siffrorna för hamninlopp och oceanvatten i resolution A.1046(27) från Internationella sjöfartsorganisationen (IMO), som används här som budgetar.scenarios/maritime-spoof-position-push.toml(spoof-detect): en spoofer på +2 dB, inte bärvågsjusterad, som skjuter fyra satelliter för att dra ett fartyg 500 m. Den fusionerade övervakaren upptäcker den (poäng 0,70 mot en tröskel på 0,50) på autonom integritetsövervakning i mottagaren (RAIM) och signalkvalitetsövervakning (SQM); enbart effektövervakning missar den.scenarios/automotive-urban-canyon.toml(gnss-ins): en bil genom en underfart på 15 s och ett avbrott på 60 s orsakat av en jammer vid vägkanten, mot en budget på 1,5 m för ett halvt körfält. Det fusionerade avbrottets kvadratiska medelfel (RMS) är 1,9 m för en MEMS-enhet (mikroelektromekaniskt system) av fordonsklass och 0,7 m för en taktisk jämförelseenhet; fritt löpande driver MEMS-enheten till 850,8 m.scenarios/rail-tunnel-coast.toml(ins-trn-coast): ett taktiskt INS på ett tåg vid 160 km/h i en tunnel. Det passerar 2 m (spårdiskriminering) efter 35,8 s, cirka 1,6 km in, och 20 m efter 107,3 s. Detta är enbart INS: motorn har ingen modell för vägmätare, så det är den pessimistiska gränsen. Antalet scenariofiler i README flyttas från 77 till 82. Alla fem medföljer förkshana exampleoch listas i webbläsarens lekplats.
Model Context Protocol-server
Servern för Model Context Protocol (MCP) når varje slag och varje vy av en körning: sju nya verktyg, fjorton sammanlagt.
run_scenarioskickade redan varje slag; det en agent saknade var en väg till ett giltigt scenario av ett slag, och de tre utdata som kommandoraden skriver bredvid ett resultat. Nya verktyg:list_example_scenariosochget_example_scenarioserverar de medföljande referensscenarierna (tabellenkshana example), var och ett med sitt slag och första meningen i sitt eget huvud, byte för byte filen underscenarios/. Ett scenario som finns i förvaret men inte medföljer avvisas med skälet. Varje slag utomlunar-llr-datum(vars dataurval bara levereras med förvaret) har minst ett exempel.report_scenarioreturnerar körningens rapport som JSON (JavaScript Object Notation) eller som den utskrivbara HTML-sidan (HyperText Markup Language) (docs/REPORTS.md).animate_scenarioreturnerar körningens tidsserie som en animerad SVG-ritning (Scalable Vector Graphics), en HTML-spelare eller numrerade bilder, efter en JSON-sammanfattning av vad som ritades (docs/ANIMATION.md). Ett svar bär högst 120 bilder; kommandoraden skriver vilken längd som helst.list_export_formats,export_interopochimport_routeserverar interoperabilitetsexporterna och GeoJSON-importen av rutter (docs/INTEROP.md): CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, STK-efemeridformatet (Systems Tool Kit).eoch SigMF (Signal Metadata Format), med ett JSON-index över filerna (suffix, storlek och SHA-256, sammanfattningen med Secure Hash Algorithm på 256 bitar) och den binära SigMF-samplefilen som base64.
Biblioteket får en funktion
bundled-scenariossom är avstängd som standard och som exponerar tabellen med referensscenarier somkshana::bundled_scenarios; bara MCP-servern slår på den, så Python-hjulet och WebAssembly-modulen bär fortfarande inte scenariotexten. Sviter (--study) förblir bara tillgängliga från kommandoraden, eftersom en svit namnger filer på disk och servern inte läser några. Rundturstesterna kör varje nytt verktyg mot medföljande scenarier och kontrollerar motorns tal: spektrum, solsystemet, konstellationer kring månen och Europa, ett kampanjsvep, och slagen för signal, passage, navigeringsmeddelande, fusionerad positionering, precis punktpositionering, icke-terrestriskt nät och från början till slut i låg jordbana (LEO). Varje yta som anger antalet MCP-verktyg eller listar verktygen säger nu fjorton, utom lekplatssidan underweb/, som ersätts av webbplatsen.
kshana.dev, Kshana Studio och README
- En omgjord kshana.dev. Den enda lekplatssidan ersätts av en webbplats med flera sidor: Home, Missions, Capabilities, Evidence, Developers, Editions och Docs, med Kshana Studio ett klick bort. Varje diagram, karta och tal på den är en inspelad körning av den här utgåvans motor, med scenariot och en länk som öppnar samma körning igen i Studion; webbplatsbygget avvisar en inspelning gjord av en annan motorincheckning. Dokumentationssidorna genereras från förvarets
docs/, och installationsalternativen från dess kanaler. Typsnitt och skriptbibliotek serveras från kshana.dev självt, så ingen sida begär något från en tredjepartsvärd. Gamla adresser (/#playground,/#ledger, delningslänkar/#s=<scenario>, inbäddningslänkar/?embed=1&…och resten) omdirigeras till sin nya plats, och en okänd adress får en 404-sida. - Kshana Studio, en instrumentpanel för varje förmåga. Studion öppnas på en startskärm med domänrutor och bra första körningar, och för sedan en körning genom fem numrerade steg: Choose a scenario, Set its parameters, Run the engine locally in the browser, Read the results (nyckeltal först, vart och ett med ett PASS- eller FAIL-märke där körningen anger en tröskel, därefter panelerna) och Share or export. En sökruta hittar scenarier, domäner och fälten i dem och hoppar till kontrollen; körningar kan fästas och jämföras; en brödsmula säger var du är; på en telefon blir stegen ett stegfält. Varje scenarioslag har sin vy, inklusive spektrumvattenfallet, solsystemet, konstellationstäckning, kampanjer, animationen, körningsrapporten, interoperabilitetsexporterna och kedjan för låg jordbana. En djuplänk (
?scenario=…&tab=…) öppnar samma körning på den namngivna panelen. - Forskning och citering. Sidan Evidence listar de fem Kshana-artiklarna på arXiv (2606,22054, 2606,24210, 2607,02566, 2607,05415 och 2607,06212), var och en med en sammanfattning, en figur beräknad av den här motorn, kommandot som återger den, en Studio-länk och BibTeX, bredvid hur man citerar programvaran. README får samma avsnitt Research.
- En publik sida för Kshana Pro.
docs/PRO.mdoch webbplatsens sida Editions säger vad det proprietära Pro-lagret tillför över samma motor (utformningsoptimerare, osäkerhet och känslighet, uppdragsdossier, kampanjbevakning, spektrumsamexistens, jobbtjänst på plats, kravspårbarhet), vad var och en ger och vad den inte gör. Varje Pro-siffra som webbplatsen visar anges på den publika sidan. Pro lägger inte till någon fysikalisk modell, och den öppna motorn förblir hel och fri. - En omskriven README. Korta avsnitt, en bild per avsnitt, Kshana-märket, två rader märken, genererade bilder av arkitekturen, scenarioflödet, kedjan för låg jordbana och verifieringen (
tools/gen_readme_assets.py, som misslyckas på en inaktuell bild), och Studio-skärmbilder tagna från den körande Studion avtools/capture_studio_shots.mjs. README-filerna för crates.io, PyPI, npm och MCP-servern följer samma utformning. Långt referensmaterial viks ihop eller flyttas tilldocs/.
Ändrat#
<scenario>.report.htmlär nu den avancerade körrapporten som beskrivs under Added, och CLI:ets radwrote …nämner även<scenario>.report.json. Det enkelsidiga resultatkort som den ersatte är oförändrat somRunOutput::html_report(), som Python- och WebAssembly-bindningarna fortfarande returnerar.OracleKind::modelled_reason()exponerar meningen somdocs/MODELLED-RATIONALE.mdskriver ut för varje MODELLED-rad; det dokumentet är oförändrat.- README beskriver vad Kshana Pro bygger på. Avsnittet Editions och raden om Kshana Pro under "Support & professional services" anger nu vad Pros modellbaserade systemteknik (MBSE) och programverktyg gör och vilka av den öppna motorns publicerade utdata den läser (varje körnings
result.jsonochreport.json, scenariofilen, fältenhetsschemat och verifieringsmatrisens etiketter), samt vad klockornas digitala tvillingar, avvägningsstudier och bevispaket vilar på i den öppna motorn. Endast formuleringar: ingen motorutdata och inget publicerat tal ändras. - Kompatibilitet. Den publika enumen
navsignal::Modulationfår variantenMboc, vilket är en brytande ändring för en anropare som matchar den uttömmande. Kindens kolumnergcrs_r_mochgcrs_v_m_sförephemerisändras (se "Revisions to published numbers"). En körning reproduceras fortfarande av den motorversion som gjorde den.
Rättat#
export_table_csvpå MCP-servern nämnde fyra kinds som de enda med en CSV-tabell (kommaseparerade värden); sex publicerar en. Verktyget returnerade alltid tabellen förtelecom-timingoch förleo-navmsg(dessencode-decode-analys på enkepler16- ellerkepler-rac-meddelandemodell), men dess beskrivning, dess avslagsmeddelande och dokumenten som listar kinds utelämnade båda, så en agent fick veta att den inte skulle fråga. De nämns nu, och ett rundturstest hämtar båda tabellerna.Navigationsmeddelanderamen för låg omloppsbana (LEO) var inte samma bytes på alla plattformar, och inte heller i varje bygge av en och samma plattform.
scenarios/leo-navmsg-encode-decode.tomlkodade en ram med cyklisk redundanskontroll0x110315i release-bygget på aarch64 macOS,0x898BD8i ett debug-bygge av samma källkod på samma maskin och0x6A82D9i WebAssembly-bygget (WASM);leo-navmsg-celeste-iod.tomlgav0x6EDB2Dnativt mot0xC6E4F0i webbläsaren. Tre orsaker, var och en spårad till det första avvikande värdet:- Mellan plattformar. Sanningsbanan var bitidentisk på båda; passningens startpunkt var det inte.
truth::state_to_elementstar den oskulerande inklinationen från enacosoch perigeumargumentet från enatan2, och de två matematikbiblioteken avrundar dessa olika i sista siffran (över 20 000 argument skiljer de sig åt för 781 sinusvärden, 858 cosinusvärden, 1 931 exponentialer och 1 899 tvåargumentsarkustangenser). - Mellan byggprofiler. Ett optimerat bygge på macOS slår ihop en sinus och en cosinus av ett argument till ett enda anrop av systemets kombinerade rutin, och dess sinus är inte den ensamma
sin:s för 379 av 200 000 argument; ett ooptimerat bygge gör de två anropen. Kinden tar en sinus och en cosinus tillsammans på tretton ställen. - I klockan. Normalsamplaren i
rand_distranropar värdensexpochlni sina två sällsynta grenar: av fyra miljoner seedade dragningar skilde sig tre i sista biten mellan det nativa bygget och WASM-bygget.
Levenberg–Marquardt-passningen, som på denna båge stannar vid sin gräns på 80 iterationer och inte vid ett minimum, för över en enhet i sista siffran till olika kvantiserade fält. Kinden beräknar nu varje transcendent funktion genom den nya
src/portable_math.rs, som anropar den rena Rust-cratetlibm(redan i beroendeträdet, nu namngivet iCargo.toml), kompilerad från en och samma källa för varje mål och inte ett biblioteksanrop som optimeraren skriver om:leo_navmsg::{truth, fit, elements, codec, sisre, services}och scenariokoden. Heltalspotenser på den vägen skrivs ut som kvadrera-och-multiplicera, eftersomf64::powihar ospecificerad precision, och sanningsklockan drar sina normalavvikelser frånportable_math::standard_normal(Marsaglias polära metod på generatorns råa utdata). De gemensamma rutinerna som sanningsbanan integreras genom skrivs en gång, generiska över matematikbiblioteket, med en cratinternt_portable-ingång bredvid den befintliga: den sfäriskt harmoniska accelerationen, de zonala accelerationerna och luftmotståndsaccelerationerna, J2-sekulärhastigheterna och Klobuchar-fördröjningen. De befintliga ingångarna är oförändrade ända ned till sista biten, så ingen annan kinds tal flyttas.leo_navmsg::tests::the_encoded_frame_is_the_same_bytes_on_every_platformlåser fast hela ramen på 171 bytes och ett kontrollvärde per efemeridmodell, i den vanliga (ooptimerade) testprofilen, på varje plattform och utan någon spärr mot en baslinjevärd;the_kind_never_calls_the_host_mathematics_libraryläser kindens källfiler från disk och misslyckas vid ett inneboende transcendent anrop, vid enrand_distr-samplare eller vid ett anrop till en modul som inte har granskats. Efter ändringen ger ett debug-bygge, ett release-bygge och WASM-bygget byteidentiska resultatdokument för alla femleo-navmsg-scenarier. Detta flyttar tal och redovisas här som en revision. Kindenleo-navmsgär ny i den här releasen, så inget som publicerats i en tidigare release flyttas, men varjeleo-navmsg-värde gör det, nativt och i WASM-bygget, ochnavmsg-steget ileo-pnt-chainmed dem: banvärdena eftersom passningen nu startar från de portabla elementen, klockvärdena eftersom sanningsklockan är en annan realisering av samma process.docs/LEO-NAVMSG.mdär omgenererad från de nya resultaten; dess publicerade kontrollvärde för kodnings- och avkodningsscenariot var0x110315och är0x19105F(position inom 1,126 mm från det exakta meddelandet där det var 0,665 mm, klocka inom 0,185 mm där det var 0,451 mm). Storleken på ändringarna i värdena under en millimeter är passningens känslighet, inte ett fel i någon av uppsättningarna: passningen är oförändrad och stannar fortfarande vid sin iterationsgräns.- Mellan plattformar. Sanningsbanan var bitidentisk på båda; passningens startpunkt var det inte.
Seedad omsampling drog andra index på ett 32-bitarsmål.
Rng::gen_rangeöverusizetar 64 bitar från generatorn på en 64-bitarsvärd och 32 bitar på en 32-bitarsvärd, så samma seed gav andra index, och lämnade strömmen på ett annat ställe, i WASM-bygget. Tre ställen drog på det sättet: percentilbootstrapparna ieval_stats(bootstrap_ci,bootstrap_auc_ci), blandningen före varje träningsomgång iimpairment_mloch permutationstestet iimpairment_study. De drar nu genomportable_math::uniform_index, som alltid samplar somu64: exakt vad en 64-bitarsvärd gjorde, så inget nativt tal flyttas. Detta flyttar publicerade tal i WASM-paketet och redovisas här som en revision:quantum-anomaly-detect-bootstrapintervallet för arean under kurvan (quantum_auc_ci,trade.foms[0].ci95) var[0.9901265, 0.9938305]i webbläsaren och är nu det nativa[0.99035875, 0.993861].STK-efemeridfilnamn från mover-id:n. Ett mover-id som innehöll ett
/eller ett mellanslag (ett konstellationsskal och en satellit,Pulsar inclined/S1-0163) fick CLI:et att krascha vid--export stk; varje id passerar nu genom en säker filnamnsdel (bokstäver, siffror,-,_).Nutationstecknet för TEME→GCRS, beskrivet under "Revisions to published numbers" ovan eftersom det flyttar publicerad utdata.
0.28.0 - 2026-09-26#
Tillagt#
- Scenario-kinden
slot-timing(src/slot_timing.rs): sekunder tills en fritt gående klocka lämnar skyddsmarginalen för en tidsindexerad rutt- eller uppdragsslot, varje bidragande term vid den tidpunkten med den dominerande namngiven, tiden som återstår sedan senaste positionsbestämningen och det största intervall mellan positionsbestämningar som håller klockan innanför, efter avdrag för latensen i positionsbestämningen. Klockan kommer från ett klassstandardvärde, en förinställning ur ett telecom-timing-datablad, ett inbäddat datablad (maxima för Allan-deviation, åldrande, temperaturkoefficient) eller en uppmätt faspost. Ett överskridande bortom den längsta medelvärdestid som källan stöder flaggas som extrapolerat. Medföljande exempel:slot-timing-ocxo-leo. Sedocs/SLOT-TIMING.md. - Uppmätt rödbrusgolv. En faspostens överlappande Allan-deviation passas med viktade minsta kvadrater i basen för vitt fasbrus och IEEE Std 1139 för frekvensmodulation (
slot_timing::fit_weighted), varje punkt viktad med sina ekvivalenta frihetsgrader, så att ett holdover-svar kan vila på klockans eget golv i stället för klassantagandet. En oviktad passning lade ett falskt flickergolv på en testpost med vitt brus och förkortade ett överskridande på 2 000 s med 30 %. - Validering med undanhållen datamängd av holdover-inversionen på en riktig klocka (
tests/slot_timing_cs5071a_holdout.rs): passad på första tredjedelen av posten för cesium 5071A mot vätemaser landar de förutsagda ettsigma-överskridandena vid sex trösklar från 0,5 till 2,5 ns inom 0,84 till 1,03 av de överskridanden som uppmätts på de andra två tredjedelarna, mot en tröskel på 1,5 som fastställdes innan testet först kördes. En kontroll (Allan-deviationen vid en sekund tolkad som vitt brus) missar med en faktor på ungefär 1 000 och faller på tröskeln. Ny VALIDATED registerrad; arbetsflödetrealdata-clockkör den nu. - Samma förutsägelse på en riktig kristalloscillator (
tests/slot_timing_ocxo_holdout.rs,scripts/fetch_ocxo.sh): på en uppmätt ugnsstyrd kristalloscillator är förutsägelsen för den undanhållna datamängden konservativ, vid 0,59 till 0,70 av det uppmätta överskridandet och aldrig senare, och mestadels utanför tröskeln 1,5, eftersom oscillatorns brusgolv halverades under posten på 5.5 timmar; passad i urvalet landar den inom 0,98 till 1,17. Kristallfallet är inte validated och förblir MODELLED. Körningen avslöjade också en saknad term: en kristalls frekvens driver, så modellen bär nu osäkerheten i den frekvens som är känd vid positionsbestämningen (fix_frequency_sigma); utan den var förutsägelsen optimistisk med upp till 2,5×. - Samma förutsägelse på atomklockor i omloppsbana (
tests/slot_timing_igs_holdout.rs,scripts/fetch_igs_clocks.sh): 14 dygn av International GNSS Service slutgiltiga klockor för GPS Block IIF-satelliterna, med protokollet nedskrivet innan data hämtades. Åtta av tio satelliter landar inom tröskeln 1,5; G25 och G30 förutsäger överskridanden som är upp till ungefär dubbelt så sena som de uppmätta. Protokollet kräver att varje satellit klarar den, så fallet i omloppsbana är inte validated och förblir MODELLED; utfallet är fastlåst. - Klockklasserna temperaturkompenserad kristall (TCXO), ugnsstyrd kristall (OCXO) och atomfrekvensnormal med rubidium (RAFS) (
ClockClass::Tcxo,Ocxo,Rafs), de delar som en kommersiell småsatellitbuss eller en markgateway flyger med, var och en med hänvisning till ett publikt datablad (ClockClass::source).ClockClass::ALL,idochfrom_idtillagda.quantum-trade:sbaseline_clock_classaccepterar de tre nya id:na. Att lägga till varianter i en publik enum är en brytande ändring för en anropare som matchar den uttömmande. - Skyddsnivå för tidssynkronisering för en mottagare i omloppsbana (
src/orbital_timing.rs, den valfria sektionenspoofingi kindenslot-timing): hur länge en markspoofer kan nå en satellit i låg omloppsbana per passage, den förskjutning som en spoofer med angiven maximal rampgrad ackumulerar innan satelliten lämnar dess räckvidd eller en oberoende kontroll körs, och om varje markkontakt- eller korslänkskontroll är oberoende av den spoofern. Reduceras exakt tilltpl::timing_protection_level_nsför en klocka utan flicker-, vitfas- eller slumpvandringsbrus. MODELLED. - Tre anteckningar:
docs/SLOT-TIMING.md(bland annat mot vilket vandringsmått en slot bör accepteras: maximalt absolut tidsfel, inte maximalt tidsintervallfel eller tidsdeviation, och varför),docs/DECEIVED-TIME.md(ett signerat kommando som utförs vid en vilseledd tid felrouterar ändå) ochdocs/DEPLOYMENT-TARGETS.md(var Kshana körs; ingenno_std-flygkärna erbjuds).
0.27.4 - 2026-09-26#
Releasen v0.27.3 nådde crates.io (kshana och kshana-mcp) och PyPI, och stannade sedan vid npm, så npm, MCP-avbilden på ghcr.io, MCP-registret, JetBrains Marketplace och kshana.dev fick den aldrig. 0.27.4 bär samma motor, med releasefixen nedan, till varje kanal.
Rättat#
- Npm-publiceringssteget namnger tarbollen med en explicit sökväg. Npm tolkar ett bart
npm-dist/kshana-0.27.3.tgzsom GitHub-förkortningenowner/repo, så npm-jobbet för v0.27.3 försökte klonagithub.com/npm-dist/kshana-0.27.3.tgzoch misslyckades med "Permission denied (publickey)". Själva tarbollen hade byggts och attesterats. Steget publicerar nu./npm-dist/*.tgz. Allt efter npm i releaseordningen (MCP-avbilden, JetBrains-pluginet, kanalparitetskontrollen och webbplatsen) hoppades över, som avsett.
Ändrat#
- Enhetskatalogerna för telecom-timing och
gnss-insär undantagna från detektering av kopierad kod, under samma policy och motiveringstest som de andra katalogerna. SonarCloud-kvalitetsspärren hade blivit röd på duplicering i ny kod (4,0 % mot 3 %), och varje duplicerat block var en enhetsrad eller en ITU-T-maskpost.
0.27.3 - 2026-09-25#
Tillagt#
scenarios/small-uas-jammed-nav.toml: hur länge en liten drönares navigering håller efter att GNSS störs ut med jamming. Den kör en tröghetsenhet av mikroelektromekanisk typ (MEMS) i flygkontrollerklass, en Bosch BMI088, mot en enhet av taktisk klass. GNSS-signalen (Global Navigation Satellite System) är nominell i 100 s och nekas sedan i 60 s (jamming-demo.tomlvisar varför en jammer i närheten gör så). BMI088:s bias är de residualer som finns kvar efter kalibrering vid start, hämtade från temperaturkoefficienterna i dess datablad (BST-BMI088-DS000-19 rev 1,9): 0,015 °/s per K för gyrot och < 0,2 mg per K för accelerometern. Två antaganden är flaggade i filen: en uppvärmning på 10 K efter kalibreringen och fortsatt uppvärmning på 1 K per minut under flygning. Driften under flygning är felet som filtret inte hinner lära sig innan jamming börjar, och det är den som avslutar glidflygningen. Varje värde är modellerat; för att validera det krävs flygloggar från en miljö med jamming.kshana example small-uas-jammed-navskriver ut det.Varje
gnss-ins-sensor kan ställa in sitt eget filterprior ([imu_quantum.filter_prior]eller[imu_classical.filter_prior], medsigma_accel_biasochsigma_gyro_bias). Standardvärdet är oförändrat, så varje befintligt scenario ger samma resultat. En konsumentklassenhets residuala gyrobias ligger omkring 26 sigma utanför standardvärdet för taktisk klass, där filtret aldrig skulle lära sig den. Ett prior som inte är ändligt och positivt avvisas, och resultatet ekar priorn när en är inställd.kshana example [<name>]ger en registeranvändare ett scenario att köra. Encargo install kshana-användare har den körbara filen men ingen katalogscenarios/, så det första kommando som varje snabbstart gav misslyckades. Kommandoradsgränssnittet (CLI) bär nu de 75 referensscenarier som kan köras på egen hand, byte för byte, inbyggda i binären, kompilerade frånscenarios/(src/bundled_scenarios.rs; tabellen finns i CLI-binären, så Python-wheelen och WebAssembly-modulen växer inte).kshana examplelistar dem;kshana example clock-holdover > clock-holdover.tomlskriver ut ett. De övriga två filerna finns bara i repositoryt:lunar-llr-datumläser arkiverad data för månlaseravståndsmätning som bara levereras med repositoryt, ochquantum-pnt-demonstrator.suiteär ett studiemanifest som kör tre syskonfiler med--study. Att be om någon av dem anger varför och avslutar med 2 i stället för att skriva ut något som inte kan köras på egen hand.tests/cli_first_run.rshåller tabellen i linje med katalogen i båda riktningarna, så en ny scenariofil som varken är medföljande eller namngiven som endast för repositoryt misslyckas.Varje kvalitetsmått i ett klock-, bana-, hybrid- eller fusion-resultat anger nu om det är VALIDATED eller MODELLED, i själva resultatet. Resultatdokumentet får ett block
figure_tiers, alltid dess sista nyckel. Det listar varje rapporterat mått (till exempelquantum.fom.timing_p95_ns) med dess nivå — VALIDATED betyder kontrollerat mot en oberoende extern referens, MODELLED betyder en modell från grundprinciper som testas internt — och den rad i verifieringsmatrisen som nivån läses från. Nivån kommer frånsrc/verification.rsgenomsrc/fom_label.rs, så det finns ingen andra tabell som kan glida isär. Innan dess förekom orden "validated" och "modelled" noll gånger i ett clock-holdover-resultat, och den som läste rå JSON (JavaScript Object Notation) hade inget sätt att skilja de två åt. Positionsvärdena förhybridochfusionhar ingen ägande matrisrad, så de listas underuntieredi stället för att få en nivå. Blocket innehåller inga tal. Att det är additivt är bevisat, inte antaget: om det tas bort återfås dokumentet från före ändringen byte för byte, för alla fem kinds (ett motortest), och båda golden-testerna (tests/registry_golden.rs,tests/cross_platform_golden.rs) tar nu bort exakt denna nyckel, och bara när den är den sista, och hashar sedan resten mot sina oförändrade frysta konstanter. En lista i varje test fastställer vilka scenarier som måste bära blocket, så att undantaget inte i tysthet kan vidgas.En
telecom-timing-kind svarar i en tidssynkroniseringsingenjörs enheter: tidsfel, maximalt tidsintervallfel (MTIE) och tidsdeviation (TDEV), var och en med PASS eller FAIL och en marginal mot maskerna från International Telecommunication Union Telecommunication Standardization Sector (ITU-T). Maskerna är avskrivna från de utgåvor som gäller: G.8272 (07/2025) för klasserna A och B av den primära referenstidsklockan (PRTC), G.8272.1 (2024) Amd. 1 (07/2025) för den förbättrade PRTC i låst läge och i holdover (inklusive dess tidsfelskuvert, som stiger från 30 ns till 100 ns under en holdover-period som sätts av hur länge klockan var låst), G.8273.2 (2023) Amd. 2 (11/2025) för telecom-gränsklockor och tidsslavklockor, klasserna A till D, och G.8271.1 (2022) Amd. 3 (05/2025) för nätgränserna vid referenspunkt C. Varje post som de rekommendationerna lämnar "för vidare studier" saknas, uppskattas inte, ochdocs/TELECOM-TIMING.mdlistar varje tal med dess tabell eller klausul och varje post som utelämnades. Rapporten anger också tiden till dess att varje tidsfelsbudget överskrids: som standard holdover-standardvärdet 100 ns för ePRTC, en nätallokering för holdover på 400 ns, gränsen 1 100 ns vid punkt C och det heltäckande kravet på 1,5 mikrosekunder för klass 4.Indata är antingen en syntetisk holdover eller en egen serie. Den syntetiska använder en av fyra oscillatorförinställningar (en ugnsstyrd kristalloscillator, en rubidiumnormal, en cesiumnormal och en chipskalig atomklocka), var och en med stabilitets-, åldrings- och temperaturvärdena från ett namngivet Microchip-datablad. Hur dessa värden blir vitt, flicker- och slumpvandringsfrekvensbrus, åldrande och en temperaturterm anges i varje rapport och märks MODELLED. En egen serie är
[time_s, time_error_ns]-par, inbäddade (så körs det i webbläsaren) eller, i nativa byggen, från en fil med kommaseparerade värden. MTIE/TDEV-tabellen, med varje vald masks gräns bredvid, skrivs som körningens CSV-artefakt.scenarios/telecom-prtc-holdover-24h.tomlär en holdover med rubidium på 24 timmar med åldrande, flicker och en daglig temperaturcykel: dess största tidsfel är 603,2 ns, den passerar 100 ns 8 206 s efter bortfallet och håller sig inom 1,5 mikrosekunder hela dygnet, och den faller på holdover-kuvertet för förbättrad PRTC, som en klocka som inte är av cesiumklass ska göra.scenarios/telecom-tie-ingest.tomlvisar den inbäddade indatan. MTIE och TDEV som kinden rapporterar kontrolleras mot paketet allantools på en incheckad holdover-serie med 2 048 prov, exakt för MTIE och till 1.1e-15 för TDEV, så matrisen får en VALIDATED rad och två MODELLED (masktranskriptionen och förinställningarna) och står nu på 171 rader — 65 VALIDATED, 102 MODELLED, 4 PARTNER. Täckningen av fältenheter går från 60 av 61 kinds till 61 av 62, och från 1 742 till 1 788 beskrivna fält. Kinden är ny och additiv: inget befintligt scenario, ingen fastlåsning och inget publicerat värde flyttas.Lekplatsen kör motorn i en Web Worker i bakgrunden, så ett långsamt scenario fryser inte längre sidan.
web/engine-worker.mjsär värd för WebAssembly-motorn ochweb/engine.mjsvidarebefordrar varje scenariokörning dit — körningar, parametersvep och exporterna SP3 / OMM / OEM / CSV. En körning som varar längre än 150 ms visar ett upptaget läge (Run inaktiverad, "Running… N s") och en Cancel-knapp som avslutar och startar om workern; en webbläsare som inte kan starta en modulworker faller tillbaka på den gamla vägen i huvudtråden.cislunar-arc-recovery, som utelämnades ur katalogen eftersom den fryste sidan, är tillbaka i den, märkt som långsam: den tar omkring 13 s i Chrome (fyra motoranrop på omkring 3 s vardera), under vilken tid sidan förblir responsiv.Varje rapporterad storhet i
cislunar-observabilitybär nu en enhet, en proveniensklass och en definition — den näst sista kinden på undantagslistan för hela craten. Alla 41 numeriska fält i dokumentet RELEASED är beskrivna, så täckningen av fältenheter går från 59 av 61 kinds till 60 av 61 och från 1 698 till 1 742 beskrivna fält, medan efterslepet av fält utan definition är oförändrat på 239.Detta blockerades av den fastlåsning som fryser det släppta dokumentet, som namngav
unitssom en nyckel som dokumentet aldrig får få. Att lägga till en hade inneburit att ta bort det påståendet och ta om baslinjen för tre hashar i tre filer — en form som inte går att skilja från att dölja en regression. I stället bevisar de två fastlåsningar som mäter detta dokument nu att tillägget är additivt: var och en tar bort blocketunitsigen och hashar om mot den konstant som frystes innan blocket fanns, och båda konstanterna är oförändrade. En mutation bekräftar att garantin är verklig — flytta ett släppt värde och ta om baslinjen för hela dokumentets hash så som en slarvig fix skulle göra, och ta-bort-och-hasha-om misslyckas ändå. Den tredje fastlåsningen, i det generiska registry-golden-testet, har fått ny baslinje i linje med de sex syskon som fick ny baslinje av exakt detta skäl, och dess värdebärande literalexpect_summaryflyttas inte.realtime-frame-eoprapporterar mot vilken sanning varje Earth-orientation-rad bedömdes och hur ofta reservvägen användes.table3_joint_eop[].{ut1, polar_motion,combined}fårtruth_sourceochtruth_fallback_rows. Golvetfinalbedöms mot Bulletin B final och kan bara använda epoker som publicerar en; varjedN-rad bedöms mottruth_pm()/truth_ut1(), som faller tillbaka på Bulletin A:s snabba värde. I den medföljande utdraget för 2026 är det 12 av 31 prov vid en dag, mot 0 vid golvet — så golvraden och prediktionsraderna bredvid den vilar på mätbart olika sanning, vilket rapporten nu anger i stället för att överlåta åt läsaren att dra slutsatsen av ett antal prov som stiger där nästlade horisonter säger att det inte kan göra det.moonlight-service-volumeavger en storleksmatchad keplersk baslinje.ephemeris_comparison.keplerian_matchedkör om den illustrativa konstellationen vid den HÄMTADE uppsättningens egna antal satelliter, närvarande bara när antalen skiljer sig åt. Antalet är en del av den utformningens geometri — RAAN och medelanomali sprids båda som360k/n— så utan det bedömdes en hämtad uppsättning med fem satelliter mot en illustrativ med åtta, och utformning blandades ihop med storlek. För LANS-referensuppsättningen med fem satelliter visar det sig att 8,68 av gapet på 14.24 poäng i täckning beror på de tre saknade satelliterna och bara 5,56 poäng på utformningen; för de fyra farkoster som verkligen finns i månbana når en särskilt byggd uppsättning med fyra satelliter 4,86 % där de når 0 %. Ett test fastställer att den matchade raden är en ombyggd konstellation och inte den konfigurerade omdöpt, vilket var hur den först skrevs och vad körningen sedan rapporterade.Nio förmågekort på den publika webbplatsen, som täcker 22 rader i verifieringsmatrisen som levererades utan något kort på produktnivå. Motorn hade vuxit till en familj av förmågor — ARAIM-kontrollen mot publicerade referensvektorer från Working Group C, verklig hämtad geometri för månkonstellationer, månens nekandekontur med ett uppmätt C/N₀-band, steget från VLBI-schema till stationskovarians, optisk och RF-överlämning med felinjektion över modaliteter, prediktion av jordorientering i realtid mot arkiverad Bulletin A, delning av apertur mellan navigering och kommunikation, INS/TRN-glidflygning samt täckning av enheter och proveniens — var och en med en matrisrad och ett medföljande scenario, och ingen av dem nämnd på kshana.dev. Täckningen mellan kort och rader går från 72 av 168 rader till 94.
Åtta scenarier har lagts till i lekplatsens katalog. Knappen Run på ett förmågekort visas bara när
web/app.jsockså innehåller filen; sex kort namngav ett scenario som den inte innehöll, så de visades utan någon möjlighet att köra dem — ett av dem, datumet för verklig laseravståndsmätning, hade varit i det tillståndet sedan det levererades.tests/scenario_examples_doc_sync.rsspärrar nu invarianten i båda halvorna: ett korts mål förrunmåste vara medföljande underscenarios/och erbjudas av katalogen. Mutationstestat mot båda felfallen.moonlight-service-volumeavger sin geometri per satellit som<scenario>.table.csvnär en exportplats är konfigurerad (G11). Det är den största array som craten publicerar — 2304 rader i den släppta gemensamma tabellen för kommunikation och navigering — och den nådde konsumenter bara inuti JSON, den form som kapade en syskonscenarios kurva med 57 punkter till 23 punkter under en kolumn som påstod sig innehålla alla. En rad per länk, radantalet på rubrikraden, antennkolumnerna närvarande bara när en antenn var konfigurerad. En körning utan exportplats är byteoförändrad och skriver ingen fil.SBOM:en beskriver nu det som levereras: 60 komponenter blev 66.
scripts/gen-sbom.shlistade varje paket i resolven för standardfunktionerna, inklusive dev-dependencies. Det gjorde attsgp4ochchrono— crates som bara används i test och inte kompileras in i någon artefakt — fanns med i materialförteckningen, och att kedjan--features pythonsom PyPI-wheelen länkar (pyo3,pyo3-ffi,pyo3-macros,pyo3-macros-backend,pyo3-build-config,portable-atomic,target-lexicon,heck) saknades, vilken är den wheelens gräns mot främmande funktioner. Skriptet går nu genom resolve-grafen från paketet kshana via enbart normala kanter och build-kanter, över unionen av funktionsuppsättningarna default,pythonochwasm(npm-paketet bär samma SBOM), för varje målplattform. Det fastlåsta CycloneDX-formatkontrollutslaget har fått ny baslinje genom sin incheckade generator: 60 → 66 komponenter, 53 → 60 sammansatta licensuttryck, och fortfarande noll schemafel när dessa har placerats i standardformenexpression.CSV-tabellen för reproducerbarhet når varje ingång, inte bara CLI:et och Python-wheelen. MCP-servern får ett sjunde verktyg,
export_table_csv, som kör ett scenario och returnerar den bytestabila tabell som CLI:et skriver som<scenario>.table.csv— eller ett fel som namnger de kinds som publicerar en (realtime-frame-eop,lunar-time-budget,lunar-jammingochmoonlight-service-volumebara närexport_site_lat_deg+export_site_lon_degär satta). WebAssembly-modulen fårtable_csv, som returnerar samma text ellerundefined. MCP-rundturstestet och Python-bindningarnas tester låser nu den returnerade CSV:n byte för byte mottests/golden/realtime-frame-eop.csv, och låser attRunOutput.write_csvreturnerar skrivna bytes, och 0 utan att någon fil skapats för en kind utan tabell. Varje yta som anger antalet MCP-verktyg eller listar verktygen säger nu sju.run_alli WebAssembly-modulen: en motorkörning för varje utdata.run,chart_svg,summaryochtable_csvkör var och en scenariot från början, så lekplatsen betalade för fyra fullständiga körningar per klick — omkring 12 s i stället för 3 s förcislunar-arc-recoveryi en webbläsare.run_allreturnerar{json, svg, summary, csv}från en körning, och lekplatsen använder nu den. Den stämmer med de fyra separata anropen byte för byte.
Rättat#
REVISION: kopplingen för gyrobias i GNSS/INS-filtret hade fel tecken, och avbrottsvärdena för
gnss-insändras. Det utökade Kalman-filtret (EKF) med felstillstånd håller båda tröghetsbiaserna som residualer (sant minus den löpande skattningen, återmatat genom addition). Accelerometerkolumnen drev hastighetsfelet med+C_b^n b_a, men gyrokolumnen drev lägesfelet med−C_b^n b_g. En residual gyrobias roterar i själva verket det beräknade läget med+C_b^n b_g, så varje skattning av gyrobias knuffade åt fel håll. Paketet förblev stabilt bara för att dess standardprior för gyrobias (1e-4 rad/s, 1-sigma) var tillräckligt snäv för att hålla dessa tillstånd stilla. Med ett bredare prior divergerade filtret även när den sanna gyrobiasen var noll: 93 m fuserat avbrottsfel blev 4,3 km. De publicerade värdena förscenarios/gnss-ins.tomländras enligt följande:gnss-ins.tomlföre (≤ 0.27.2) efter kallatom-IMU, fuserat avbrotts-RMS 96,1 m 1,9 m kallatom-IMU, glidflygning inom specifikation (50 m) 30 s 60 s (hela avbrottet) taktisk IMU, fuserat avbrotts-RMS 62,5 m 3,1 m taktisk IMU, glidflygning inom specifikation (50 m) 37 s 60 s (hela avbrottet) De fritt gående värdena (130,7 m och 314,3 m) ändras inte; de använde aldrig filtret. Paketets tidigare tolkning, att den fuserade glidflygningen begränsas av ett golv för överlämningsläge och därför inte förbättras med en bättre sensor, var en artefakt av detta fel och är tillbakadragen. Med konstanta, brusfria biaser lär sig filtret dem nu medan GNSS är tillgängligt, så den fuserade glidflygningen är ett bästa fall. Den externa filterpy-referensen (
tests/gnss_ins_sensor_fusion_reference.rs) kontrollerar bara mätuppdateringarna, vilket är varför den aldrig såg propageringen. Två tester kontrollerar nu tecknet direkt och båda faller på det gamla. Det första, iclosed_loop.rs, matar en känd residual gyrobias genom strapdown och kräver att filtret förutsäger det resulterande lägesfelet inom 2 %. Det andra kräver att ett brett prior lär sig en gyrobias på 1e-3 rad/s och håller sig inom 6 m. Det plattformsoberoende golden-testet förgnss-inshar fått nya fastlåsta värden av detta skäl och inget annat.Varje snabbstart för register körs nu som skriven på en ren maskin. Uppmätt före denna ändring läste exemplen för crates.io och PyPI (Python Package Index)
scenarios/clock-holdover.toml, som en registerinstallation inte har, och npm-exemplet kraschade under Node.js medTypeError: fetch failed, eftersom paketetsinit()hämtar sin WebAssembly-binär och Node:sfetchinte kan läsa en lokal fil. Nu:README.crates.mdochREADME.pypi.mdbär det scenariot inbäddat, somREADME.npm.mdredan gjorde. Rust-blocket är ett helt program med sin egenmain, eftersom raden# Ok::<…>, dold för rustdoc, som det tidigare slutade med visas på crates.io och inte kompilerar när den klistras in.tests/readme_code_fences_doc_sync.rskompilerar det fortfarande byte för byte, och avvisar nu även en dold rad i blocket.README.npm.mdskiljer webbläsaren från Node.js och ger ett Node-recept som läser binären från disk och skickar den tillinitSync. Doc-sync-testet accepterarinitSyncsom den laddare wasm-bindgen genererar.- Alla tre bäddar in scenariot med sina provenienssträngar oförkortade, så scenariohashen är
5ba83a232b94på varje yta. Npm-exemplet brukade förkorta dem, vilket gav det en annan hash än CLI:et. - Reproducerat från lokala byggen av detta träd: ett nytt
cargo new-projekt med ett sökvägsberoende på den paketerade craten byggde och körde Rust-exemplet; en wheel byggd med maturin från de paketerade källorna, installerad i en ny virtuell miljö, körde Python-exemplet; och paketetwasm-pack --target web, packat och installerat med npm, körde Node-receptet. Alla tre skrev ut samma sammanfattningsrad.
cargo run -- <scenario.toml>fungerar från en klon.Cargo.tomlsätterdefault-run = "kshana". Utan det vägrade cargo med "could not determine which binary to run", vilket varje rad medcargo run --i dokumentationen drabbades av.CLI:ets fel under första minuten säger vad man ska göra härnäst. En scenariosökväg som inte finns lägger nu till ett tips som pekar på
kshana example, och ett andra positionellt argument skriver ut användningstexten och namnger även argumentet.--help,--version, felet för okänt alternativ (exit 2) och--validate:s enradigaok:vid framgång fanns redan på main.tests/cli_first_run.rstäcker nu alla dem, eftersom inget test körde binären för något av dem tidigare.list_kinds()i Python är dokumenterad som att den returnerar en JSON-sträng, inte en lista. Den returnerar samma metadata somscenario_kinds(), serialiserad, så att iterera över den går igenom tecken. Den behåller sin strängretur så att befintliga anropare inte går sönder.kshana.pyi, bindningens doc-kommentar,docs/PYTHON_API.mdochREADME.pypi.mdsäger nu så och pekar påscenario_kinds().De tre README-filerna för register skriver ut varje förkortning vid första användningen. PNT är nu utskrivet i sloganen, där det först förekommer, och CLI, TOML, JSON, SVG, CSV, CSAC, HTML, URL och API är utskrivna i de filer som använder dem. Rubriken på tabellen över oberoende referenser säger inte längre "CI-gated" innan CI är definierat.
Rättade ett publicerat värde: tillgänglighet för ARAIM med två konstellationer på de medföljande Celestrak-TLE:erna för GPS + Galileo.
docs/CAPABILITY.mdangav att tillgängligheten stiger från 0,21 till 0,67 när Galileo poolas, under ett VAL på 12 m, och att det konstellationsfelrobusta läget är begränsat med bara två konstellationer. Det kom fråntests/araim_dual_real_data.rssom propagerade varje satellit från sin egen TLE-epok (parse_propagatorssläpper epoken), och epokerna i dessa filer spänner över 70,6 h (GPS) och 335,7 h (Galileo), så satelliterna befann sig vid inbördes oförenliga tidpunkter. Testet behåller nu varje epok (parse_tle) och utvärderar varje satellit vid ett gemensamt UTC-ögonblick, den senaste TLE-epoken i uppsättningen (2026-06-07T07:21:04). Den uppmätta tillgängligheten över samma rutnät på 24 h med 289 prov blir enbart GPS 0,993 (var 0,208), poolad 1,000 (var 0,671) och konstellationsfelrobust dubbel 0,990 (var 0,031); vid APV-I-gränsen går det dubbla läget från 0,180 till 1,000. Slutsatsen vänds: på en konsistent himmel bär två konstellationer hypotesen om konstellationsfel vid ett VAL på 12 m. Samma värden fås med den tidigaste TLE-epoken som referens. En självkontroll i testet låser dess tillgänglighetsloop prov för prov motaraim_dual_constellation_availability, så den enda skillnaden är tidsjusteringen.docs/CAPABILITY.mdochdocs/REAL_TLE_GUIDE.md§3 bär de nya talen; posten för 0.13.0 nedan lämnas som släppt.De publika ytorna marknadsför inte längre RINEX 4 som validated. Motorn avvisar nu en RINEX 4-navigationsfil vid namn i stället för att avkoda den fel, men standardrutnätet visade fortfarande ett kort "RINEX 3 / 4" med en validated-pill, bunden till navigationsparserns RINEX-3-evidens. Kortet är nu "RINEX 3", och README,
docs/CAPABILITY.md,docs/STANDARDS.md,ROADMAP.mdoch förmågesammanfattningen anger vad som är sant: RINEX 3.0x-observationsfiler tolkas, observationslayouten 4,00 förväntas göra det men ingen 4,00-fil har lästs genom koden, och RINEX 4-navigationsfiler avvisas.--validatesäger när "ok" betydde att det inte fanns något att kontrollera. Omkring två tredjedelar av katalogen publicerar inget obligatoriskt fält — de paketen kör sin referenskonfiguration från en tom kropp — så lintern kunde bara skriva ut "ok" för dem, med samma ord som den använde efter att ha kontrollerat sex fält. Framgångsraden anger nu antalet obligatoriska fält som den fann närvarande, eller att kinden inte kräver något.scripts/gate.shavvisar ett icke-numerisktREPEATellerTEST_THREADS. Under bash 3,2 gjordeREPEAT=noatt den numeriska jämförelsen gav fel och utvärderades som falsk, så spärren meddelade "repeatability loop SKIPPED (REPEAT=0)" för ett värde som inte var 0 och skrev ändå ett kvitto. Båda inställningarna avslutar nu med 2 om de inte är rena heltal.MSRV anges som 1,85 överallt där en människa läser det.
Cargo.tomlflyttades till 1,85 i förra releasen; README-märket, installations- och felsökningstexten,codemeta.jsonoch MCP-cratens egen motivering sa fortfarande 1,75.RunOutput.__repr__i Python-bindningen rapporterar bytes, inte "chars". Den skrev utlen()av UTF-8-strängar, vilket är ett antal bytes: 710 "chars" för en tabell med 708 tecken.README dokumenterar inte längre
--study --study-nametillsammans.--study-nameär en flagga för ett enda scenario, ignorerad med--study(binären varnar). De två exempel att kopiera och klistra in i README.md och README.crates.md visar nu studiekommandot ensamt.Webbplatsens evidens för klockstabilitet anger båda observerade toleranserna. Serien för cesium 5071A reproduceras till ≤ 3e-5 och PHASE.DAT till ≤ 5e-5; stycket angav 3e-5 för båda.
Två filer med motorutdata spåras inte längre.
scenarios/quantum-pnt-demonstrator.study.{json,html}stämplades av motor 0.20.0 med varje kvalitetsmått tomt, och README:s eget studiekommando skrev över dem, smutsade ner trädet och blockerade push-spärren.*.study.json/*.study.htmlignoreras nu som de andra fyra motorutdatafilerna.Ett seed-svep i lekplatsen misslyckas inte längre vid varje körning. Svepet steg heltalsreglaget
seedlinjärt (1, 10,9, 20,8, …), och motorn, som läste det somu64, avvisade varje bråkvärde. Heltalsreglage sveper nu distinkta heltal.Varje nedladdning från lekplatsen anger vilken motor och vilken indata som gjorde den. Några kinds (t.ex.
realtime-frame-eop) avger ingetengine_versionellerscenario_hash, så deras nedladdningar fick det vanliga namnetkshana-csv.csv. Namnet faller nu tillbaka på den inlästa motorns version och ett FNV-1a-64-fingeravtryck på 12 hex-tecken av scenariotexten.
Ändrat#
Den publicerade craten är mindre än hälften så stor som förut, och
cargo install kshanabygger enbart CLI:et. Paketet brukade innehålla artiklarna, deras inlämningspaket, artefakterna med artikelfigurer, notebooks,docs/, underhållsskripten och exempelprogrammen. Inget av dem kompileras av biblioteket eller CLI:et. Det innehöll också de tre interna generatorerna undersrc/bin/(crossover_study,gen_validation_artifacts,validation_report), så en registerinstallation kompilerade och installerade fyra körbara filer, tre av dem användbara bara i en utcheckning. Dessa träd och de tre generatorkällorna är nu exkluderade. Cargo listar ett pakets binärer utifrån de filer det innehåller, så det publicerade manifestet namnger barakshana. I en klon hittas generatorerna fortfarande automatiskt, såcargo run --bin <name>och releasejobbet som körvalidation_reportär oförändrade. Mätt medcargo package: 763 filer, 16,7 MiB, 6,8 MiB komprimerat före; 591 filer, 10,5 MiB, 3,0 MiB komprimerat efter. Dess verifieringsbygge, som bara kompilerar de paketerade filerna, går igenom.cargo install --pathpå den paketerade craten installerade en körbar fil,kshana.Utdata som en tidssynkroniseringsingenjör kan läsa: inga fler
p95 0.0ns, inga flersecurity 0.000utan angrepp, och webbplatsens antal stämmer med README-filerna. Detta är en visningsrevision. Inget publicerat tal ändras; JSON-värdena är identiska, vilket golden-hasharna ovan bevisar.- Enradssammanfattningen skrev ut den optiska klockans tidsfel vid 95:e percentilen (p95) som
0.0nsmedan tabellen bredvid visade 1.20e-4 ns. Ett tidsvärde som inte är noll men för litet för en decimal skrivs nu ut med tre värdesiffror (p95 1.20e-4ns); en exakt nolla skrivs fortfarande ut som0.0. HTML-rapporten (HyperText Markup Language), studiens jämförelsetabell och lekplatsens nedladdningsbara rapport använder samma regel, så inget värde som inte är noll skrivs heller ut som0.000. securityär en analytisk gräns för spoofingdetekterbarhet som bara betyder något mot ett konfigurerat angrepp. Kindsclock,orbit,hybridochfusionkonfigurerar inget, så deras sammanfattning skriver nu utsecurity n/a (no attack)i stället för ett tal som0.000som läses som en misslyckad detektering. Värdet finns kvar ifom.security, markeratapplicable: falsemed skälet ifigure_tiers, och rapporttabellerna visar "not applicable". Kindenspoofbedömer fortfarande detektering.- Två sammanfattningsfastlåsningar i
tests/registry_golden.rsflyttades av exakt dessa två skäl och inga andra:golden_clock(kvant-p95 och båda värdena försecurity) ochgolden_orbit(båda värdena försecurity; dess p95-värden är exakt noll). Deras hashar för hela dokumentet flyttades inte. De förväntade sammanfattningarna i README, de tre handledningarna och deras undervisningsscenarier är uppdaterade så att de stämmer, ochtests/tutorials.rskontrollerar undervisningskopiorna mot motorn. - Lekplatsens guidade tur öppnas inte längre vid första inläsningen. Dess modala ruta fångade de första klicken och dess spotlight scrollade sidan bort från där besökaren landade. Den startar från knappen "Take the 60-second tour" eller den flytande Tour-knappen.
- Sidan scrollar inte längre i sidled på en telefon. Vid 390 px kom varumärkesraden och GitHub-knappen upp i omkring 410 px innehåll, ett överskott på 4 px; sidhuvudet ryms nu från 320 px och uppåt, och tabellen med kvalitetsmått scrollar inuti sin egen ruta i stället för att vidga sidan.
- Förmågeutforskaren inledde med sitt eget antal kort ("46 capability cards … 17 backed by an external oracle") bredvid README-filer som säger 64 av 168. Den inleder nu med verifieringsmatrisen, läst från den genererade
web/data/verification-matrix.json(samma matris som README-antalen är fastlåsta mot), och nämner korten efteråt som det sammanfattande lager de är.web/counts.test.mjs, ett nytt steg i arbetsflödet för kontinuerlig integration (CI), kontrollerar aritmetiken och korskontrollerar README.md och sidans beskrivningar;tests/web_validation_counts_doc_sync.rslåser fast kopplingen från Rust-sidan.
- Enradssammanfattningen skrev ut den optiska klockans tidsfel vid 95:e percentilen (p95) som
Den publika beskrivningen inleder nu med tidssynkronisering och holdover, den bäst validerade domänen. Öppningen av README och
docs/POSITIONING.mdpresenterar Kshana som en öppen, reproducerbar, proveniensmärkt evidensmotor för PNT-resiliens: tidssynkronisering och holdover för kritisk infrastruktur först (estimatorerna för Allan, modifierad Allan, tidsdeviation och maximalt tidsintervallfel samt holdover-inversionen av glidflygningsvarians är de VALIDATED rader som ligger bakom), kvant som en neutral avvägningsmetod mellan kvant och klassisk vars resultat märks MODELLED, och navigering på Månen / cislunärt och i djuprymd som underhållna förmågor snarare än huvudrubriken. Båda sidorna säger nu vad Kshana inte är — inte en simulator för radiofrekvenssignaler eller en rigg för hardware-in-the-loop, inte en ersättning för MATLAB/Simulink, STK eller Orekit — och pekar på den nya kindentelecom-timingochdocs/TELECOM-TIMING.md. Den gamla raden "there is no good open tool" är borta: en sökning som inte hittar något är inget belägg för att inget finns.ROADMAP.mdfår en odaterad prioritetsordning (tidssynkronisering först, kvantavvägningen som andra, månen underhållen) och tappar tre inaktuella poster (Coriolis- och ljusförskjutningssystematik, NRHO-begynnelsevillkoren och månscenariot, alla levererade); README:s rad "Coriolis and light-shift remain roadmap" rättas på samma sätt.docs/CAPABILITY.mdslutade underdriva. Raden för jordfasta referenssystem sa "none" medan matrisen graderar GCRS→ITRS VALIDATED; den är nu "full", och raden för kärnreferenssystem anger ANISE-korskontrollen som levererad. Guidat läge var upptaget som färdplan; lekplatsen har levererat guidade reglage och en guidad tur. En genomgång motsrc/verification.rsrättade fem rader till som föregick sina valideringar: kraftmodellen Cowell och banbestämning med batch/sekventiell metod mot Orekit 12,2, markstationspassager mot Orekits elevationsdetektor, kärnan för geometrisk försämring av precisionen mot gnss_lib_py och OEM-import mot den oberoende parsernoem; raden för verifiering och validering namnger nu de spärrar som kontrollerar att varje citerat test finns.Ordlistan förklarar vad en resultatfil säger.
docs/GLOSSARY.mdfår förklarande poster på klartext för utdatatermerna (holdover, p95, integritet, säkerhetspoängen, PDOP,sigma_y,q_wf), termerna för telecom-tidssynkronisering (tidsfel, max|TE|, cTE, dTE, MTIE, TDEV, PRTC, ePRTC, T-BC, T-TSC, OCXO, CSAC) och de tre evidensnivåerna (VALIDATED, MODELLED, PARTNER).Förkortningar skrivs ut vid första användningen i varje handskrivet publikt dokument. README och 24 filer under
docs/hade flera hundra förkortningar som användes före sin utskrivna form, eller utan den; var och en är nu utskriven där den först förekommer i den filen. De tre genererade filerna (docs/VERIFICATION-MATRIX.md,docs/MODELLED-RATIONALE.md,docs/SCENARIOS.md) lämnas orörda: de skrivs frånsrc/verification.rsochapi::list_scenario_kinds(), så deras formuleringar måste ändras vid källan.Radtäckningen har ett mätvärde som gäller som referens.
docs/COVERAGE.mdanger 95,63 % (37 697 av 39 419 rader) från CI-jobbetcoveragepåb1d350d, ochtests/coverage_figure_doc_sync.rslåser de fem publika ytornas "~96%" mot det — det enda rubriktal som var handunderhållet, och som redan hade flyttats en gång obemärkt.Nya doc-sync-spärrar för ytor som inget läste.
tests/readme_code_fences_doc_sync.rskontrollerar varjeimport { … } from "kshana"i ett JavaScript-block mot WebAssembly-exporterna, och låser Rust-exemplet i README.crates.md byte för byte mot en kopia som testbinären kompilerar.tests/security_md_doc_sync.rsfaller omsrc/lib.rsförlorar#![forbid(unsafe_code)]eller SECURITY.md slutar ange det.tests/no_overclaims.rssöker nu också igenomweb/README.mdoch de tre README-filerna för register, och varje standard på webbplatsen måste ange sinproofuttryckligen.De två kontrollerna av klockor med verklig hårdvara körs på en runner.
realdata-clock.yml(månadsvis och vid dispatch) hämtar serierna 5071A och PHASE.DAT och kör båda testerna medKSHANA_REQUIRE_REALDATA=1, så att en saknad indata ger fel i stället för att hoppas över. Båda hämtningsskripten är låsta till en och samma allantools-commit och verifierar SHA-256.Python-typstubben kontrolleras mot den byggda wheelen (
mypy.stubtesti bindningsjobbet), vilket är hurcsv/write_csvlevererades utan stub.Ordlistan definierar URE, EOP, FoM, CTI och TIB, som README och registret använde utan förklaring.
Varje kinds publicerade fältkontrakt är nu sant, och ett test håller det så. Fem av de 61 kinds ändrades. Kinds med ett icke-tomt
required_fieldsgår från 21 till 22:ephemeriskräver nutle|orbit+epoch(ett bartkind = "ephemeris"brukade passera--validateoch sedan misslyckas i körningen), ochquantum-tradelägger tillcandidate_adev_taus+candidate_adev_values|candidate_clock_class, som dess körning redan krävde. En obligatorisk post får använda|(en av dessa) och+(alla dessa tillsammans);--validateförstår båda.lunar-joint-od-clock,pvtochearth-gnss-lunarpublicerar 9 verkliga valfria fält som de hade utelämnat.docs/SCENARIOS.mdsäger nu attkindär obligatoriskt för varje kind utomclock.tests/required_fields_are_true.rskontrollerar varje kind mot dess medföljande scenario: att ta bort någon obligatorisk post måste få körningen att misslyckas, och ett dokument som bara innehåller de obligatoriska fälten måste kunna köras.Anteckningarna för JetBrains Marketplace är spärrade.
scripts/check-version-sync.shmisslyckas nu om inte den nyaste posten<change-notes>iplugin.xmlnamnger den version som levereras; sju publicerade versioner hade serverat anteckningarna för 0.22.0 oförändrade.Den tekniska rapportens täckningsvärde är det uppmätta.
paper/kshana-technical-report.mdsa "near 97 %"; den säger nu nära 96 % (95,63 % uppmätt,docs/COVERAGE.md) och är den sjätte yta som täckningstestet låser.Motorklienten utanför huvudtråden är testad (
web/engine.test.mjs, i CI): tillåtelselista för dispatch, avbryt och starta om, de tre reservvägarna i huvudtråden och krashåterställning, mot en låtsasworker.Ingenting publiceras förrän den taggade committen har klarat sina tester, och en release är inte klar förrän varje register serverar den. Ordningen är nu tagg, verifiering, publicering, paritet, webbplats, i en körning av
release.yml(docs/RELEASING.md).- Publiceringen väntar på utslaget.
publish.yml,mcp-publish.ymlochjetbrains-plugin.ymlstartar inte längre vid tagg-pushen;release.ymlanropar dem från jobb somneeds: verify. Tidigare tävlade de mot den: vid v0.27.2 hade crates.io, npm och Python Package Index (PyPI) alla publicerat inom 4,5 minuter efter taggen, ochverifyreturnerade 84 minuter efter den; vid v0.27.0 publicerade npm och PyPI medan crates.io-jobbet misslyckades. En manuell omkörning på en tagg hålls tillbaka av den nyascripts/check-release-verdict.sh, som kräver en grönverifyför exakt den committen från Actions-gränssnittet och vägrar i alla andra fall. - Allt byggs innan något laddas upp, och crates.io, vars paketeringssteg är det som misslyckades mitt under en release, publicerar först.
- En saknad registertoken får jobbet att misslyckas i stället för att hoppa över uppladdningen och rapportera framgång.
- En paritetskontroll efter publicering.
scripts/check_channel_parity.pyfrågar crates.io (kshanaochkshana-mcp), npm, PyPI (källdistributionen och alla sex plattformswheels) och ghcr.io tills var och en serverar versionen, eller låter körningen misslyckas; docs.rs och registret för Model Context Protocol (MCP) rapporteras, men krävs inte. Körd mot tidigare releaser visar den att 0.22.0 saknas på npm och PyPI, 0.23.0 på PyPI och 0.27.0 på crates.io. - Färdigbyggda kommandoradsbinärer för macOS (Apple silicon och Intel) och Windows x86-64, namngivna efter mål (
kshana-aarch64-apple-darwinoch så vidare), bredvid Linux-binärenkshana, vars namn är oförändrat. En filSHA256SUMStäcker varje tillgång, ochverify-releasekontrollerar den och kör macOS- och Windows-binärerna på deras egna system. - kshana.dev visar en release, inte
main. Den brukade driftsättas om vid varje push tillmainmedan dess sidor namngav den senaste releasen.pages.ymlbygger nu bara en releasetagg: releasen skickar den en gång när varje kanal serverar versionen, och en manuell dispatch driftsätter om den senaste releasen (eller en namngiven). - En källa till wheels. Den handkopierade matrisen med sex mål i
publish.ymlär borta; den anroparwheels.yml, så att auditwheel-taggspärren och kontrollen av byte-reproducerbarhet nu bedömer de wheels som PyPI tar emot, och ett fel i någon av dem stoppar releasen. - Låsta byggverktyg. Varje arbetsflöde begär Rust 1.93.0 (jobbet msrv sin egen version);
publish.ymlochpages.ymlhade begärt@stable, och loggen för v0.27.2 visar att rustup installerade 1.98.1 och sedan kompilerade med 1.93.0 bara för attrust-toolchain.tomlväger tyngre. wasm-pack är låst till 0.13.1 (den version som byggde v0.27.2, som det olåsta installationsskriptet valde) med en kontroll av checksumma, och mcp-publisher till 1.8.1 med dess publicerade SHA-256.scripts/check-toolchain.shmisslyckas nu om ett arbetsflöde begär en annan kompilator eller pipar ett nedladdat skript in i ett skal. Inget verifieringsjobb, ingen golden-fastlåsning och inget lokalt spärrskript togs bort eller lättades.
- Publiceringen väntar på utslaget.
Säkerhet#
Varje GitHub Action från tredje part är låst med commit-SHA — 93 referenser i 15 arbetsflöden, 92 av dem nya — med taggen kvar som avslutande kommentar för att Dependabot ska uppdatera den. Undantaget är
dtolnay/rust-toolchain, vars tagg är verktygskedjans väljare.Basskikten i MCP-serverns avbild är låsta med multi-arch-digest, och Dependabot bevakar nu Dockerfile för
mcp/kshana-mcp, så att OS-skikten fortfarande får säkerhetsuppdateringar — genom en granskad PR.Kontrollen av tagg mot manifest körs i de två publiceringsarbetsflöden som levererar taggens version.
mcp-publish.yml(ghcr-avbild, MCP-registret) ochjetbrains-plugin.yml(Marketplace) tävlar motpublish.ymli stället för att vänta på det, så en felaktigt skuren tagg spärrades bara i ett syskon. Båda kör nuscripts/check-version-sync.shföre bygget.Fyra säkerhetsrådgivningar som Dependabot gav upphov till den dag dess varningar slogs på är åtgärdade. MCP-servern flyttas från
rmcp1,7 till 2,2: tre rådgivningar motrmcp< 2,1 (en läcka i sessionstabellen för Streamable-HTTP, saknad validering av OAuth-skyddade resurser, anpassade rubriker som följer en omdirigering mellan ursprung) — inga nåbara här, eftersom servern bara talar stdio, men en publicerad crate bör inte låsa en sårbar SDK. Makrona irmcp2 kräver Rust 1,88, så enbartkshana-mcpdeklarerar nurust-version = "1.88"; biblioteketkshanastannar på 1,85. Den enda API-ändringen (Content→ContentBlock) är genomförd, och rundturstesterna går igenom. SonarQube-skanningsåtgärden flyttas från v5 till v6, vilket åtgärdar en rådgivning om argumentinjektion (≥ 4,0, < 6,0).
0.27.2 - 2026-09-22#
Tillagt#
Varje Rust-objekt som en rad i verifieringsmatrisen citerar slås nu upp mot craten. Den befintliga spärren kontrollerade citat som såg ut som filsökvägar; 63 av de 164 raderna som inte är partnerrader namnger sin evidens som ett objekt i craten i stället —
navsignal::code_tests,integrity::tpl_scalar::tests,api::tests::tracking_loop_kind_round_trips_through_the_dispatch— och ett token utan ändelsen.rsvar osynligt för en sökvägsskanner. De raderna kunde ha namngett en omdöpt modul, en tömd testmodul eller en funktion som aldrig funnits, och varje spärr hade förblivit grön.tests/verification_rows_name_a_test_that_exists.rslöser alla 339 sådana citat genom modulträdet, kräver att varje rad som inte är en partnerrad namnger minst ett test som faktiskt bär#[test], och kräver att partnerrader inte namnger något. Fyra mutationer användes för att bedöma det: att döpa om en citerad modul, att peka en rads enda testcitat på en funktion som inte är ett test, att döpa om den verkligamod testsoch att ta bort attributen#[test]från den — var och en blir röd på det påstående som äger den.En rad var redan fel: Alternative / complementary PNT citerade
tests/*, en glob, som inte är ett citat. Den namnger nutests/alternative_complementary_pnt_reference.rsoch de tre testmodulerna i craten bakom den.De publicerade figurerna kontrolleras på nytt mot motorn vid varje bygge (
tests/published_figures_still_reproduce.rs). De tre demodiagrammen i README är motorns egen utdatachart.svgoch inget körde om scenariot; artikelns två crossover-studier genererades en gång och checkades in; och README anger fyra kvalitetsmått i löptext bredvidscenario-fom.png. Alla tre är nu låsta mot levande motorutdata.Att pussla ihop dem gav det användbara resultatet: demodiagrammen hade ritats vid motor 0.22.0 och artikelns crossover-JSON vid 0.20.0, och vid 0.27.1 är varje plottat värde i alla fem artefakter identiskt — de tre diagram-SVG:erna skiljer sig från en ny körning med exakt två tecken vardera, versionsstämpeln i fotraden. Diagrammen har ritats om så att fotraden stämmer. Artikelns JSON lämnas medvetet stämplad 0.20.0: den är protokollet över den körning vars figur en publicerad artikel bäddar in, och att stämpla om den skulle göra anspråk på en proveniens som PDF:en inte har. Spärren kontrollerar i stället den starkare egenskapen — att den nuvarande motorn fortfarande reproducerar varje publicerat värde.
Rättat#
SonarCloud-analyser registrerades som
VERSION=not provided, så attprevious_versionför ny kod aldrig avancerade: den var fortfarande förankrad vid analysen 2026-07-02, bedömde åttiotvå dagars arbete som ett enda delta och mätte 7877 "nya" duplicerade rader mot en tröskel på 3 %. Skanningen skickar nu cratens version. Den underliggande dupliceringen är verklig och döljs inte av detta: den är koncentrerad till de deklarativa registrenFieldUnitsom upprepas iensemble,hybrid,fusion,inertialochreport, och i verifieringstabellen med 168 rader, och den namnges här som arbete att göra i stället för att uteslutas ur mätningen.scripts/gate.shhade inget lås för en enda skrivare, och varje körning skrev samma logg. Det handlar inte om ordning och reda: kvittotsintegration_binaries,tests_passedochtests_ignoredläses tillbaka UR den loggen, och pre-push-kroken litar på kvittot. En spärr som hade dödats men vars testbinär fortfarande levde fortsatte skriva i den fil som nästa körning just hade trunkerat — så en körnings antal kunde ha redovisats som en annans, och tillåtit en push på grundval av en svit som aldrig kördes på det träd som pushades. Det är nu en spärr per utcheckning (den vägrar med exit 75 bredvid en levande, och rensar ett gammalt lås vars pid är borta) och en logg per körning, medtarget/gate-run.loguppdaterad från den körning som avslutas på vägen ut. Båda riktningarna är testade: en levande pid vägras, en död rensas.src/verification.rspåstod att dess tester "do not prove the named test/oracle strings resolve to live code". Två spärrar gör nu precis det, så modulens dokumentation sa motsatsen till sanningen; den anger nu vad som kontrolleras maskinellt och vad som lämnas åt mänsklig bedömning. En inaktuell hänvisning tillverification::gen— modulen heterartifacts— är rättad i syskonspärrens egen dokumentation.
Ändrat#
mainskrevs om 2026-09-22 och force-pushades. Tio commits blev fyra. Omskrivningen vek in varje commit som lämnade en spärr röd i den commit som rättade den, så att varje commit påmainnu har ett träd som går igenom, och tog bort de avbrutna körningar som en samtidighetsgrupp över hela grenen hade lämnat på varje ersatt commit.Ingenting kastades bort. Commits från före omskrivningen går fortfarande att nå genom de taggar som pekar på dem, och det slutliga trädet är byteidentiskt med det träd som omskrivningen utgick från —
git diffmellan den gamla toppen och den nya är tom förutom de tre arbetsflödesfiler som denna release ändrar.De ersatta SHA:erna, för den som håller en referens till någon av dem:
gammal ämne 9733177docs(changelog): disclose the authorship rewrite and the two dangling crate sha1s 5d16ea8fix(docs): the engine-flow diagram said 6 figures of merit; the engine scores 7 148d31dfix(test): two more cross-platform pins, and two wrong assumptions of my own a3a2667feat(web): surface the lunar cluster on the site — seven capability cards 1e8bec6docs(lunar): document 42 public fields and ratchet the ceiling down to 985 7bba514chore(release): v0.27.0 3154548test(docs): guard the distribution diagram, the last unguarded one 7864142chore(release): v0.27.1 Taggarna v0.27.0 och v0.27.1 flyttades medvetet INTE. De pekar fortfarande på
7bba514och7864142, de exakta commits vars träd gav de artefakter som nu är live på crates.io, npm, PyPI, ghcr.io och MCP-registret. En cratens.cargo_vcs_info.jsonregistrerar den sha1 den paketerades från, register är oföränderliga, och SLSA-attesteringen av byggproveniens på tillgångarna i releasen v0.27.1 är bunden till den committen. Att flytta taggarna hade lämnat varje en av dessa publicerade artefakter pekande på en commit som inte längre finns. Genom att lämna dem förblir de gamla commits nåbara och varje publicerad provenienskedja löses upp, till priset av två taggar som inte längre är förfäder tillmain— vilket är varför denna release finns: v0.27.2 germainen egen tagg, paketerad från en commit som finns på den.Detta är den andra redovisade omskrivningen av den här historiken; den första, 2026-09-21, kanoniserade författarskap och är dokumenterad i anteckningarna för 0.27.0 med sina egna två hängande crate-sha1. En omskrivning redovisas här varje gång, eftersom ett repository som säljer verifierbar proveniens inte i tysthet kan flytta marken under en publicerad artefakt.
0.27.1 - 2026-09-22#
Rättat#
Den publicerade craten kompilerade inte.
src/lunar_orientation.rsinnehåller eninclude_str!på översta nivån avtests/fixtures/llr_geometry/de440_moon_pa.csv, och manifestet exkluderar/tests/fixturesfrån paketet, så tarbollen som crates.io tog emot saknade en fil som biblioteket självt bäddar in. Publiceringen av v0.27.0 misslyckades i sitt verifieringsbygge av det skälet och ingen 0.27.0 nådde crates.io; npm och PyPI, vars jobb inte beror på det, publicerade som vanligt. Exkluderingen har nu ett undantag för just den katalogen.Varje annan
include_str!av en fixtur isrc/ligger inuti en#[cfg(test)]-modul och når därför aldrig det paketerade biblioteket. Bara en på översta nivån gör det.Ingenting i CI körde
cargo package, vilket är varför en tarboll som inte kan kompileras först upptäcktes av publiceringsjobbet, efter att två andra register redan hade levererat. Ettpackage-jobb bygger och kompilerar nu exakt tarbollen vid varje push.
Ändrat#
- Fastlåsningarna för utdata från månreferenssystemets realisering flyttas inte längre vid en versionshöjning. SVG-fotraden bär motorversionen, så varje release tog om baslinjen för tre hashar — två gånger på en dag — och en fastlåsning som tas om rutinmässigt slutar läsas. Versionssträngen normaliseras till en platshållare före hashningen, och utdata kontrolleras separat för att ange den körande versionen, så att det faktum kontrolleras mer exakt än hashen någonsin gjorde.
0.27.0 - 2026-09-22#
Tillagt#
lunar-llr-datum— månens referensdatum från en verklig observationskampanj.lunar-frame-campaignersatte en injicerad Helmert-transformation med en simulerad kampanj och sa det: dess stationsnätverk, dess schema och dess sigma per observation är illustrativa indata. Detta scenario tar bort simuleringen från de två ställen där ett schema och en felmodell går in i svaret. Epokerna är sändningstiderna för 337 arkiverade normalpunkter från ILRS lunar laser ranging (2015-04-08 .. 2015-06-27, Grasse MeO 7845 och Matera MLRO 7941, alla fem retroreflektorgrupper), och varje observationsvikt är den normalpunktens egen arkiverade precision,bin_rms / sqrt(n_raw)— en median på 5,13 mm enkelriktat avstånd, hämtad ur filen och inte vald här. Stationskoordinaterna kommer från IERS ITRF2020 och reflektorkoordinaterna från JPL DE430 Table 7; varje fixtur registrerar en URL, ett hämtningsdatum och en SHA-256 och regenereras från sin källa av en incheckad generator som verifierar källan och avbryter i stället för att avge ett tal. Rapporten namnger vilka länkar som är uppmätta och vilka som förblir modellerade, och de modellerade är uppmätta: observerat-minus-beräknat enkelriktat avstånd över de verkliga data är 156 494 m RMS, vilket samma testuppsättning bekräftar mot JPL Horizons över samma tidsspann (195 655 m RMS-vektor, sämsta epok 0,054° — inom de ~0,3° som den inbyggda analytiska månserien själv gör anspråk på). Additivt: en ny kind, en ny läsare (realdata::llr_crd) och en ny modul (lunar_llr); de befintliga paketen för månens referenssystem är låsta bit för bit.sigma_ure_msom scenarioparameter pålunar-integrityochmoonlight-service-volume. Noggrannheten i avståndsmätningen för signal i rymden var en konstant vid kompileringen (LUNAR_SIGMA_URE_M), så ett svep över servicevolymen kunde bara besvara klarar/klarar inte vid ett enda fast värde. Skyddsnivåerna är exakt linjära i den, så att exponera den gör om svepet till ett krav på noggrannhet i avståndsmätningen över hela volymen. Standardvärdet reproducerar tidigare beteende bit för bit.Export av geometri per satellit på
moonlight-service-volume:export_site_lat_deg+export_site_lon_deglägger till en arrayper_sat_geometrysom anger azimut, elevation och snett avstånd till varje satellit vid varje epok för en namngiven selenografisk plats, plus synlighetsflaggan. Den aggregerade täckningssammanfattningen slår medvetet ihop geometrin per satellit, men snett avstånd är exakt vad en länkbudget förbrukar, så en gemensam analys av kommunikation och navigering kunde inte göras enbart utifrån sammanfattningen. Avstängd om inte båda koordinaterna anges; rent additivt.lunar_service::topocentric, den publika hjälpfunktionen för blickvinkel bakom exporten.En rad i verifieringsmatrisen för den nya geometriförmågan.
Det verkliga antennmönstret i geometriexporten. Motorn har sedan P1 haft ett mönster för en likformigt belyst cirkulär apertur (
antenna::pattern_gain_dbi, Airy-formen[2·J₁(x)/x]²) och ingenting utanförantenna.rsanvände det — i stället gjorde en boresight-förstärkning ihop med en tumregel för förstärkning mot strålbredd jobbet. En valfri tabellexport_antennapåmoonlight-service-volume(läses bara när exportplatsen är satt) ger nu varje exporterad rad vinkeln utanför borelinjen vid satelliten och sändningsförstärkningen mot platsen från det mönstret, och lägger till ett blockantenna_patternsom rapporterar antalet inom strålen under det verkliga mönstret bredvid antalet inom strålen under den symmetriska approximationen (θ₃dB[deg] = √(31000/G_lin)) med skillnaden som en namngiven korrektion. Båda talen avges; inget ersätter det andra. Uppmätt vid motorns egen representativa månapertur (1 m parabol, 2,4 GHz, η = 0,60) över en plats vid sydpolen och det illustrativa skalet i LCNS-klass skiljer sig de två åt med mer än en satellit: det verkliga mönstret lägger 0 av 76 synliga länkar inom halveffektstrålen, approximationen påstår 28 — en korrektion på −2,33 satelliter per epok, sämsta enskilda epok 3. Approximationen bär en egen aperturverkningsgrad (0,641 mot den regel på70·λ/Dgrader som den normalt anges med, 0,920 mot en likformig cirkulär apertur), så på en parabol med η = 0,60 ger den en stråle som är 1,238× för bred; blocket avger båda de underförstådda verkningsgraderna i stället för att lämna dem åt läsaren att dra slutsatser om. Rent additivt: uppmätt över den dokumenterade arbetspunkten, 597 befintliga löv, 0 ändrade, 0 borttagna, 494 tillagda.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_COEFFochlunar_service::nadir_off_boresight_rad, de publika delarna bakom det. Mönstret är nu också förankrat mot de publicerade Airy-konstanterna och inte bara mot sig självt: halveffektskorsningen hittas genom bisektion och jämförs medx = 1.61634, vilket ger den exakta halveffektsbredden1.02899·λ/Doch registrerar ärligt att den konventionella koefficienten1.02placerarpattern_gain_dbivid −2,955 dB, inte −3,010 dB.En reproducerbarhetstabell i långt format för
lunar-time-budget. Scenariots arrayvärderade utdata — rutnätet för medelvärdestider, de sju kurvornax(τ)per term och deras kvadratsumma — nådde konsumenter bara som JSON-arrayer. En släppt tabell kapades vid 400 tecken och publicerade 23 av sina 57 medelvärdestider under en kolumn som påstod sig innehålla alla, och manuskriptet byggde om kurvorna per term från slutna former eftersom motorn aldrig avgav dem. En vanlig körning skriver nu också<scenario>.table.csvmed en rad per (rutnätsindex, medelvärdestid, term), som inte kan kapas till något som ändå ser helt ut. Rutnätsindexet är en exakt sammanfogningsnyckel;τskrivs med 13 värdesiffror och varjexmed 7, så att bytena inte förgrenas mellan bygget av samma källa. Rent additivt: rapport-JSON är byteidentisk.Rapporten för
hybrid-optical-rfbeskriver nu sig själv. Ett blocklink_configurationekar de lösta länkindata — bärvågens våglängd, sändar- och mottagarapertur, avstånd, pulsbredd, integrationstid, verkningsgrader och förluster — med standardvärden tillämpade, så att en artikel anger den konfiguration den kördes med i stället för att citera ett standardvärde läst ur källkoden. Ett blockunitsanger enhet och proveniensklass för varje storhet som en artikel sannolikt citerar. Spåren för kovarians vid överlämningen är anledningen till att det finns: de avgavs som en barvarianceoch ett manuskript drog slutsatsen kvadratmeter av en intern konsistenskontroll. Slutsatsen var riktig, vilket är precis varför det var en brist — inget hade fångat om den varit fel. Rent additivt: uppmätt över fyra konfigurationer, 456 befintliga fält, 0 ändrade, 0 borttagna, 196 tillagda.En rad i verifieringsmatrisen för reproducerbarhetstabellen för tidsbudgeten, ärligt
InternalConsistency/ MODELLED — totalen kontrolleras mot kvadratsumman av termerna i samma fil, som delar motorns egna termdefinitioner och därför inte är en oberoende referens. Tillsammans lägger dessa till tre rader. Den löpande totalen för det här osläppta avsnittet är 168 rader — 64 VALIDATED, 100 MODELLED, 4 PARTNER.
Ändrat#
Commit-författarskapet i hela historiken är nu en enda identitet, och två publicerade crates pekar på en commit som inte längre finns. Den 2026-09-21 skrevs git-historiken om så att varje mänsklig commit är författad och committad av
ashfordeOU <236818772+ashfordeOU@users.noreply.github.com>. Den bar tidigare tre stavningar av en person — 688 commits somashfordeOU <contact@ashforde.org>, 34 somChakshu Baweja <contact@ashforde.org>och 94 redan kanoniska. Den endadependabot[bot]-committen lämnades medvetet som sin egen författare: att byta etikett på en bots beroendeuppdatering skulle göra anspråk på författarskap till arbete som ingen här gjort.Inget innehåll ändrades. Omskrivningen rörde bara rubrikerna för författare och committer, och det går att kontrollera i stället för att bara påstå: trädet för varje tagg och varje gren är bitidentiskt med vad det var förut.
v0.26.0löses fortfarande upp till trädet92284e9420605568f1bfabb78cd95d383b40f3e2, precis som förut.Vad det kostade. En commits namn är en hash över dess träd, dess föräldrar och dess författarrubriker, så att ändra en förfader byter namn på varje ättling. Releasecommitten
v0.26.0vardce2dbf7700788cf6de46260c14673c0e5347360och är nud4921f3025569e00e425e1747d0acfc261e96e18. Två artefakter registrerade det gamla namnet vid publiceringen och kan inte rättas, eftersom en publicerad registerversion är oföränderlig till sin konstruktion:kshana0.26.0 på crates.io —.cargo_vcs_info.jsonregistrerardce2dbf…kshana-mcp0.26.0 på crates.io — samma sha1,path_in_vcs: mcp/kshana-mcp
Inget annat påverkas. Npm-paketet registrerar ingen
gitHead, och PyPI-distributionen registrerar ingen commit alls; båda kontrollerades i stället för att antas.Det finns ingen reparation som får
dce2dbf…att namnge den omskrivna committen: den strängen är den gamla släktlinjen, och det enda sättet den löses upp är att behålla den gamla historiken publicerad, vilket skulle återställa det författarskap som omskrivningen tog bort. Proveniensen för 0.26.0 går därför genom taggen och inte genom den registrerade sha1 — och taggen levererar identiska bytes som craten byggdes från. Nästa release registrerar en giltig commit utan att något behöver göras.
Rättat#
realtime-frame-eophade som standard en EOP-fil utan prediktionsrader (G12). Scenariot bäddade in ett utdrag avfinals2000Amed fem rader, endast slutgiltiga, som sin standard för offline, så en bar körning rapporteradepredicted_rows.n = 0och tabellen per horisont vilade på 5, 4, 3 och 2 par. Motorn kunde alltid läsa en prediktionsrad — indata hade helt enkelt inga. Standarden är nu det ordagranna IERS-utdraget för 2026 (tools/finals2000A_2026.txt, MJD 61173–61204): 20 slutgiltiga från Bulletin B och 12 rader med enbart prediktion från Bulletin A, så en bar körning utan filargument och utan nätverk rapporterarpredicted_rows.n = 12och en tabell per horisont vid n = 20 / 31 / 30 / 29, och jämförelsen med den operativa prediktorn och överensstämmelsen med produktens egna publicerade prediktioner fylls också i. Det långa utdraget med 45 rader mättes som alternativ och avvisades: det är också endast slutgiltigt, så det hade lämnatpredicted_rows.npå 0. Detta flyttar publicerade tal, under regel R4 och med grundarens tillstånd: tio av de 22 cellerna i den släpptap4_frame_eop.csvoch 24 av de 42 ifyllda cellerna itests/golden/realtime-frame-eop.csv. Den uppmätta polgolvet för snabb-minus-slutgiltig blir 0,0678 mas (från 0,0769 mas), vilket är det värde som artikel P4:s egen tabell för polarrörelse redan publicerar vid n = 20 — de två stämmer nu i stället för att skilja sig med 13,5 %. Varje annat värde som P4 skriver ut från den här tabellen är oförändrat vid den utskrivna precisionen. Hela uppräkningen gammalt → nytt, inklusive de fält som inte flyttades, finns idocs/revisions/G12-default-eop-cell-changes.md. Utdraget med enbart slutgiltiga levereras fortfarande, byte-låst och använt: ett antal prediktionsrader på noll i det är filens egenskap, och ett test bevisar det fortfarande.En inaktuell begränsning av antalet satelliter i
moonlight-service-volume. Scenariot begränsaden_satstill 12 fastän dess egen konstellationsbyggare stöder 24 och ett test påstår 24, så varje begärt antal över 12 reducerades i tysthet och ett svep över antalet satelliter gav identiska värden över 12 — omöjligt att skilja från verklig geometrisk mättnad. Nu begränsas det vid byggarens gräns. Detta är en beteendeändring bara förn_sats > 12.Samma inaktuella begränsning i
lunar-differential-pnt.lunar_dpntbegränsaden_satstill 12 med samma följd, och den här nådde en publicerad tabell:dpnt_nsats_sweep.csvhar en radn = 16som är byteidentisk med sin radn = 12, eftersom motorn returnerade ett svar för tolv satelliter under en etikett för sexton satelliter. Nu begränsas det vid byggarens gräns på 24, och ett nytt test låser det — varje större konstellation måste både rapportera sitt eget antal och strikt förbättra skyddsnivån, så att begränsningen inte kan återvända obemärkt. Detta flyttar publicerade tal: skyddsnivån förn = 16blir 16,92 m → 14,57 m. Svept till 24 är kurvan strikt monoton (11,94 m vid 24 satelliter, 29,5 % bättre än vid 12), så det finns ingen mättnad vid 12 — den uppenbara platån var begränsningen. Beteendeändring bara förn_sats > 12.
0.26.0 - 2026-09-18#
En release för dokumentation, transparens och lekplats. Ingen motorbeteendeändring: verifieringsmatrisen står på 102 rader — 56 VALIDATED, 42 MODELLED, 4 PARTNER, oförändrat sedan 0.25.0.
Tillagt#
- Rustdoc på cratenivå (
//!ilib.rs) som täcker ingångspunkter, modellen för ärlighet och nivåer samt reproducerbarhet, så att docs.rs öppnas på en riktig startsida i stället för en naken modulvägg. docs/SCENARIOS.md— en referens per kind för alla 50 scenario-kinds, genererad frånapi::list_scenario_kinds()(den enda källan till sanning) avgen_validation_artifactsoch bevakad avtests/scenarios_reference_doc_sync.rs, så att den inte kan glida ifrån dispatchern.- Moduldokumentation för de 11 tidigare odokumenterade publika modulerna (
allan,estimator,fom,hybrid,inertial,models,report,run,scenario,timetransfer,types). - Litteraturkällor för fem formelmoduler som angav en ekvation men inte namngav någon referens:
batch_ls(Tapley/Schutz/Born; Bjorck),cr3bp(Szebehely; Koon m.fl.),detection(Kay),attitude_budget(Wertz; Sidi),reentry(Allen-Eggers, NACA TR-1381). - En publicerad
security.txtpå kshana.dev för samordnat avslöjande av sårbarheter. - Valideringsnivå per körning i lekplatsen. Tabellen med kvalitetsmått för en enskild körning bär nu en pill VALIDATED/MODELLED per mått, läst från samma uppslagning
fomTier()som den nedladdningsbara rapporten använder (som speglarsrc/fom_label.rs, i sin tur härledd från verifieringsmatrisen), så att nivån som visas bredvid ett levande tal aldrig kan skilja sig från registret. lunar-attack-surfacei lekplatsens meny — alla 50 kinds som går att dispatcha är nu ett klick bort (var 49/50).- Fem förmågekort till som går att köra (rymdväder, utvärdering av RF-störningar, resiliens, CCSDS OEM-interoperabilitet, KIF), vilket lyfter antalet körbara kort från 11 till 16. Kort som bara gäller API och bibliotek behåller en ärlig länk till dokumentationen i stället för en falsk körknapp.
Ändrat#
- Dokumentationstäckningen har nu en spärr som bara får gå åt ett håll i CI.
check-doc-coverage.shkompilerar biblioteket medmissing_docs, räknar varningarna och misslyckas bara om antalet stiger över ett fastlåst tak (986). En hård#![warn(missing_docs)]under-D warningshade förvandlat ~1000 för närvarande odokumenterade publika objekt till ett byggstopp över en natt; på det här sättet får nya odokumenterade publika objekt bygget att misslyckas medan det befintliga efterslepet betalas av med avsikt.
Rättat#
- Raden för MCP-verktyget
list_scenario_kindsannonserade "~17 built-in scenario kinds" medanapi::list_scenario_kinds()hade exponerat 50 en tid — ett dokument riktat till agenter som underdrev den verkliga förmågan med en faktor tre. Låst till det sanna antalet. - Omgenererade CycloneDX-SBOM:ens referens för formatkontroll för den uppdaterade beroendegrafen (60 komponenter). Utslaget för formatkontrollen är oförändrat: noll normaliserade schemafel och varje atomärt licens-id finns fortfarande i den officiella SPDX-uppräkningen.
0.25.0 - 2026-07-15#
Tillagt#
- Fem förmågor uppflyttade till externt VALIDATED, var och en nu korskontrollerad mot en oberoende tredjepartsimplementation av samma entydigt definierade storhet (icke-cirkulärt, med fixturer som kan regenereras offline):
- IEEE-1139-konvertering från potenslag till Allan-deviation mot slutna former i
allantoolsför alla fem brustyper (tests/powerlaw_oadev_reference.rs); - CRPA MVDR / vikter för nollstyrande strålformare med minsta norm mot numpy/scipy LAPACK (
tests/crpa_reference.rs); - Wahba / TRIAD / QUEST för lägesbestämning mot SciPys SVD
Rotation.align_vectorspå brusfria observationer (tests/wahba_reference.rs); - CCSDS 502,0 OEM-utbyte av kovariansblock som rundturas genom den oberoende parsern i biblioteket
oem(tests/ccsds_oem_covariance_reference.rs); - kärnan för detekteringsstatistik vid kvadratlagsakvisition (generaliserad Marcum-Q / P_d / P_fa / tröskel) mot SciPy
ncx2/chi2(tests/acquisition_reference.rs). Den maskinkontrollerade valideringsmatrisen flyttas till 56 VALIDATED · 42 MODELLED · 4 PARTNER över 102 rader (var 51 · 47 · 4). Ärliga förbehåll om omfattning bevaras — t.ex. gäller uppflyttningen av akvisition bara kärnan för detekteringsstatistik; CFAR/straddling loss förblir MODELLED.
- IEEE-1139-konvertering från potenslag till Allan-deviation mot slutna former i
- Kvalitetsmått i positionsdomänen (
fom::positioning_performance): exakta CEP, SEP och 2DRMS från en navigationslösnings 3D-ENU-positionskovarians plus en horisontell skyddsnivå. CEP/SEP är de exakta mediana radiella felen (inte den linjära regeln0.589·(σ₁+σ₂)), korskontrollerade mot kvantiler för rayleigh/maxwell iscipy.statsoch en oberoende median från NumPy-Monte-Carlo (tests/positioning_fom_reference.rs). Ersätter den tidigare ärliga stubben för ej implementerat — funktionssignaturen ändrades från()som returnerar ett fel till(cov_enu, hpl_m)som returnerar enPositioningFom. - Ekvivalenta frihetsgrader (EDF) för konfidensintervall är nu kompletta för alla estimatorer i Allan-familjen (
assurance::uncertainty::edf): EDF för modifierad Allan, Hadamard och total varians använder nu algoritmen för kombinerad EDF av Greenhall & Riley och formen TOTVAR i NIST SP 1065 Table-7 (tidigare var bara EDF för överlappande Allan implementerad; de övriga återanvände den i tysthet), korskontrollerade motallantoolsedf_greenhall/edf_totdev(tests/uncertainty_edf_reference.rs). - Oberoende externa korskontroller för geometri, DOP, EOP, DRO och RF-avståndsmätning i månens PNT (
tests/validate_p*.rs, med fixturer och referensgeneratorer undertests/fixtures/{p1_footprint,lunar_service,eop_prediction,rf_ranging_precision,dro_family_jpl,p2_independent_dop}/). Varje kontroll driver en redan levererad modellerad förmåga mot en referens som produceras av en annan implementation, så att samstämmigheten är icke-cirkulär: orbitalfotavtrycket för sändning/infångning motscipy.special.j1(Cephes — en genuint annan Bessel J1); DOP för ytbeaconernas geometri mot en oberoende NumPy-lösning av(HᵀH)⁻¹; tillväxten av prediktionsfelet för persistens i UT1/EOP mot en separat NumPy-omtolkning av samma ordagranna IERS-raderfinals2000A; familjen av plana avlägsna retrograda banor mot NASA/JPL:s Three-Body Periodic Orbit Database; och budgeten för RF-avståndsmätningens precision mot en referens från grundprinciper. Dessa är ytterligare regressionsevidens för befintliga moduler; att lägga till de här korskontrolltesterna ändrar i sig inte etiketten på någon förmåga (de fem uppflyttningarna ovan är separata statusändringar med stöd av referenser isrc/verification.rs). - Scenariot
lunar-attack-surface(src/attack_surface.rs,kind = "lunar-attack-surface"): en sammansatt, binärnåbar (CLI / Python / MCP / wasm viarun_toml) P1-körning av signalsäkerhet för Månen som sammanfogar effektunderskottet i länkbudgeten och dess känslighetsband på 12–18 dB, den sändareffekt som krävs för jamming/spoofing mot avstånd, orbitalt infångningsfotavtryck under ett verkligt antennmönster, utfallet av spoofing-infångning i spårningsslingan, räckvidden mot horisonten för kroppar utan atmosfär och autentiseringsbudgeten för OSNMA/TESLA. En tom kropp reproducerar P1-baslinjen. - Känslighetsband för effektunderskott (
linkbudget::deficit_sensitivity_band,deficit_power_factor): ett genuint svep över flera axlar (referens × EIRP × snett avstånd) byggt påsweep::SweepAxisoch utvärderat genomreceived_signal_power_dbw, som reproducerar P1-bandet på 12–18 dB och förenar de linjära faktorerna 32× (avrundad) / 36× (oavrundad). - Tredimensionell kub för spoofing-infångning (
spoof_capture::capture_cube): lägger till axeln för bärvåg/Doppler-förskjutning i infångningskartan (J/S × kodförskjutning × bärvågsförskjutning, låsningstid per cell); skivan med noll bärvågsförskjutning reduceras exakt till den 2-D-formadecapture_map.
Ändrat#
- Detektering med glest övervakningsnätverk (
monitor_network) sammansätter nu den fysiska AGC-statistikenspoof_monitorsoch det selenografiska synlighetsrutnätetlunar_serviceför att härleda varje stations detekteringsstatistik och geometri, i stället för fria parametrar och en ad hoc-överlappning över storcirklar; sannolikheterna för detektering per övervakare och för nätverket förblir de slutna formerna med chi-två/Marcum-Q idetection. FältenSurfaceMonitor/SpoofEventändrades till fysiska storheter (lat/lon/höjd/effekt).
Rättat#
- Dimensionering av autentiseringsöverhead för OSNMA/TESLA (
nma_budget): fältdelarna per sida i OSNMA (8 bitar HKROOT + 32 bitar MACK per sida om 2 s) var felmärkta som totaler per delram, vilket underskattade överheaden 15× (1,33 bit/s). Rättat till de publicerade totalerna per delram om 30 s i SIS-ICD (HKROOT 120 + MACK 480 bitar ⇒ 20 bit/s). Följden anges nu ärligt: vid en navigationstakt för AFS på 50 bit/s är autentiseringsöverheaden en förstaordningskostnad på ≈40 %, inte några försumbara procent; fältetauth_latencydokumenteras som fördröjningen för nyckelavslöjande (en nedre gräns för den heltäckande tiden till första autentiserade positionsbestämning).
0.24.0 - 2026-07-09#
En bred förmågerelease. Den levererar två fullt externt validerade analyssviter — en komplett familj för multikriterie-beslutsanalys (MCDA) och estimatorerna för Allan-vandring / klockstabilitet vid långt τ — och öppnar ett nytt lager av körbara scenarier för månens tidsbudget, ramverk/EOP i realtid, optisk/RF-hybrid, cislunär observerbarhet och konfliktresiliens i lagerindelad PNT ovanpå substratet, plus ett substrat för förmågor kring månens ytbeacons och signalsäkerhet. Den maskinkontrollerade valideringsmatrisen växer till 51 VALIDATED · 47 MODELLED · 4 PARTNER över 102 rader (var 40 · 47 · 4 över 91): alla elva nya rader är valideringar mot externa referenser av beslutsanalysen och tidsestimatorerna, kontrollerade mot oberoende bibliotek (SciPy, pymcdm, pyDecision, allantools) med snäv tolerans, medan den nya PNT-förmågeytan ärligt redovisas som MODELLED. Som alltid uppgraderas inget numeriskt modellpåstående utan en extern datamängd bakom sig.
Tillagt#
Scenarier som går att köra — var och en en registrerad scenario-kind, dispatchad genom motorn och bevisad från början till slut i CI av tests/determinism.rs (som kör varje medföljande scenarios/*.toml och misslyckas hårt vid varje fixtur som inte går att köra):
- Konfliktresiliens i lagerindelad PNT (
conflict-resilience,src/conflict_resilience.rs) — en seedad Monte-Carlo-motor för resiliens för en PNT-arkitektur med flera lager, med en modell för överlevnad vid graciös degradering per vektor i §4,2 (fyra namngivna hotvektorer, den slutna formen för användbar PNT-överlevnad som varje Monte-Carlo per lager konvergerar mot, avgiven i resultat-JSON) och dokumenterad, glidskyddad proveniens för hotparametrar (src/conflict_threat_params.rs). MODELLED arkitekturer; konvergensen från Monte-Carlo för överlevnad till sluten form är den Validated kärnan. - Cislunär observerbarhet (
cislunar-observability,src/cislunar_observability.rs) — ett egenspektrum för observerbarhets-Gramianen över en båge, en differentialkorrigerad frögenerator för avlägsna retrograda banor (DRO) och en oberoende korskontroll med kvadratrotsinformationsfilter vars posteriori-kovarians blir ändlig exakt vid full observerbar rang. MODELLED konstellation; invarianterna för rang/Gramian/STM/SRIF är den Validated kärnan. - Kontinuitet och integritet i heterogen optisk/RF-hybrid (
hybrid-optical-rf,src/hybrid_integrity.rs,src/optical_availability.rs,src/optical_linkbudget.rs,src/cross_raim.rs) — tillgänglighet och integritet över domäner när optisk och RF-baserad PNT kombineras. MODELLED. - Endogen tidsbudget för Månen (
lunar-time-budget,src/lunar_time_budget.rs) och budget för ramverk / EOP i realtid (realtime-frame-eop,src/realtime_frame_eop.rs,src/frame_eop.rs) — P3/P4-budgetarna för månens tid och jordorientering härledda endogent ur tidskedjan i stället för påstådda. MODELLED.
Externt validerade analyssviter — biblioteksförmågor, var och en inkommande i matrisen som nya VALIDATED rader (kontrollerade mot en oberoende extern referens, inte en självkontroll):
- Komplett svit för multikriterie-beslutsanalys (MCDA) (
src/mcda/) — de fyra metodfamiljerna: värdeaggregering (WSM, WPM, WASPAS), kvotsystem (MOORA) och proportionell (COPRAS), avstånd till idealet (TOPSIS), kompromissprogrammering (VIKOR) och överrangering (PROMETHEE II med sex generaliserade kriterieformer, ELECTRE I konkordans/diskordans) — plus AHP med prioritetsvikter från Perron-egenvektorn och Saatys spärr för konsistenskvot (CR < 0,10), MAUT-nytta, extraktion av Pareto-front och känslighetsanalys av vikter. De nio aggregatorerna reproducerar pymcdm / pyDecision och AHP-egenvektorn stämmer med SciPy/LAPACK, alla till < 1e-9 (tests/mcda_*_reference.rs). Känslighetstornadon visas också inuti scenariot för konfliktresiliens. - Allan-vandring och estimatorer för klockstabilitet vid långt τ (
src/allan.rs) — MTIE (den statistik för peak-to-peak-vandring i tidsfel enligt ITU-T G.810/G.823/G.8261 som synkroniseringsmaskerna skrivs mot), tidsdomänvandringen MDEV och TDEV, samt estimatorerna med utökat område Theo1 / TOTVAR. VALIDATED mot allantools på NIST SP 1065-serien; den biasbefriade hybriden ThéoH byggd på TOTVAR förblir ärligt MODELLED. - Harness för assurance / extern referens (
src/assurance/) — ett referensharness kopplat direkt till CI:s ärlighetsspärr, en proveniensjournal enligt W3C-PROV med en deterministisk Merkle-rot, samt Greenhall ekvivalenta frihetsgrader + chi-två-konfidensintervall för stabilitetsestimat. - PackRegistry / ExternalPack som sömmen för utökning (
src/registry.rs,src/api.rs) — en dispatchsöm så att förmågepaket routas genom ett register (inbyggd dispatch ligger på CLI:ets hetaste väg; paket utanför trädet kopplas in bakom enExternalPack::register_intomed standardvärde), bevakad av en golden-svit för byteidentitet och fristående / wasm32-CI-spärrar.
Modellerat substrat för förmågor — nya biblioteksmoduler som matar scenarierna ovan och framtida (ännu inte ett fristående scenario-kind):
- DOP för månens ytbeacons (
src/lunar_beacon.rs) med budget för uppnådd noggrannhet, svep över N satelliter och GDOP-karta, plus en störd månefemerid (src/lunar_perturbed.rs) och geometri för horisont utan atmosfär / invers av spoofing-effekt / underskottsband för AFS (src/jamming.rs,src/linkbudget.rs). Återanvänder DOP-kärnan som validerats mot gnss_lib_py. - Inläsning av DEM i LOLA-format + terrängens siktlinje (
src/realdata/lola_dem.rs). - Trelagersförsvar för signalsäkerhet — spoofing-infångning, korssensorintegritet och dimensionering av övervakningsnätverk (
src/spoof_capture.rs,src/cross_sensor_integrity.rs,src/monitor_network.rs) med ett antennfotavtryck för orbital stråle och en autentiseringsbudget för OSNMA (src/antenna.rs,src/nma_budget.rs). MODELLED.
Ändrat#
- Valideringsmatrisen och varje härledd artefakt omgenererades från den enda källan till sanning (
src/verification.rs): registret på plats, diagrammen över modulkarta och valideringsproveniens, och antalssträngarna i README och per yta anger nu 51 / 47 / 4 av 102 (var 40 / 47 / 4 av 91); spärren för ärliga antal söker nu igenom hela git-historiken, och figurerna i README är enhetliga i den mörka varumärkespaletten. - En gemensam adaptiv integrationsdrivrutin ligger nu bakom både
integrateochintegrate_dopri(src/integrator.rs), vilket tar bort den duplicerade stegaren. - Statisk analys med SonarQube Cloud tillagd i CI (Rust + importerad täckning), med betygsmärken för säkerhet / underhållbarhet / tillförlitlighet i README.
- Disciplin för release och paketering: CI registrerar en driftsättningsmiljö per publicering av paket/register, och det fokuserade publika fristående jobbet är avgränsat bort från de långsamma valideringsbinärerna.
- Hygienspärren mot attribution är avgränsad till markörer för författarskap, så att nämna en integrationsvärd eller en produkt inte längre får bygget att misslyckas.
- Dokumentation: avsnittet Citing i README listar nu de fyra publicerade arXiv-preprinterna, och förmågan DOP för ytbeacons är dokumenterad på månraden.
Ett stycke som namnger AI-klienter från tredje part utelämnas här; det finns i CHANGELOG.md på GitHub.
Rättat#
- Heltalsräknare i loopar som drivs av flyttal (Sonar S2193).
- Noggrann invers chi-två vid låga frihetsgrader genom Newton-förfining i vägen för konfidensintervall i assurance.
- kshana.dev: standardavsnittet öppnas nu som standard och reservvärdet för registerantalet är rättat; inaktuella strängar i README och på webbplatsen kring observerbarhetslagret synkade.
0.23.0 - 2026-06-29#
En förmågerelease som lägger till ett allmänt lager för Fisher-information / Cramér–Rao-observerbarhet och optimal experimentutformning, och den release som artikeln om observerbarhet i månens PNT vilar på. Den maskinkontrollerade valideringsmatrisen växer till 40 VALIDATED · 47 MODELLED · 4 PARTNER över 91 rader (var 39 · 46 · 4 över 89): den nya skattningsmotorn är kontrollerad mot en extern referens och är VALIDATED; dess tillämpning på Månen är ärligt MODELLED. Som alltid uppgraderas inget numeriskt modellpåstående utan en extern datamängd bakom sig.
Tillagt#
src/fim.rs— Fisher-information, Cramér–Rao-gränser och optimal experimentutformning. En allmän, återanvändbar motor för skattningsteori: Fisher-informationsmatrisenM = HᵀWHfrån en mät-Jacobian och vikter; en symmetrisk egenvärdeslösare (cyklisk Jacobi); den nedre Cramér–Rao-gränsen via inversen, eller Moore–Penrose-pseudoinversen plus en nollrumsbas när informationen är rangdefekt (fallet med fritt nätverk / datumdefekt); och D-, A-, E- och T-optimala mått för experimentutformning med enbest_design-väljare över kandidatgeometrier. VALIDATED mot NumPy (eigh/inv) och de publicerade slutna gränserna av Kay (1993) till 1e-9 (tests/fim_observability_reference.rs), så den kommer in i matrisen som en rad med extern referens och inte som en självkontroll.- Observerbarhet för gemensam banbestämning på Månen (
lunar_observabilityisrc/lunar_combination.rs, visad på rapporten för månkombinationen): tillämpar FIM/CRLB-motorn på den gemensamma lösningen för bana och klocka för att visa den absoluta datumdefekten för stationerna, hur rangen återställs när stationer på jordbaslinjer läggs till, den uppnådda CRLB för stationspositionen och den E-optimala konditioneringen. Ärligt MODELLED — skattningsmotorn är externt validerad, men månnätverket den tillämpas på är en representativ simulering, och ingen nuvarande datamängd kan göra den geometrin till en mätning. - Representativ geometri för elliptisk frusen månbana (ELFO) för scenariot månkombination (
orbit_ecc,orbit_inc_deg,orbit_argp_deg,orbit_planes; cirkulär placering förblir standard) och ett observerbarhetsfält utan VLBI på rapporten, så att resultatet om datumdefekt kan visas vara geometrigenerellt. Samma stege 3→1→0 och tröskel på tre stationer gäller på en ELFO i familjen Moonlight/LCNS, och med tre VLBI-baslinjer på jorden är den absoluta stationspositionen observerbar vid en gräns under en meter — låst avelfo_geometry_confirms_the_observability_structure. Fortfarande MODELLED.
Ändrat#
- Valideringsmatrisen och varje genererad evidensartefakt omgenererades från den enda källan till sanning (
src/verification.rs): registret (web/data/verification-matrix.json),docs/VERIFICATION-MATRIX.md,docs/MODELLED-RATIONALE.md, figurerna för valideringsfördelning och typ av referens, och antalssträngarna i README över alla distributionsytor anger nu 40 / 47 / 4 av 91.
0.22.1 - 2026-06-29#
En release enbart för paketering. Inga ändringar av motor, scenarier eller resultat; valideringsmatrisen är oförändrad på 39 VALIDATED · 46 MODELLED · 4 PARTNER över 89 rader.
Rättat#
- npm publish: paketfältet
repository.urlsom härleddes från crate-manifestet använde GitHub-ägaren med fel skiftläge (AshfordeOU), vilket fick npm:s sigstore-verifiering av proveniens att misslyckas (den matchar ägaren skiftlägeskänsligt). Manifestfältetrepositoryär nu det kanoniska med gemenerashfordeOU, så att den genereradepackage.jsonstämmer med proveniensens subjekt och npm-releasen publiceras.
Ändrat#
- Wheel-bygget låser
codegen-units = 1så att manylinux-wheelen är byte-reproducerbar över ombyggen (reproducerbarhetskontrollen med ombygge och diff).
0.22.0 - 2026-06-29#
En konsolideringsrelease med fokus på evidens, proveniens och disciplin i distributionen. Den maskinkontrollerade valideringsmatrisen växer till 39 VALIDATED · 46 MODELLED · 4 PARTNER över sina 89 rader (var 15 · 42 · 4 över 61), drivet av korsvalidering av modellerade förmågor mot oberoende externa referenser. Varje distribuerad artefakt bär nu en kryptografisk SLSA-attestering av byggproveniens, levereras med en CycloneDX-SBOM och publiceras i takt över alla ytor. Inget numeriskt modellpåstående uppgraderas utan en extern datamängd bakom sig; ny förmåga förblir ärligt MODELLED.
Tillagt#
- Lägesdynamik (
src/attitude_dynamics.rs, MODELLED) — momentfria Eulerekvationer för stel kropp + kvaternionkinematik (RK4), med självtester av bevarandelagar (kvaternionnorm, rörelseenergi, |Iω|, precession för symmetrisk topp). - Korsvalidering av modellerade förmågor mot oberoende externa referenser, vilket tar valideringsmatrisen till 39 VALIDATED rader, var och en med stöd av en extern datamängd (CI:s ärlighetsspärr förbjuder statusen VALIDATED utan en). De senaste valideringarna mot externa referenser: den uppmätta stabilitetskurvan för optisk klocka (
quantum_trade:s anpassning av ADEV-kurvan reproducerar den publicerade σ_y(τ) för ⁸⁸Sr-optiskgitterklockan av Norcia m.fl., Science 366:93 (2019), Zenodo 10.5281/zenodo.3382347, CC-BY-4.0, medföljande undertests/fixtures/optical_clock_adev/); generering av spridningskod för GPS L1 C/A (src/sdr.rs:s G1/G2-LFSR reproducerar kodfasoktalerna i IS-GPS-200 Table 3-Ia för PRN 1–9); och SRTM-läsaren för digital höjdmodell på verklig terräng (src/altpnt/terrain.rsläser en medföljande SRTM v3-ruta i public domain från NASA/USGS, N36W117 / Death Valley, och placerar Badwater Basin inom dess dokumenterade mätband). - Nya MODELLED förmågor, var och en internt korskontrollerad mot en sluten form eller en syskonkodväg: relativ rörelsedynamik enligt Clohessy–Wiltshire / Hill, passiv geolokalisering av sändare med TDOA/FDOA, lägesbestämning med Wahba/TRIAD/QUEST, upplösning av heltalsosäkerhet i bärvågsfas för GNSS (LAMBDA), B-plan-målstyrning och gravitationsassist med patched conic, strålformning med CRPA-grupp mot jamming, statistik för kvadratlagsakvisition i GNSS, fringe-osäkerhet / dynamiskt område för kvantiska tröghetssensorer, klockbrus enligt IEEE-1139-potenslag + golv för flicker-FM, och utbyte av kovariansblock i CCSDS-OEM.
- Evidensregister från en enda källa med genererade verifieringsdokument och ett driftskydd; ett bläddringsbart valideringsregister på kshana.dev med djuplänkar till evidensen för varje kort.
- Maskinläsbar citeringsmetadata —
codemeta.json(CodeMeta 2,0) och.zenodo.json, fastlåsta mot Cargo-manifestet avtests/citation_metadata_doc_sync.rs. - Härkomst för leveranskedjan — SLSA-attestering av byggets härkomst för crate-tarbollen, wheels, sdist och npm-tarbollen; PyPI OIDC Trusted Publishing; CycloneDX SBOM som levereras inuti wheel- och npm-paketet; diff av reproducerbara byggen och verifiering efter release.
- Sökbarhet —
robots.txt,sitemap.xmlsamt metadata för Open Graph / JSON-LD på kshana.dev; en genereradvalidation-breakdown-figur som härleds ur matrisen. - README-filer per yta för crates.io / PyPI / npm med ett skydd som håller antalen ärliga.
Ändrat#
- Sagnac-tidsöverföringens oberoende referens har uppgraderats till ExternalDataset — Sagnac-korrektionen för ett varv runt ekvatorn kontrolleras nu mot Ashbys publicerade 207,4 ns (Living Reviews in Relativity 6:1, 2003, ekv. 1,29; reproducerad till < 0,05 ns). Den sammansatta tidsöverföringsförmågan förblir ärligt MODELLED.
- Dokumentation, diagram och figurer har uppdaterats till den aktuella matrisen (39/46/4/89): diagrammet över valideringens härkomst, figuren
oracle-kind-stacked(nu genererad ur matrisen med ett CI-driftskydd), VALIDATION/PROVENANCE/CAPABILITY/QUANTUM-MODELS/WHEEL_TAGS, arkitektur- och handledningsdokumenten samt totalsumman i registret på kshana.dev. - Källträdet har formaterats om med den fastlåsta rustfmt-versionen (toolchain 1.93.0) — enbart stil, ingen ändring av beteendet.
- Versionering i takt. Varje distributionsyta (crate, PyPI, npm, MCP-crate + OCI-avbild, JetBrains-plugin) versioneras nu i takt med motorn, vilket
scripts/check-version-sync.shupprätthåller i CI. - JetBrains-pluginet har bytt licens till AGPL-3.0-only (den publicerade 0.1.1 angav fortfarande Apache-2.0) och hämtar nu sin Marketplace-version från release-taggen.
- Härdning av robustheten —
unwraputanför tester har tagits bort eller motiverats;clippy::unwrap_usedtillämpas på kod utanför tester. - kshana.dev har fått en total omarbetning med bevisen först: dominerande hero, arkitekturdiagram och resultatfigurer, i18n, ihopfällbara och responsiva avsnitt för registret och standarderna.
Rättat#
- SP3-precisionsefemerid — IGS-korrektionen för jordrotationens nod tillämpas under interpolationen.
- Registerbilder — README-filerna för PyPI/crates.io/npm använder absoluta bild-URL:er; huvud-READMEs relativa bildsökvägar visades som trasiga bilder på PyPI-sidan för 0.21.0. Ett CI-skydd (
tests/surface_readme_image_urls_doc_sync.rs) förhindrar att felet återkommer. - CI —
fmt+clippygröna; sluta kompilera mot verkliga data som är git-ignorerade.
Tester#
- Kalman-klockans kovarians förblir PSD och symmetrisk (egenskapstest,
tests/property.rs). - Dokumentsynkroniserande skydd: varje offentlig sträng med valideringsantal, citeringsmetadata, den genererade figuren och bild-URL:erna i README-filerna för respektive yta är alla fastlåsta mot sin källa till sanning.
0.21.0 - 2026-06-26#
Den här releasen lägger till två MODELLED tillämpningssviter i den öppna motorn — en demonstrator för kvantaktiverad PNT (betrodd kvanttidsöverföring, GNSS-fri kvantnavigering, detektion av kvantfel och kvantanomalier) och en PNT-svit för måne och cislunart rymd (månens koordinattid, VLBI för månen, gemensam OD+klocka, realisering av referenssystem, servicevolym, differentiell PNT, interoperabilitetsexport) — var och en körbar från en enda kind, var och en med en ärlig TradeEvidence-post plus ett register över representativitet och återstående steg till flygning. Den tillför också sex nya valideringar mot externa oberoende referenser, vilket tar den maskinkontrollerade verifieringsmatrisen till 15 VALIDATED · 42 MODELLED · 4 PARTNER över dess 61 rader. De nya tillämpningssiffrorna är MODELLED utifrån illustrativa parametrar från öppna källor — ingen TRL, ingen flygerfarenhet, ingen certifiering och inget stöd från någon myndighet — och de validerade kärnor som de återanvänder är märkta som sådana.
Tillagt#
- Demonstratorsvit för kvantaktiverad PNT (
quantum-time-transfer,quantum-gnss-free-nav,quantum-anomaly-detect). Tre körbara MODELLED tillämpningsområden bakom motorn, var och en medTradeEvidenceplus en post om representativitet och återstående steg till flygning:- Betrodd kvanttidsöverföring (
src/timetransfer_chain.rs) — en budget för optisk gitterklocka + fotonisk länk mot CSAC + RF-tvåvägs, som återanvänder skyddsnivån för tidssynkronisering, med en säkerhets-FoM mot fördröjnings-/återuppspelningsattacker (1 − P_md) samt detektion av klockanomalier + CUSUM-latens. - GNSS-fri kvantnavigering (
src/quantum_nav_od.rs) — en tröghetsframdrivning med kallatomsinterferometer mot ett INS av navigeringsklass över ett GNSS-avbrott, med det ärliga resultatet att accelerometerbiasen förblir icke observerbar utan extern positionsbestämning, så att felet ändå växer. - Detektion av kvantfel och kvantanomalier (
src/quantum_faults.rs) — en märkt felkatalog med ROC AUC och bootstrap-konfidensintervall samt minsta detekterbara fel vid en fast falsklarmsfrekvens. - Ett gemensamt bibliotek med felmodeller för kvantenheter (
src/quantum_devices.rs) och ett enhetligt testunderlag för avvägningar mellan kvant och klassiskt (src/qtrade.rs) ligger till grund för alla tre.
- Betrodd kvanttidsöverföring (
- PNT-svit för måne och cislunart rymd. Sju körbara MODELLED
kindovanpå CR3BP-kärnan: månens koordinattid (sekulär takt för LTC/TCL − TT,src/lunar_time.rs), geodetisk VLBI-fördröjning för månen som observerbar (src/lunar_vlbi.rs), gemensam estimator för OD + klocka med flera tekniker (src/lunar_combination.rs), realisering av referenssystem (Helmert med 7 parametrar + IAU 2015 WGCCRE-koppling,src/lunar_frame_realise.rs), analys av servicevolym i Moonlight / LCNS-klass (src/lunar_service.rs), differentiell PNT för månen (src/lunar_dpnt.rs) och en interoperabilitetsexport i linje med LunaNet / IOAG (CCSDS-OEM + månens tidsskala i KIF-höljet,src/lunar_interop.rs). Allt är MODELLED utifrån illustrativa parametrar från öppna källor; inte validerat mot verklig VLBI- eller Gateway-spårning; ingen anknytning till eller något stöd från någon myndighet. - Sex nya valideringar mot externa oberoende referenser (verifieringsmatrisen står nu på 15 validated):
- ADEV / HDEV på en verklig 5071A-cesiumklocka — validerat mot Stable32:s referenser för decadpunkter (
tests/cs5071a_reference.rs). - OADEV / MDEV / TDEV mot Stable32-referensen
PHASE.DAT— validerat mot Stable32:s publicerade tabeller (tests/phasedat_reference.rs). - ROC AUC för anomalidetektion på verklig ESA OPS-SAT-telemetri — validerat mot scikit-learn (
tests/opssat_ad_reference.rs). - Syntes av ICGEM-tyngdfunktionaler — validerat mot normaltyngdstandarden GRS80 (Somigliana-γ till 3.5e-12; EGM2008-störningskarta,
tests/icgem_gravity_reference.rs). - Klobuchar-modellen för den utsända jonosfären — validerat mot RTKLIB (
tests/klobuchar_reference.rs). - RAIM-detektionskärnan (171 fall,
tests/raim_reference.rs) och skyddsnivån för SBAS enligt DO-229E på verkliga EGNOS-data (RTKLIB:s SBAS-PL-fork,tests/sbas_reference.rs) — båda validerade mot sina externa oberoende referenser.
- ADEV / HDEV på en verklig 5071A-cesiumklocka — validerat mot Stable32:s referenser för decadpunkter (
- Register över representativitet och återstående steg till flygning (
src/representativeness.rs). En strukturerad post som varje demonstrator ger — vad som är representativt, vad som är förenklat och vad som står mellan modellen och flygning — den ärliga följeslagaren till varje MODELLED avvägning. - Aggregering av studier och smidigare CLI. Ett scenariomanifest för en svit med aggregering av studier med ett enda kommando, hashstabil studiemetadata +
--study-name, scenariokontroll med--validateoch visning av valideringsnivå per FoM i studierapporter.
Ändrat#
- kshana.dev har utformats om kring en gemensam domänrygg — förmågor och validering har slagits ihop till en domänutforskare med ett gemensamt ordförråd, de nya validerade öarna har lyfts fram, ett landexakt animerat jordinstrument och en uppmaning att beställa en studie har tillkommit, liksom varumärke och länkar för Ashforde OÜ.
- README + ARCHITECTURE har granskats för fullständighet och ärlighet — föråldrade antal validerade har korrigerats (nu 15 externa oberoende referenser), diagrammen har byggts ut, och förtrycken om Conditional Timing Protection Level (arXiv:2606,24210) och optimismgapet vid RF-störningar (arXiv:2606,22054) har citerats.
- Källorna i
paper/och pipelinen för JOSS-utkastet finns kvar i det offentliga arkivet.
0.20.0 - 2026-06-22#
Den här releasen lägger till fyra studieförmågor i den öppna motorn — en villkorad skyddsnivå för tidssynkronisering, poängsättning av PNT-resiliens i linje med ramverk, en utvärdering av optimismgapet vid RF-störningar och en front end för programvarudefinierad mottagare / verkliga data — var och en reproducerbar från ett enda kommando och skriver en bytedeterministisk artefakt. Alla studier är MODELLED (syntetisk eller kalibrerad mot offentliga datamängder), bär sin ärliga härkomst (motorversion, frön, konfigurationshash) och sina valideringsmärken, och är inte certifieringar.
Tillagt#
- Conditional Timing Protection Level (
tpl). En holdover-begränsad gräns för det oupptäckta tidsfelet under GNSS-spoofing, med ett golv för k-sigma-monitorn, en van Loan-varians för framdrivning över detektionslatensen och en CUSUM-tid till larm. Kalibrerad mot en verklig inspelad attack (JammerTest 2024, scenario 2.1.1) viacargo run --release --example tpl_jammertest, som reproducerar sin referenstabell ur skalärer som hämtats ur den offentliga inspelningen (den råa datamängden distribueras inte vidare). - Poängsättning av PNT-resiliens i linje med ramverk + studie av beslutsinstabilitet (
resilience). Arkitekturmodell, poängsättning i linje med RPCF, viktning med Dirichlet-simplex, instabilitet i Kendall-tau och andel byten av top-1 samt kollaps av mångfald i gemensamt läge (Hill-N2), medcargo run --release --example resilience_report -- paper-artifacts/resilience-study.json. Korstabell idocs/RESILIENCE-CROSSWALK.md. - Studie av optimismgapet vid RF-störningar (
impairment_study,impairment_ml,eval_stats). En panel med 13 detektorer över ett parameterförankrat syntetiskt korpus, ett optimismgap mellan data inom och utanför fördelningen, skalningslagstrender med en permutationsnollhypotes och en prediktor för försämring med uteslutning av en i taget, viacargo run --release --example optimism_study -- paper-artifacts/optimism-study.json. - Front end för programvarudefinierad mottagare (
sdr) och adaptrar för verkliga data (realdata/). Rå IQ/IF till korrelatorstift och SQM, samt inläsningsadaptrar (RINEX, u-blox UBX, GnssLogger, JammerTest, Yunnan, SatGrid) och exempel för sondering. De läser inspelningar som användaren själv tillhandahåller lokalt; inga inspelningar checkas in. - Incheckade studieartefakter. De bytedeterministiska
optimism-study.jsonochresilience-study.jsonspåras nu underpaper-artifacts/, så att studiens siffror kan kontrolleras utan ombyggnad; de kan fortfarande genereras om med generatorerna ovan. Råa datamängder hålls utanför arkivet (/realdata-cache/).
Ändrat#
- Versionen har höjts till 0.20.0 i
Cargo.toml,CITATION.cffochREADME; artefakterna i korsningsstudien har genererats om så att deras stämpel stämmer med den släppta versionen.
0.19.0 - 2026-06-18#
Ändrat#
- Licensen har bytts från Apache-2.0 till GNU AGPL-3.0-only, med en kommersiell licens tillgänglig från Ashforde OÜ (dubbel licensiering). Den öppna motorn förblir helt öppen och offentligt verifierbar; AGPL:s nätverks-copyleft (§13) innebär att en sluten eller värdbaserad härledning måste komma tillbaka som öppen källkod — eller ta en kommersiell licens. Det här försvarar den validerade kärnan mot att någon forkar och stänger den, samtidigt som trovärdigheten hos en offentlig, körbar och granskningsbar motor bevaras. Se
LICENSE(AGPL) och den nyaLICENSING.md(vad varje licens omfattar och när den gäller).LICENSEinnehåller nu AGPL-3.0-texten; SPDX-huvuden i alla källor har uppdaterats tillAGPL-3.0-only;NOTICE,README,GOVERNANCE,GLOSSARY, webbplatsen samt metadata för crate och paket (Cargo.toml,pyproject.toml,CITATION.cff, MCP-crate + avbild) har uppdaterats i enlighet med detta.- Bidragsvillkoren (
CONTRIBUTING.md) licensierar nu inkommande bidrag under AGPL och ger Ashforde OÜ rätt att ta med bidrag i den kommersiellt licensierade utgåvan, så att dubbellicensieringen fortsätter att fungera. - Beroendepolicyn är oförändrad men har motiverats på nytt (
deny.toml,GOVERNANCE): beroenden förblir tillåtande (Apache/MIT/BSD/ISC). AGPL tillåts bara för kshanas egen crate — ett beroende med copyleft skulle smitta den kommersiella utgåvan och bryta dubbellicensieringen. - Notering för efterföljande led: det här är ett licensbyte till copyleft. Användare som förlitade sig på de tillåtande villkoren i Apache-2.0 kan fortsätta använda den senaste Apache-2.0-releasen (
v0.18.0och tidigare, som publicerade); frånv0.19.0och framåt gäller AGPL-3.0 / kommersiell licens.
Säkerhet#
- Höjde
pyo3från 0,24 till 0,29 för att få bort RUSTSEC-2026-0176 / RUSTSEC-2026-0177 (GHSA-36hh-v3qg-5jq4 / GHSA-chgr-c6px-7xpp) ur externa OSV-/beroendeskanningar. Båda är rådgivningar på funktionsnivå vars berörda funktioner (BoundList/TupleIterator::nth/nth_back,PyCFunction::new_closure) Kshana aldrig anropar, ochpyo3är ett valfritt beroende (med funktionenpython) — så den verkliga exponeringen var noll — men höjningen håller skanningen ren för efterföljande granskare. Migreradesrc/python.rstill API:et i pyo3 0,29 (returtypen Bound förscenario_kinds; explicitskip_from_py_objectpå pyclassRunOutput). Alla 11 Python-bindningstester går igenom mot den ombyggda extensionen.
0.18.0 - 2026-06-17#
Tillagt#
Elva nya körbara scenariotyper — demonstratorer för två anbud, en CCSDS-interoperabilitetsbrygga och en förstaordningssvit för uppdragsanalys / miljö (alla MODELLED, additiva; befintliga golden-filer för reproducerbarhet är oförändrade). Var och en kan dirigeras via CLI / Python / WASM / MCP, levereras med en
scenarios/<kind>.tomloch bär ett uttryckligt MODELLED-märke i sitt resultat-JSON och i den enradiga sammanfattningen (ett test per typ itests/dominance_demonstrators.rskontrollerar att märket finns och att utdata aldrig innehåller strängenVALIDATED):impairment-eval(src/impairment_eval.rs) — Testbädd för utvärdering av maskininlärningsbaserad detektion av RF-störningar: ett märkt syntetiskt korpus + ett detektoroberoende ROC/AUC-underlag + en rapport om optimismgap mellan data inom och utanför fördelningen (enbart driftsegenskaper — aldrig fält-/IQ-data).quantum-trade(src/quantum_trade.rs) — avvägning mellan kvant och klassisk PNT med inläsning av uppmätt ADEV och ett resiliensomhölje för GNSS-nekade miljöer.space-weather(src/space_weather.rs) — sol-/geomagnetiska index (IAGA-tabellen Kp↔ap, dagligt Ap, centrerat 81-dygns F10.7a), exosfärstemperatur enligt Jacchia-71 och en aktivitetsdriven koppling av termosfärens densitet över en statisk atmosfär (INTE en absolut densitetsmodell av typen NRLMSISE).oem-interop(src/oem.rs) — CCSDS 502,0 OEM-import + brygga för tur och retur för efemerider från GMAT / Orekit / STK (läsarenparse_oem, exakt invers till skrivaren).launch-window(src/launch.rs) — tvåkropps-uppskjutningsazimut (sin Az = cos i/cos lat), planändrings-Δv, bonus från platsens rotation och geometri för dagliga tillfällen.reentry(src/reentry.rs) — ballistisk återinträdeskorridor enligt Allen-Eggers: maximal retardation, hastigheter vid maximal g-belastning och maximal uppvärmning, höjd vid maximal g-belastning.eo-coverage(src/eo_payload.rs) — geometri för EO: svepbredd / GSD / åtkomst / återbesökstid (SMAD-rymdtriangel).space-packet(src/space_packet.rs) — kodning/avkodning av primärhuvudet i CCSDS 133.0-B Space Packet med bitexakt tur och retur.attitude-budget(src/attitude_budget.rs) — gravitationsgradientmoment med 3 frihetsgrader + RSS-budget för pekfel (skalär budget före hårdvara, inte en reglerslinga).passes(src/passes.rs) — prediktion av uppgång/nedgång för överflygningar från markstation (AOS/TCA/LOS, maximal elevation, åtkomst).link-budget(src/linkbudget.rs) — enkelriktad länkekvation enligt CCSDS-401 / DSN-810-005 (C/N₀ = EIRP − FSPL − L_other + G/T − k, FSPL / Eb·N₀ / marginal / slutning).
Hybrid kvant + klassisk UKF med 17 tillstånd och tät koppling — gjord till ett körbart scenario (MODELLED). En ny scenariotyp
hybrid-ukf(src/fusion/hybrid_ukf.rs,scenarios/hybrid-ukf.toml) som gör det tidigare enbart API-baserade osparfiltret för tätt kopplad GNSS/INS med 17 tillstånd (src/fusion/tightly_coupled17.rs) till ett scenario som bindningarna för CLI/Python/WASM/MCP kan dirigera. Felvektorn med 17 tillstånd är de 15 INS-feltillstånden (position, hastighet, felinriktning av attityd, accelerometer- och gyrobias) utökade med den CAI-härledda korrektionen av accelerometerbias — kallatomsinterferometern (src/inertial/quantum_imu.rs) sätter golvet för hastighetens slumpvandringq_va, så att den långsiktiga driften under framdrivningen är den som kvantsensorn begränsar — och en klocka med 2 tillstånd för fas + frekvens vars processbrus kommer från q-parametermotorn för klockor (clock_state::q_from_allan, som avbildar en klockas Allan-deviationsprofil på PSD:ernaq_wf/q_rw, skalade till avståndsenheter). Plattformen stöds av GNSS under en inledning (filtret lär sig bias, hastighet och klocka) och glider sedan genom ett GNSS-avbrott enbart på CAI-IMU och klocka, så körningen visar klassisk IMU på kort sikt + kvant på lång sikt som hybrid. Kvalitetsmåttet är filtrets självkonsistens: samlad NEES (Normalised Estimation Error Squared, över den skattbara delmängden position/hastighet/klocka) och NIS för innovationens vithet (Normalised Innovation Squared) över ett Monte Carlo-ensemble, kontrollerade mot deras 95-procentiga χ²-band (Bar-Shalom §5,4). Det matchade filtret hamnar inom banden; ett medvetet feljusterat filter (knapparnaq_factor/r_factor) flaggas — en objektivt kontrollerbar och urskiljande spärr, inte ett gummistämpel. Kontrollen av NEES/innovationens vithet är den STATISTISKA OBEROENDE REFERENSEN: ett påstående om självkonsistens (filtrets rapporterade kovarians stämmer ärligt med spridningen i dess egna fel under det modellerade bruset), INTE en garanti för noggrannhet i verkligheten. Ärligt omfång: allt är modellerat / simulering — CAI- och klockindata är inramade värden som är representativa för litteraturen, inte uppmätt hårdvara; CAI-hårdvaran och dess nyckelperson förblir partnerägda; ingenting här antyder TRL > 3, flygerfarenhet eller extern validering (resultat-JSON och den enradiga sammanfattningen bär dessa märken uttryckligen). Den enda banan med konstant hastighet och horisontell flygning gör att attityd- och IMU-biastillstånden bara är svagt observerbara, så NEES bedöms över de 8 skattbara tillstånden; en manövrerande bana för full observerbarhet av alla 17 finns på färdplanen. Lägger också tillUkf::update_stats(returnerar NIS för varje uppdatering) och instrumentering för konsistens iTightlyCoupled17::{update_gnss_nis, nees, nees_subset}. Alla befintliga scenarier påverkas inte (additivt; golden-filer för reproducerbarhet oförändrade).Sekventiell (rekursiv) terrängreferensnavigering — SITAN som löpande filter. En ny scenariotyp
terrain-slam(src/altpnt/sequential.rs,scenarios/terrain-slam.toml) som kör den befintliga mätmodellen höjdmätare mot DEM epok för epok genom SIR-motornparticle_filter, i stället för den satsvisa sökningen från grovt till fint somterrain-navanvänder för att återfinna en enda konstant INS-förskjutning. Vid varje vägpunkt propageras molnet med det inkrement som INS rapporterar (självt förvanskat av driftens tillväxt per steg), viktas om efter terrängmatchningen och omsamplas vid degenerering — så att en tidsvarierande INS-drift följs längs banan, vilket en anpassning med konstant förskjutning strukturellt inte kan göra. På den syntetiska DEM:en förblir den rekursiva skattningen begränsad och konvergerar på nytt (slutligen ≈ 70 m) medan den ostödda tröghetslösningen divergerar obegränsat till ≈ 5 km; felet per epok följer terrängens särprägel (det glider på den felaktiga INS över platta sadlar och låser in sig på nytt över särpräglad relief), och övervakningen av effektiv urvalsstorlek bekräftar ett friskt moln. Ärligt omfång: kartan är känd och fast — rekursiv lokalisering mot en lagrad DEM (lokaliseringsdelen av terräng-SLAM), inte gemensam kartskattning; icke-cirkulär till sin konstruktion (den injicerade driftrampen är den oberoende referensen). Alla befintliga scenarier påverkas inte (additivt; golden-filer för reproducerbarhet oförändrade).Resiliensrygg för GNSS-nekade miljöer + FutureNAV-demonstratorsnitt (
src/holdover.rs, och grunder för resiliensomhölje undersrc/impairment_eval.rs,src/quantum_trade.rs,src/navsignal.rs,src/inertial/quantum_imu.rs, med FutureNAV-verifieringssnitt isrc/verification.rs). Sätter ihop byggstenarna för alternativ PNT — klockans holdover, signalföljning, tröghetsframdrivning, terräng — till en enda berättelse om resiliens vid GNSS-avbrott. MODELLED; additivt.Kshana Interchange Format (KIF) — ett versionerat, självbeskrivande artefakthölje (
src/interchange.rs). Ett schemataggat omslag runt scenarioresultat så att en lagrad artefakt bär med sig sin typ, sin schemaversion och sina MODELLED-/VALIDATED-märken, och så att äldre höljen förblir läsbara framåtkompatibelt. Additivt; befintligt resultat-JSON oförändrat.Modulation / följning av navigeringssignal + differentialkorrektor för halo/NRHO i CR3BP (
src/navsignal.rs,src/cr3bp.rs). En förstaordningsmodell för modulation och följning av navigeringssignaler, och en differentialkorrektor för det cirkulära begränsade trekroppsproblemet för halobanor / nästan rätlinjiga halobanor, framlyft på den befintliga förmågeaxeln för djuprymd. MODELLED.Utvärderingsläge för fördelningsskifte + reglage för korpusets allvarlighetsskala för
impairment-eval(src/impairment_eval.rs). Lägger till en uttrycklig uppdelning i data inom och utanför fördelningen och en justerbar allvarlighetsskala för korpuset i underlaget för optimismgap med ROC/AUC (enbart driftsegenskaper — aldrig fält-/IQ-data).Avkastning på kostnad per täckning + avbildning av integritetspåverkan vid missad detektion (
src/frugal.rs,src/integrity_impact.rs). En ROI-lins för frugal engineering (kostnad per täckningsenhet) och en avbildning från andelen missade detektioner till påverkan på integriteten. MODELLED; additivt.Citerat parameterblad för felmodellen för kallatomsinterferometer (CAI) (
src/inertial/quantum_imu.rs). Ett litteraturreferat, inramat parameterblad för CAI-tröghetsmodellen — indata är citerade, inte uppmätt hårdvara (inget TRL- eller flygpåstående); det matar golvet för hastighetens slumpvandring ihybrid-ukf.Projektstyrning.
GOVERNANCE.mdsom dokumenterar beslutsmodellen och gränsen mellan öppet och slutet; raden för community/styrning i förmågekartan går frånnone → partialför att spegla detta.
Rättat#
Skyddsnivå för ARAIM-integritet — nominell bias (
b_nom) och σ_URA tillämpas nu. MHSS-skyddsnivån drar nu av den ensidiga nominella biasprojektionenb_k = Σ_i |s_i|·b_nomper felläge, och använder integritets-sigma σ_URA (skilt från noggrannhets-sigma σ_URE) som medföljer Integrity Support Message. Det gör skyddsnivån mer konservativ och standardriktig, och därför ändras de PL-värden som befintliga integritetsscenarier rapporterar. ISM/scenariot får fälten#[serde(default)]sigma_ura_m/b_nom_m, så indata som lämnar dem osatta behåller tidigare beteende. Sedocs/ARAIM_REFERENCE.mdför den återställda formelnb_koch den ärliga implementationsanmärkningen.Konsistens med χ² i spoofing-monitorn.
parity_raim_testanvänder nu den delade inversa χ²-vägenraim::chi2_quantile, vilket tar bort en andra, avvikande χ²-implementation så att RAIM och paritetsmonitorn för spoofing är överens om sina trösklar.gravity-map-navkopplat till CLI-dispatchern. Scenariot kunde tidigare bara nås via API:et; det dirigeras nu somkind=precis som alla andra scenarier.Noggrannhet i dokumentation/antal. Antalet scenariotyper i README är nu fastlåst mot
api::list_scenario_kinds().len()av ettscenario_count_doc_sync-test, så att det dokumenterade antalet inte längre kan glida ifrån dispatchern.
0.17.0 - 2026-06-14#
Tillagt#
- PNT för djuprymd och Mars — öppen radiometrisk navigeringsmotor + GSE-simulering. En ny, helt additiv förmågeaxel ovanpå den jordvaliderade kärnan (varje befintligt jordscenario är byte-identiskt — golden-filerna för reproducerbarhet går igenom oförändrade utan någon omgenerering). Lägger till: en dynamikkärna för flera kroppar (
Body{mu, re, zonals, gravity, rotation, IAU-pole}med tesseral gravitation för Mars enligt GMM-3, ett kroppsfast Mars-system enligt IAU, en utbytbar sömEphemerisProvider, tvådelade juliska datum med precision under mikrosekunden och TT↔TDB); radiometriska observabler (iterativ ljustid + Shapiro-fördröjning, två-/en-/trevägs Doppler och avstånd via Moyers lösning med två ben, koherent transpondervändning, regenerativ/PN-avståndsmätning enligt CCSDS 414, Δ-DOR enligt CCSDS 506, media som solplasma/tropo/iono); inläsning + utskrift av CCSDS-TDM (503); ett Square-Root Information Filter med reducerad dynamik, empiriska RTN-accelerationer, en ombordklocka med tre tillstånd och en modell för Mars-drag; en gemensam estimator för fusion av enkelriktat + tvåvägs; scenarioytanmars-pnt(reläkonstellation + LMO/överföring/ yta) över CLI, Python, WASM, MCP och playground; och en GSE-prestandasimulator från början till slut (geometri → länkbudget → observabler → SRIF → kovarians). Valideringsnivå — simuleringsvaliderad: syntetisk sluten OD (Mars-LMO ≈ 0,2 m) och analytisk självkonsistens, där dynamiken kring Solen för Mars har korskontrollerats oberoende mot JPL DE440 (xval/anise-mars-od, kärnstyrd: 137 m vid 1-dygnsbåge, den ärliga omodellerade n-kropps-resten). Rapporterade noggrannheter för djuprymd är simulerings-/kovariansmått på kvalitet, inte resultat från verkliga uppdrag; validering mot verkliga spårningsdata från DSN/ESTRACK finns kvar på färdplanen. ANISE (MPL-2.0, edition-2024) är begränsad till en korskontrollcrate som är undantagen från workspace, så licensspärrencargo denyoch jobbet för MSRV-1.75 är orörda. - Markspår med myndighetsnoggrannhet från verklig IERS jordorientering. Scenariot
ephemeristar ett valfritt fälteop_finals2000a— den inlinade kroppen av en verklig IERS-filfinals2000A— och reducerar markspåret genom UT1−UTC och polrörelse per epok, interpolerade ur den (sammaEopSeriessomprecise_odanvänder), och åsidosätter de nominella skalärernadut1_s/xp_arcsec/yp_arcsec. Data följer med i scenariot, så körningen förblir reproducerbar och behöver inget filsystem (den fungerar i WASM-playground). En flaggakshana --eop <finals2000A>för in en verklig fil i scenariot från CLI. Stänger asymmetrin där baraprecise_odanvände verkliga data om jordorientering.
Rättat#
- Konsistens i referenssystem för avståndshastighet. Markstationen avbildas nu in i det tröghetsbundna systemet genom den exakta inversen till satellitens reduktion (
frames::itrf_to_teme, som ångrar polrörelsen och sidertiden) i stället för en GMST-rotation som är blind för polrörelse, så att båda ändpunkterna delar ett system. Effekten på den rapporterade Doppler ligger under valideringsgolvet, men den tar bort en verklig systemmissanpassning och ett överdrivet påstående om "exakt" i källan. carrier_hzvalideras. En bärfrekvens som är noll eller inte ändlig ger nu ett fel i stället för att i tysthet ge noll Doppler (den hade gjort λ = c/bärvåg oändlig), i enlighet med den befintliga kontrollen avstep_s.
0.16.0 - 2026-06-11#
Tillagt#
- Validering av kraftmodellen genom anpassning av efemerider, korsvaliderad mot verkliga myndighetsprodukter. En ny batchestimator med minsta kvadrat (
src/precise_od.rs) med variationell tillståndsövergångsmatris och redigering av avvikande värden, driven av en fullständig kraftmodell (PreciseForceModel: EGM2008-geopotential, tredje kroppar, fasta + oceaniska + atmosfäriska tidvatten och empiriska accelerationer av typen CPR/2-per-varv), matad av en verklig tolk för jordorientering från IERSfinals2000A. Validerad mot publicerade referensbanor: Galileo MEO till 13 cm efter anpassning, ESA Swarm-A LEO och LRO för månen (selenocentrisk, GRAIL-gravitation, kroppssystem enligt IAU-2015 — reducerad dynamik 6,6 m, ärligt över målet 5 m på den öppna vägen; den väg i DE-klass med ANISE/DE440 som når det är en crate som är undantagen från workspace). - Scenariot
spoof-detect— en integrerad spoofing-detektor med flera lager som kombinerar RAIM-paritet per epok, monitorer för AGC och signalkvalitet (SQM) samt ett sammanvägt beslut, validerad mot de publicerade scenarioparametrarna i TEXBAT (Humphreys et al., ION GNSS 2012), inklusive det svåra fallet med bärvågsinriktning. - Scenariot
ephemeris— tillstånd, referenssystem, markspår och Doppler. Propagera en satellit (TLE→SGP4 eller en analytisk bana) och ge, för varje steg, tillståndet i det tröghetsbundna TEME och GCRS (position och hastighet), den jordfasta positionen i ITRF/ECEF, markspåret under satelliten i WGS-84 (latitud / longitud / höjd) samt den topocentriska azimuten / elevationen / avståndet med avståndshastighet och Doppler från en markstation. Nåbart från CLI, Python, WASM och MCP-servern, och levereras som förinställningen "Ground track" i webb-playground, där spåret ritas över en verklig världskarta (kustlinjer från Natural Earth 1:110m, inbäddade — inget nätverk eller externt beroende). - Export av CCSDS OEM (
--export-oem/export_oem = true) — det hastighetsbärande Orbit Ephemeris Message som GMAT / Orekit / STK använder, i paritet med de befintliga exportörerna för SP3 och OMM. - Fasta, oceaniska (FES2004) och atmosfäriska (Ray 2001 S2) jordtidvatten på geopotentialen (IERS Conventions kap. 6), inkopplade i kraftmodellen.
- ARM64-wheels — PyPI-bygget producerar nu även wheels för Linux aarch64 (manylinux_2_28), macOS arm64 och Windows arm64.
- Utökad teknisk rapport (förtryck) länkad från README, och JOSS-artikeln har gjorts inlämningsbar (författarens ORCID, kompilerad till PDF i CI vid varje ändring).
Ändrat#
- Referenssystem validerade till millimeter mot publicerade Vallado-vektorer. Reduktionen TEME→PEF/ITRF, hela kedjan CIO IAU 2006/2000A GCRS→ITRS och omvandlingen ECEF→geodetisk WGS-84 är nu fastlåsta mot det genomräknade exemplet i Vallado et al. (AIAA 2006-6753) med dess IERS EOP, inte bara mot intern självkonsistens.
- Oberoende korskontroller av tidsskalor. ERA och skalorna UTC/TAI/TT stämmer med
hifitimetill < 1 µs, och planetefemeriden DE440 stämmer med JPL Horizons (geocentriska positioner för Månen/Solen), båda som alltid aktiva CI-spärrar. - Webb-playground döljer fliken för kvalitetsmått när ett resultat inte har några rader med kvalitetsmått, så att paket med enbart diagram (efemerid, RAIM, spoofing) öppnas på sitt diagram — för efemerid markspåret — i stället för en tom tabell.
- Playgroundens guidade reglage och parametersvep fungerar nu för scenariot efemerid / markspår: dess inställningar (stationens latitud / longitud, tidssteg, varaktighet, UT1−UTC) går att justera, och ett svep kan rita överflygningsgeometri (maximal elevation, maximal Doppler, höjd, hastighet) mot vilken som helst av dem — till exempel maximal elevation mot stationens latitud. Fliken Sweep visas nu bara när ett scenario faktiskt går att svepa, så inget paket erbjuder en kontroll som inte ritar någonting.
- Dokumenterade approximationen
DUT1 ≈ 0för SGP4 vid anropsstället för GMST (ett rotationsfel på ≤ ~13″, väl inom SGP4:s eget modellfel) och uppdateradeCAPABILITY.md.
0.15.1 - 2026-06-09#
Tillagt#
- JetBrains-pluginet Kshana — PNT simulator är nu publicerat och har antagits på JetBrains Marketplace. README,
kshana.devoch distributionsdokumenten länkar direkt dit.
Rättat#
- Publiceringen i MCP-registret lyckas nu:
server.jsondescriptionöversteg registrets gräns på 100 tecken (HTTP 422). Förkortade den och anpassade servernamnet (och avbildens ägarmärke) till det kanoniska namnrymdsnamnetio.github.ashfordeOU/kshana-mcp. - Publiceringen på JetBrains Marketplace lyckas nu: CI laddade upp om samma pluginversion som redan listats manuellt, vilket Marketplace avvisar. Pluginversionen har höjts till
0.1.1, och idempotensskyddet behandlar nu även svaret "already contains version" som en lyckad no-op. - Cache-busting för
kshana.dev: de versionsstämplade frågesträngarna förstyle.css/app.jsföljer releasen, så att återkommande besökare alltid får det aktuella bygget.
0.15.0 - 2026-06-08#
Tillagt#
kshana-mcp— Kshana som server för Model Context Protocol (MCP) (mcp/kshana-mcp/). En fristående crate som är undantagen från workspace (SDK:nrmcpär edition 2024) och som exponerar den validerade motorn för AI-agenter och assistenter — Cursor, JetBrains AI Assistant / Junie och vilken MCP-klient som helst — över stdio. Verktyg:run_scenario,list_scenario_kinds,validate_scenario,export_sp3,export_omm, vart och ett ett tunt omslag runtkshana::api.- JetBrains IDE-plugin (
ide/jetbrains/). Högerklicka på ett scenario.toml→ Run Kshana Scenario; kvalitetsmått och resultat-JSON strömmas in i ett Kshana-verktygsfönster. Ett rent plattformsplugin i Kotlin, kompatibelt med varje JetBrains IDE 2024,3+. - Offentlig distribution + automatisk publicering per release för båda:
kshana-mcptill crates.io (cargo install kshana-mcp) viapublish.yml.kshana-mcpsom en OCI-avbild för flera arkitekturer påghcr.io(docker run ghcr.io/ashfordeou/kshana-mcp) via en nymcp-publish.yml.kshana-mcptill det officiella MCP-registret via GitHub OIDC (inga hemligheter); registerposten (server.json) använder OCI-pakettypen med en ägare som verifierats via etikett.- IDE-pluginet till JetBrains Marketplace via
publishPlugin(spärrat med token, valfri utvecklarsignering) vid varje release-tagg.
0.14.1 - 2026-06-08#
Tillagt#
- Oberoende korsvalidering av referenssystem mot ANISE/SPICE (
xval/anise-frames/). En fristående crate som är undantagen från workspace korskontrollerar IAU 2006/2000A CIO-reduktionen ikshana(kshana::cio::gcrs_to_itrs_matrix, GCRS→ITRS) mot ANISE (den rena Rust-återimplementationen av NAIF/SPICE) som roterar GCRF→ITRF93 från JPL:searth_latest_high_prec.bpc, med samma IERS-parametrar för jordorienteringfinals2000Amatade till båda sidor, över åtta kvartalsvisa epoker 2020–2023. De två oberoende systemrealiseringarna stämmer överens till en maximal relativ rotation på 0,028″ — ≤ 0,86 m på marken, ≤ 0,93 m i LEO, ≤ 3,6 m i GNSS-bana, vilket med god marginal uppfyller den länge gällande korskontrollen av referenssystem på "< 10 m" i ROADMAP (den kompletterar, och ersätter inte, de befintliga bit-för-bit-förankringarna mot SOFA/ERFA). Craten är isolerad eftersomanise+hifitimeär MPL-2.0 / edition-2024 och aldrig får hamna i den publicerade grafen över beroenden förkshana, dessCargo.lock, licensspärrencargo denyeller MSRV-bygget; ANISE är fastlåst meddefault-features = false. Innehåller en binärframe-xval(hämtar den ~5 MB stora BPC:n, skriver ut en tabell, skriverreport.{json,md}), en testspärr som hoppar över sig själv när kärna/nätverk saknas och ett valfritt CI-jobb som bara körs medworkflow_dispatch(blockerar aldrigmain). Dokumenterad idocs/VALIDATION.md(CIO-raden) ochROADMAP.md.
Rättat#
- Mobilvänlig playground. Åtgärdade horisontell överflödning av playgroundens
.panelpå telefoner (ett CSS-grid-element som som standard harmin-width: autorenderades ~100 px bredare än visningsytan) viamin-width: 0och breddskyddade kontroller; verifierat rent vid 360 / 390 / 414 / 768 px. Justerade åtgärdsknapparna "Pin to compare" / "Download report" (lika stora marginalrutor i flex-raden). Förstorade körknappar, reglage, väljare och navigeringslänkar till minimimåttet ~44 px för tryckytor enligt WCAG 2.5.5 / Apple HIG på telefoner och pekenheter, med oförändrad storlek på datorer.
0.14.0 - 2026-06-08#
Rättat#
- Härdning av robustheten efter en kontradiktorisk stresstestomgång. (1)
sbas_protection_levelavvisar nu elevation/azimut/varians som inte är ändliga och negativa eller icke-ändliga diagonaler i kovariansen (en nästan singulär geometri uppskalad med litet σ kunde tidigare slinka förbi spärren för absolut pivot och ge ett NaN-VPL / absurt HPL som ett giltigtSome— ett tyst integritetsfel). (2) Den numeriska propagatorn (propagate/propagate_dopri) stänger vid fel på ett begynnelsetillstånd som inte är ändligt i stället för att låta den adaptiva regulatorn snurra i evighet. (3) DEM-cellhjälparen går inte längre i panik på ett rutnät med ett enda prov (1×N). (4) Azimuten ilunar_look_anglehålls strikt i[0, 360). (5)SphericalHarmonicField::from_gfcavvisar icke-fysikaliska (NaN / icke-positiva)GM/radie.
Tillagt#
- Binären
validation_report+ releaseartefakt: en beroendefri generator som ger en utskriftsklar HTML-sammanfattning av valideringen på en sida och som indexerar varje validering som upprätthålls av CI (SGP4 666/666, EGM2008, bit-för-bit-referenssystem, NIST Allan, IMU-datablad, ARAIM/SBAS, reproducerbarhet på 3 operativsystem, täckning) mot dess test och externa oberoende referens. Releaseflödet genererarkshana-validation-summary.htmloch bifogar den (med SLSA-härkomst) till varje taggad release. - pytest för numpy-interoperabilitet + härdning av wheels:
tests/python/test_numpy_interop.py(körs i CI) plus en fastlåst manylinux-container och ett verifieringssteg medauditwheel showi wheel-bygget. - Handledningar och utbildning:
docs/tutorials/(tre genomarbetade handledningar, annoterade scenarier per domän, övningar på nivå 1/2/3) medtests/tutorials.rssom fastlåser varje citerat tal mot motorns aktuella utdata. - Artefakter för externa inlämningar (
paper/,notebooks/,submissions/): ett utkast till JOSS-artikel, en anteckningsbok om kvant mot klassiskt och färdiga paket för awesome-gnss / ESA Navipedia / NASA ASCL / ESA ESSR / ION/IAC, plusFUNDING.yml— förbereder de externa stegen inför inlämning. - Terrängreferensnavigering och kombinerad alternativ PNT (modulen
altpnt): en navigator för terrängmatchning med TERCOM/SITAN över en DEM (inläsare för.hgt+ generator för syntetiska testdata) och en kombinerad GPS-nekad navigator med gravitation + magnetfält (IGRF) + terräng, exponerad som scenariotypernaterrain-navochcombined-altpnt. Validerad genom konvergens vid terrängmatchning (en känd injicerad förskjutning återfinns) och ett begränsat fel i det kombinerade filtret över ett GPS-nekat tidsfönster. - Geometri för LunaNet LANS (
lunar): namngivna platser på månytan (Apollo 11/15/16, Shackletons kant) med auktoritativa selenografiska koordinater, utsiktsvinklar från ytan (az/el/avstånd), sikt/täckning och DOP för platsen, validerade mot månens radie, de publicerade platskoordinaterna och identiteten för radiellt överhuvudet med elevationen 90°. - Guidad playground i webbläsaren: reglage i guidat läge, en utdatapanel med flikar, en rundtur vid första körningen, lägen för parametersvep och överlagring av flera körningar, en beroendefri 3D-banvy med canvas/SVG (banpaketet ger nu en additiv
eci_track), ett inbäddnings-/iframe-läge och nedladdning som HTML-rapport — var och en med nodenhetstester i CI. - Felmodell för IMU validerad mot datablad (
tests/imu_allan_spec.rs): ARW/VRW/biasinstabilitet för ADIS16465/16488/16460 återfunna ur den syntetiserade Allan-deviationen och kontrollerade mot tillverkarens specifikationer (identifiering enligt NIST SP1065 / IEEE 952). - Validering av Allan-estimatorer enligt NIST SP1065 (
tests/allan_nist_sp1065_1000point.rs): de fyra estimatorerna reproducerar de publicerade referensdeviationerna för 1000 punkter och konfidensgränserna i tabell 32. - Skyddsnivåer för SBAS / DO-229E, jonosfärsfri L1/L5 och en compliance-karta för DO-316 (modulen
sbas).sbas_protection_levelbildar den viktade geometrimatrisen ur varje satellits elevation/azimut och felbudgeten för UDRE/GIVE/flyg/tropo, inverterar normalmatrisen (deladorbit::invert4) och projicerar varianserna till HPL/VPL via K-faktorerna i DO-229E (PA 6.0/5.33, NPA 6,18).iono_free_l1l5lägger till den jonosfärsfria pseudoavståndsobservationen för GPS L1/L5 (IS-GPS-705,γ₁₅ = 1.79327), validerad att ta ut motorns oberoende jonosfärsfördröjning av första ordningen.do316_compliance_mapspårar kraven i DO-316/DO-229E till de funktioner som implementerar dem. Validerad mot slutna definitioner av K-faktorer, numpy-referensgeometrininv(GᵀG)och identiteten för kovarians längs två vägar; den publicerade korskontrollen av PL med RTKLIB/gLAB är dokumenterad som väntande på granskning idocs/COMPLIANCE.md. - Fullständig tesseral gravitation med sfäriska harmoniska funktioner — EGM2008-fältet till grad/ordning 70. Ett nytt
gravity_sh::SphericalHarmonicFieldutvärderar geopotentialen och dess acceleration i det jordfasta systemet ur fullnormaliserade koefficienterC̄_nm, S̄_nm, med den stabila normaliserade Legendre-rekursionen av Holmes–Featherstone (avnormalisering skulle ge överflöde vid denna grad). De medföljande koefficienterna är NGA:s EGM2008-produkt (public domain, via ICGEM), medföljer iegm2008_data.rsoch reproduceras bit för bit avtools/gen_egm2008.pyur den incheckadetools/egm2008_to70.gfc; vilken ICGEM-modell.gfcsom helst läses in viafrom_gfc. Validerad mot tre oberoende referenser: sammanfall till punktmassa (enbartC̄00=−μr/|r|³), ett fält med enbart zonala termer som reproducerar den befintligaforces::zonal_acceltill ~1e-9, och den analytiska accelerationen som stämmer med finita differensgradienten av den direkt summerade potentialen till <1e-6. - Allmänt relativistisk acceleration av Lense–Thirring (referenssystemsdragning) (
forces::lense_thirring_accel, IERS 2010 ekv. 10,12), den gravitomagnetiska termen utöver den befintliga Schwarzschild-korrektionen, inkopplad i den numeriska propagatorn via en ny flaggaForceModel::lense_thirring(). Validerad som linjär i jordens rörelsemängdsmoment och 1–2 storleksordningar under Schwarzschild-termen, det område som mätningarna med LAGEOS / Gravity Probe B ligger i. - Ett trait
Propagatorsom förenar de analytiska och numeriska banpropagatorerna. Den numeriska Cowell-propagatorn med kraftmodell är nu en förstklassig jämlike till SGP4: en ny typNumericalPropagator(begynnelsetillstånd +ForceModel+Tolerance+ val av steghalvering eller Dormand–PrinceIntegrator) ochSgp4implementerar bådapropagator::Propagator, varsstate_at(t_seconds) -> StateVectorreturnerar det tröghetsbundna TEME-tillståndet i SI-enheter (m, m/s) så att de två är utbytbara bakom enBox<dyn Propagator>. SGP4-implementationen är den exakta omvandlingen km/min→SI av den inneboende metoden (verifierad med ett likhetstest); den numeriska implementationen klarar samma spärr på under en meter mot exakt Kepler via traitet, de två adaptiva drivrutinerna är överens, och ettPropagatorErrorlyfter fram den underliggande SGP4-koden.
0.13.0 - 2026-06-08#
Den här releasen stänger det största korrekthetsgapet i motorn: jordorientering och reduktion av referenssystem görs nu med referensimplementationens kvalitet (validerat bit för bit mot ERFA/SOFA), integritetsstacken får ARAIM med två konstellationer på verkliga GPS+Galileo-TLE, och lagren för propagering, kvantsensorer, måne/cislunart rymd och geomagnetism fördjupas alla — vid sidan av ett typat Python-API, en rikare playground i webbläsaren och en reproducerbarhetsmatris för tre operativsystem. Höjdpunkter:
- Referenssystem, bit för bit. Full IAU 2000A- och 2000B-nutation, IAU 2006-precession, den CIO-baserade (X, Y, s) reduktionen IAU 2006/2000A GCRS↔ITRS, IERS-polrörelse och utdatasystemen TEME→GCRS/ITRS — var och en validerad bit för bit mot referensrutiner i ERFA/SOFA.
- ARAIM med två konstellationer (GPS + Galileo) på verkliga TLE, med HPL/VPL, utdata som Stanford-diagram och en öppen
docs/ARAIM_REFERENCE.md. - PNT för cislunart rymd: en CR3BP-propagator för Jorden–Månen, system MCI↔MCMF, selenografiska koordinater och ett körbart LunaNet-scenario för integritet på månen.
- Kvantavkänning: systematiska fel från Coriolis och AC-Stark för kallatomsinterferometern, ett driftsvep och validering mot Freier-budgeten (2016).
- Geomagnetisk huvudfältsmodell IGRF-14, fristående och validerad.
- Typat Python-API (PyO3
RunOutput/ScenarioMeta,.data(),scenario_kinds,validate_toml, typstubbar) med ett wheel-bygge i CI, plus förstklassig utdata av GCRS/ITRS från propagatorn och export av CCSDS OMM. - Trovärdighet och reproducerbarhet: en direkt jämförelse av SGP4-noggrannhet mot den oberoende craten
sgp4, en täckningsspärr i CI (~97 % av raderna isrc/) och en reproducerbarhetsmatris för tre operativsystem (ubuntu/macos/windows).
Ändrat#
- Varje diagram i playground matchar nu webbplatsens tema. Alla tolv SVG-diagramgeneratorer — resultat-/holdover-diagrammet (
src/report.rs+src/chart.rs), Allan-deviationsdiagrammet (web/app.js) och varje scenariodiagram (src/hybrid.rs,jamming.rs,timetransfer.rs,spoof.rs,raim.rsStanford + tillgänglighet,lunar.rs,ensemble.rs,sweep.rs,gnss_sim.rs,fusion/pack.rs,inertial/mod.rs) — använde kalla marinblå paneler (#0e131b), kallgrå axlar/text och en kolliderande serieuppsättning i rött/blått/lila. De använder nu den varma grafitpaletten genomgående: paneler med--bg, varmt--line-rutnät, etiketter med--fg, med en konsekvent serietilldelning: kvant = honungsguld (--accent-bright), klassisk = varm bärnsten (--partial), spec/gräns =--crit. Säkerhetskodade vyer behåller sin betydelse: RAIM-Stanford-diagrammet förblir grönt (tillgängligt) / bärnsten (vilseledande) / rött (farligt) / dämpat stål (otillgängligt), och HPL/VPL läses som guld/brons. - Diagram beskriver sig nu självt när de sparas/laddas ner. Båda diagrammen bakar in sin titel i SVG (Allan-diagrammets titel + undertiteln "lower is better" fanns tidigare bara som HTML runt bilden, så en sparad bild saknade bildtext), och båda bär en fotrad med härkomst —
Kshana v<version> · <scenario-hash> · kshana.dev— så att ett nedladdat diagram står på egna ben och förblir reproducerbart. - Varje diagram bär nu fotraden med härkomst. Fotraden —
Kshana v<version> · scenario <hash> · kshana.dev— stämplas centralt för alla scenariotyper iapi::run_toml(den fanns tidigare bara på diagrammen för holdover och Allan), så att varje sparad eller nedladdad bild — från playground, från CLI:s export med.chart.svgeller från HTML-resultatkortet — identifierar sin version, sitt scenarioavtryck och sin källa. Hashen är märktscenarioför tydlighetens skull och kommer från resultatetsscenario_hashdär den finns, med en reserv på källhash för integritets-/månrapporterna. Vad avtrycket är och varför det finns beskrivs i avsnittet "Output" i README och idocs/PROVENANCE.md.
Rättat#
raim::chi2_quantileoch RAIM-samplaren för Stanford-brus går nu inte längre i panik vid indata utanför intervallet / som inte är ändliga (ett fynd från fuzzning som berodde på ordningen iread_dir, från de nya ARAIM-scenarierna).chi2_quantileskyddar nup/ksomnormal_quantile(returnerar ett gränsvärde i stället för att panikera medassert!), ochNormalför tillgänglighetens Stanford-brus begränsar till ett strikt positivt σ — så att stacken för integritet/ARAIM aldrig går i panik på muterade eller felkonfigurerade scenarier.
Tillagt#
- CI-matris för reproducerbarhet över plattformar. Ett nytt jobb
reproducibility-matrixkör reproducerbarhetstesterna på ubuntu-latest, macos-latest och windows-latest vid varje push. Eftersom hela resultat-JSON inte är byte-identiskt mellan operativsystem (avvikelse i libm i sista ULP) kontrollerar den den plattformsinvarianta projektionen exakt — indataavtrycket plus utdataformen, fastlåst per scenario som SHA-256-golden-filer itests/golden/av nyatests/cross_platform_golden.rs— vid sidan av de numeriska fastlåsningarna (golden.rs, till 1e-6), SGP4-tillstånden (sgp4_verification.rs, till 2e-5 km) och determinism inom samma process (determinism.rs). Tillsammans bevisar dessa reproducerbarhet över plattformar på tre operativsystem utan det sköra i exakta bytehashar av hela utdata.docs/REPRODUCIBILITY.mddokumenterar uppdelningen. - Täckningsspärr för kod i CI. Ett nytt jobb
coveragekörcargo-tarpaulinmed den LLVM-källbaserade motorn, publicerar en lcov-rapport som byggartefakt och upprätthåller ett golv för radtäckning påsrc/(genererade datatabeller, CLI-ingången, testerna och webbtillgångar undantagna). Uppmätt radtäckning är ~97 % påsrc/(SGP4 och klockmodulerna ≥95 %); spärren är satt till 85 % — över målet ≥80 % och med god marginal till det uppmätta värdet, så att den fångar regressioner utan att bli ostadig. Ett täckningsmärke publiceras i README. - SGP4/SDP4 head-to-head mot den oberoende craten
sgp4. Ett nytt test (tests/sgp4_crate_comparison.rs) korsvaliderar Kshanas propagator mot det mest använda SGP4-biblioteket i Rust (neuromorphicsystems/sgp4, tillagt som ett beroende enbart för test) över samma 666 vektorer i AIAA 2006-6753. När båda drivs med gravitationsmodellen WGS72 som vektorerna använder stämmer de två oberoende implementationerna överens till under en mikrometer för jordnära och resonanta banor och till 4,12 mm i värsta fall över alla regimer, och båda reproducerar referenstabellentcppver.out. Den incheckade jämförelsetabellen (tests/fixtures/sgp4_comparison.md, omgenererad viaKSHANA_REGEN_FIXTURES=1) bryter ut resultatet per regim (LEO/MEO, djuprymd, resonans på ½ dygn och 1 dygn) och noterar de fyra medvetet patologiska fall som craten avvisar vid konstruktionen. De levande kontrollerna håller båda inom 2e-5 km från referensen och inbördes inom 4e-5 km — ett regressionsskydd, inte en engångsföreteelse. Det här är konkurrenskraftig meritlista: korrekthet mot en oberoende kodbas, inte bara en statisk tabell. (Craten har som standardfrom_elementsmed WGS84 och skiljer sig därför från WGS72-referensen med ~km — det framgår ärligt i tabellens text.) - Export av CCSDS OMM kan nu nås från början till slut. OMM-skrivaren (
src/omm.rs) hade tidigare ingen väg via CLI/API; medelelementen i ett scenarioorbitkan nu publiceras som en CCSDS 502.0-B-2 OMM-katalog — ett OMM KVN-meddelande per satellit som definieras av TLE — viakshana <orbit.toml> --export-omm out.omm, eller så skriverexport_omm = truei scenariot automatiskt<scenario>.omm(som speglar det befintliga--export-sp3). Varje meddelande bär satellitens verkliga NORAD-katalognummer, internationella COSPAR-beteckning (YYYY-NNNP) och epok (CCSDS-form med dag på året), tolkade ur TLE-rad 1 av den nyatle::parse_tle_identity; namnraden blirOBJECT_NAME(annarsOBJECT <id>).CREATION_DATEär scenariots epok, inte väggklocktid, så utdata är reproducerbara. Nytt API:api::export_omm/api::auto_export_omm,OmmFile::from_tle_block,OrbitClockScenario::to_omm_string. Ett syntetiskt Walker- eller RINEX-scenario (inga TLE-medelelement) ger fel i stället för att skriva en tom fil. Validerat mot den medföljande ögonblicksbilden med 30 satellitergps-ops(tests/sp3_export_roundtrip.rs). - Interaktiva avläsningar vid hovring på playgroundens diagram. När markören förs över ett diagram snäpper ett hårkors till närmaste prov och visar en verktygstips med värdet (
web/hover.mjs, inkopplad iweb/app.js). På Allan-diagrammet visar det τ och varje klockas σ_y(τ); på tidsseriediagrammen för scenarier (klockans holdover, dödräkning, tidsöverföring, hybrid-PNT, GNSS/INS) visar det tiden och varje svits värde i diagrammets egna enheter (ns / m / ps / utnyttjandegrad), tolkade ur resultatet så att avläsningen stämmer med kurvan. Specialiserade diagram (RAIM, spoofing, svep) får ingen överlagring. Diagrammen förblir självbeskrivande blob-<img>, och överlagringen är ett genomskinligt hårkors + verktygstips ovanpå, så nedladdning/jämförelse/export berörs inte. Koordinatmatematiken (närmaste prov, markör→andel av ritytan, tolkning av polylinje) är enhetstestad (web/hover.test.mjs, körs i CI). - Jämförelseläge A/B i playground. Fäst vilken körning som helst som baslinje A, kör ett andra scenario, så visas de två sida vid sida med en tabell över skillnader i kvalitetsmått (holdover, RMS/p95 för tidssynkronisering, tillgänglighet) som färgar vinnaren per mått (
web/compare.mjs, inkopplad iweb/app.js; skillnadslogiken är enhetstestad iweb/compare.test.mjs, körs i CI). Alla värden infogas som text och alla diagram via blob<img>, så ingenting från en scenariosträng infogas någonsin som markup. - Nedladdningsknappar för diagram (SVG + PNG). Varje diagram i playground har nu ett temamatchat verktygsfält "Download SVG / PNG" (
web/chartdl.mjs, inkopplat iweb/app.js). SVG lämnar tillbaka den trogna, skalbara originalbilden; PNG rastrerar samma självbeskrivande bild i 2x för bildspel och dokument. Filerna får namn med sin härkomst —kshana-<chart>-v<version>-<scenario-hash>.<ext>— och logiken för filnamn och storlek är enhetstestad (web/chartdl.test.mjs, körs i CI). - Geomagnetisk huvudfältsmodell IGRF-14 (
src/igrf.rs). IAGA:s standardfält med sfäriska harmoniska funktioner (grad/ordning 13, epok 2025,0 + sekulär variation 2025–2030; koefficienterna är maskingenererade ur den officiellaigrf14coeffs.txtavtools/gen_igrf.pytillsrc/igrf_data.rs, bit för bit reproducerbara). En Schmidt-normaliserad syntes ger fältvektorn (nord/öst/ned) och härledda element (deklination, inklination, horisontell/total intensitet) på vilken geodetisk plats och vilket datum som helst, plus den geomagnetiska polen och dipolstyrkan — den magnetiska motsvarigheten till gravitationskartmatcharen för navigering med alternativ PNT. Validerad fristående: syntesen stämmer med den exakta slutna lutande dipolen, hela det analytiska fältet av grad 13 stämmer med en finit differens av den skalära potentialen, dipolaxeln reproducerar den kända geomagnetiska polen (~80,7°N, −72,7°E) och styrkan ~29,7 µT, och det globala fältet är fysikaliskt. - Typade Python-bindningar (
src/python.rs). Utöverrun/run_fullmed sträng in/sträng ut exponerar modulen nu en typad klassRunOutput(.json,.svg,.summaryoch en åtkomstmetod.data()som returnerar resultatet tolkat till en inbyggd Python-dict — ingen ny JSON-tolkning, kan omslutas av NumPy), plusrun_typed,scenario_kinds()(tolkad lista med metadata-dictar) ochvalidate_toml()(en lista med felmeddelanden som inte kastar fel). Levererar en typstubb enligt PEP 561 (kshana.pyi+py.typed) för mypy/pyright/editorer och en snabbstart idocs/PYTHON_API.md. De befintliga funktionerna är oförändrade. - Förstklassiga utdatasystem för propagatorer (
src/orbit.rsenumFrame+position_in_frame+state_gcrs). VarjePropagator(Kepler, SGP4, RINEX, GLONASS, SP3) kan nu ge sin position i TEME, GCRS (≈ J2000) eller ITRS (jordfast) — TEME är nativt, GCRS via den validerade reduktionen TEME→GCRS, ITRS genom att kedja den vidare till CIO-rotationengcrs_to_itrsenligt IAU 2006/2000A — och sitt fullständiga GCRS-tillstånd (position + hastighet) viastate_gcrs. Det tröghetsbundna utdata för aktuellt datum är inte längre bara TEME. - CIO-baserad reduktion från himmelssystem till jordsystem enligt IAU 2006/2000A (
src/cio.rs). Den moderna kedjan GCRS↔CIRS↔ITRS utan ekvinoktium: CIP-koordinaterX, Yavlästa ur matrisen för bias-precession-nutation enligt IAU 2006/2000A (återanvänder den validerade FW-precessionen + 2000A-nutationen med justeringen P03 föreraNut06a), serien med 66 termer för CIO-lokalisatorns(eraS06, maskingenererad ur ERFA-referensen avtools/gen_s06.pytillsrc/cio_s06_data.rs, bit för bit reproducerbar), matrisen GCRS→CIRS (eraC2ixys), jordrotationsvinkeln (eraEra00) och hela rotationen GCRS→ITRS (eraC2tcio, sammansatt med den befintliga IERS-polrörelsen). Validerad bit för bit mot de publicerade testvektorerna föreraXys06a(X=0.5791308482835292617e-3, Y=0.4020580099454020310e-4, s=-0.1220032294164579896e-7 vid JD_TT 2453736,5),eraC2ixysocheraEra00. CIO-kedjan och den äldre TEME-reduktionen med ekvinoktium/GMST-1982 visas stämma överens upp till sin dokumenterade konventionsskillnad i sidertid på ≈2·(ekvinoktiernas ekvation). Det här är den rigorösa reduktion som vägen med ekvinoktium/GMST approximerade. - Fullständig nutationsserie IAU 2000A (
src/nutation.rsnutation_iau2000a,nutation_matrix_2000a). Den kompletta modellen MHB2000 — 678 luni-solära + 687 planetära termer — noggrann till < 0,1 mas, vid sidan av den befintliga trunkeringen 2000B med 77 termer. Tabellerna är maskingenererade ur IAU SOFA / ERFA-referensennut00aavtools/gen_nut00a.pytillsrc/nutation_iau2000a_data.rs(generatorn reproducerar den incheckade filen bit för bit), och hela serien — både uppsättningarna fundamentala argument enligt IERS-2003 och MHB2000 och de planetära longituderna — är validerad bit för bit mot den publicerade testvektorn föreraNut00a(Δψ = −0.9630909107115518e-5, Δε = 0.4063239174001679e-4 vid JD_TT 2453736,5, till 1e-13 rad). Standardreduktionen TEME→GCRS behåller serien 2000B (~1 mas, under kedjans förenkling av hastighetssystemets rotation);nutation_matrix_2000aexponerar matrisen för aktuellt datum på < 0,1 mas för anropare som behöver den. - Körbart scenario för integritet på månen (
kind = "lunar-integrity",scenarios/lunanet-araim.toml). Kopplar in skyddsnivåpassagen vid månens sydpol (src/lunar.rsLunarScenario→south_pole_hpl_pass) i scenariokörningen med ett JSON-LunarReportoch ett SVG-diagram över HPL mot tid, så att fallet med integritet i cislunart rymd nås direkt från CLI. Det visar gapet ärligt: med 30 m LANS σ_URE överstiger HPL vid sydpolen (≈ 260–450 m) en larmgräns på 50 m (0 % tillgänglig) — integriteten för PNT på månen är ännu inte uppnådd. - Tillgänglighet för ARAIM med två konstellationer på verkliga GPS+Galileo-TLE, och inkoppling i scenariokörningen (
src/raim.rs,src/orbit.rs,scenarios/araim-gps-galileo.toml). Lägger tillaraim_dual_constellation_availability(den avancerade ARAIM-motorn — fel hos enskilda satelliter och fel i hela konstellationen — körd över ett tidsrutnät) ochvisible_positions_labeled, och kopplar in den i körningen förIntegrityScenariovia en flaggaaraim_dualså att en ARAIM-studie med flera GNSS nås direkt från TOML. Ett test med verkliga data (tests/araim_dual_real_data.rs) på medföljande ögonblicksbilder från Celestrak för GPS+Galileo från 2026-06-07 visar att poolning av Galileo lyfter ARAIM-tillgängligheten från 0,21 till 0,67 under ett krävande VAL på 12 m (10,5→21,8 satelliter i sikte), medan det läge som är robust mot konstellationsfel är i grunden begränsat med bara två konstellationer — den kvantitativa orsaken till att robust integritet med två konstellationer driver mot en tredje konstellation eller SBAS. Ärlig rest: den numeriskt exakta reproduktionen av tabell A-3 i EU:s ARAIM TN mot en enda versionslåst epok, och en fixturepost i Zenodo. - Det cirkulära begränsade trekroppsproblemet (CR3BP) för systemet Jorden–Månen (
src/cr3bp.rs). En ny kärna för cislunar dynamik som tvåkropps-/SGP4-propagatorerna inte kan erbjuda: rörelseekvationer i roterande system (cr3bp_accel), en RK4-propagator (propagate_cr3bp), Jacobi-konstantens integral (jacobi_constant) och de fem Lagrange-punkterna (lagrange_points). Validerad mot slutna / publicerade ankarvärden: de kollinjära punkterna för Jorden–Månen (L1 ≈ 0,83692, L2 ≈ 1,15568, L3 ≈ −1,00506), de exakta liksidiga L4/L5 = (½−μ, ±√3/2, 0), alla fem bekräftade som jämviktslägen i fältet, Jacobi bevarad till integratorns precision under propagering och den återställande kraften utanför planet som gör halo-/NRHO-banor möjliga. Det här är grunden för att kunna representera en verklig NRHO. Ärlig rest: differentialkorrigerade periodiska begynnelsevillkor för NRHO 9:2, den excentriska modellen / efemeridmodellen (DE) och den avnormaliserade transformationen till de selenocentriska systemen isrc/lunar.rs. - IERS-polrörelse och reduktionen TEME→ITRF (
src/frames.rs). Lägger tillpolar_motion_matrix(SOFAiauPom00:W = Rx(−y_p)·Ry(−x_p)·Rz(s′)med TIO-lokalisatorns′),pef_to_itrf/itrf_to_pefochteme_to_itrf— GMST-baserad rotation TEME→PEF följd av polrörelse — vilket fullbordar en ITRF-precis jordfast position ovanpå den enbart GMST-baseradeteme_to_ecef(polrörelsen är en effekt på tiotals meter vid banradien).x_p/y_pär observerade IERS-storheter som anroparen tillhandahåller. Ärlig rest: en helt CIO-baserad kedja (X, Y, s) och en numerisk korskontroll mot ANISE/SPICE på <10 m återstår som uppföljningar. - Systematiska fel i kallatomsinterferometern, driftsvep och en validering mot en publicerad enhet (
src/inertial/quantum_imu.rs,docs/QUANTUM.md). Utökar den accelerometer för CAI som bygger på första principer med de två ledande deterministiska systematiska felen: fasen för Coriolis/rotationΦ_cor = 2·k_eff·v_⊥·Ω·T²(coriolis_phase, med den motsvarande accelerationsbiasen2·Ω×vviacoriolis_accel_bias) och fasen för ljusförskjutning med AC-StarkΦ_LS = (δ_LS,1 − δ_LS,3)/Ω_eff(ac_stark_phase, som tar ut sig själv genom symmetrin π/2–π–π/2 för en konstant förskjutning). Lägger tillcai_drift_sweep(drift i dödräkningsposition mot cykeltid — kärnan i en jämförelse mellan kvant och klassiskt) och ett valideringstest mot den mobila gravimetern i Freier et al. 2016 (arXiv:1512,05660): det modellerade golvet för kvantprojektionsbrus ligger under, och inom ~2 storleksordningar från, det publicerade kortsiktiga bruset på 96 nm/s²/√Hz.docs/QUANTUM.mduppdaterad. Ärlig rest: systematiska fel från vågfront/strålriktning, lösning av fransosäkerhet, den exakta reproduktionen av flygtesterna CARIOQA-PMP / Boeing-AOSense (kräver publicerade PSD:er för plattformen) och en förinställning för JS-playground. - Reduktion av cislunara referenssystem och en integritetspassage vid månens sydpol (
src/lunar.rs). Utökar månens ARAIM-motor med rotationen MCI↔MCMF (månencentrerat tröghetssystem ↔ månfast) (mci_to_mcmf/mcmf_to_mci, en förenklad modell med medelrotation vid månens sidertidstakt), selenografisk latitud/longitud/höjd (mcmf_to_selenographic/selenographic_to_mcmf) ochsouth_pole_hpl_pass— en landad mottagare i Artemis-regionen mot en representativ uppsättning LunaNet-reläer över en passage på 24 h, vilket ärligt kvantifierar integritetsgapet: med nominella 30 m LANS σ_URE är skyddsnivån ändlig men överstiger en larmgräns på 50 m för ytoperationer. Ärlig rest: den precisa efemeriden för LANS NRHO (en cislunar bana med 3 kroppar), den fysikaliska libration / den precesserande månpolen (DE421/SPICE) och ett LunaNet-TOML-scenario återstår som uppföljningar. - Integrity support message för ARAIM, SVG för Stanford-diagram och den öppna ARAIM-referensen (
src/raim.rs,docs/ARAIM_REFERENCE.md). Lägger till ett uttryckligtIntegritySupportMessage(σ_URA / σ_URE / b_nom / P_sat / P_const, med referensvärdena från WG-C för GPS+Galileo och omvandlarna.fault_priors()/.dual_fault_priors()in i motorernaaraim_raimför enkelfel ocharaim_dual_raimför fel i hela konstellationen), en fristående renderarestanford_svgav Stanford-integritetsdiagrammet (de fyra zonerna, gränsenPL = error, larmgränsernas hjälplinjer, en färgkodad markör per epok) ochdocs/ARAIM_REFERENCE.mdsom dokumenterar algoritmen, ISM, felhypoteserna, kontraktet för skyddsnivån och fördelen med två konstellationer. Testen visar vinsten i geometri/redundans (poolning av en andra konstellation skärper HPL för enkelfel) och tolerans mot fel i konstellationen (användaren med två konstellationer klarar förlusten av en hel konstellation; en användare med en konstellation gör det inte). Ärlig rest: att numeriskt reproducera tabell A-3 i EU:s ARAIM TN / tillgänglighetssiffran 15–25 % mot en versionslåst verklig TLE-ögonblicksbild, en fixturepost i Zenodo och inkoppling avaraim_dual_raimi körningen av scenariofiler. - Nutation IAU 2000B och hela tröghetsreduktionen TEME→GCRS/J2000 (
src/nutation.rs). Lägger till den andra och tredje delen av en sann reduktion till tröghetssystem ovanpå den levererade precessionen IAU 2006: den luni-solära serien MHB2000 med 77 termer (nutation_iau2000b, den vanliga trunkeringen IAU 2000B, noggrann till ~1 mas) med Delaunays fundamentala argument och nutationsmatriseniauNumati SOFA, samt Valladokedjan AIAA-2006-6980 TEME→TOD (ekvinoktiernas ekvation) → TOD→MOD (nutation) → MOD→GCRS (bias-precession), exponerad somteme_to_gcrs(r, v, jd_tt)/gcrs_to_teme. Serien, argumenten och enhetskonstanterna är avskrivna ur IAU SOFA / ERFA-referensennut00boch validerade bit för bit mot den publicerade testvektorn föreraNut00b(Δψ, Δε till 1e-13 rad). Ärlig rest: hela serien IAU 2000A med 678 termer (<0,1 mas), en numerisk korskontroll mot ANISE/SPICE på <10 m och polrörelse återstår som uppföljningar (seROADMAP.md).
0.12.0 - 2026-06-06#
Den här releasen levererar Kshanas första icke-analytiska banpropagator — en Cowell-integrator med en hierarkisk kraftmodell med sex störningar (tvåkropps + zonala J2–J6 + tredje kropp Sol/Måne styrd av epok + solstrålningstryck med konisk umbra-/penumbraskugga + atmosfärisk drag + den postnewtonska relativistiska Schwarzschild-korrektionen) driven av ett val mellan två adaptiva integratorer (RK4 med steghalvering och det inbäddade paret Dormand–Prince RK5(4)) — vid sidan av ett lager för manöver- / banutformning (impulsiva och finita brännor, en Lambert-lösare enligt Izzo och ett porkchop-svep), ett alt-PNT-lager med gravitationskartmatchning som återfinner ett GPS-nekat spår på 60 minuter till under 500 m, en pipeline för banbestämning med batch + sekventiell och en fullständig UKF med 17 tillstånd och tätt kopplad GNSS/INS med dödräkning via kvant-CAI. Varje numerisk förmåga är fastlåst mot analytisk referens eller en handhärledd sluten form; de perturbationer som är avstängda som standard lämnar de släppta golden-filerna orörda.
Tillagt#
- Postnewtonsk (Schwarzschild) relativistisk korrektion (
forces::relativistic_accel+propagator::ForceModel::relativity). Lägger till den dominerande allmänt relativistiska störningen på en jordnära bana — den ledande drivkraften bakom den relativistiska periger-framflyttningen — i formenβ = γ = 1enligt IERS / Montenbruck–Gill:a = (μ/c²r³)·{[4μ/r − v²]·r + 4(r·v)·v}. Liksom atmosfärisk drag är den hastighetsberoende, så den följer med i högerledet för integratorn(r, v)via [accel_rv], är något man väljer till och är avstängd som standard. Validerad fristående: på en cirkulär bana kollapsar den till den slutna formen3μ²/(c²r³)·r̂(rent radiell och utåtriktad, komponenter utanför axeln exakt noll); dess kvot mot tvåkropps är läroboksvärdet≈1.9·10⁻⁹i LEO (signaturen förμ/(c²r)); ett fall med radiell hastighet stämmer med den handförenkladeμ(4μ + 3v²r)/(c²r³); och i propagatorn stör den banan utan att dissipera den — halva storaxeln bevaras till långt under en meter/dygn, den strukturella motsatsen till dragets monotona avtagande. Eftersom den är avstängd som standard är golden-filerna för tvåkropps/J2/zonal orörda. Justering av PPN-parametrarna (β,γ) och termen för referenssystemsdragning av Lense–Thirring återstår som uppföljningar. - Konisk skuggmodell för umbra+penumbra (
forces::conical_shadow), som nu används av solstrålningstrycket. Uppgraderar den binära förmörkelsen med umbracylinder till en mjuk faktorν ∈ [0,1]: Solen och Jorden modelleras som skivor med skenbara vinkelradiera = asin(R☉/d☉),b = asin(Rₑ/|r|)med skenbart centrumavståndc, ochνär ett minus den andel av solskivan som Jordens skiva skymmer (cirkel–cirkel-linsens överlappsarea) — fullt solljus förc ≥ a+b, total umbra förc ≤ b−a, ringformig förc ≤ a−boch en kontinuerlig penumbra däremellan.srp_accelanvänder den nu, så att SRP-kraften avtar mjukt genom förmörkelsen i stället för att slås på/av. Lägger till det nominella IAU-värdetforces::SOLAR_RADIUS. Validerad fristående:ν = 1i fullt solljus ochν = 0djupt i umbran (exakt), en mjuk monoton penumbra (νstiger 0 → ~½ vidc = b→ 1 över bandet[b−a, b+a]), och den koniska penumbran sträcker sig bortom umbracylindern (en punkt som den binära cylindern kallar helt upplyst är0 < ν < 1för konen). Den enklarecylindrical_shadowfinns kvar; solens randfördunkling och skuggan från den tillplattade jorden återstår som uppföljningar. - Inbäddad integrator Dormand–Prince RK5(4) (
integrator::dopri54_step/integrator::integrate_dopri+propagator::propagate_dopri). Lägger till det inbäddade paret med Butcher-tablå enligt standarden Dormand–Prince (1980) vid sidan av den befintliga drivrutinen RK4 med steghalvering: sju FSAL-steg ger en lösning av 5:e ordningen och en felskattning av 4:e ordningen ur en enda uppsättning utvärderingar (7 mot 11 funktionsanrop per steg), en billigare skattning av lokalt fel. Den adaptiva drivrutinen återanvänder samma RMS-felnorm och stegregulator0.9·(1/err)^(1/5), så den är ett utbytbart alternativ;propagator::propagate_dopriexponerar den på kraftmodellen för banor. Validerad fristående: den inbäddade felskattningen är O(h⁵) (en halverad steglängd skär ned den ~32 gånger); DP5(4) integrerary' = ytilleoch den harmoniska oscillatorn över 50 perioder med energin bevarad till <1e-6; den når samma ändpunkt vid samma tolerans med färre funktionsutvärderingar än steghalvering (utan att offra noggrannhet); ochpropagate_dopriklarar samma spärr mot analytisk referens som vägen med RK4 — under en meter mot den exakta Kepler-lösningen med universella variabler över en LEO-bana på 24 h — medan de två drivrutinerna är överens inom <1 m på en J2..J6-bana (ingen sluten form). Högre inbäddade par (RKF7(8) / DOP853) återstår som uppföljning. - Atmosfärisk drag inkopplad i propagatorn som dess första hastighetsberoende kraft (
forces::atmospheric_density+forces::drag_accel+propagator::ForceModel::drag). Lägger till styckvis exponentiell atmosfär enligt Vallado tabell 8-4ρ = ρ0·exp(−(h−h0)/H)(28 band från havsnivå förbi 1000 km, begränsad under ytan) och det kvadratiska drageta = −½ · ρ(h) · (C_D·A/m) · |v_rel| · v_relmot den medroterande atmosfärenv_rel = v − ωₑ ẑ × r(forces::EARTH_ROTATION_RATE = 7.2921151467e-5). Eftersom draget beror på hastigheten fårForceModelen nyaccel_rv(t, r, v)och integratorns högerled skickar nu hastigheten (f(t,[r;v]) = [v; a(t,r,v)]); den rent positionsberoendeaccel_atär oförändrad, så de konservativa termerna och golden-filerna är orörda. Validerad fristående: densiteten förankras vid havsnivåvärdet 1,225 kg/m³, begränsas under ytan, avtar monotont genom LEO, ligger i bandet ~1e-12 kg/m³ för solmedelvärde vid 400 km, och dess återfunna lokala skalhöjd (≈ 58 km vid 400 km) är fysikalisk; draget motverkar den medroterande relativa hastigheten med storleken ~2e-6 m/s² i LEO förC_D·A/m = 0.02 m²/kg; och — den viktigaste signaturen — draget är dissipativt: en bana på 300 km förlorar specifik energi monotont och dess halva storaxel avtar med ett begränsat ~km/dygn, där vakuumbaslinjen bevarar energin till <1e-9. Termosfärens densitet enligt NRLMSISE-00 (klausulen om drag-densitet på < 5 %) återstår som uppföljning. - Solstrålningstryck inkopplat styrt av epok i propagatorns kraftmodell (
forces::srp_accel+propagator::ForceModel::solar_radiation). Lägger till kanonkulemodellen för SRPa = ν · P☉ · cᵣ · (A/m) · (AU/d)² · d̂med en förmörkelsefaktor för cylindrisk skugga (forces::cylindrical_shadow, ν ∈ {0 1}): strålningstrycketP☉ = Φ☉/cfrån den moderna totala solinstrålningen på 1361 W/m² (≈ 4,5398·10⁻⁶ N/m²), flödets avtagande med inverterad kvadrat(AU/d)²och den radiella knuffen bort från Solen. Den följer med i samma epokstyrda högerled som tredje kropp, och samplar Solenephemen gång vid den framflyttade epokenepoch_jd_tt + t/86400som delas mellan Solen som tredje kropp och SRP. Sammansättbar:with_zonals_j2_j6().third_body(true, true, epoch).solar_radiation(1.5, 0.02). Validerad fristående mot handhärledda signaturer: strålningstrycket vid 1 AU fastlåses till läroboksvärdet ≈ 4,5398·10⁻⁶ N/m²; SRP för en fullt belyst LEO-satellit är bitidentisk med kanonkuleformeln, pekar bort från Solen och ligger i bandet ~1,36·10⁻⁷ m/s² för cᵣ = 1,5, A/m = 0,02 m²/kg; ett fördubblat avstånd till Solen ger en fjärdedel av storleken (inverterad kvadrat); den cylindriska skuggan förmörkar bara umbracylindern (bortvänd från Solen och inom en jordradie från linjen Jorden–Solen) och ger exakt noll SRP i förmörkelse; och i propagatorn stör SRP en LEO-bana med en liten begränsad storlek som skalar ~linjärt med A/m — medan en modell utan störningar förblir bit för bit tidsoberoende och lämnar golden-filerna för tvåkropps/J2/zonal orörda. Den koniska umbran/penumbran (mjuk ν ∈ [0 1]), atmosfärisk drag och extern korsvalidering mot GMAT/Orekit återstår som uppföljningar. - Tredje kropp Sol/Måne styrd av epok, inkopplad i propagatorns tidsvarierande högerled (
propagator::ForceModel::third_body/accel_at). Störningen från tredje kropp är inte längre en fristående kraftterm — den integreras nu av Cowell-propagatorn som en genuint tidsvarierande kraft: varje utvärdering av högerledet samplar positionerna för Sol/Måneephemvid den framflyttade epokenepoch_jd_tt + t/86400(återanvänderprecession::julian_centuries_ttför omvandlingen mellan dygn och sekel), så att störkropparna rör sig längs sina banor under integreringen i stället för att vara frusna vid starten. Sammansättbar med vilken gravitationsmodell som helst (ForceModel::with_zonals_j2_j6().third_body(true, true, epoch)). Validerad fristående: solens term i högerledet är bitidentisk medthird_body_accelutvärderad vid efemeridens position för det ögonblicket vid bådet = 0ocht = 1 day(vilket bevisar kopplingen 86400 s ↔ 1 dygn ↔ 1/36525 sekel exakt), störkroppen flyttar sig ~2,6·10⁹ m/dygn mellan proven (inte fryst), de momentana tidvattenstorlekarna i LEO når läroboksbanden ~5·10⁻⁷ m/s² (Solen) och ~1,1·10⁻⁶ m/s² (Månen, ≈ 2× Solen), varje kropp stör mätbart banan över ett dygn men förblir begränsad, och samma begynnelsetillstånd propagerat vid epoker ett kvarts år isär ger en annan bana (tidvattenaxeln roterar 90°) — medan en modell utan någon av kropparna aktiverad är bit för bit tidsoberoende och lämnar golden-filerna för tvåkropps/J2/zonal orörda. Efemerider i DE-klass och extern korsvalidering mot GMAT/Orekit återstår som uppföljningar. - Månefemerid med låg precision (
ephem::moon_position), som fullbordar paret Sol/Måne som tredje kropp. Lägger till Montenbruck & Gills lågprecisionsserie för månen (§3.3.2) vid sidan av solmodellen, så att den kroppsoberoendeforces::third_body_accelnu kan drivas av vilken himlakropp som helst med ingen extern DE/SPK-kärna. Validerad fristående mot handhärledda signaturer för månen: det geocentriska avståndet håller sig inom det verkliga perigeum-/apogeumomhöljet (~356 500–406 700 km) över en månad och dess månatliga medelvärde återfinner halva storaxeln på ~384 400 km; ekliptikal latitud överstiger aldrig lutningen ~5,3° för månbanan (kontrollerad genom projektion på ekliptikans pol i ekvatoriella koordinater, vilket validerar latitudserien och oblikvitetsrotationen tillsammans); månens riktning återvänder till inom 1° efter en siderisk månad (27,3217 d) och dess dagliga rörelse håller sig i det fysikaliska bandet 12–15°/dygn; och störningen från månen som tredje kropp på en LEO-satellit har läroboksstorleken ~1,1·10⁻⁶ m/s² (≈ dubbelt så stor som Solens). Positionsnoggrannhet i DE-klass, atmosfärisk drag och SRP återstår som uppföljningar. - Gravitation från tredje kropp (Solen) med en inbyggd efemerid med låg precision (
forces::third_body_accel,ephem::sun_position). Lägger till störningen från tredje kropp i kraftmodellen:a = GM₃·((s−r)/|s−r|³ − s/|s|³)(direkt attraktion minus den indirekta term som det geocentriska systemet måste dra av), med solens position levererad av den nya modulenephemmed Montenbruck & Gills analytiska lågprecisionsserie — ingen extern DE/SPK-kärna behövs för en körning med låg noggrannhet. Validerad fristående: accelerationen stämmer med den exakta gradienten av sin egen störpotential (third_body_potential), störningen försvinner i geocentrum och har läroboksstorleken ~5·10⁻⁷ m/s² på en LEO-satellit, och solefemeriden når handhärledda ankarvärden för J2000 — periheliavstånd ≈ 1,471·10¹¹ m, deklination ≈ −23° nära decembersolståndet, en skenbar rörelse på ≈ 1°/dygn (≈ 90° per kvartsår) och ett avstånd som håller sig inom omhöljet 0,983–1,017 AU för jordbanan under ett helt år. Levererar halvan för tredje kropp i kraftmodellsteget i milstolpen för den numeriska propagatorn (Månen levereras i en följeslagarpost ovan); positionsnoggrannhet i DE-klass, atmosfärisk drag och SRP återstår som uppföljningar. - Kraftmodell med zonala harmoniska J2–J6 (
forces::zonal_accel/zonal_potential). Utökar Cowell-propagatorns kraftmodell bortom J2 till hela jordens zonala fält till och med grad 6 (de publicerade standardvärdena i EGM-96, ej normaliserade, förJ2..J6), inkopplad i propagatorn somForceModel::with_zonals_j2_j6(). Accelerationen är den exakta analytiska gradienten av den zonala störpotentialenR(r) = −(μ/r)·Σ Jₙ(Re/r)ⁿPₙ(z/r)(Legendre-polynom med rekursion uppåt), validerad på tre oberoende sätt: den reduceras tillj2_accel, validerad med 666 vektorer, till maskinprecision när den begränsas till[J2]; den stämmer med den numeriska gradienten av sin egen potential genom hela fältet J2..J6 (guldstandardkontrollen för konservativa fält); och de udda termernaJ3mot de jämnaJ2/J4..J6uppvisar sin karakteristiska (anti)symmetri nord–syd underz → −z— päronformens asymmetri. En propagerad J2..J6-bana bevarar total energi (kinetisk + central + zonal potential) till ~1e-8 över ett dygn och stör den bana som bara har J2 med en liten, men inte försumbar, mängd. Det här levererar steg 2 ("J2–J6 zonala harmoniska") i milstolpen för den numeriska propagatorn; det tesserala EGM-fältet av hög grad, drag, SRP, tredje kropp och extern korsvalidering mot GMAT/Orekit återstår som uppföljningar. - Numerisk (Cowell) banpropagator (
src/propagator.rs). Kshanas första icke-analytiska propagator (resten av banstacken är analytisk SGP4/SDP4): den kopplar in kraftmodellen tvåkropps + J2 (src/forces.rs) i den adaptiva RK4-drivrutinen med steghalvering (src/integrator.rs) somf(t,[r;v]) = [v; a(r)], med en växelForceModel. Validerad mot analytisk referens som är starkare än ett numeriskt verktyg att jämföra med: den ostörda banan reproducerar den exakta Kepler-lösningen med universella variabler till under en meter över en LEO-bana på 24 timmar (en strängare spärr än "mot en numerisk referens < 10 m" som milstolpen formulerar), specifik energi och rörelsemängdsmoment bevaras till ~1e-9 relativt, och nodalregressionen från J2 reproducerar den slutnaj2_secular_ratestill första ordningens teori (inom 2 %, resten av ordningen O(J2²)). Lägger också tillsolve_kepler_checked, en Newton-lösare för Keplers ekvation som returnerarErri stället för ett tyst felaktigt svar när den inte konvergerar inom en begränsad iterationsbudget (fallet nära perigeume = 0.999). Ärligt omfång: kraftmodellen är bara tvåkropps + J2 — det tesserala EGM-fältet av hög grad (200×200 + inläsare), drag (NRLMSISE-00), SRP, krafter från tredje kropp och en extern korsvalidering mot GMAT/Orekit återstår som uppföljningar. - Gravitationskartmatchning under 60 minuter utan GPS till < 500 m (
run_gps_denied_gravity_nav). Fördjupar alt-PNT-lagret till valideringsmålet Quantum Wayfarer från ESA NAVISP: ett fordon flyger ett spår på ~700 km under ett helt GNSS-avbrott på en timme — dess tröghetslösning driver till ≈ 70 km — och en kallatomsgravimeter plus en hierarkisk matchare från grov till fin med partiklar/rutnät återfinner den konstanta INS-driften till ≈ 145 m (< 500 m), en minskning med > 480×. Gravimeterns verkliga golv för vitt brus injiceras som en deterministisk sekvens med fast frö, så att matcharen aldrig får brusfri referens men körningen ändå är exakt reproducerbar (verifierat bitidentisk, och stabil inom några meter över brusrealiseringar). Ett test av regressionsklass visar att förfiningen är nödvändig — ett enda grovt rutnät stannar vid ~2 km, och först förfining i tre steg bryter barriären på 500 m. Nytt incheckat scenarioscenarios/gps-denied-gravity-nav.toml. Radendocs/CAPABILITY.mdförblir ärligt partial (fortfarande ingen medföljande EGM2008-karta) med sin evidens uppdaterad till resultatet på 60 min < 500 m. Ärligt omfång oförändrat: fält med låg grad av sfäriska harmoniska funktioner + syntetiska mascons; en Monte Carlo över realiseringar av fel i kartrepresentationen är en uppföljning. - Register över överdrivna påståenden + regressionsskydd (
docs/CLAIMS-VS-REALITY.md,tests/no_overclaims.rs). Avslutar spåret för ärlighet / borttagande av påståenden: de fjorton överdrivna påståenden som en tidigare granskning katalogiserade (OC-0…OC-13) är nu alla GREEN — de starka påståendena (OC-0kopplat Kalman-filter för klocka + position,OC-2jamming J/S→C/N₀→förlorad låsning,OC-7fysik för Mach–Zehnder-CAI,OC-8ARAIM HPL/VPL) är ersatta av levererade, testade förmågor i stället för mjukare formuleringar, och de återstående raderna har fått påståendena borttagna så att de stämmer med koden. Ett nytt CI-test skannar de levande offentliga ytorna (README,CAPABILITY,GLOSSARY,web/) och slår fel om någon utfasad bar fras med överdrivet påstående dyker upp igen utan förbehåll, så att en GREEN rad inte tyst kan regrediera. Måttet "integrity" per körning förblir ärligt märkt filtrets självkonsistens (inte flygintegritet); det verkliga ARAIM HPL/VPL visas separat så att de två aldrig blandas ihop. - Navigering med gravitationskartmatchning (alt-PNT utan GPS). Nya
src/gravimeter.rslägger till det alt-PNT-lager som studierna om gravitationskartmatchning inom ESA NAVISP:s Quantum Wayfarer / QT-CCI efterfrågar: en mätmodell för kallatomsgravimeter vars golv för vitt brus härleds ur ASD för CAI-accelerometern (σ = ASD/√τ); ett gravitationsanomalifält med sfäriska harmoniska funktioner av låg grad och full normalisering (validerat mot de slutna Legendre-funktionernaP̄₁₁=√3·cosφ,P̄₂₀=(√5/2)(3sin²φ−1),P̄₂₂=(√15/2)cos²φoch en handhärledd anomali med en enda term på 1,897 mGal) plus syntetiska mascons för de lokala dragen av hög grad; och ett partikelfilter för gravitationskartmatchning (som sätter ihopmapmatch+particle_filter) som återfinner ett GPS-nekat spår ur den anomalisekvens det flyger igenom. En incheckad NAVISP-benchmark (scenarios/gravity-map-nav.toml) skär ned en fri tröghetsdrift på ~73 km till några få km. Ärligt omfång: Kshana medföljer inte hela koefficientuppsättningen EGM2008 på 2190° — fältet är av låg grad + mascons, inte en verklig karta med hög upplösning; inläsaren för EGM/EIGEN, magnetkartan, terränghjälpt SLAM och inkopplingenkind=i scenariomotorn med ett SVG-driftdiagram återstår som uppföljningar.docs/CAPABILITY.md"Gravity-map / alt-PNT navigation" → partial. - Manövermodellering och brohuvud för banutformning. Nya
src/maneuver.rslägger till det första lagret för banutformning ovanför SGP4: impulsiva ΔV-noder som tillämpar en hastighetsdiskontinuitet och för en kovarians på 6×6 framåt (deterministisk bränna ⇒ identitet som tillståndsövergång; kovariansen för genomförandefelet roteras från brännans system — ECI eller LVLH — in i hastighetsblocket), en integrering av finit bränna (konstant dragkraft över en brännbåge med massan som tillstånd) vars uppnådda ΔV kontrolleras mot den slutna Tsiolkovskij-raketekvationen till bättre än 0,01 %, en Lambert-lösare enligt Izzo-2015 för ett enda varv (r1,r2, flygtid ⇒v1,v2), en exakt Kepler-propagator med universella variabler (tvåkroppsreferens) och ett porkchop-svep som avbildar ett rutnät av uppskjutningsepok × ankomstepok på avgångens C3 och ankomstens V∞, utskrivet som en 2D-JSON-array för konturrendering i webbläsare. Valideringen är fristående och starkare än en avläsning ur en handledning: varje Lambert-utdata skickas tur och retur genom Kepler-propagatorn (den måste landa tillbaka pår2), och porkchop-minimum kontrolleras mot det analytiska golvet för C3 i en Hohmann-överföring för två koplanära cirkulära banor. Kshana positionerar detta som lagret för prestandasimulering ovanför GMAT/Orekit, inte som en ersättning (grenar med flera varv och en verklig planetefemerid ligger utanför omfånget). Tio tester. - Fullständig UKF med 17 tillstånd och tätt kopplad GNSS/INS med dödräkning via kvant-CAI. Nya
src/fusion/tightly_coupled17.rsbär hela det tröghetsnavigeringstillstånd som ett tätt kopplat filter skattar —[position, velocity, attitude-error, accelerometer bias, gyro bias, clock bias, clock drift](17 tillstånd) — propagerat genom den strapdown-mekanisering som drivs av den uppmätta specifika kraften och vinkelhastigheten, med rotationen kropp→tröghetC ≈ I + [ψ×]för små vinklar så att attitydfelet kopplar in i horisontell acceleration (den vanliga lutningskopplingen i INS). Under ett GNSS-avbrott glider det enbart på IMU; processbruset för hastighetens slumpvandring är den härleddaq_va(crate::inertial::quantum_imu) för kallatomsinterferometerns accelerometer, så driften vid dödräkning är den som kvantsensorn begränsar — ett avbrott på 120 sekunder förblir begränsat till några hundra meter mot de kilometer som ett fritt INS av navigeringsklass skulle nå. Uppdateringen av pseudoavstånd/avståndshastighet går genom det delade osparfiltret (med α = 1 för välkonditionerade vikter vid denna tillståndsstorlek). Fem tester: identitet för mätmodellen, integrering med konstant hastighet med perfekt IMU, stöd från GNSS, skattning av accelerometerbias och benchmarken för avbrott på 120 s begränsat av CAI.
0.11.0 - 2026-06-05#
Ändrat#
- Ärlig inramning av kvantpositioneringen. Den rubrikbeskrivning som gäller är nu "PNT-resiliens-simulator med prestandamodeller för kvantsensorer" genomgående i README:s slogan, citeringsraden,
CITATION.cff(titel + sammanfattning) och bannergrafiken — i stället för den lösare marknadsföringsformuleringen "hybrid kvant/klassisk PNT-simulator". README:s avsnitt What it is / is not får ett uttryckligt omfångspåstående "It is not (yet)" (inte en fysikmotor för atominterferometri från första principer, inte en GNSS-mottagare/PVT-lösare, inte ett verktyg för uppdragsutformning), och en nyROADMAP.mdpå toppnivå gör kvantfysiklagret till en P2-punkt (Mach–Zehnder-CAI-fas, projektionsbrus, vibrationstensor) så att läsarna vet att fysiken från första principer är avgränsad och på väg, inte övergiven. Ingen ändring av beteende eller API.
Tillagt#
- Avvägningsstudie för konstellationsutformning: Walker-svep över utformningar med en Pareto-front, JSON med återbesökstid och en validering av Walker-formeln under en kilometer.
src/walker.rsfårwalker_design_sweep, som kör ett rutnätplanes × sats_per_plane(till exempel en avvägning på 3×3) vid fast inklination och tabellerar, per utformning, täckningsandel, PDOP i värsta fall och största/genomsnittliga gap mellan återbesök;pareto_frontflaggar de icke-dominerade utformningarna (färre satelliter, mer täckning, lägre PDOP, kortare återbesök), ochWalkerDesignReport::to_jsonserialiserar cellerna och Pareto-fronten — inklusive fälten för återbesökstid — som JSON. Ny validering fastlåser generatorn mot Walker-formelni:T/P/F: satelliter på samma plats i angränsande plan visas avbildas på varandra genom en exakt rotationR_z(2π/P)till under 1 km över hela 24 h av SGP4-propagering (kortperiodisk J2-andning är gemensamt läge och tar ut sig själv), och platserna i planet bekräftas ligga med avståndet2π/Si medeltal. Bygger på den incheckade verkliga ögonblicksbilden från Celestrakgps-opsfrån 2021-07-28 (scenarios/orbit-sgp4-gps.toml, som används av testerna för scenariotäckning och SP3-tur-och-retur). - Avancerad tids- och frekvensöverföring: TWSTFT, GNSS common-view, PPP, optisk, anpassning av potenslag enligt IEEE-1139 och ett klockensemble. Nya
src/timetransfer_adv.rsbygger de operativa överföringsmetoderna ovanpå de levererade slutna formerna för Sagnac/common-view och verktygen för Allan-stabilitet.twstft_sagnacger Sagnac-korrektionen för Two-Way Satellite Time and Frequency Transfer som slingsumman över tre hopp, exakt lika med BIPM:s slutna formΔt = 2·A·ω_E/c²(korskontrollerad av den oberoendetwstft_sagnac_bipm);run_twstftger en endygnsserieT_A − T_Boch dess TDEV.gnss_common_view_seriesenkeldifferentierar två syntetiska markstationer så att satellitklockan tar ut sig.iono_free_combination+ppp_receiver_clockär den jonosfärsfria PPP-kombinationen och lösningen av mottagarklockan mot en (syntetisk) referens av SP3-klass, som tar ut jonosfären av första ordningen exakt.rytov_variance,fried_parameteroch den lognormalalognormal_fadingmed enhetsmedelvärde modellerar den turbulensdrivna scintillationen på en optisk fri-rymdslänk.fit_power_law_psdär en fullständig anpassning med minsta kvadrat av fem koefficienterh_αenligt IEEE-1139 till Allan-variansens kurva (alla fem kanoniska brusprocesser samtidigt) med den dominerande processen rapporterad per τ-decad.ensemble_timescalebildar en pappersbaserad tidsskala med invers-variansviktning vars Allan-deviation faller strikt under den bästa bidragande klockan. 31 enhetstester; valideringsmålen är slutna former och syntetisk referens — en inläsning av verklig BIPM Circular-T / IGS SP3 återstår. - IONEX-jonosfärskartor: filtolkare, interpolation i tid och avbildning med snett obliquitetsmått.
src/ionex.rsfårparse_ionex, som läser filformatet IONEX (definition av rutnät i huvudet + blockSTART/END OF TEC MAP) till en sekvens avIonexMap— och normaliserar filens latitudordning från norr till söder till ettTecGridmed positivt steg och skalar värden med10^EXPONENT.interpolate_tec_in_timeblandar två på varandra följande kartor till en frågeepok, ochobliquity_factor/slant_tecavbildar den vertikala TEC på en sned stråle via faktorn för tunt enkelskiktM(z) = 1/cos z′(sin z′ = (Rₑ/(Rₑ+H))·sin z). Tillsammans med den levererade rutnätsmodellen gör dessa en uppmätt global jonosfärskarta från IGS till en användbar sned fördröjning. - Konstellationsutformning: dimensionering med streets-of-coverage + jämförelse av flera konstellationer.
src/walker.rsfårmin_satellites_streets_of_coverage, en idealiserad lösare för minsta antal satelliter med streets-of-coverage — ur den levererade halvvinkeln för täckningλoch gatans halvbreddcdimensioneras den nära polära konstellationen för kontinuerlig enkel global täckning somp = ⌈π/(2c)⌉plan (till exempel behöver ett plan med 4 satelliter på GPS-höjd 2 plan, 8 satelliter), och rapporterarNonenär satelliterna är för glesa för att bilda en kontinuerlig gata.compare_constellationsär verktyget för jämförelse av flera konstellationer: det poängsätter varje namngiven Walker-utformning på samma station/fönster viapdop_sweepoch ger deras täckning / PDOP / storlek sida vid sida. Ärligt omfång: den sömexakta korrektionen av Rider vid gränsen mellan motroterande plan och en 3D-täckningsglob återstår som uppföljningar. - Detektion av spoofing i flera lager: paritetsdetektor för RAIM-konsistens + sammanvägning av lager.
src/spoof_monitors.rsfår det tredje och sista detektionslagret och sammanvägningssteget:parity_raim_testanpassar med minsta kvadrat lösningen för position/klocka till en redundant uppsättning pseudoavstånd och testar den kvarvarande viktade kvadratsumman av residualer mot sitt tröskelvärde χ²(m−4)— och flaggar en snedvriden delmängd av satelliter samtidigt som en gemensam bias (som absorberas av mottagarklockan) korrekt lämnas osynlig för RAIM, inte maskerad.fuse_spoof_layerskombinerar lagren för paritet, AGC och SQM till ett enda viktat beslut som registrerar vilka lager som utlöstes. En Monte Carlo karaktäriserar detektorn: empirisk P_fa ≈ 0,068 mot en konstruktionspunkt på 0,05, med missad detektion som faller från 0,885 vid en spoofing-bias på 2σ till 0,16 vid 8σ. Ärligt omfång: korsvalidering mot specifika publicerade testvektorer för spoofing (Spirent / ION GNSS+) kräver de externa datamängderna och återstår som uppföljning. - Valideringsensemble för kopplat mot frikopplat Kalman-filter. En Monte Carlo med 100 försök i
src/fusion/coupled.rskvantifierar värdet av att bära korskovariansen mellan position och klocka: en trogen inline-baslinje med frikopplat filter (validerad bit för bit mot den levereradeCoupledPntFilter) bearbetar samma data med korsblocken nollställda, och efter nästan degenererade pseudoavstånd plus en positionsbestämning enbart för klockan återfinner det kopplade filtret positionen till 2,97 m RMS mot det frikopplade filtrets 48,8 m, och vinner 97 av 100 försök — klockbestämningen skärper positionen bara genom den korrelation som det frikopplade paketet kastar bort. Det här fullbordar valideringssviten för Kalman-korrekthet (Joseph-form, PSD-säkerhet, konsistens för NEES/NIS och nu ensemblen för det kopplade filtret). - Pipeline för banbestämning (batch + sekventiell). Nya
src/orbit_determination.rsåterfinner en satellits banbestämningstillstånd[r, v]ur avståndsspårning från markstation, och sätter ihop tre levererade delar: kraftmodellen tvåkropps + J2 (src/forces.rs) och RK4-integratorn (src/integrator.rs) propagerar ett kandidattillstånd över bågen, en mätmodell för avstånd förutsäger varje stationsavstånd, och Gauss–Newton-korrektorn för batch (src/batch_ls.rs) driver kandidaten till det bäst anpassade tillståndet (determine_orbit_batch). Samma dynamik och avståndsmodell driver också en sekventiell rekursiv bestämning på det levererade osparfiltret (determine_orbit_sequential). Fyra tester validerar den: förutsägelse av avstånd över bågen; återfinnande med batch till under en meter / mm·s⁻¹ ur brusfria avstånd; återfinnande med batch till ~2 m med en residual efter anpassning vid brusgolvet på 5 m (signaturen för en konsistent anpassning med minsta kvadrat); och sekventiellt återfinnande inom tiotals meter. Ärligt omfång: mätningar av avståndshastighet/Doppler och vinklar, en analytisk tillståndsövergångsmatris för J2 och maskering av stationens sikt är uppföljningar. - Tätt kopplad GNSS/INS UKF-navigator. En ny
src/fusion/tightly_coupled.rskopplar in den levererade osparkärnan för Kalman (src/fusion/ukf.rs) i en fungerande tätt kopplad navigator över det åttatillståndiga[px,py,pz,vx,vy,vz,b,d](ECEF-position/hastighet plus mottagarens klockbias och drift i avståndsenheter). Den tar in de råa satellitmätningarna —pseudorange(ρ = |p − sᵢ| + b) ochrange_rate/Doppler (ρ̇ = (p − sᵢ)·(v − ṡᵢ)/|p − sᵢ| + d) — i stället för en förberäknad positionsbestämning, såTightlyCoupled(medpropagate/propagate_orbital/update_gnss) fortsätter korrigera med färre än fyra satelliter och glider genom GNSS-avbrott på sin propagerade dynamik. Fem tester validerar den från början till slut, inklusive acceptansscenarierna i milstolpen: geometrin för pseudoavstånd/Doppler mot handvärden; brusfri konvergens till under en meter med fem satelliter; ett fall med tre satelliter som konvergerar från ~212 m till ~13 m där en PVT från ett enda ögonblick inte ens kan bildas; ett avbrott på 120 sekunder med konstant hastighet inom 50 m; och — den viktigaste acceptansen — en krökt LEO-passage på 30 minuter (verklig tvåkropps- + J2-bana) med ett GNSS-avbrott på 120 sekunder, hållen till 0,77 m RMS över passagen och 2,9 m i värsta fall genom avbrottet. Den banglidningen sätter ihop den levererade gravitationskraftmodellen (src/forces.rs) och RK4-integratorn (src/integrator.rs) till UKF:ns processmodell (propagate_orbital), så att filtret följer banans krökning — vilket en glidning med konstant hastighet inte kan (enbart krökningen är ~58 km över 120 s i LEO). Ärligt omfång: banglidningen använder kraftmodellen tvåkropps + J2 i stället för rå specifik kraft från IMU (för en obemannad orbitalplattform sammanfaller dessa); att lägga in ett feltillstånd för strapdown-IMU och korrektioner av iono/tropo i slingan återstår som uppföljningar. - Mätmodell för kartmatchning (terräng-/gravitationsreferenserad navigering). En ny
src/mapmatch.rslevererar den mätmodell som gör det levererade partikelfiltret med sekventiell viktad omsampling (src/particle_filter.rs) till en fungerande GPS-nekad navigator:field_likelihood(en Gaussisk sannolikhet för fältmatchning) ochmap_match_likelihood, som samplar vilket georefererat referensfält som helst — terränghöjd (TRN) eller en gravitationsanomali — vid en partikels position och viktar den efter överensstämmelsen med fordonets uppmätta värde. Fältet är vilken samplerFn(lat, lon) -> valuesom helst, så den kan sättas ihop med det bilinjära rutnätet isrc/ionex.rseller en closure. Två tester förankrar den — sannolikheten har sin topp (=1) vid perfekt matchning och faller tille^(−½)vid en sigma, och ett partikelfilter över en särpräglad syntetisk terrängbit återfinner den verkliga positionen till inom 0,1. Ärligt omfång: de verkliga referenskartorna (SRTM-höjd, EGM/EIGEN-gravitationsanomali) och deras inläsare är uppföljningar. - Integritet för PNT i cislunart rymd (ARAIM för månen). En ny
src/lunar.rstillämpar ARAIM-motorn MHSS för jordsidan på en navigeringstjänst för månen i stil med LunaNet med månparametrarna (σ_URE ≈ 30 mmot GPS 0,6 m,P_sat ≈ 1e-4): månkonstanter, en selenocentrisk bas Öst/Nord/Upp och en hjälpfunktion för himmelsgeometri, samtlunar_araim(HPL/VPL). Tre tester förankrar den — den ortonormala selenocentriska basen, geometrin för snett avstånd och den exakt linjära skalningen av skyddsnivån medσ_URE(månens 30 m ger en 50× större skyddsnivå än samma geometri vid GPS 0,6 m — den kvantitativa orsaken till att integritet för PNT på månen är svår). Ärligt omfång: den precisa efemeriden för LANS NRHO, felbudgeten för signal i rymden och reduktionen av referenssystem MCI↔MCMF är uppföljningar. - Tvådelade (högprecisions) juliska datum. En ny
src/jd2.rslägger tillJd2, ett julianskt datum delat i ett heltaldayoch en bråkdelfraci[0,1)(konventionen i SOFA/hifitime), mednew/from_parts/add_seconds/diff_seconds/total. Skillnader mellan närliggande epoker förblir exakta ned till golvet förf64där ett JD med en endaf64tappar ~50 µs nära J2000. Fyra tester förankrar den: tur och retur, normalisering av bråkdelen, exakt återfinnande av mikrosekunder (med felet hos enkelf64demonstrerat bredvid) och additiv/reversibel aritmetik med sekunder. - Skrivare för CCSDS OMM (Orbit Mean-Elements Message). En ny
src/omm.rskompletterar efemeridskrivarenoemmed meddelandet om medelelement:OmmFile::from_tleavbildar SGP4/TLE-medelelement till OMM-enheterna (medelrörelse i varv/dygn, vinklar i grader, plusBSTAR), ochto_omm_kvnserialiserar den KVN-form i CCSDS 502.0-B-2 som är på standardspåret — så att en bana från Kshana kan användas av vilket OMM-medvetet verktyg som helst i stället för som en skräddarsydd TLE. Två tester förankrar enhetsomvandlingen TLE→OMM (≈ 15,5 varv/dygn, 51,6° inklination med mera) och förekomsten av de obligatoriska KVN-nyckelorden. Ärligt omfång: KVN-formen och avbildningen av TLE levereras här; XML-renderingen (ndm/omm) och en tur-och-retur mot en referenstolkare är uppföljningar. - Partikelfilter med sekventiell viktad omsampling. En ny
src/particle_filter.rslägger till den olinjära, icke-Gaussiska estimatorn bakom kartstödd, GPS-nekad navigering (terrängreferenserad eller gravitationskartmatchning):predict(propagera partiklar genom dynamiken + Gaussiskt processbrus),update(viktar om efter en sannolikhet för mätning per partikel), systematiskresample, degenereringsmonitorneffective_sample_sizeoch det viktade medelvärdet som skattning. Sex tester förankrar den deterministiska kärnan exakt — ESS som spänner över 1…N, systematisk omsampling som väljer index i proportion till vikt, den viktade medelvärdets konvexa kombination, en Gaussisk sannolikhet som drar skattningen mot mätningen, beteende för omsampling till likformig fördelning och determinism för predict med fast frö. Ärligt omfång: motorn levereras här; referenskartorna (SRTM-höjd, EGM-gravitationsanomali) och kartans mätmodell är uppföljningar (rutnätssamplern med bilinjär interpolation iionexskulle fungera lika bra för en gravitations-/terrängkarta). - TEC-jonosfärskartor i IONEX-stil. En ny
src/ionex.rslägger till ett uppmätt jonosfärsalternativ till den utsända Klobuchar-modellen: enTecGrid(ett regelbundet lat/lon-nät av vertikal TEC, en global jonosfärskarta från IGS) med bilinjär interpolation vid genomstickspunkten (vtec_at, avskuren utanför nätet) och förstaordningens fördröjningΔ = 40.3·TEC/f²(vtec_to_delay_m,delay_at). Fyra tester förankrar den:1 TECU ≈ 0.162 mvid L1 med1/f²-skalningen, nodexakt interpolation, bilinjära mittpunkter som medelvärdesbildar hörnen samt kantavskurna frågor utanför nätet. Ärlig avgränsning: nätet och interpolationen levereras här; tolkning av IONEX-filformatet, tidsinterpolation mellan kartor och snedavbildningsfunktionen är kommande steg. - Geometriska korrektioner för tidsöverföring (Sagnac + GNSS common-view). En ny
src/timegeo.rslägger till de två deterministiska effekter som en verklig klockjämförelse måste ta hänsyn till, som komplement till den stokastiska tvåvägsmodellen itimetransfer:sagnac_correction(Δt = (ω_E/c²)·(x₁y₂ − x₂y₁), den fördröjning som den roterande jorden ger — tiotals ns för kontinentala baslinjer) ochcommon_view_offset, GNSS common-view-enkeldifferensen som exakt tar bort satellitklockfelet och återskapar förskjutningen mellan stationerna. Tre tester förankrar dem mot exakta referenser: Sagnac-effekten på ≈ 33 ns för ett ekvatoriellt kvartsvarv, antisymmetri och de radiella/polära nollfallen samt den exakta upphävningen av satellitklockan. Ärlig avgränsning: en fullständig TWSTFT-budget för transponder- och hårdvarufördröjning samt en jonosfärsfri PPP-lösning för tidsöverföring är kommande steg. - Kraftmodell för banor (tvåkroppsproblem + J2). En ny
src/forces.rslägger till den accelerationsmodell som en numerisk propagator integrerar:two_body_accel(−μ·r/|r|³),j2_accel-störningen från avplattningen (den slutna ECI-formen) ochgravity_accelsom summerar dem — använd den tillsammans medsrc/integrator.rssomf(t,[r;v]) = [v; a(r)]. Den ger också de analytiska J2-sekulära hastigheterna (j2_secular_rates): nodregressionΩ̇, apsidrotationω̇och medelanomalidriftṀ. Sex tester förankrar fysiken mot exakta referenser:μ/r²för tvåkroppstermen, den slutna J2-formen vid ekvatorn (~10⁻³ av tvåkroppsstorleken), den kritiska inklinationen (63,4349°) som fryser perigeum (ω̇ = 0), ISS nodregression (Ω̇ ≈ −5°/day) och den österut riktade driften hos en retrograd solsynkron bana. Ärlig avgränsning: endast tvåkroppsproblem + J2; J3–J6, luftmotstånd, SRP och tredjekropp är kommande steg. - Delbara permalänkar till scenarier. En ny
src/permalink.rslägger till en beroendefri Base64-kodek enligt RFC 4648 (standardalfabetet+/med utfyllnad och ett URL-säkert alfabet-_utan utfyllnad) samt omslagenencode_scenario/decode_scenario, så att en TOML-fil från lekplatsen kan kodas till en frågeparameter?s=och delas som en URL. Exponeras i webbläsaren som wasm-bindningarnaencode_permalink/decode_permalink. Fyra tester förankrar den mot de kanoniska RFC 4648-vektorerna ("foobar"→"Zm9vYmFy"med flera), en URL-säker tur-och-retur för ett scenario (inget+///=att escapa), avvisning av ogiltiga symboler samt en tur-och-retur över alla 256 byte. Ärlig avgränsning: kodeken och bindningarna levereras här; användargränssnittet med delningsknappen i lekplatsen, Plotly/D3-diagrammet med flera serier och A/B-jämförelseläget är kommande steg. - Gauss–Newton-batchminstakvadrat (batchens differentialkorrigerare). En ny
src/batch_ls.rslägger till den skattningskärna som en banbestämning i batch (eller vilken parameteranpassning som helst) vilar på:gauss_newtonlinjäriserar en användarlevererad modellh(x)med en Jacobian från centrala finita differenser, bildar och löser de viktade normalekvationerna(HᵀWH)·Δx = HᵀW·(z − h(x))(med återanvändning av den testade matrisinversen) och itererar till konvergens med vikter per mätning. Fyra tester förankrar den: en linjär linjeanpassning som når den exakta viktade minstakvadratlösningen, en olinjära·exp(b·t)-anpassning som återskapar de sanna parametrarna, en 3D-avståndsmultilateration som återskapar en känd position från brusfria avstånd (banbestämningsvarianten) samt avvisning av underbestämda eller oförenliga indata. Ärlig avgränsning: detta är den generiska korrigerarmotorn; den banspecifika mätmodellen för avstånd, avståndshastighet och azimut/elevation, den analytiska J2-tillståndsövergångsmatrisen och valideringen mot publicerade fall är kommande steg. - Spoofing-monitorer i RF-lagret (AGC-effekt och SQM). En ny
src/spoof_monitors.rslägger till två oberoende spoofingdetektorer i mottagarens front-end, som komplement till den klockstödda tidsspoofingmonitorn ispoof: en AGC-effektmonitor (combine_power_dbminkoherent effektsumma +AgcMonitor) som flaggar den överskottseffekt som en spoofingsändare ger utöver en konfigurerbar dB-marginal, och en signalkvalitetsmonitor (bpsk_autocorrtriangulär kodautokorrelation +SqmMonitor) som flaggar den obalans mellan Early- och Late-korrelatorerna som flervägsutbredning, meaconing och replay ger upphov till. Fyra tester förankrar de exakta slutna formerna (3,01 dB för en effektfördubbling, aggregatet10·log10(N), den trianguläraR(τ)=1−|τ|och larmtröskeln på 10 % för Early/Late). Ärlig avgränsning: den fullständiga RAIM-konsistensbaserade paritetsdetektorn för spoofing, flerlagersfusionen av monitorernas utdata och validering mot publicerade spoofingvektorer från Spirent/ION GNSS+ är kommande steg. - Adaptiv numerisk ODE-integrator. En ny
src/integrator.rslägger till den första delen av en numerisk propagator (Kshanas banpropagering är annars analytisk SGP4/SDP4): ett generiskt Runge–Kutta-steg av fjärde ordningen (rk4_step) över vilket förstaordningssystemy' = f(t, y)som helst, och en adaptiv drivrutin (integrate) som styr det lokala felet genom stegdubbling (Richardson-extrapolation) med den vanliga stegstyrningen0.9·(tol/err)^(1/5)och logik för att acceptera eller förkasta steg. Sex tester förankrar den mot exakta lösningar: exponentialfunktioneny' = y → etill< 1e-9, felminskningen på ~16× per halverat steg som visar konvergens av fjärde ordningen, energi- och återkomstbevarande hos den harmoniska oscillatorn under en hel period samt den adaptiva drivrutinen som uppfyller en snäv tolerans med variabla steg. Ärlig avgränsning: detta är integratorkärnan och dess felstyrning; de inbäddade Dormand–Prince RK5(4)/RKF7(8)-tabellerna och den hierarkiska kraftmodellen för banor (tvåkroppsproblem + J2–J6 + luftmotstånd + SRP + tredjekropp) som gör den till enNumericalPropagatorär kommande steg. - Unscented (sigma-punkts) Kalman-filter. En ny
src/fusion/ukf.rslägger till det skalade unscented Kalman-filtret (Julier & Uhlmann; Wan & van der Merwe) som en allmän skattare medntillstånd över användarlevererade process- och mätfunktioner — den sigma-punktsskattare som en tätt kopplad GNSS/INS-navigator använder när pseudoavstånds- och Dopplermodellen är kraftigt olinjär och Jacobianen i ett EKF försämras. Den omfattar den underliggande täta linjära algebran (Cholesky-faktor för sigma-punkternas spridning, Gauss–Jordan-invers för innovationskovariansen) och en Joseph-friP⁺ = P⁻ − K S Kᵀ-uppdatering. Sex tester fastställer den, där de viktigaste utnyttjar den exakta egenskapen att den unscented transformen för en linjär modell återger Kalman-filtret med numerisk precision (prediktion, uppdatering och en hel cykel av prediktion + uppdatering stäms alla av mot ett för hand körd linjärt KF, plus en 1D-analytisk kontroll av den bayesianska posteriorn och Cholesky-/inversidentiteterna). Ärlig avgränsning: detta är skattarmotorn; den tätt kopplade GNSS/INS-navigatorn med 17 tillstånd, mätmodellen för pseudoavstånd/Doppler och avbrottsvalideringsscenariot är fortfarande kommande steg. - Skyddsnivåer för ARAIM med två konstellationer. En ny
araim_dual_raimutvidgar ARAIM (Advanced RAIM) för enkelfel (araim_raim) med det konstellationsomfattande felläget i EU ARAIM / DO-316: vid sidan av hypotesen om felfrihet och hypotesen per satellit bidrar varje konstellation (märkt per satellit) med en hypotes som tar bort alla dess satelliter samtidigt, med aprioriP_const(en nyDualFaultPriors { p_sat, p_const }). Varje hypotes lägger en term till samma MHSS-integritetssumma, så VPL/HPL är de minsta gränser vars totalaP_HMIuppfyller budgeten över felfri + enskild SV + fel per konstellation (Bonferroni-fördelningen av falsklarm sker över allaN + Chypoteser). MedP_const = 0är resultatet bit för bitaraim_raim; en användare med en enda konstellation fårNonemot sitt eget konstellationsfel (det kan inte uteslutas) — vilket är precis varför täckning med två konstellationer spelar roll. Fyra tester täcker ekvivalensen, vidgningen av skyddsnivåerna, otillgängligheten för en enda konstellation och indatakontrollen, med återanvändning av den befintliga maskineriet för delösningar med lösningsseparation. - IAU 2006-precession (Fukushima–Williams-vinklar och bias-precessionsmatris). En ny
src/precession.rsimplementerar IAU 2006-precessionen (P03; Capitaine, Wallace & Chapront 2003): de fyra Fukushima–Williams-vinklarna(γ̄, φ̄, ψ̄, ε̄_A)som polynom i TT-julianska sekler (fw_angles) och rotationsmatrisen för bias och precession från GCRS till medelvärdet för datumet, uppbyggd av dem med SOFA-konstruktioneniauFw2m(precession_matrix, med hjälpfunktionernagcrs_to_mod/mod_to_gcrs). Detta är den första delen för tröghetssystem ovanpå den befintliga GMST-baserade reduktionenframes. Åtta tester validerar mot slutna ankarvärden — den genomsnittliga snedställningen vid J2000ε̄ = 84381.406″ = 23.4392794°, de publicerade konstanttermerna för vinklarna, ackumuleringen av den allmänna precessionenψ̄ ≈ 5039.998″över ett sekel, matrisens ortonormalitet ochdet = +1, det nästan identiska värdet (enbart systembias) vid J2000 samt nettorotationsvinkeln≈ 1.40°/sekel. Ärlig avgränsning (ROADMAP.md): endast precession — IAU 2000A-nutationen med 678 termer, hela kedjan TEME→GCRS och en numerisk korskontroll mot SOFA/ANISE på µas/<10 m är kommande steg. - Förstaprincipsfysik för en accelerometer baserad på kalla atomer i interferometer (CAI).
src/inertial/quantum_imu.rsmodellerar en atominterferometer av Mach–Zehnder-typ med tre pulser utifrån första principer i stället för ett datablad: effektiv vågvektork_eff = 4π/λ, interferometerfasΦ = k_eff·a·T², kvantprojektionsbrus (skottbrus)σ_Φ = 1/(C·√N), accelerationskänslighet per skott, kontrastavklingningC(t) = C₀·e^(−t/τ)och — själva poängen —CaiAccelerometer::q_va(), som härleder den vita accelerations-PSD som den klassiskaAccelModelredan använder från atomantal, avfrågningstid och kontrast. Modellen omfattar nu även vibrationskoppling — den dominerande termen i verkliga enheter: interferometerns överföringsfunktion från acceleration till fas|H(ω)| = (4/ω²)sin²(ωT/2)(accel_transfer_function), fasvariansen för vit PSDσ_Φ² = k_eff²·S_a·T³/3(vibration_phase_variance_white, med en numerisk korskontroll via bandintegralvibration_phase_variance_band), den rang-1-projiceradebeam_axis_projectionlängs strålen samtCaiAccelerometer::vibration_phase_noise/vibration_limited_accel(den senare reducerad till detk_eff-oberoende golvet√(S_a/(3T))). Elva tester verifierar fysiken för hand (Rb-87k_eff ≈ 1.61×10⁷,Φ(1 g) ≈ 1.58×10⁴ rad,σ_a ≈ 0.13 µg/skott som golv för skottbrus mot ett vibrationsgolv på ≈ 5,9 µg,1/T²,1/√Noch skalningslagarna förT³). Ärlig avgränsning idocs/QUANTUM.md: detta täcker golvet för projektionsbrus och det vibrationsbegränsade området ovanför det; laserfasbrus, Coriolis- och ljusskiftssystematik samt valideringsscenarierna PHARAO/CARIOQA är fortfarande kommande steg. - Kvant-CAI-accelerometer inkopplad i tröghetsscenariot. En accelerometer i ett tröghetsscenario med dödräkning löses nu upp till en ny
ImuKind—Classical(den befintliga sensorn med databladskoefficienter) ellerQuantumCainär den har ett valfritt[cai]-block (CaiCfg: våglängd, pulsavstånd, atomantal, kontrast, cykeltid och en valfri plattforms-vibration_psd). Enquantum_cai-sensors PSD för hastighetsslumpvandringq_vahärleds ur interferometerfysiken — skottbrusgolvet plus, när en vibrations-PSD anges, det vibrationsbegränsade bidraget kvadratiskt summerat — i stället för en angiven koefficient, och körningens proveniens registrerar att bruset är fysikhärlett. Fältetcaiärskip_serializing_if = "Option::is_none", så befintliga scenarier utelämnar det och serialiseras byte för byte likadant (scenariots hash är oförändrad). Fem tester täcker härledningen, den kvadratiska vibrationssumman, valet mellanClassical/QuantumCai, hash-stabil serialisering och en CAI-driven körning från början till slut. - Optimerare för konstellationsutformning och geometri för täckningsremsor (streets-of-coverage).
src/walker.rsfåroptimize_walker_design, en gradientfri nätoptimerare som söker i utformningsrymden{planes × sats × inclination}och returnerar den bästa Walker-utformningen under ett valtDesignObjective—MinSatellitesForCoverage,MaxCoverageellerMinWorstPdop— över den redan validerade PDOP-svepningen (ett test bekräftar att den returnerar samma vinnare som brute force). Därtill kommer de analytiska slutna formerna för streets-of-coverage,coverage_half_angle_rad(λ = arccos(Re/r·cos ε) − ε) ochstreet_half_width_rad(cos c = cos λ / cos(π/s), Rider/Beste), handverifierade mot läroboksgeometri och med detektering av luckan vid underbefolkning. Den fullständiga Rider-lösaren för minsta antal satelliter vid global täckning, en 3D-glob i lekplatsen och en DOP-korskontroll mot externa verktyg är fortfarande kommande steg. - Export av SP3-precisionsefemerid från CLI. Ett propagerat bane- eller konstellationsscenario kan nu skrivas till en SP3-c-fil:
kshana <orbit.toml> --export-sp3 out.sp3, ellerexport_sp3 = truei scenariot skriver automatiskt<scenario>.sp3(api::export_sp3/auto_export_sp3,OrbitClockScenario::to_sp3_string, valfriepoch). Ett tur-och-retur-test (tests/sp3_export_roundtrip.rs) propagerar den verkliga ögonblicksbildengps-opsfrån Celestrak, exporterar den, läser in den på nytt och bekräftar att de återskapade ECEF-positionerna stämmer med SGP4-referensen över 24 h till < 0,5 m (väl inom toleransen på 10 m för TLE-klass). README beskriver samverkansrollen (RINEX → RTKLIB/gLAB, SP3 → Ginan/produkter för precisionsbanor). - Kopplat Kalman-filter för klocka och position (kovarians mellan block).
src/fusion/coupled.rsCoupledPntFilterär ett enda staplat[pos, vel, phase, freq]-filter (uppdateringar i Joseph-form) vars pseudoavståndsmätningρ = g·pos + c·phase + noiseverkligen kopplar ihop position- och klockblocken — till skillnad från det äldre fusionspaketets två oberoende tvåtillståndsfilter, som håller kovariansen mellan blocken exakt noll. Validerat: ett gemensamt pseudoavstånd görP[pos,phase]skilt från noll; två olika geometrier löser gemensamt ut inlagda position- och klockförskjutningar som ett enskilt avstånd inte kan skilja åt; en positionsbestämning enbart för klockan skärper positionen via korskovariansen (den vinst som frikopplade filter inte kan ge); och NEES enligt Monte Carlo är χ²(4)-konsistent. Detta är realiseringen med 1-DOF (fusionspaketets dimensionalitet); den 3D-baserade utvidgningen med 8 tillstånd och kopplingen in i det körbara paketet spåras som kommande steg. - Hälsoövervakning av Kalman-filtrets konsistens (NIS/NEES). Kovariansuppdateringen i tvåtillståndsklockfiltret sker nu i Josephs stabiliserade form `P⁺ = (I−KH)P(I−KH)ᵀ
- KRKᵀ
, which stays positive-semidefinite under extreme Q/R ratios (Cholesky-checked in CI atR=1e-26 / Q≈1e-30). A newsrc/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, kontrollerad mot tabell).
- KRKᵀ
docs/PROVENANCE.md— en enda citerbar proveniensstabell. Samlar varje sensorparameter (klockor, tröghet, tidsöverföring), fysikalisk och algoritmisk modell (bana, tidssystem, referenssystem, jono/tropo, integritet, detektering, jamming, Allan) och valideringsdatamängd (AIAA 2006-6753, Celestrakgps-ops) med dess publicerade källa — datablad, artikel, ICD eller standard — och en ärlig mognadsetikett (flygkvalificerad / markladdad / rymdmål på markhårdvara). Länkad från README-introduktionen och dokumentationstabellen; kompletterar deprovenance-strängar per körning som redan följer med i resultat-JSON.- Typat scenario-API. Dispatch sker nu på en typad enum
ScenarioKindi stället för en rå strängmatchning påkind(ScenarioKind::classify+ uttömmande dispatch), så att tillägg av ett paket kontrolleras vid kompilering. Nya typade gränssnitt vid sidan av det oförändraderun_tomlsom returnerar en sträng:run_scenario(src) -> Result<RunOutput, KshanaError>med en strukturerad felklassificering (InvalidInput/NonConvergence/Unsupported/IoError, var och en med en stabilkind_tag()); ettScenario-trait och enExternalPack-utvidgningspunkt (paketetjammingär kopplat genom den som arbetsexempel); samt introspektionenlist_scenario_kinds()(namn, beskrivning, obligatoriska och valfria fält per slag). Python- och WebAssembly-bindningarna fårlist_kinds()ocherror_kind(). Dokumenterat idocs/ARCHITECTURE.md. - Verklig GPS-konstellation + täckning av driftområdet.
scenarios/orbit-sgp4-gps.tomllevererar nu en verklig ögonblicksbildgps-opsfrån Celestrak (2021-07-28, 30 satelliter) i stället för syntetiska Walker-TLE:er, medstrict_checksum = trueså att den bara läses in när varje TLE-kontrollsumma är giltig;scripts/fetch_tles.shdokumenterar reproducerbar uppdatering och README anger öppna data som källa. Nyatests/scenario_coverage.rsprövar varje paket över ≥5 varianter av driftområdet och kontrollerar att utdata är ändliga och begränsade, bekräftar att flicker-FM-golvet mätbart försämrar en klockas frigång när det är aktiverat (nu satt i tre levererade scenarier) och bekräftar att fusionsfiltret konvergerar med en realistisk accelerometerbias som inte är noll (inom 3× av fallet med nollställd bias), vilket stänger realismluckan "fusion fungerar bara med nollställda biaser".docs/VALIDATION.mdfår en tabell över driftområdet. - GNSS-simulering i mätdomänen (slaget
gnss-sim). En framåtmodell på pseudoavståndsnivå: för varje synlig satellit syntetiserar denρ = geometric range + c·δt_rx − c·δt_sv + I + T + noise + multipathoch L1-Doppler, med Klobuchar-jonosfären för en frekvens (IS-GPS-200 §20.3.3.5.2.5) och Saastamoinen-zenittroposfären projicerad med avbildningsfunktionen Niell (1996) — exponerade som TOML-blocken[iono]och[tropo]. Residualerna matas in i snapshot-RAIM för HPL/VPL per epok, och en JSON-arraygnss_measurements[]bär varje SV:s pseudoavstånd, Doppler, C/N₀ och jono-/tropokorrektioner. En körning utan brus återskapar geometri + korrektioner till under en millimeter (CI-test). Nyasrc/gnss_sim.rsochscenarios/gnss-sim-raim.toml. - Stokastisk detektor för tidsspoofing (slaget
spoof). Spoofingpaketet kör nu en verklig detektor i stället för en deterministisk jämförelse av ramp mot gräns: fyra injektionsformer (linear_ramp,step_jump,meaconing,replay), ett tvåsidigt χ²₁-energitest / Neyman–Pearson-test på den klockstödda monitorstatistiken med tröskeln satt utifrån en målbudget för falsklarmtarget_pfa, och sannolikheten för missad detekteringP_mdredovisad både på sluten form och med Monte Carlo (mc_runsförsök per hypotes — de två stämmer överens inom några ×1/√N). Kvalitetsmåttet Säkerhet är nu1 − P_mdvid den operativt skadliga (specificerade) storleken. Nyasrc/detection.rs(gaussiska svansfunktioner, NP-/energitest, Monte Carlo P_fa/P_md) ochscenarios/spoof-meaconing.toml. Bakåtkompatibelt: ett ensamt[attack] rate_ns_per_sgodtas fortfarande som en linjär ramp.
Ändrat#
- Definition av kvalitetsmåttet Säkerhet (slaget
spoof): från den analytiska detekterbarhetsgränsen1 − min_detectable/thresholdtill den stokastiska detektorns1 − P_md. Klockpaketets fältsecurityär fortfarande den snabbare analytiska ersättaren.
Tillagt (fortsättning)#
- RF-jammingmodell (slaget
jamming). En länkbudgetmodell för störning som omvandlar en jammers effekt och geometri till förlorad låsning per satellit: jammer-till-signal-förhållandet utifrån fritt-rums-väglust och mottagarantennens förstärkning i varje riktning, den effektiva C/N₀ via den vanliga anti-jam-ekvationen (avspridningens processgain × den spektrala separationsfaktornQ; Kaplan & Hegarty §9,4) och en konfigurerbar spårningströskel, poängsatt över en Walker-konstellation som kvalitetsmåttetavailability_under_jamming. Nyasrc/jamming.rsochscenarios/jamming-demo.toml. Den ärliga avgränsningen (ingen flervägsutbredning, terrängskuggning, AGC eller adaptiv nollning) dokumenteras idocs/CAPABILITY.md/docs/VALIDATION.md. - Generisk N-dimensionell parametersvepning över vilket scenarioslag som helst (
sweep-nd). Den tidigare N-dimensionella svepningen gällde bara klockpaketet.sweep-ndvarierar punktade TOML-nycklar i ett[base]-scenario över den kartesiska produkten av dess axlar, skickar om varje nod i nätet genom den normala körvägen och läser ut ett eller flera mått ur resultatet via punktade JSON-sökvägar — så att det fungerar för varje paket (tröghet, gnss-ins, integritet, spoofing, …) utan koppling till varje pakets Rust-typ. Noderna i nätet utvärderas parallellt över OS-trådar på inhemska mål (inget tillagt beroende); wasm faller tillbaka på sekventiell körning. Deterministisk och radvis oberoende av antalet trådar. Nytt exempelscenarios/sweep-nd-inertial.toml. - TOML-konfigurerbar deterministisk IMU-felmodell i paketet
gnss-ins. Den treaxliga felkedjan för strapdown (skalfaktor, felinriktning, g-känslighet, kvantisering, hastighetsramp; IEEE Std 952-1997 §A.2, Groves 2013 §4,3) kan nu nås per sensor från en scenariofil via ett valfritt[imu_*.error_model]-block, lagt ovanpå de konstanta tillslagsbiaserna. Om blocket utelämnas förblir varje sensor en ren källa med konstant bias, så att befintligagnss-ins-körningar är oförändrade. Detta kopplar in den tidigare enbart biblioteksbaserade felmodellen i ett körbart paket och ett kvalitetsmått.
0.10.0 - 2026-06-04#
Ändrat#
- Validering mot verkliga data. Den multi-GNSS-baserade tolkaren för RINEX-navigation, GLONASS RK4-propagatorn och SP3-läsaren prövas nu mot äkta IGS/DLR-filer (en verklig blandad RINEX 3-sändningsnavigationsfil och en IGS SP3-c-banprodukt), inte bara mot egenskrivna exempel — med kontroll av att satellitmängderna inte är tomma och att ECEF-positionerna är ändliga och fysiskt rimligt stora. Testfilerna används bara vid test (undantagna från det publicerade paketet); se
tests/fixtures/igs/NOTICE. - RAIM på verklig geometri från referensbanor. Kärnorna för snapshot, lösningsseparation (MHSS) och ARAIM-skyddsnivåer är nu validerade mot verklig geometri från IGS precisionsbanor (SP3), inte enbart mot syntetiska konstellationer: siktlinjegeometrin byggs från den första SP3-epoken vid en verklig markstation, och testerna kontrollerar skyddsnivåer på meternivå som är tillgängliga för APV-I, att ett pseudoavståndsbias på 60 m utlöser χ²-monitorn, att lösningsseparationen identifierar den felaktiga satelliten och att ARAIM:s nivåer uppfyller den tilldelade
P_HMI. Detta stänger luckan att enbart vara validerad på syntetisk geometri (gLAB-paritet i mottagardomänen över en hel RINEX-båge återstår som en punkt på färdplanen — den kräver en pseudoavståndslösning).
Tillagt#
- Konfidensintervall per nod för den N-dimensionella parametersvepningen (
sweep::nd_sweep_ensemble). Varje nod i nätet för den N-dimensionella svepningen över kartesisk produkt kan nu utvärderas som en Monte Carlo-ensemble av frön, med mätvärdets medelvärde, percentiler och ett percentil-bootstrap-KI på 95% per nod (för båda klockorna) — en statistiskt ärlig svepning i stället för ett enda dragning per nod. Återanvänder maskineriet för ensemble och bootstrap (metric_stat); deterministisk;runs = 1reduceras exakt till den enkland_sweepmed ett frö. (Att generalisera svepningen över alla paket, vilket hänger ihop med omstruktureringen till typade scenarier, och parallell körning återstår.) - Korsvalidering av IMU-brusflödet mot NaveGo (
tests/navego_imu_crossval.rs). En extern korskontroll mot NaveGo (R. Gonzalez öppna verktygslåda för INS/GNSS): återskapar den syntetiska tur-och-retur-körningen inavego_example_allan.mpå dess publicerade referensprofil Microstrain 3DM-GX3-35 och bekräftar att vår överlappande ADEV-skattare återskapar NaveGos koefficienter för hastighets- och vinkelslumpvandring (ADEV(1 s) = σ·√dt) med under 5% avvikelse och den väntade vita-brus-lutningen −1/2. (Den inspelade STIM300-loggen.matpå 40 MB läses inte in — den är spärrad av ett binärt format.) - Tätt kopplad GNSS/INS-uppdatering (pseudoavstånd).
GnssInsEkf::update_tightly_coupled(och omslagetClosedLoopInsGnss::fuse_tightly_coupled) implementerar den tidigare stubbade mätningen i avståndsdomänen: innovationen är det predikterade avståndet från INS-positionen till varje satellit jämfört med det uppmätta pseudoavståndet, med en Jacobian längs siktlinjen på positionsfelet. Eftersom varje satellit är en skalär mätning fortsätter filtret att korrigera med färre än fyra satelliter — där en löst kopplad PVT-positionsbestämning inte finns. Fem tester täcker nollställning med fyra satelliter, korrektion med två satelliter (ingen PVT möjlig), observerbarhet längs siktlinjen med en enda satellit och indatakontroll. Endast pseudoavstånd; bärvågsfas och ett uttryckligt tillstånd för mottagarklockan återstår på färdplanen. Den oanvända cargo-funktionentight_coupling(som spärrade den gamla felstubben) har tagits bort. - Scenariopaket för löst kopplad GNSS/INS (
kind = "gnss-ins",src/fusion/pack.rs). Kopplar in den treaxliga strapdown-navigatorn och felstatus-EKF med 15 tillstånd (closed_loop/gnss_ins_ekf) i ett körbart scenario med ett kvalitetsmått — EKF disciplinerar mekaniseringen mot brusiga GNSS-positionsbestämningar medan täckningen finns och glider sedan genom avbrottet, och ersätter det äldre skalära 1-DOF-paketets nollställning som snäpper till referensen med verklig fusion. Resultatet redovisar den fusionerade serien för horisontellt fel, det poängsatta positionskvalitetsmåttet (tillgänglighet / RMS under avbrott / holdover) och RMS för den öppna slingans fria INS som jämförelse; ett kvant-/klassiskt IMU-par skiljer sig endast i verklig bias. Skickas från CLI/Python/wasm-ingången med ett exempelscenarios/gnss-ins.toml. Ärlig inramning: endast löst kopplad, en deterministisk bana, och det fusionerade felet under avbrott är golvbegränsat av överlämningens attitydfel (så det påstås inte skala med bias) — de robusta slutsatserna är att fusion slår oassisterad dödräkning för en sensor med bias och att en sensor med lägre bias har den bättre oassisterade frigången. - Konstellationsutformning på den validerade SGP4-kärnan (
src/walker.rs). En ny modulwalkerger ett utformat Walker-delta-mönster (i: T/P/F) som SGP4-medelelement, så att den syntetiska konstellationen propageras genom samma SGP4-väg som validerats till 4,12 mm mot AIAA 2006-6753-vektorerna — inte den analytiska Kepler-generatorn. Ovanpå den:pdop_sweeptabellerar täckning och median/sämsta PDOP över ett utformningsnät{planes × sats × inclination}, ochcoverage_revisitredovisar täckningsandelen och luckorna mellan överflygningar (sämsta/medel) vid en punkt på marken. Validerad mot de fysikaliska monotonicitetsvillkor som en avvägning måste följa (fler satelliter ⇒ högre täckning, lägre PDOP, kortare återbesökstid). Separat läggs en äkta TLE-ögonblicksbildgps-opsfrån Celestrak (2021-07-28, 30 operativa GPS-satelliter) till som en fixtur endast för test, och vägen från verklig TLE → SGP4 → ECEF-geometri valideras mot den (hela MEO-skalet inom 1%, nio satelliter alla i sikte vid PDOP 1,64), vid sidan av de befintliga verkliga dataväggarna för SP3 och RINEX. - Brustypsspecifika effektiva frihetsgrader för Allan-konfidensintervallen.
allan::edf_overlapping_adevimplementerar de slutna formerna i NIST SP 1065 tabell 5 (den enkla uppsättningen i Stable32) för alla fem kanoniska potenslagsbrustyper — vitt/flicker-PM, vitt/flicker-FM, slumpvandrings-FM — och ersätter det konservativa icke-överlappande antalet som χ²-frihetsgrader. En ny enumPowerLawNoiseochclassify_power_lawidentifierar den dominerande typen utifrån lutningen hos den modifierade Allan-deviationen i registret (MDEV skiljer vitt från flicker-PM där ADEV inte kan), ochoverlapping_adev_curvekopplar nu den identifierade brustypen, dess edf och ett konfidensband på 95% till varje punkt i den exporterade ADEV-kurvan (AdevPointfårnoise/edf/ci_lo/ci_hi, additivt med serde-standardvärden). Validerat på två sätt: de fem formlerna stämmer med handutvärderade värden till 1e-12, och en Monte Carlo-ensemble med 4 000 poster med vitt FM bekräftar att formeln förutsäger skattarens faktiska kvadratiska edf inom 20% (och att den klart slår det konservativa antalet). Åtta nya tester. - Stokastisk modell för tidsöverföring i två riktningar.
timetransfer::TwoWayLinkersätter samplaren med enbart vitt brus med en fysikaliskt grundad modell: den reciproka (gemensamma) vägfördröjningen upphävs i skattningen(m_AB - m_BA)/2(two_way_offset_estimate, så att två oberoende envägsmätningar medelvärdesbildas till1/sqrt(2)), och residualen är den icke-reciproka differentialfördröjningen — modellerad som en färgad process av vitt FM + slumpvandrings-FM (den valideradeClockModel), vilket ger synkroniseringsfelserien en realistisk Allan-signatur (sigma_y^2(tau) = q_rw*tau/3) i stället för plant vitt brus.LinkCfgfårq_wf_s/q_rw_s(serde-standardvärde 0 ⇒ det äldre beteendet med enbart vitt brus, bit för bit), länkens kvalitetsmått redovisaradev_tau0(modellens Allan-deviation vid grundsteget), och scenariottimetransfersamt CLI-gränssnittet exponerar dem. Golden-kvalitetsmåttet har fastlagts på nytt. Sex handhärledda tester (upphävning av gemensam mod, tvåvägsvinsten sqrt(2), RWFM-lagentau/3via länkens egenstep(), ekvivalens med det äldre beteendet vidq=0, determinism och exponering av kvalitetsmåttet från början till slut). - Numerisk paritet med Stable32 för Allan-familjens skattare (NBS14).
tests/allan_reference.rsvaliderar de överlappande skattarna ADEV, modifierad ADEV, tidsdeviation och överlappande Hadamard mot Stable32-referensdeviationerna för den kanoniska datamängden NBS14 (W. J. Riley, Handbook of Frequency Stability Analysis, NIST SP 1065, ~s. 107) vid tau = 1, 2 till en relativ tolerans på 1e-4 — faktisk överensstämmelse ~1e-6. Detta fäster skattarnas matematik mot den de facto-ledande referensimplementeringen, inte bara mot skattarnas egen analytiska självkonsistens. Endast de publika referenstalen används; ingen tredjepartskod. - Vertikalt Stanford-integritetsdiagram exporterat av scenariot
integrity. Det körbara scenarioslagetintegrityexporterar nu ett vertikalt Stanford(-ESA)-diagram vid sidan av tillgänglighetskartan för HPL/VPL: vid varje skyddad epok avbildas en fröstyrd, reproducerbar dragning av avståndsfel utan fel genom geometrin till ett faktiskt vertikalt positionsfel och klassificeras mot VPL och den vertikala larmgränsen (Available / System-Unavailable / Misleading / Hazardously-Misleading). Diagrammet (punkter per epok + antal per område) bärs i resultat-JSON och antalet integritetshändelser och HMI i CLI-sammanfattningen, så att Stanford-klassificeraren — tidigare enbart i biblioteket — kan nås från början till slut.IntegrityScenariofår ett fältseed(standardvärde 0) som styr felrealiseringen; själva tillgänglighetskartan förblir enbart geometribaserad och oberoende av frö. - Integritetsrisk (P_HMI) för ARAIM som budget för skyddsnivåerna.
raim::araim_raimhärleder de horisontella och vertikala skyddsnivåerna ur en uttrycklig integritetsriskbudget i stället för en fastK_md-multiplikator: för lösningen med alla satelliter i sikte och varje delösning där en enskild satellit utesluts bygger den(prior, detection threshold, σ)per läge på varje axel, och därefter löseraraim_protection_levelut den minsta PL vars summerade sannolikhet för farligt vilseledande information (araim_integrity_risk,P_HMI = Σ_k p_fault,k · Q((PL − T_k)/σ_k), Blanch et al. Baseline ARAIM) uppfyller den tilldeladeP_HMI. Resultatet redovisar den integritetsrisk som nivåerna faktiskt uppnår, så att en användare uttryckligen kan avväga integritet mot larmgränsen. Sex handhärledda tester (slutna former för felfritt läge och tröskelsatt enskilt läge, summering och monotonicitet över flera lägen, felfritt skydd från början till slut där en 10⁵× snävare budget höjer PL, felupptäckt och felidentifiering samt redundansgolvet för sex satelliter). MHSS för enkelfel är ARAIM:s baslinje; samtidiga fel i flera SV-delmängder, det konstellationsomfattande felläget och validering mot gLAB:s referensdatamängd är dokumenterade utvidgningar. - Tvåhastighets-kompensation för coning/sculling för strapdown-mekaniseringen.
inertial::mechanization::coning_sculling_compensateviker bort de högfrekventa termerna för coning (attityd) och rotation + sculling (hastighet) ur de ordnade IMU-inkrementen i delintervallen för en grov uppdatering, så att enNavState::step_incrementsmed måttlig frekvens återger vibrationsrektifierad rörelse som ett grovt steg över de råa summorna missar. Ett valideringstest driver en miljö med coning + sculling på 10 Hz i 60 s och jämför referens med fin frekvens, naiv grov integrering och grov integrering med vikningen: vikningen minskar positionsfelet med ~18× (från meter av naiv drift till under en decimeter), vilket bekräftar att termerna för coning/sculling är bärande. Ett typaliasScalarErrorBudgetger den äldre modellenAccelModelmed 1-DOF sitt rätta namn, skilt från den treaxliga navigatornNavState. - Tolkare för RINEX-observationsfiler. Den nya modulen
rinex_obsläser RINEX 3.0x / 4,00-observationsfilen — mottagarens faktiska mätningar — och fullbordar RINEX-paret vid sidan av den befintliga tolkaren för navigationsmeddelanden.parse_obsavkodar huvudet (version/typ, listornaSYS / # / OBS TYPESper system med fortsättningsrader, ungefärlig position, intervall, tid för första observationen) och varje epoks poster per satellit: pseudoavstånd, bärvågsfas, Doppler och signalstyrka, nycklade efter sin RINEX 3-observationskod (C1C,L1C, …) med flaggorna för förlorad låsning (LLI) och signalstyrka (SSI), där ett tomt fält bevaras som saknat i stället för som noll. Ärlig avgränsning: detta är inläsningen av standardformatet (en verklig observationslogg från RTKLIB/gLAB/IGS-station in, typade mätningar ut), inte en positioneringsmotor — ingen pseudoavståndslösning, PPP eller RTK här. - Skrivare för CCSDS OEM (Orbit Ephemeris Message). Den nya modulen
oemexporterar en propagerad konstellation som ett giltigt CCSDS 502.0-B OEM 2,0-meddelande — det KVN-efemeridformat som GMAT, Orekit, STK och de flesta verktyg för flygdynamik läser in.OemFile::from_propagatorssamplar varje satellits tröghetstillstånd (TEME) — position och hastighet, hämtade direkt från propagatorn utan jordfast rotation, till skillnad från SP3-exporten — på ett tidsnät, ochOemFile::to_oem_stringserialiserar huvudetCCSDS_OEM_VERS/CREATION_DATE/ORIGINATORplus ettMETA_START … META_STOP-segment per satellit (OBJECT_NAME/OBJECT_ID/CENTER_NAME/REF_FRAME = TEME/TIME_SYSTEM = GPS/START_TIME/STOP_TIME) följt av dessepoch X Y Z X_DOT Y_DOT Z_DOT-rader (km, km/s).CREATION_DATEanges av anroparen, aldrig från väggklockan, så att utdata är byte för byte identiska mellan körningar (reproducerbarhetskontraktet). Detta är motsvarigheten för rymdfarkostefemerider till GNSS-exporten av SP3: en Kshana-bana kan nu lämnas över till ett verktyg för flygdynamik i ett standardformat. - SP3-precisionsefemerid som propagationskälla.
Sp3File::interpolatorbygger enSp3Interpolatorper satellit som fyller i positionen mellan de tabellerade SP3-epokerna med ett Lagrange-polynom av 9:e ordningen (vedertagen IGS-praxis) och roterar den till det gemensamma TEME-systemet, exponerad somPropagator::Sp3Precise. En precisionsbanefil från IGS eller ett analyscentrum kan nu driva samma kedja för geometri, sikt och integritet som de utsända och analytiska propagatorerna. Validerad tur-och-retur: en Kepler-bana skriven till SP3 och inläst på nytt via interpolatorn stämmer med originalet till under en meter i noderna och < 100 m mitt i intervallen. Interpolation av klockan kommer härnäst. - GLONASS utsända efemerid (fullbordar multi-GNSS RINEX-navigation). Ny modul
glonass: GLONASS sänder inte Kepler-element utan en jordfast tillståndsvektor i PZ-90 (position, hastighet, sol-måne-acceleration).parse_glonass_navläser RINEX 3-posternaR, och satellitens position vid valfri tidpunkt fås genom Runge–Kutta-integrering av 4:e ordningen av rörelseekvationerna i GLONASS ICD (central gravitation +J2+ Coriolis- och centrifugaltermer från jordrotationen + den utsända accelerationen). Exponerad somPropagator::Glonass, så att GLONASS-satelliter går genom kedjan för konstellation, sikt och integritet vid sidan av Kepler-systemen; ett enda konstellationsblockrinexkan nu blanda GPS, Galileo, QZSS, BeiDou och GLONASS. - Multi-GNSS RINEX-navigation (GPS, Galileo, QZSS, BeiDou). Tolkaren för RINEX 3-navigation avkodar nu poster för Galileo (
E), QZSS (J) och BeiDou (C, MEO/IGSO) vid sidan av GPS (G) — de delar Kepler-layout och användaralgoritm — var och en utvärderad med sin egen gravitationskonstant och jordrotationshastighet (μ för Galileo/BeiDou, Ω̇ₑ för BeiDou). En fil med blandade konstellationer ger alla dem, som går genom kedjan för konstellation, sikt och integritet somPropagator::Rinex. Geostationära BeiDou-satelliter använder en annan koordinatrotation och hoppas över i väntan på en referensfixtur att validera mot. Postgenomgången använder radantal per system, vilket rättar ett latent fel där fyraradiga GLONASS/SBAS-poster hoppades över som om de var åtta rader långa. GLONASS (en modell med tillståndsvektor) kommer härnäst. - Läsare och skrivare för SP3-c/d-precisionsefemerid. Den nya modulen
sp3tolkar SP3-precisionsbanefiler från IGS/analyscentrum (parse_sp3) — den efterbearbetade ECEF-produkten för position och klocka som PPP-motorer (Ginan, RTKLIB, gLAB) behandlar som referens — till en struktureradSp3File(huvud, epoknät, position per satellit km→m, klocka µs och hastighet dm/s→m/s förV-produkter), med SP3:s sentineller för felaktiga värden bevarade. Den omvända riktningen täcks också:Sp3File::from_propagatorsbygger en SP3 av en propagerad konstellation (TEME→ECEF per epok) ochto_sp3_stringserialiserar den, så att Kshana-banor kan exporteras i det format som externa PPP-verktyg läser in — tur-och-retur mellan läsning och skrivning. Epokinterpolation och en SP3-propagatorkälla kommer härnäst. - Utsänd RINEX-efemerid som körbar konstellationskälla. En konstellation godtar nu ett inbäddat
rinex-block (RINEX 3-navigationstext för GPS) vid sidan av det befintliga alternativettle, så att en verklig utsänd fil driver ett scenario från början till slut från CLI, Python eller lekplatsen i webbläsaren — RINEX in, PNT-geometri ut. Nyttscenarios/orbit-rinex.tomlvisar GNSS-tillgänglighet och DOP från åtta GPS-satelliter byggda direkt av utsända poster. (Endast GPS LNAV; multi-GNSS och SP3 kommer härnäst.) - Utsänd RINEX-efemerid som propagationskälla. En tolkad
RinexEphemeriskonverteras nu till enorbit::Propagator(Propagator::Rinex): positionen är IS-GPS-200:s utsända bana roterad från ECEF till det gemensamma tröghetssystemet TEME (sv_position_teme, med skottsekundskorrekt tid från GPS till UT1), hastigheten fås genom central finit differens, och Kepler-omloppstiden. Verkliga utsända GPS-data kan nu driva samma kedja för geometri, sikt och integritet (RAIM) som de analytiska propagatorerna SGP4/Kepler. (Ännu inte exponerad som ett scenarioslag för RINEX-filer — det och multi-GNSS/SP3 kommer härnäst.)
0.9.2 - 2026-06-03#
Tillagt#
- Arkivbeständig DOI. Utgåvor deponeras nu i Zenodo och tilldelas en citerbar DOI.
0.9.1 - 2026-06-03#
Ändrat#
- Dokumentation. README har uppdaterats till institutionell standard: en översikt över förmågorna i hela stacken v0.9.0, ett avsnitt om versionshantering och utgåvor, ett rent huvud med den nya märkningen och en kortfattad statusrad. Inga ändringar i motorn.
0.9.0 - 2026-06-03#
Den här utgåvan lägger till tre omfattande förmågeområden ovanpå SGP4-underlaget i 0.8.0: en äkta treaxlig strapdown-INS, ett löst kopplat felstatus-EKF för GNSS/INS med sluten återkoppling, verklig RAIM med snapshot och lösningsseparation (ARAIM-stil) med HPL/VPL och ett körbart scenario integrity, samt det första steget mot samverkan mellan GNSS-format (inläsning av RINEX-3-efemerider för GPS).
Tillagt#
- Tolkare för RINEX 3-navigationsmeddelanden för GPS (
src/rinex.rs). Första steget mot samverkan mellan GNSS-format:parse_navläser en RINEX 3.x-navigationsfil och avkodar varje GPS-post (G) med utsänd efemerid — det åtta rader långa blocket SV/epok +BROADCAST ORBIT— till enRinexEphemerismed Kepler-element och klockkorrektioner, med fältnamn och enheter enligt IS-GPS-200. Hanterar Fortran-flyttalsformatet medD-exponent (parse_d) och kolumnlayout med fast bredd; poster för system som inte är GPS hoppas över, inte avvisas, så att en blandad fil fortfarande ger sina GPS-efemerider. Fyra tester: tolkning avD-exponent (inklusive tomma fält och fel), en hel post avkodad mot kända fältvärden med en rimlighetskontroll av GPS halva storaxel (√A² ≈ 26 560 km), överhoppning av system som inte är GPS och fallet med tom fil. - GPS utsänd efemerid → ECEF-position (
src/rinex.rs).RinexEphemeris::sv_position_ecef(t_tow)utvärderar satellitens jordfasta position ur den tolkade efemeriden via användaralgoritmen i IS-GPS-200 §20.3.3.4.3.1: Newtons lösning av Keplers ekvation för den excentriska anomalin, korrektionerna av andra övertonen för latitudargument, radie och inklination samt rotationen till ECEF med hänsyn till jordrotationen sedan referensepoken (med GPS-värdenaμochΩ̇ₑsom specifikationen föreskriver, och en vikning av veckoskiftetk). Tre tester: det geocentriska avståndet håller sig i GPS-bandet (≈ 26 560 km), den jordfasta farten är ~3,9 km/s, och utvärdering en hel vecka bort återger samma position. - GPS SV-klockbias med den relativistiska korrektionen (
src/rinex.rs).RinexEphemeris::sv_clock_bias_s(t_tow)utvärderar den utsända klockpolynometaf0 + af1·Δt + af2·Δt²kringTocplus den relativistiska excentricitetstermenF·e·√A·sin Ek(IS-GPS-200 §20.3.3.3.3.1). En nyEpochUtc::gps_time_of_weekomvandlar postens kalenderepok till GPS-veckotid via julianska dagar räknade från GPS-epoken (1980-01-06), och Kepler-lösningen delas med positionsutvärderingen. Tester: GPS-veckotid för en söndag/tisdag/lördag (veckogränser) och att klockbiasen domineras av af0 med en närvarande, begränsad relativistisk term. GrupplatensenTGDför L1 exponeras men räknas medvetet inte in. Ärlig avgränsning: enPropagator-källa, Galileo/BeiDou/GLONASS och SP3 återstår som nästa steg. (docs/CAPABILITY.mduppdaterad så att den stämmer.) - Användarkörbart scenarioslag
integrity(scenarios/integrity-raim.toml). Förmågan för RAIM-tillgänglighet kan nu nås från CLI/TOML som varje annat paket:kind = "integrity"tolkar ettIntegrityScenario(användarbana, en eller flera GNSS-konstellationer, elevationsmask och integritetskonfigurationen(sigma, P_fa, P_md, AL_H, AL_V)), körconstellation_raim_availabilityoch ger tillgänglighetskartan för HPL/VPL per epok som JSON plus en fristående SVG — skyddsnivåer över tid mot larmgränserna, med en grön/röd tillgänglighetsremsa.kshana scenarios/integrity-raim.tomlskriver JSON, diagrammet och en HTML-rapport. Det medföljande scenariot (24-satellitig Walker, dubbelfrekvent avståndsmätning på 1 m, APV-I-gränser) redovisar ~95 % tillgänglighet; det dokumenterar att RAIM med en frekvens inte når den vertikala APV-I-gränsen med en enda konstellation, vilket är därför vertikal vägledning använder SBAS/dubbelfrekvens/ARAIM. Testerna täcker dispatchen, JSON för tillgänglighetskartan och SVG. - Körbar RAIM-tillgänglighet över en konstellation (
src/raim.rs). Integritetsmodulen hade ingen anropare —constellation_raim_availabilitygör den till en äkta ingång från början till slut: vid varje epok på ett tidsnät propagerar den de synliga satelliterna (samma SGP4/Kepler-Propagatorsom motorn använder), beräknar skyddsnivåerna utan fel och bedömer tillgängligheten mot de horisontella/vertikala larmgränserna, och returnerar enserde-serialiserbarRaimAvailabilityReport(per epokn_visible/HPL/VPL/availableplus tillgänglighetsandelen). EnRaimConfigsamlar(sigma, P_fa, P_md, AL_H, AL_V), ochraim_availability_epochper epok exponeras för anropare som löser sin egen geometri. Tre tester: en epok som bedöms tillgänglig under APV-I-gränser på en geometri med tio satelliter, som görs otillgänglig av en omöjligt snäv gräns, ochNone-nivåer under fem satelliter; samt en körning från början till slut över en Walker-konstellation med 24 satelliter som ger en ändlig tillgänglighetskarta och serialiseras. (Sex satelliter — golvet för residual-RAIM-redundans — uppfyller ärligt talat inte APV-I ens vid avståndsmätning på 1 m; APV-I-tillgänglighet kräver den tätare geometri som testet använder.) - Ackumulator för Stanford(-ESA)-integritetsdiagram (
src/raim.rs). Det vedertagna sättet att sammanfatta en integritetsmonitor över många epoker: den ritar faktiskt positionsfel (x) mot skyddsnivå (y) och klassificerar varje epok, med hjälp av diagonaleny = xoch larmgränsen, somAvailable(PL begränsar felet, inom AL),SystemUnavailable(PL begränsar felet men överskrider AL — säkert, oanvändbart),MisleadingInformation(PL < fel ≤ AL) ellerHazardouslyMisleadingInformation(PL < fel och fel > AL — det osäkra felet).classify_stanfordär den rena klassificeraren;StanfordDiagramackumulerar(error, PL)-punkter mot en fast larmgräns och exponerar antal per område, tillgänglighet, summor av integritetshändelser ochserde-serialiserbara punkter för ritning/JSON-export. Fyra tester: varje område (inklusive gränsfalleterror == PLför begränsat), ackumulering av antal/tillgänglighet och JSON-tur-och-retur. Detta är rapporteringsytan för RAIM-skyddsnivåerna; att koppla in den i konstellationsscenariot och validera mot en offentlig datamängd återstår som punkter på färdplanen. - RAIM med lösningsseparation (ARAIM-stil) (
src/raim.rs). En integritetsmonitor med flera hypoteser vid sidan av den befintliga χ²-monitornsnapshot_raimför residual/paritet. För minstakvadratlösningen med alla satelliter i sikte och varje delösning där en enskild satellit utesluts bildar den separationenΔ_k = x_k − x₀— gaussisk med medelvärde noll när inget fel finns, med kovariansCov(x_k) − Cov(x₀)(identiteten för nästlade skattare, giltig eftersom lösningen med alla satelliter i sikte är BLUE) — och därför både upptäcker den ett fel och identifierar den felaktiga satelliten (den vars uteslutning ger den största normaliserade separationen). Horisontella/vertikala skyddsnivåer följer den vanliga MHSS-tilldelningenPL = max(K_md·σ₀, max_k[K_fa·σ_ss,k + K_md·σ_k]), medK_fa = Φ⁻¹(1−P_fa/2),K_md = Φ⁻¹(1−P_md). Nya beroendefrianormal_cdf/normal_quantilebyggda på modulens befintliga regulariserade ofullständiga gammafunktion (erf(x) = P(½,x²)). Fyra handhärledda tester: normalfördelningens CDF och kvantil mot läroboksvärden (Φ(1,95996)=0,975, svansen 1e-7 = 5,1993, symmetri); en felfri geometri som inte larmar och ger ändliga, positiva HPL/VPL; ett bias på 60 σ hos en enskild satellit som upptäcks och identifieras korrekt (excluded_sv == 2); samt redundansgolvet för sex satelliter. Stänger granskningens lucka P0 "tautologisk integritet — ingen verklig RAIM/HPL/VPL" på algoritmsidan; validering mot gLAB-datamängd och Stanford-diagramackumulatorn återstår som punkter på färdplanen. - Sluten GNSS/INS-integration (
src/fusion/closed_loop.rs).ClosedLoopInsGnsskopplar felstatus-EKF-kärnan till den treaxliga strapdown-mekaniseringen: varje IMU-sampel korrigeras med de löpande biasskattningarna, mekaniseras framåt och EKF-kovariansen tidspropageras med motsvarande navigationskontext; varje GNSS-positionsbestämning för position/hastighet bildar INS−GNSS-innovationen och matar tillbaka de skattade position, hastighet, attitydfel (ψ, som en kvaternionrotation) och accelerometer-/gyrobiaserna in i lösningen och nollställer medelvärdet för felstatus. Att återkoppla attityden (inte bara biaserna) krävs för stabilitet — lutningen och accelerometerbiasen är ett kopplat par, så att korrigera det ena utan det andra divergerar. INS och GNSS jämförs i ett lokalt tangentplan med NED-system med mekaniseringens egna krökningsradier (nyamechanization::radii_of_curvature;NavState::omega_ie_n/omega_en_nexponeras). Detta är den ärliga ersättningen för den hybrida paketets nollställning som snäpper till referensen. Tre tester: en sluten slinga som nollställer ett inlagt positionsfel på 8 m / −5 m till <0,1 m; en assisterad lösning som håller sig inom meterstorlek (<6 m) på en körbana medan en fritt löpande INS divergerar förbi 100 m; och milstolpsbenchmarken — den fusionerade lösningens Monte Carlo-positions-RMS under ett GNSS-avbrott på 60 s slår en oassisterad dödräknare med öppen slinga med >2× (≈4× över olika frön). Ärlig begränsning som dokumenteras i modulen: i löst kopplat läge går accelerometerbias och lutning bara svagt att skilja åt (båda kopplas via gravitationen), så det levererade värdet är det begränsade, korrigerade tillståndet och ett rent ingångsläge vid avbrott — inte en exakt tröghetskalibrering; rikare dynamik och den tätt kopplade utvidgningen återstår som punkter på färdplanen. - Löst kopplad felstatus-EKF-kärna för GNSS/INS (
src/fusion/gnss_ins_ekf.rs). Ett utvidgat Kalman-filter för felstatus med 15 tillstånd —δx = [δp, δv, ψ, b_a, b_g]— med strapdown-felets dynamik enligt Groves 2013 §14,2 (koppling mellan specifik kraft och lutning, Coriolis, projektion av bias från kropp till nav, Gauss–Markov-biasmodeller), en diskret övergång av första ordningenΦ = I + F·dtoch en löst kopplad mätningsuppdatering för position + hastighet (H = [I₃ 0 0 0 0; 0 I₃ 0 0 0]) i Joseph-form. Beroendefri tät linjär algebra (Gauss–Jordan-invers, Joseph-kovariansuppdatering). En cargo-funktiontight_couplingspärrar en dokumenterad, ännu inte implementerad uppdatering för pseudoavstånd/Doppler. 7 tester med handhärledda förväntningar: identiteten för skev symmetri/kryssprodukt, en verifierad invers av 3×3, kovarians som förblir symmetrisk/PSD under prediktion (och positionsosäkerhet som växer utan assistans), en positionsbestämning som krymper positionskovariansen, exakt återskapande av ett känt positionsfel vid den analytiska Kalman-förstärkningenP/(P+R)och mindre korrektioner vid större mätbrus. Detta är den kärna som ska ersätta det hybrida paketets nollställning med öppen slinga som snäpper till referensen med sluten återkoppling (kopplingen till paketet + validering mot NaveGo följer). - Deterministisk IMU-felmodell för den 3-axliga strapdown-navigatorn (
src/inertial/imu_errors.rs).ImuErrorModelförvränger ett verkligt(ω, f)-par i kroppssystemet till ett uppmätt par genom fem systematiska kategorier (IEEE Std 952-1997 §A.2; Groves 2013 §4,3, tabell 4,1): skalfaktor (förstärkningsfel i ppm per axel), felinriktning / korskoppling (icke-ortogonalitet i triaden utanför diagonalen), g-känslighet (en gyrobias i vinkelhastighet proportionell mot specifik kraft), kvantisering (avrundning till utgångens LSB) och hastighetsramp (en drift linjär i tiden — Allans tredje område), plus en konstant tillslagsbias. Varje term har standardvärdet noll, så attImuErrorModel::ideal()är en genomsynlig genomströmning och befintliga scenarier påverkas inte. Varje felkälla har ett isoleringstest (skala linjär till <0,01%, felinriktning över axlarna ovanför VRW-golvet, g-känslighetsbias, LSB-nät, linjär ramp), och ett test från början till slut driver ett navigationsfel genom mekaniseringen från en förvrängd IMU. Modelleras inte: vibrationsrektifieringsfel, temperaturgradientdrift. (Det levererade scenariopaketetinertialkör fortfarande den äldre skalära budgeten med 1-DOF; den här modellen matar 3-axelbiblioteket.) - Coning- och sculling-kompensation för strapdown-integratorn. Attitydvägen får tvåsampelsmåttet
coning_increment(½ Δθ_prev × Δθ_cur); en integrering med grov frekvens (30 Hz, 5 sampel/cykel) av en coning-miljö på 5 Hz verifieras följa referensen med fin frekvens ≥ 3× bättre med korrektionen än med naiv summering av inkrement. Hastighetsvägen fårsculling_increment(½ Δθ × Δv, Groves ekv. 5,82) och löser kroppens hastighetsinkrement genom en ny inkrementbaserad uppdateringNavState::step_incrementsmed den kroppsrelativa rotationenΔθ_rel = Δθ_b − C_n^b ζ, så att en jordfast plattform inte får något falskt sculling medan en verklig vibration utlöser hela termen. - Fullständig treaxlig strapdown-mekanisering i NED-systemet (
src/inertial/mechanization.rs).NavState { q, v_ned, p_llh }flyttas fram medstep(gyro_b, accel_f_b, dt)med de vanliga NED-ekvationerna för jordfasta system (Groves §5,4): attityd från kropp till NED korrigerad för hastigheten från tröghet till navω_in = ω_ie + ω_en(jordrotation + transporthastighet); specifik kraft löst från kropp till NED via DCM; hastighet som integrerarv̇ = f_n − (2 ω_ie + ω_en) × v + g_n(Coriolis/transport + gravitation); och geodetisk position via meridianens och tvärkrökningens krökningsradier. Gravitationen är WGS-84:s slutna Somigliana-normalgravitation (lodlinje) med en NIMA-korrektion för höjd i fri luft — aldrig en hårdkodad konstant. Detta är den äkta treaxliga navigatorn som ersätter vägen med skalär felbudget och 1-DOF. Verifierad med fysikaliska invarianter: en plattform fastskruvad i den roterande jorden vid 45°N (som mäter jordrotation + 1 g) håller sig inom 1 mm över 60 s; en horisontell specifik kraft mot norr gerv_N ≈ a·toch förskjutningen½ a t²; normalgravitationen stämmer med de kända ytvärdena vid ekvatorn, polen och 45° och med lapsehastigheten i fri luft. - Treaxlig attitydrepresentation för strapdown-INS (
src/inertial/attitude.rs). En typ för enhetskvaternionQuaternion(skalär först, Hamilton-konvention) som bär rotationen från kropp till nav, med en DCM-vy (to_dcm/from_dcmvia Shepperds metod), Hamilton-produkt, konstruktorer för axel-vinkel och rotationsvektor (exakt exp-avbildning) samt kvaternionkinematik — både en RK-hastighetsuppdatering av första ordningen (q̇ = ½ q ⊗ ω) och en coning-korrigerad uppdatering av rotationsvektorn. Tvåsampelsmåttetconing_increment(Savage / Bryan–Lewantowski,½ Δθ_prev × Δθ_cur) ger den korskopplingsterm för rotationshastighet som skalär dödräkning utelämnar. Detta är attitydgrunden för den fullständiga 3-axliga mekaniseringen som ersätter den äldre vägen med felbudget och 1-DOF. Verifierad mot slutna rotationer: propagering med konstant hastighet stämmer med axel-vinkel-kvaternionen till 1e-6, DCM:erna är ortonormala med determinant ett, och coning försvinner vid rörelse kring en enda axel. (src/inertial.rsär nu modulkatalogensrc/inertial/; den publika sökvägencrate::inertialär oförändrad.) - Geodetiskt korrekt sikt från markstation (
src/frames.rs).elevation,is_visibleochvisible_countberäknar en satellits elevation över en markstations horisont mot WGS-84-ellipsoidens normal (den verkliga lokala vertikalen), inte den geocentriska radiella — de skiljer sig med upp till ~0,19° geodetisk avvikelse, vilket räcker för att få satelliter nära horisonten att hamna innanför eller utanför en elevationsmask. Verifierad från början till slut (en Walker-konstellation propagerad, roterad TEME→ECEF och räknad från en geodetisk plats) och mot den geocentriska approximationen.
Ändrat#
- Tillförlitlighet i CI. Jobbet
test-python-bindingsbygger nu hjulet medPyO3/maturin-action(manylinux-container) i stället för ett råttmaturin buildpå värden, vilket tar bort en intermittent rustup-konflikt mellanrustfmt-preview/cargo-fmtpå runner-avbilden. Jobbetdenyinstallerarcargo-denysom en förbyggd binär viataiki-e/install-actioni stället för den Docker-baseradecargo-deny-action, vilket tar bort en timeout vid hämtning från Docker Hub-registret. Ingen av ändringarna påverkar de kontroller som utförs.
0.8.0 - 2026-06-02#
Tillagt#
Tröghetshastighet exponeras nedströms.
Propagator::velocity_eciochPropagator::state_eci(som returnerarStateEci { r_m, v_m_s }) för den analytiska TEME-hastighet som SGP4 redan beräknar — tidigare kastad — vidare till anropare i m/s;Orbit::velocity_eciger Kepler-vägen en konsekvent hastighet. Verifieringstestet för AIAA 2006-6753 kontrollerar nu även hastigheten för varje referensrad (sämsta hastighetsfel 1.85e-9 km/s över alla 666 tillstånd) och fastställer antalet jämförda rader till exakt 666.Strängare TLE-tolkning utan panik. Rader måste vara ASCII och delas säkert (inga fler byteindexpaniker vid flerbyteindata); element områdeskontrolleras (inklination, excentricitet, medelrörelse); kontrollsumman i kolumn 69 kan upprätthållas via
ParseOpts { strict_checksum }/parse_propagators_optsoch den nya flagganstrict_checksumpåConstellationCfg(tillåtande som standard).Allan-deviationskurva i utdata. Varje klockkörning redovisar nu en
adev_curve([{tau_s, adev, n_samples}]) och lekplatsen i webbläsaren ritar ett log-log-diagram "Clock stability (ADEV)".Validering av indata för tidsnätet.
TimeCfg::validateavvisar ett icke-ändligt, nollställt, negativt eller för stort tidsnät (ett steg som är större än varaktigheten, eller fler änMAX_TIME_STEPSsampel) innan någon allokering sker, så att ett felaktigt scenario ger ett fel i stället för att få panik eller tömma minnet.Monte Carlo-ensembler för tröghetspaketet.
runs = Ni ett tröghetsscenario kör N frön och redovisar varje mätvärdes medelvärde, standardavvikelse, percentiler och ett percentil-bootstrap-konfidensintervall på 95% (ensemble). Varje tröghetskörning bär nu en flaggamonte_carlo, så att ett kvalitetsmått från en enda realisering inte längre misstas för en fördelning. (CEP/2DRMS redovisas medvetet inte — de kräver 3-axelmodellen som finns på färdplanen.)Guidat läge i lekplatsen. Lekplatsen i webbläsaren släpper inte längre ner dig på en rå TOML-vägg: en "Start here"-remsa med scenariokort för ett klick läser in och kör ett genomarbetat exempel, reglage ger tillgång till de universella inställningarna (frö, tidströskel) utan att röra TOML, en "How to read this"-notering förklarar resultatet, och hela TOML-filen ligger ett fällbart avsnitt bort. Varje körning är delbar — Copy share link kodar hela scenariot i URL-fragmentet (inget laddas upp), så att en länk återskapar exakt samma körning vid inläsning. Kodeken är enhetstestad (
web/share.test.mjs, körs i CI).N-dimensionella parametersvepningar (
src/sweep.rs).nd_sweeputvärderar ett mätvärde över hela den kartesiska produkten av fleraSweepAxis-intervall (avvägningsstudien med flera parametrar), i radvis ordning och deterministiskt. Additivt — det befintliga 1-D-svep-API:et är oförändrat. Bootstrap-konfidensintervall per nod och generalisering bortom klockpaketet återstår på färdplanen.Verklig snapshot-RAIM (
src/raim.rs). Äkta Receiver Autonomous Integrity Monitoring i positionsdomänen: den bygger siktlinjegeometrin till de synliga satelliterna, bildar minstakvadratlösningen och residualerna, kör ett χ²-test av residualerna för feldetektering (exakt tröskel från en beroendefri ofullständig gammafunktion med χ²/icke-central χ²) och beräknar lutningsbaserade horisontella och vertikala skyddsnivåer (HPL/VPL) med det bias för missad detektering som härleds för konfigurerade P_fa/P_md. Detta är något annat än — och är ännu inte inkopplat i — scenariokedjans kvalitetsmått för integritet baserat på filtrets självkonsistens; felexkludering, budgetering av larmgräns/P_HMI och ARAIM återstår på färdplanen.Svit för frekvensstabilitet: MDEV, TDEV, HDEV + konfidensintervall (
src/allan.rs). Vid sidan av den överlappande ADEV: den modifierade Allan-deviationen (skiljer vitt från flicker-fasbrus), tidsdeviationen (TDEV = tau/sqrt(3) * MDEV) och Hadamard-deviationen (avvisar linjär frekvensdrift exakt och konvergerar för divergerande röda brustyper). χ²-baserade konfidensintervall (deviation_ci) använder ett beroendefritt kvantilpar för normal/χ² (Acklam + Wilson-Hilferty) med ett konservativt icke-överlappande edf; brustypsspecifikt edf och numerisk paritet med Stable32 återstår på färdplanen.Reduktion av referenssystem (
src/frames.rs). GMST-baserad rotation TEME↔ECEF (med samma sideriska tid enligt IAU-1982 som propagatorn), exakt geodetisk↔ECEF enligt WGS-84 med en iterativ invers startad med Bowring (maskinprecision på alla höjder, inklusive MEO/GEO) och en geodetisk observatör på markstation som ger azimut / elevation / avstånd i det lokala systemet Öst-Nord-Upp. Polarrörelse och nutation under bågsekunden tillämpas inte (enbart GMST, under en kilometer på markspåret); en ITRF-precis CIO-kedja finns på färdplanen.Grund för tidsskalor (
src/timescales.rs). Ett beroendefritt API för julianskt datum (gregorianskt civilt ↔ JD, MJD), hela IERS-historiken över heltalsskottsekunder (UTC↔TAI, 10 s år 1972 till 37 s sedan 2017), den definierade förskjutningen TAI→TT, UT1-korrektionen via en given DUT1 och jordrotationsvinkeln enligt IAU-2000. Detta är det tidsunderlag som reduktionen till jordfasta system (planerad) vilar på. Ögonblick är julianska datum med enkelf64(~50 µs upplösning nära nutida epok; ett tvådelat JD finns på färdplanen), och eran före 1972 med gummisekunder modelleras inte — båda dokumenterade i modulen.Reproducerbarhet och proveniens. En deterministisk generator för CycloneDX SBOM (
scripts/gen-sbom.sh) och ett SLSA-intyg om byggproveniens för utgivningsbinären och SBOM; verktygskedjan för utgåvor är låst så att den stämmer med CI. Determinismgarantierna, förbehållet omlibmmellan plattformar och tillvägagångssättet med golden-fastlåsning dokumenteras idocs/REPRODUCIBILITY.md.Egenskapsbaserade tester och fuzz-tester (
tests/property.rs). Deterministiska slumpmässiga tester (inget nytt beroende) kontrollerar invarianter över tusentals indata: TLE- och scenariotolkarna får aldrig panik av skräp, icke-ASCII, muterade eller trunkerade indata;TimeCfg::validatefår aldrig panik av NaN/inf/negativa nät; TLE-kontrollsumman är konsekvent och gäller bara kolumn 69; geodetisk↔ECEF-tur-och-retur och rotationen TEME→ECEF bevarar normen över hela jorden och ett brett höjdband.
Ändrat#
- Golden-tester fastlåser nu kvalitetsmåtten fält för fält för de fyra referensscenarierna (med en tolerans som absorberar jitter i
libmmellan plattformar), och ersätter de tidigare kontrollerna som bara bestod av olikheter, så att en tyst numerisk regression upptäcks omedelbart. schema_versioni resultatartefakter har höjts från0.1till0.7(den var fryst medan motorn gick vidare).cargo-denynekar nu (varnar inte för) indragna beroenden.- Ny dokumentation:
CAPABILITY.md(karta över ärlig avgränsning),SCHEMA.md(referens för resultatfält),INTEGRITY.md,QUANTUM-MODELS.md,REAL_TLE_GUIDE.md. En CI-spärr misslyckas om versionsmärket i README avviker frånCargo.toml.
0.7.0 - 2026-06-02#
Tillagt#
- SGP4/SDP4-banpropagering. En fullständig, beroendefri implementering av den vanliga propagatorn för förenklade störningar — SGP4 för nära jorden tillsammans med SDP4-utvidgningen för djuprymd (sol-måne-sekulära och periodiska störningar och geopotentialresonans på 12 h / 24 h). Den är validerad mot de officiella verifieringsvektorerna i AIAA 2006-6753 ("Revisiting Spacetrack Report #3"): alla 666 referenstillstånd för fallen nära jorden, djuprymd, resonans och felkod stämmer med ett positionsfel i sämsta fall på cirka 4 mm. Detta är den modell som tvåradselementuppsättningar (TLE) är definierade mot, så den representerar verkliga konstellationer — särskilt GNSS-banorna på ~12 h, som är djuprymd och resonanta och som den tidigare modellen med tvåkroppsproblem + J2 sekulär inte kan fånga.
- En konstellation angiven som kompletta tvåradselementuppsättningar (rad 1 + rad 2) propageras nu med SGP4/SDP4; en konstellation angiven med enbart rad-2-element behåller den analytiska Kepler-propageringen med tvåkroppsproblem, oförändrad. De två formerna kan blandas i ett block. Nytt referensscenario
orbit-sgp4-gps.toml(en GPS-liknande MEO-konstellation i verkligt tvåradsformat, propagerad med SGP4) — lägg in en aktuell uppsättning "gps-ops" från Celestrak för att studera den levande konstellationen.
0.6.0 - 2026-06-02#
Tillagt#
- Demonstrator för aktiv spoofingattack. Ett nytt scenarioslag
spoofinjicerar en ramp av falsk tid som spoofing och kör varje klockas klockstödda integritetsmonitor, och redovisar om och när spoofingen upptäcks och om den når den operativa specifikationen oupptäckt — vilket gör kvalitetsmåttet Säkerhet till en konkret demonstration av attack och försvar. Nytt referensscenariospoof-attack.toml. - Tillgänglighet med flera konstellationer. Ett banscenario kan kombinera flera konstellationer (en lista
[[constellations]]vid sidan av den primära[constellation]) för multi-GNSS-tillgänglighet och försämring av precisionen — t.ex. GPS plus Galileo. Nytt referensscenarioorbit-multignss.toml.
0.5.0 - 2026-06-02#
Tillagt#
- Resultatkort som HTML-rapport. Varje körning ger nu också ett fristående, märkt HTML-resultatkort — sammanfattningen på en rad, diagrammet (inbäddat som en overksam data-URI-bild) och hela JSON — skrivet av CLI vid sidan av JSON och SVG. En delbar enfilsartefakt för en studieleverans eller en bilaga.
- Gemensam skattare för sensorfusion. Ett nytt scenarioslag
fusionkör ett enda rekursivt Kalman-filter som navigationslösning — som fuserar klocktillståndet[phase, frequency]och positionstillståndet[position, velocity], disciplinerat av GNSS (som lär sig frekvensförskjutningen och hastigheten) och assisterat av optisk tidsöverföring under avbrottet — i stället för att komponera oberoende prediktorer. Det redovisar fusionerad holdover för tid/position och en integritet med gemensam kovarians. Nytt referensscenariofusion-pnt.toml. - Fylligare IMU-brusmodell. Accelerometern modellerar nu de återstående termerna i Allan-variansen utöver den konstanta biasen och hastighetsslumpvandringen: biasinstabilitet (ett 1/f-flickergolv vid den vanliga koefficienten för Allans biasinstabilitet, med återanvändning av klockans flickersyntes) och accelerationsslumpvandring. Nya valfria tröghetsscenariofält
bias_instabilityochq_aa; en ny GNSS-positionsbestämning omkalibrerar den kvarvarande biasdriften. - Verklig konstellationsgeometri från TLE. En konstellation kan anges som ett block med tvåradselementuppsättningar (standardformatet från NORAD/Celestrak) via ett fält
tle, så att tillgänglighet och försämring av precisionen använder en verklig konstellations publicerade geometri i stället för ett syntetiskt Walker-mönster. Motorn läser varje TLE:s Kepler-medelelement och propagerar dem med tvåkroppsproblem — inte SGP4 — vilket är hållbart för en ögonblicksstudie från en gemensam epok. Nytt referensscenarioorbit-real-tle.toml.
0.4.0 - 2026-06-02#
Tillagt#
- Parametersvepningar för avvägningsstudier. Ett nytt scenarioslag
sweepvarierar en parameter (threshold_ns,duration_s,quantum_q_wfellerclassical_q_wf) över ett linjärt eller logaritmiskt intervall och registrerar ett valt kvalitetsmått i varje punkt för båda klockorna, vilket ger det jämförelsediagram "hur skalar holdover med klockstabiliteten?" som en utformningsavvägning behöver. Nytt referensscenariosweep-clock-stability.toml. - Konfidensband med Monte Carlo. Scenariot för klockans holdover kan köra många realiseringar (nytt valfritt fält
runs): varje kvalitetsmått redovisas då som ett medelvärde med en spridning mellan 5:e och 95:e percentilen, och diagrammet skuggar felhöljet på 5–95% runt medianen för varje klocka. En enda körning är fortfarande standard. Nytt referensscenarioclock-ensemble.toml. - Excentriska banor och J2-drift. Bantypen är nu en fullständig Kepler-bana (halva storaxel, excentricitet, inklination, RAAN, perigeumargument, medelanomali), propagerad genom att lösa Keplers ekvation, med valfri sekulär J2-nodregression och apsidprecession. Nya valfria scenariofält
eccentricity,argp_degochj2, samt ett referensscenarioorbit-molniya.toml(en mycket excentrisk användare med kritisk inklination på 12 h). Cirkulära banor behåller den ursprungliga slutna vägen bit för bit. - Det hybrida paketet (kombinerad PNT) redovisar nu Integritet och Säkerhet, så att alla fyra paket täcker hela uppsättningen operativa kvalitetsmått. Integritet är innehållandet i skyddsgränsen för tidskanalen från en Kalman-skattare som disciplineras mot referensen medan GNSS är nominellt och återförankras (lösare) vid varje optisk återsynkronisering; dess gräns inkluderar länkens golv för mätbrus, så att en klocka som är mycket bättre än länken poängsätts mot den levererade lösningens faktiska brus. Säkerhet är den klockstödda poängen för spoofingdetektering mot tidsspecifikationen.
Ändrat#
- Utgivningsanteckningar genereras nu ur det kurerade avsnittet i CHANGELOG för taggen (
scripts/changelog-extract.sh), så att varje GitHub-utgåva lyfter fram vad som ändrats i stället för att lista råa incheckningar.
0.3.0 - 2026-06-02#
Tillagt#
- Kvalitetsmåttet Säkerhet (tidigare ofyllt): en klockstödd poäng för spoofingdetektering för paketen för klockholdover och bana. Det modellerar en integritetsmonitor som korskontrollerar GNSS-härledd tid mot klockans egen frigångsprediktion över ett koherent fönster; detekteringsgolvet kombinerar det medelvärdesbildade mätbruset med klockans osäkerhet vid frigång, så att en tystare klocka upptäcker mindre, långsammare tidsspoofing. Poängen redovisas i
[0, 1]relativt tidsspecifikationen, vilket fullbordar de sex operativa kvalitetsmåtten. - Geometrihärledd positionsnoggrannhet för banpaketet: utifrån siktlinjegeometrin till de synliga satelliterna bildar det designmatrisen och dess kovariansfaktor
Q = (HᵀH)⁻¹, vilket ger försämringsfaktorerna för precision (GDOP/PDOP/HDOP/VDOP/TDOP). Positionsnoggrannheten är positions-DOP skalad med ett konfigurerbart användarekvivalent avståndsfel (nytt valfritt scenariofältsigma_uere_m). Ett banresultat bär nu en geometrisammanfattning (andel sampel med positionsbestämning, bästa och mediana PDOP och positionssigma). - En lekplats i webbläsaren (
web/) som kör motorn på klientsidan som WebAssembly: välj ett referensscenario eller redigera TOML, kör det och se sammanfattningen, diagrammet och hela JSON, utan att något laddas upp. Ett arbetsflödepagesbygger och publicerar den på GitHub Pages, och en ny WebAssembly-exportsummaryligger bakom utläsningen. - Märkta y-axlar på SVG-diagrammen: stödlinjer, numeriska skalstreckstexter och en axeltitel med enheter (via en delad hjälpfunktion
chart), så att storleksordningarna går att läsa. - Arbetsflöde för paketpublicering (
publish) till crates.io, PyPI och npm, vart och ett spärrat av sin registertoken och utlöst av en publicerad utgåva.
0.2.0 - 2026-06-02#
Tillagt#
- Flicker-FM-golv (1/f) för klockans felmodell, syntetiserat som en summa av logaritmiskt fördelade Ornstein-Uhlenbeck-processer och kalibrerat så att det platta golvet för Allan-deviationen ligger på en konfigurerbar nivå. Av som standard; aktiveras per klocka via det valfria scenariofältet
flicker_floor. - Gyrokanal för tröghetsmodellen: kvarvarande gyrobias och vinkelslumpvandring driver ett attitydfel (lutning) som kopplar in gravitationen i ett horisontellt fel i specifik kraft, den dominerande mekanismen för felväxt i strapdown. Av som standard; aktiveras per sensor via de valfria fälten
gyro_biasochq_arw. - Kalman-klockskattare med två tillstånd (fas, frekvens) med exakt diskretisering av processbruset enligt van Loan. Frigång från ett känt tillstånd återger exakt den analytiska tillväxten av holdoverfelet (
q_wf*T + q_rw*T^3/3), och filtret ger dessutom en 1-sigma-osäkerhetsgräns online. - Klockkörningen redovisar nu kvalitetsmåttet Integritet (tidigare ofyllt): andelen avbrottssampel vars fel håller sig inom filtrets skyddsgräns på 3 sigma, redovisad i JSON-resultatet och CLI-sammanfattningen.
- Geometrihärledd GNSS-tillgänglighet: cirkulär banpropagering, en generator för Walker-delta-konstellationer och siktlinjesikt (jordockultation plus elevationsmask) ger tillgänglighetstidslinjen utifrån verklig banegeometri. Nytt scenarioslag
orbitoch referensscenariotorbit-gnss-challenged.toml(en rymdfarkost inuti GNSS-skalet med intermittent täckning). - Valfritt Python-tillägg (PyO3, abi3) som exponerar
run,run_fullochversion, paketerat med maturin (pyproject.toml) och byggt för Linux, macOS och Windows av ett arbetsflödewheelsvid utgivningstagg. Bindningen är ett funktionsspärrat, valfritt beroende: standardbygget, testerna och spärren för beroendegranskning påverkas inte. - Valfri WebAssembly-modul (wasm-bindgen) som exponerar
run,chart_svgochversion, byggd med wasm-pack under funktionenwasm;getrandomär målspärrad för att använda webbläsarens entropikälla påwasm32. - Gemensam dispatch av
api::run_tomlsom används av CLI och båda bindningarna, så att kommandoraden och bindningarna inte kan glida isär.
Ändrat#
- Holdover-poängsättningen är nu segmentmedveten: avbrottstidslinjer delas i sammanhängande segment vid GNSS-återinfångning, och den redovisade holdovern är den sämsta (kortaste) frigången över dem. Scenarier med ett enda avbrott är oförändrade. Gäller poängsättarna för klocka, tröghet och hybrid.
- Tröghetsmodellens redovisade
kindär nuinertial(varaccelerometer), vilket speglar de kombinerade kanalerna för accelerometer och gyro.
0.1.0 - 2026-06-01#
Första utgåvan.
Tillagt#
- Deterministisk simuleringsmotor för hybrid kvant-/klassisk PNT: ett gemensamt gränssnitt för felmodeller, deklarativa scenarier för GNSS-tillgänglighet, estimatorer för holdover och dödräkning samt poängsättning av kvalitetsmått mot de vanliga operativa PNT-kriterierna. Resultaten är reproducerbara från
scenario + seed + engine version(versionerad, självbeskrivande JSON med en scenariohash) och återges som SVG-diagram. CLI skickar scenarier vidare efterkind. - Fyra sensorpaket, vart och ett kalibrerat mot publicerade data och validerat mot standardsambandet:
- Klockans holdover — vitt FM, slumpvandrings-FM och linjär åldring; validerad med överlappande Allan-deviation (Riley, NIST SP 1065). Chipskaleatomklocka mot optisk gitterklocka med strontium.
- Tröghetsbaserad dödräkning — kvarvarande bias + hastighetsslumpvandring, dubbelintegrerad till positionsfel; validerad mot Groves samband för felväxt. Kallatom- mot navigationsklassad accelerometer.
- Tidsöverföring — tidsjitter i optisk mot RF-länk → synkroniseringsprecision → envägsavståndsmätning.
- Hybridfusion (slutstenen) — en kombinerad PNT-svit som måste hålla både tid och position, med valfri klockassistans via optisk tidsöverföring mellan satelliter.
- Ett citerat referensscenario per paket under
scenarios/, där varje numerisk parameter bär en referensgranskadprovenance. - Spärrar för reproducerbarhet och hygien i förvaret; CI (format, clippy, tester, spärrar, MSRV) och en taggspärrad utgivningskedja som kör om alla kontroller.
- Dokumentation: README med arkitekturdiagram, statusrapport för validering, vägledning för bidrag, säkerhetspolicy och uppförandekod; licens Apache-2.0; mallar för ärenden och PR samt Dependabot-konfiguration.
- Leverantörsneutralt genomgående; referensgranskade vetenskapliga och metrologiska källhänvisningar behålls.
- Licenshygien för Apache-2.0: SPDX-huvuden i alla källor, en
NOTICEmed varumärkesmeddelande, godkännande enligt Developer Certificate of Origin (DCO) för bidrag ochcargo-denysom upprätthåller beroendenas licenser och rekommendationer i CI. - Positionering som öppen kärna (README): en gratis motor under Apache-2.0 plus tillgängligt kommersiellt stöd, integration och proprietära tillägg från Ashforde OÜ — finansierat av tjänster, inte licensavgifter.
CITATION.cffså att programvaran kan citeras.