Maskinöversättning, inte granskad av en modersmålstalare. Engelska är referensen.

ProjektRedigera på GitHubKälla: CHANGELOG.md

Ä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; lang i 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åks REVIEW.md listar 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ån geolocation. 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. Bibliotek interference_map::api::emitter_regions_from_*, Python och WebAssembly interference_emitter_regions. MODELLED (registerrad VM-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 i examples/emitter-region/ (docs/INTERFERENCE-MAP.md).
  • Uppmätta klockloggar. src/clock_log.rs läser in en uppmätt klocklogg som en fasserie: åtta format (RINEX clock, TimeLab, TICC, linuxptp ptp4l, phc2sys och ts2phc, 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 av telecom-timing ([series.clock_log]) och klocktypen ([clock_log], som lägger till ett block measured med loggens SHA-256 och de överlappande ADEV, TDEV och MTIE), med det medföljande scenariot clock-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 som f64), 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 scenario clock-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); blocket fitted och 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 i examples/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 i docs/drafts/PARTNER-OUTREACH.md (ingenting skickas).
  • Andra kampanjer för tröskeln som inte nåddes för gnss-ssv och lunar-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, MODELLED eller PARTNER, 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 kolumn ID i docs/VERIFICATION-MATRIX.md, en frusen lista i tests/fixtures/evidence_ids.txt). Också på receiver-trust, jammertest score, iq acquire/sweep/track/monitor, rapporten om ruttexponering och, inuti den signerade config.json, varje bevispaket (config_version 1,1; kshana evidence verify redovisar nivån; paket som gjorts före 0,40 verifieras oförändrat). tests/evidence_labels_doc_sync.rs misslyckas 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 i docs/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-ssv och 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 i xval/mission-thread/PREREGISTRATION.md fö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.toml lä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ån lunar-differential-pnt), en terrängrelativ positionsbestämning (matcharen terrain-nav på 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.toml lägger till LOLA-horisonten framräknad med strålmarsch): positioneringssiffran för en enda plats är lika med moonlight-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, i xval/mission-thread-lunar/.

Evidens#

  • Förhandsregistrerad i xval/mission-thread-lunar/PREREGISTRATION.md fö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ör yes | 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.rs stä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, p384 och p521 0,13 till 0,14 (med elliptic-curve 0.14.3, ecdsa 0.17.0 och crypto-bigint 0.5.5 till 0.7.10; även det direkta beroendet crypto-bigint, nu 0,7) åtgärdar RUSTSEC-2026-0387, tidsvariation i crypto-bigint 0.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).
  • memmap2 0.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ägsberoendet kshana i repositoryt.
  • pillow 12.3.0 till 13.0.0 och certifi 2026.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 i xval/bench/RESULTS-v2.md: A2 (agc_k_sigma AUC 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 av docs/KINDS.md; varje kommando i docs/COMMANDS.md; varje yta, insticksmodulskommando, färdighet och Studio-sida i docs/ALL-SURFACES.md; varje förmågedomän i docs/CAPABILITY-DOMAINS.md; inbäddade Mermaid-diagram (systemöversikt, ytor, inre slinga, receiver trust, laboratorieringlopp, Studio, test- och releaseflöde, modulkarta, distribution). Skrivet av tools/gen_kinds_index.py, tools/gen_readme_blocks.py och tools/gen_figures_038.py; granskat av tools/readme_audit.py; bevakat av tests/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.md bä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 med study (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 i xval/lunar-infra/PREREGISTRATION.md och 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-recovery testar 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 import läser den publicerade NPRA Jammertest-katalogen och sändningsplanen som schemalagd referens (katalog-id:n bevarade) och kshana jammertest score poä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 spoofDetState och UBX-SEC-SIG läses in i self_report vid varje epok, och jämförelsen receiver_self_report i 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 cratet sbf-tools) och receiver-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). Scenariotypen holdover-test poä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_log läser loggar från linuxptp (ptp4l, phc2sys, ts2phc) och chrony (tracking, statistics). iq scene --format sdrx skriver ION GNSS SDR-metadata och iq monitor --follow övervakar en SigMF-inspelning medan den växer (endast mottagning). compliance-report får NIST IR 8323r1 Foundational PNT Profile (15 omskrivna rader, ger belägg för). Ett bevispaket kan registrera operatörens lab-attestation i sitt signerade manifest, aldrig verifierat; hårdvarustegen 0 till 4 och de juridiska anmärkningarna finns i HARDWARE-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 i xval/bench/PREREGISTRATION.md: poängsättarens trösklar uppfyllda, C1 till C3 uppfyllda, D2 uppfylld; A2 NOT MET (agc_k_sigma AUC 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. Python bench_score, bench_leaderboard; WebAssembly detsamma; MCP score_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är BESTPOS, RANGE C/No och RXSTATUS; mottagarens jammer-flagga blir epokens self_report, ställd mot Kshanas larm av jämförelsen receiver-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 i NOTICE, inte från RTCM-standarden) och gnss-sdr (GNSS-SDR Monitor- och PVT-monitor-meddelanden som JSON-rader, vidarebefordrade av integrations/gnss-sdr/relay.py).
  • IMU-loggar som en andra sensor. [log.imu] (csv eller euroc) integrerar gyrots girhastighet till den färdriktning som övervakaren heading-course läser; inbyggd på varje yta och förd vidare genom bevispaket. kshana imu-fit (Python imu_fit, WebAssembly imu_fit, MCP fit_imu_log, insticksmodul /kshana-fit-imu, en JetBrains-åtgärd) anpassar accelerometerns och gyrots parametrar för scenarierna hybrid och fusion frå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 och ublox_ubx_msgs in, 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 brygga gnss_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-mqtt och --mqtt-tcp <host:port> (discovery-meddelanden och ett JSON-tillståndsdokument; endast publicering, inga inloggningsuppgifter eller TLS), och format = "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-atmosphere tar 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 i xval/optical-atmosphere/PREREGISTRATION-timeseries.md före den första körningen.
  • Specifikation för testförhållanden och laboratorieringloppet. kshana.test-conditions/1 publiceras som docs/spec/TEST-CONDITIONS.md med ett JSON-schema, och får recording.kind = "receiver-log". kshana bench-export skriver också <base>.conditions.json. kshana evidence round-trip bygger 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. Python evidence_round_trip, MCP create_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-report få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, signalerna lunanet-afs-i och lunanet-afs-q i kshana iq, SB1 BCH-koden, CRC-24Q och interfolieraren samt kshana 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 av LICENSES/. 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 (resultatet holdover-test mätt mot ITU-T-masker, ritat från resultatets egen record.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 /benchmark visar fragmentet kshana 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 av scripts/gate.sh), inte på varje Mac med Apple-kisel, eftersom Apples matematikbibliotek skiljer sig mellan macOS-versioner; det portabla lagret körs överallt, och tests/exact_pin_gate_guard.rs hindrar 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.sh och docs/LOCAL-ORACLE-TESTS.md beskriver 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 check bygger 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.md regenereras för det valfria fältet timeseries i 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 med OpenFileDescriptor. Insticksmodulen är kompatibel med och ren på 2024,3 (since-build, oförändrad) och båda 263-byggena. CI kör nu verifyPlugin och 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, designanteckning docs/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_linkbudget få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 i xval/optical-atmosphere/PREREGISTRATION.md mot 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, som roc.json och 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-jobb labfit-iq-followup). Den testar de två hypoteser som § 13,6 i docs/design/LABFIT-FROM-IQ.md lä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 i docs/design/evidence/labfit-followup/RESULTS.md.

    • S1 uppfylld: med varje J/S-nivå hållen återfås δ_eff inom +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 step i testramen.
    • Inget utslag i § 13 ändras, och registerraden förblir MODELLED.
  • Begränsad FLL-inlåsning, tillval (DS-LOOP-05): en ny nyckel [design.carrier] fll_pull_in_max_s (s) för slingutformning, i Rust LoopConfig::fll_pull_in_max_s. Under fll_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) och reacquisition_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) och fom.availability_acquired (1).
    • [front_end]: adc_bits (1 till 16) och bandwidth_mhz (MHz, standard dubbla chiphastigheten). Ger ett block front_end: agc_gain_reduction_db (dB, 10·log10(1 + J/N)), quantiser_loss_db (dB, avdragen från varje länks effektiva C/N0) och loss_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 ett jamming-scenario med en jammer. Fält:

    • dem_hgt: en SRTM-ruta .hgt, relativt arbetskatalogen;
    • samples_per_side, ll_lat_deg och ll_lon_deg (deg): rutans storlek och hörn;
    • geoid_undulation_m (m, standard 0), k_factor (standard 4/3) och profile_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) och profile_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 ett jamming-scenario. Fält: elements_enu_m (elementpositioner i lokalt öst-nord-upp, m), weighting ("null-steering" eller "mvdr") och bandwidth_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) och jammer_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 kshana och api::run_toml liksom jamming::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".
  • IQ-spårningsmotor mot GNSS-SDR 0.0.19 (PRO-33): kshana iq track och 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-l1of och glonass-l2of (varje FDMA-kanal som glonass-l1of-k<K>, K = −7 till 6), beidou-b1i, beidou-b1c, beidou-b2a, beidou-b3i och galileo-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_cfar och ca_cfar_cells avgö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ör M icke-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.sh hä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_sdrx läser en LuGRE IQ-batch med I i den höga nibblen och mid-rise-nivåerna 2v + 1 (SdrLayout::mid_rise), vilket tar bort medelvärdet −½ som de nakna tvåkomplementsheltalen bär på I och Q. run_acq.py --corrected ger 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::boc omskalar 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_jumps listar 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 i docs/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ån kshana iq campaign i 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/1 som 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 är delta_eff = delta - 10 log10 Q (utformningsändring 2026-10-12). En okänd jammertyp tar det mest skadliga angivna Q (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ör delta_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-system på en JPL-kärna (CAP-31): planetary_kernel_path tar varje kropp som SPK:n innehåller (med de440s: Merkurius, Venus, Jorden, Månen) från kärnan, etikett KERNEL, och lägger bara till ett block kernel nä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_kernel sveper 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 via LunarForceModel::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 omkopplare KSHANA_LRO_DEGREE fö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 i docs/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_de440 avbildar 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) och lunar_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_et stämmer med SPICE pxform på 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), och Body::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 hos maneuver::kepler_universal på en båge med e = 0,994; den är dokumenterad i docs/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 med ForceModel::box_wing_srp / PreciseForceModel::box_wing_srp (fälten srp_boxwing, standard None: kanonkulevägen och alla golden-värden är oförändrade); med en box-wing-uppsättning är cr dess 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) och ShadowModel, valt med ForceModel::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 av gtd7 och gtd7d (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_at och propagator::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_ephemeris tar emot valfri EphemerisProvider (t.ex. en DE440 KernelEphemeris) 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_jd2 behå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_s1 och s1_air_tide_acceleration (Biancale & Bode 2006, GFZ STR06/01 tabell 1 modell N1, grad 2–6), aktiverat med air_tide_s1() på propagator::ForceModel och precise_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_accuracy och Sp3Accuracy::position_sigma_m avbildar 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_field kopplar 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 av xval/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äsare from_gfc_file / from_gfc_reader (kontroller av norm och maxgrad, tidvattensystem registrerat, tidsvarierande termer avvisade), och scripts/fetch_egm2008.sh (full EGM2008, SHA-256 fastlåst, ej medföljande; tester styrda av KSHANA_EGM2008_GFC). propagator::FieldEvaluator väljer den på den valfria Geopotential. 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 i xval/.

  • 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.1 solve_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 av propagator::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::ForceModel får geopotential: Option<Geopotential> (with_geopotential, with_egm2008(nmax)). Den utvärderar ett SphericalHarmonicField (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). Standard None: 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 i xval/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_jd2 och own_jd2_utc, konverteringar via From mellan jd2::Jd2 och timescales::TwoPartJd, och en valfri two_part_jd = true för scenariot ephemeris (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 pyerfa gmst82/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 enda f64 missar dem). Cowells kraftmodellsepok förblir en enda f64; 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 av precession_matrix, teme_to_gcrs_matrix och 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, och Jd2::from_utc_calendar, jd2::utc_to_tai och jd2::tai_to_utc frå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 pyerfa dtf2d/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_utc med en enda f64 ä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 −τn och γn var tidigare oanvända. Ny registerrad "GLONASS utsänd satellitklocka och propagering av utsänd bana", VALIDATED mot RTKLIB 2.4.2-p13 geph2clk/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 testfixtur igs_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_nav läser RINEX 4.00-4.02-navigationsfiler (> EPH GPS LNAV, Galileo I/NAV och F/NAV, BeiDou D1/D2, QZSS LNAV; andra poster hoppas över till nästa postrubrik), och parse_nav_with tar 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_geo och RinexEphemeris::sv_position_ecef_bds_geo (BDS ICD, lutning på −5 grader). parse_nav hoppar 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.sh och tests/ppp_parity_glab_rtklib.rs med 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_navmsg kodar 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; synk 0101100000) och Galileo F/NAV (sidtyper 1-4; 61x8-interfolierare; synk 101101110000), 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_file med IonexFile, IonexHeader, IonexEpoch, IonexFileMap och IonexTimeInterp: en strikt läsare för IONEX 1,0 med fast kolumnformat, med epoker räknade från första kartans dygn, 9999 lä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:s iontec stä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::HatchFilter och pvt::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), med parse_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_s och clock_nodes interpolerar de tabellerade SP3-satellitklockorna linjärt mellan de två omslutande giltiga noderna (markören för ogiltig klocka hoppas över), och ClockRinex::from_sp3 matar dem till PreciseProducts, 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 block integrity_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 klassas geometry, aldrig environment; utan en gäller reservlösningen med azimutglapp och alla utdata som tidigare. Besättningsutbildningsgeneratorn får en händelse natural-degradation (en blockerad himmel, inte störning) och scenariot scenarios/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_token kontrollerar 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 pakets timestamp.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_tiers som 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-coverage har ingen figure_tiers förrän en ny daterad prognos ersätter den frusna; leo-ppp, solar-system, sweep och sweep-nd har inget skalärt huvudmått, och lunar-attack-surface skriver 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ör assurance::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.rs lä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 block measured (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-timing få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 referensscenariot scenarios/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-export fö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 via xval/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.md anger 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::kfgins samt 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 i xval/kfgins/PREREGISTRATION.md.

  • Kopplat PNT-filter i fusionspaketet (0,36, WP-09, FUT-16): typen fusion tar en valfri tabell [coupled] som kör ett staplat filter på pseudoavstånd med ett accelerometer-biastillstånd (fusion::coupled::CoupledPntBiasFilter), och fusion::coupled::CoupledPnt3d är den 3-D-version som har 8 tillstånd. Nytt medföljande scenario fusion-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åde fusion och hybrid oförändrade (fastlåsta); hybrid vä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-rail och gnss-ins-aviation på trajektoriebiblioteket, och en valfri tabell [tight] för typen gnss-ins som 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-ins tar en valfri tabell [trajectory] med profile = "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); csv importerar 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_path läser en textbricka realdata::lola_dem (höjder över medelsfären på ett rutnät i latitud/longitud) i stället för det polära stereografiska dem_path, för både lunar-station-coverage och moonlight-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 terrain bär varje rad i exporten av geometri per satellit för moonlight-service-volume värdet clears_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-funktionen field_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.rs misslyckas 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-funktionen kind_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.rs misslyckas 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() och iq_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 ur iq::cli som bara finns i native-bygget (till iq::scene::synthetic och iq::signals::by_name) så att båda byggen delar dem; kommandoradens utdata är oförändrad. Det native testet och web/smoke.mjs jä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.pyi typar de stängda vokabulärerna (ScenarioKind, varje typnamn; ErrorKind; ProvenanceClass) och ordböckerna KindMeta och FieldUnit; scenario_kinds() och error_kind() returnerar dem. WebAssembly-paketet lägger till run_typed (en körning som ett typat objekt RunOutput med det tolkade dokumentet som data) och scenario_kinds (de tolkade KindMeta[]), och dess kshana.d.ts bär samma vokabulär; error_kind är typad ErrorKind | "". tests/typed_api_sync.rs håller båda listorna lika med motorns.

  • Enheter för varje kolumn i sweep-nd (FUT-28): ett resultat av sweep-nd bär nu key_units och metric_units, enheten för varje svept nyckel och varje registrerat mått, läst från det svepta paketets egen enhetstabell. En axel kan deklarera unit för en nyckel som paketet inte ekar; en deklarerad enhet som strider mot paketets avvisas, och en enhet som ingen av dem anger är null, aldrig gissad. points[].coords[] och points[].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-klassen RunOutput får array(path), columns(path) och series(), som returnerar objekt av typen numpy.ndarray för en numerisk lista, de numeriska kolumnerna i en lista med poster eller varje postserie i dokumentet. Varje array är lika med numpy.asarray av samma värden från data() (dtype och bitar). NumPy importeras bara när en av dem anropas och står utanför körkraven. Typad i kshana.pyi och kontrollerad av stubtest.

  • Kampanjoptimerare (CAP-32): typen campaign få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 resultatets trace. 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 av gen_calibration_ensembles; värden per frö i docs/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): traiten BuiltinKind (api::BuiltinKind, med en nivåkrok per mått och append_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.rs kontrollerar 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-map tar en valfri [reference]: en gravitationsanomali syntetiserad från de medföljande EGM2008-koefficienterna (eller en ICGEM-fil .gfc via gfc_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 scenariot gps-denied-gravity-nav-egm2008 kö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 scenario gravity-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-altpnt tar 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.py hä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_map flyger 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ör terrain-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ån OmmFile::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äver ELEMENT_SET_NO, avvisar COMMENT i användardefinierade XML-parametrar, skriver inte BTERM utan BSTAR, och läser OCM:s relativa epoker under TDB i SI-sekunder). Den äldre OMM-skrivarens META_START avvisas 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 utan MAN_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 CPython crc_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.0 check metrics utan lintproblem, och vidarebefordrade oförändrade genom OpenTelemetry Collector contrib 0.135.0 (datastyrt: verktyg hämtade med fastlåst SHA-256, utdata incheckade).
  • Banbestämning för Mars, körning 2 (0,36, WP-14, CAP-30): mars_od::fit_damped skalar 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 i docs/revisions. Raden förblir MODELLED.

  • Mars rampad 2-vägs-Dopplermodell och banbestämning (0,36, WP-14, CAP-30 del, steg 2): mars_od fö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_kernel läser SPK-typ 1 (kontrollerad mot CSPICE) och gravity_sh::from_shadr lä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_odf lä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_budget lö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 timetransfer med vitt jitter är oförändrat.
    • Verkliga serier: stabiliteten hos tillhandahållna serier från BIPM Circular T, CSV MJD,ns eller 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.

  • 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 scenarier entry-heating-stardust, eo-radiometry och ascent-losses, samt docs/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 scenarier aocs-slew och aocs-slew-mekf, samt docs/AOCS.md.

  • Schemaläggning av markkontakter och DVB-S2 ACM (0,36, WP-14, CAP-22/23): två nya scenariotyper. acm-link ger, 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-schedule gö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 scenarier acm-link och contact-schedule (illustrativa indata) samt docs/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-pvt med förinställningen starlink-sop mot 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_kernel finner 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): typen lunar-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 till lunar-differential-pnt vid 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.md fryser, vid commit c05dac1d, resultaten för lunar-station-coverage under 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.rs vaktar den; docs/VALIDATION.md få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-coverage och frånvarande som standard, så att varje befintligt dokument, den frusna prognosen inräknad, är oförändrat: [receiver] (flervägsutbredning a + 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) och moonlight-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:en LDEM_75S_240M från LRO LOLA (public domain), omsamplad med blockmedelvärde 5 x 5 till 1200 m (data/lunar-dem/, med dess NOTICE, SHA-256 och scripts/make_lola_south_polar_crop.py), och scenariot scenarios/lunar-station-coverage-terrain.toml som 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äl few-satellites, high-pdop, high-hdop och informationen sky-blocked) eller unknown dä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ärnan orbit::dop, eller tas från NMEA GSA. Varje epok bär också en etikett, good, fair eller poor, 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 monitor geometry som 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, environment eller inconsistency, så att en dålig himmel inte läses som en attack. loss-of-lock är geometry när de förlorade satelliterna alla låg under 15 grader vid sin senaste rapport; ett avdrag för dålig geometri är inconsistency nä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 epoken signal_loss och geometriavdraget är environment. 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_points 15), rampens slut (full_ratio 1,5) och golvet (floor, som standard poängens degraded_min) finns i [geometry], liksom etikettens goda nivåer (HDOP 2, PDOP 3, 6 satelliter, representativt); taket som gäller är min(cap_points, 100 - floor), så en tabell [score] som höjer degraded_min (en på 0,35 inräknad) sänker taket i stället för att avvisas, och ett golv under degraded_min avvisas. 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, class på varje avdrag, geometry_model, geometry_summary), de levande JSON-raderna (schema 1,3), Python- och WebAssembly-gränssnitten receiver_trust, assess_vessel_log och receiver_trust_replay, MCP-verktygen assess_*, bevispaket (epochs.json, config.json, ett geometrispår på sammanfattningssidan) och trust-telemetry (Prometheus kshana_trust_geometry* och en etikett class på kshana_trust_reason_active, OTLP kshana.geometry.*, anpassade CEF-fält cs6 (geometristatus och klasser), cfp3 (HDOP) och cfp4 (PDOP), kontrollerade mot båda CEF-referenstolkarna, och LEEF geoStatus, geoHdop, geoClass). Geometrietiketten exporteras också, tillagd efter varje tidigare serie och fält och endast för indata som bär den: Prometheus kshana_trust_geometry_label{label} och kshana_trust_geometry_vdop, OTLP kshana.geometry.label och kshana.geometry.vdop, LEEF geoLabel, geoPdop, geoVdop, geoUsed, och CEF ett tredje fält cs6 (etiketten) och cn1 (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örblir degraded medan den består: Prometheus kshana_trust_geometry_signal_loss, OTLP kshana.geometry.signal_loss, LEEF geoSignalLoss=1; i CEF visas den som klassen environment i cs6.

  • orbit::dop_cofactor: kovariansfaktorn (HᵀH)⁻¹ bakom orbit::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 är max(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ör gnss-sim, jamming, leo-pvt (varje läge, det polära svepet inräknat), leo-pass och nmea-scenario, och i orbit och integrity genom 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 ingen epoch anges; en kretsande user avvisar en skyline). Resultat får skyline { source, open_fraction, provenance } och masked_by_skyline per 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-skyline och kampanjen leo-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-epok epoch) eller givna satelliter; sky_source och sky_statement anger om himlen är representativ eller den himmel som elementmängderna ger vid den epoken, inte en mätning; tle_skipped listar 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_profile och skyplot_svg. orbit::dop_cov exponerar kovariansen bakom orbit::dop, som nu är dess reduktion (de kontrollerade skalärerna är oförändrade). Ytor: kshana sky och kshana skyline, Python- och WASM-funktioner med samma namn, och MCP-verktyget sky_geometry (40 verktyg), och notebooken notebooks/geometry.ipynb (med dess spegel .md; körs av tests/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 numpy linalg.inv och linalg.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_reflectors och extra_beacons på lunar-llr-datum lägger till ett block station_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ån lunar-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.toml och -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 i tests/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 i tests/lunar_station_published_oracle.rs. En registerrad, märkt MODELLED med fyndet.

  • Månreferensstation: databeredskap för klockfiler. realdata::clk::rinex_clock_series anger nu tidssystemet för sina epoker. Det är värdet TIME 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_coupled och fusion::gnss_ins_ekf kallar 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_coupled17 och carrier_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_ionex lä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 returnerade None på 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-e1 och galileo-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.md och 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) och galileo-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 onormaliserade P_nm med cosinusfasfördröjningar; de användes som fullt normaliserade med fördröjningen som IERS sinusledning. De går nu in dividerade med N_nm med ε = 90° − ψ; den nya tides::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 i xval/s2-air-tide-fix/).

  • Endast dokumentation: propagator::solve_kepler_checked, orbit::solve_kepler och ephem::solve_kepler dokumenteras som äldre lösare, numeriskt oförändrade, med hänvisning till kepler::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 i orbit::Propagator, läsaren src/ionex.rs mot en verklig produkt, och uteslutning av flera satelliter i raim). Den saknade docs/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.txt och C8_E1C.txt (ICD Annex C.7/C.8) har tagits bort från förrådet och paketen. ICD:ns villkor (citerade i LICENSING.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_table returnerar nu ett Result och läser användarens egen kopia från KSHANA_GALILEO_E1B / KSHANA_GALILEO_E1C, eller, i en källkodsutcheckning, från data/galileo-os-sis-icd/, där det nya scripts/fetch_galileo_e1_codes.sh extraherar dem ur ICD-PDF:en (hashkontrollerat). galileo::E1B_TABLE_TEXT / E1C_TABLE_TEXT har 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 i tests/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 f64 i biblioteket, och samplarna för normal-, gamma- och exponentialfördelning i rand_distr, beräknas nu genom det rena Rust-biblioteket libm (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 i docs/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-pnt tillgä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-clock stationsfel 3,541350 -> 3,536885 m med VLBI och 2183,558 -> 2184,021 m utan; paper/crossover/inertial.json, åtta värden i vibration_psd med 3 enheter på sista platsen (erratum i den tekniska rapporten); det utgivna dokumentet cislunar-observability i 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 i docs/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ör iq_campaign, de äldre referenshasharna för gnss-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_series returnerar RinexClockSeries (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.rs håller båda exempelsessionernas utdata och tests/geometry_corpus_identity.rs varje 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 (geometry tillagd, class i varje avdrag); utdragssammanfattningen får geometry; telemetrin får geometriserier, fält och etiketten class endast 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 i monitors_run nä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/NOTICE angav 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 i xval/jammer-q/RESULTS.md):
      • jamming-demo: C/N0 +3,01 dB;
      • jamming-harbour-approach-skyline: min_tracking 6 → 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-loop och impairment-eval, spektrumtypernas jamming_kind_cross_check, IQ-kampanjens MODELLED referenskurva och labfit-standardvärdet Q, och interop-scenexport.
  • JetBrains-plugin: inget föråldrat eller för borttagning schemalagt plattforms-API. De fem valdialogerna använder en liten DialogWrapper med en rullgardinsmeny i stället för den föråldrade Messages.showChooseDialog; enfilsväljare använder konstruktorn med FileChooserDescriptor i stället för den föråldrade FileChooserDescriptorFactory.createSingleFileDescriptor(); animeringen öppnas med BrowserUtil.browse(Path) i stället för browse(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); verifyPlugin kontrollerar 2024,3 som standard och varje lista som anges i KSHANA_VERIFY_IDES.

  • gnss_sim::run_gnss_sim och jamming::run_jamming returnerar Result: en ogiltig sektion [skyline] är ett fel vid direktanrop, som den redan var via api::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ändelse false-lock rapporterad 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.
  • lunar-frame-campaign: en fyr utan observation rapporteras nu (hittat av MR-05). Rapporten får unobserved_beacons och warning endast 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 av lunar_od och LRO-anpassningen): DE421-offseten mellan medeljordsaxel och principalaxel i moon_080317.tf tillä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 SPICE pxform('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 i inline_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_parts med 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-blocked och open_fraction från skylinen där indata anger en (azimutglappet som reserv), en händelse för naturlig försämring (fjord eller terminal) i nmea-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äser unknown i 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-lock eller för C/N0; total signalförlust syns endast genom geometrimonitorns signal_loss (klassad environment). 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::osnma och kshana 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 $PKSOS för mottagarförtroendemonitorn. Utdata bär ett rådgivande meddelande om att statusen inte är en tjänst för navigeringsintegritet. docs/OSNMA.md anger 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)#

    Ett stycke som namnger AI-klienter från tredje part utelämnas här; det finns i CHANGELOG.md på GitHub.

  • kshana-mcp --http <addr>, streamable HTTP, självhostad. Loopback som standard; en adress som inte är loopback kräver --allow-remote och en bearer-token i KSHANA_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).

Tillagt (ytor)#

  • osnma_verify på Python och WebAssembly. Verifieraren bakom kshana osnma verify på bytes i minnet, som returnerar den JSON som --json skriver ut (rådgivande i sitt fält advisory; 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.md och docs/OSNMA.md säger detta.

  • trust_telemetry på WebAssembly, Python och MCP, med ett plugin-kommando och en JetBrains-åtgärd. Renderar en förtroendeström eller ett resultat från receiver-trust som Prometheus-text, syslog-rader i CEF eller LEEF eller en OTLP JSON-nyttolast, med de kodare som kshana trust-telemetry använder (kshana::surface::trust_telemetry); ingen socket och ingen klocka. Plugin: /kshana-trust-telemetry och skillen trust-telemetry. JetBrains: Render Trust Telemetry. Funktionerna wasm och python och 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 --help listar nu receiver-trust evidence, evidence, trust-telemetry och nmea-scenario; notebooken compliance-and-test-bench (compliance mapping och test-bench-export); och varje återstående JetBrains-cell "CLI only" i docs/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 evidence och kshana 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ån kshana evidence keygen eller din egen fil; nycklar lagras aldrig i ett paket och *.evidence-key är git-ignorerat). verify kontrollerar varje hash, kedjan och signaturen och namnger exakt vad som misslyckas; med --pubkey fastlå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 -verify tä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ör wasm32. Paketen anger att de är en teknisk dokumentation, inte ett juridiskt utlåtande. De nya beroendena är trädet ed25519-dalek (BSD-3-Clause och Apache-2.0/MIT, minimala funktioner) och en direkt zeroize (redan i det trädet) för att radera nyckelmaterial. Se docs/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ån receiver-trust och 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 funktionen otlp, OTLP/HTTP JSON-export. Leverans körs på arbetartrådar med tidsgränser för anslutning och skrivning, begränsad återanslutningsbackoff och en räknare kshana_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 i deploy/grafana/. Måttnamn, etiketter och CEF/LEEF-fältmappningen finns i docs/TRUST-TELEMETRY.md. Strömformatet är isolerat i src/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-trust tar 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 --gate slä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-status V, GNS- och VTG-läge N) 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-map och kshana 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älpare fetch-land --allow-network laddar 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: flate2 med 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 som null, och ett dygn vars bakgrund inte kan skattas undanhåller sina anrop. Utdatafiler namnges <source>-<dataset>-<date>.geojson och skrivs aldrig över; indata strömmas rad för rad; ruttexponering hanterar antimeridianen. Tester använder endast syntetiska data. Se docs/INTERFERENCE-MAP.md och licensgranskningen i docs/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 i scenarios/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 i receiver-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. Se docs/NMEA-TRAINING.md.

Marina integrationer (0.35.0, arbetsström B)#

  • Signal K-plugin (integrations/signalk/, inte publicerat på npm): kör eller ansluter till kshana 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 under navigation.gnss.kshana.* (inklusive den av mottagaren rapporterade positionen som kontext, aldrig navigation.position), och skickar en Signal K-notis (warn vid degraded, alarm vid 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 $PKSHT i 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 $PKSHT frå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 i integrations/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 med systemd-analyze verify av check-units.sh), ett containeralternativ, Signal K-koppling.
  • Signal K-pluginet accepterar det levande JSON-schemat 1,2 (en nyckel position och därefter en nyckel advisory lä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.sh misslyckas 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äkra inputArgs vägras, och notisen ligger på notifications.navigation.gnss.kshana.trust; reläet begränsar en kvarhållen ofullständig rad; parsrarna för $PKSHT avvisar 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/ och kshana 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 rad evidenced, partly-evidenced, not-evidenced eller out-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 typen gnss-ins, jamming eller gnss-sim för en GNSS-simulator i laboratorium: en CSV med användarrörelse med dokumenterade referenssystem och en metadata-sidfil, NMEA 0183 GGA/RMC, waypoint-text, och händelserna som CSV och som receiver-trust [[events]]-block (src/interop/testbench.rs). Endast rörelse och händelser: ingen signal skrivs. Varje fil läses tillbaka i tests/interop_testbench.rs och jämförs inom sin angivna tolerans. docs/TEST-BENCH.md beskriver metoden för att spela upp exporten genom en simulator och poängsätta mottagarens logg med kshana 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_text och assess_texts tar texter, inte sökvägar.
  • Export för test-bench. --epoch intervallkontrolleras (UtcEpoch::parse_iso); waypoint-filen kontrollerar varje intervall och kommandot anger varför när ett utelämnas; dokumentationen anger att rubriken (heading) i gnss-ins är kroppens girvinkel och inte kursen, platshållarfälten i GGA och scenariots egen höjdändring. bench-export och compliance-report finns i användningstexten.
  • fusion::pack::truth_trajectory exponerar den sanna tillståndshistoriken för körprofilen i gnss-ins (samma stegning som typens egen referens använder), och UtcEpoch få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 och cryptography) 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 meddelandet opentelemetry-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.md fick det normativa paketformatet och verifieringsförfarandet som verifieraren i ren miljö (clean-room) skrevs utifrån; VerifyReport fick signature_valid. Oberoende referenser och fixturer: scripts/gen_ed25519_rfc8032_ref.py, scripts/gen_evidence_pack_ref.py med scripts/evidence_verify_cleanroom.py, scripts/gen_telemetry_formats_ref.py; tester evidence_crypto_reference, evidence_pack_reference och telemetry_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. pycef 1,11 och Logstash CEF-kodeken (logstash-codec-cef 6.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, vilket pycef inte klarar. Tröskeln (fastställd i förväg) registrerades innan någon av parsrarna kördes (tests/cef_reference.rs); fixturer i tests/fixtures/cef/, skript för de oberoende referenserna scripts/gen_cef_ref.py och scripts/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älten cn1 och cn2, 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_log accepterar loggen som text eller base64; verktygsindata begränsas till 4 MiB.
  • Jamming-diagrammet hämtar också sina färger från paletten. src/jamming.rs var den enda modul som revisionen av Observatory-paletten lämnade kvar med egna färger medan arbetet med jammer-Q landade; dess *.chart.svg (scenarierna jamming, maritime-strait-jamming och andra scenarier av typen jamming) läser nu src/palette.rs, och tillåtelselistan i tests/palette_sync.rs är tom. Endast färger och typsnitt: diagrammen jamming-demo och maritime-strait-jamming är lika med sina tidigare registrerade renderingar när färg, font-family och versionsfoten har normaliserats. Inget ritat värde ändrades. De inspelade Studio-kopiorna under web/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_floor bar referensklockan flicker FM men filtret med två tillstånd som levererar integritetsgränsen gjorde det inte, så det levererade scenariot clock-ensemble hade 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 rapporterar consistent = false). Utdataändring, endast för klockor med ett flicker_floor skilt från noll: integrity på clock-ensemble går från 0,40866 / 0,33026 till 0,99970 / 1,0 (klassisk / kvant) och NIS/NEES för filter_health inkluderar nu flickern; tidsfelet, holdover_s och timing_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.integrity klassisk 0,7734 till 1,0 och kvant 0,9796 till 1,0, och NIS/NEES för filter_health och deras band ändras. Dess filter_health.consistent för kvant växlar från true till false: 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_dbhz med typens Q), 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. Med run.epochs satt behålls också varje cells ström kshana.track-epoch/1 och låshändelser, namngivna efter cellnyckel och hashade in i cellen. cell_key och report::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 skriver scorecard.csv/.json, en fristående report.html och ett DIGEST. 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 = true importerar annotationerna kshana:test_event i en SigMF-inspelning som händelser;
    • Python får iq_test_conditions, iq_campaign och iq_campaign_report;
    • kshana-mcp får iq_campaign, som är inkrementell och återupptagbar under provbudgeten per anrop med varje fil begränsad till arbetskatalogen, och iq_campaign_status.

    Tester: tests/iq_campaign.rs kö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 reacquire på är varje kanal tillbaka inom 2 s efter ett glapp på 2 s; utfallet med reacquire av ä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/1 TOML (docs/design/LOOP-DESIGN-TOML.md; parser iq::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_track design/design_name.
    • M2M4 C/N0 (EpochOutput.cn0_m2m4_dbhz, spårepokskolumnen cn0_m2m4_dbhz efter cn0_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 som EpochOutput.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/1 kvarstår; CSV/JSONL/binär utan punkter är bit-identiska). Med punkter: CSV-/JSONL-kolumner, och en binär post på 184 + 16 × taps bytes vars huvud bär extra_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) och extra_taps_chips (MCP iq_track). Utformningarna i en körning måste vara överens om punkterna.

    • Parallella kanaler (iq track / iq sweep --threads <N|auto>; Rust TrackSession::with_threads). Varje delblocks kanaler körs på upp till N trådar (std::thread::scope; wasm32 fö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), Python iq_acq_surface och MCP iq_acquire surface_out skriver hela korrelationseffektytan över Doppler × kodfas som sökningen beräknar (dess celler är identiska bit för bit med dem från acquire) 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). acquire sjä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 track får --epochs, --events och --summary (kshana.track-summary/1), och iq sweep får --epochs och --events. MCP iq_track får epochs_out/events_out och 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.rs mä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 än reacq_window_s (standard 30 s). Misslyckade sökningar görs om med intervallet reacq_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 över reacq_interval_s) är avstängt som standard, och max_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.
      • --summary final_state (och tabellens kolumn) är tillståndet efter den sista övergången, så en kanal som avförts efter sin sista slinguppdatering läser RETIRED.
      • 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 över fll_off_pli (0,8) i fll_gate_dwell_s (0,1 s), och återgår under fll_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änd fll_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är max_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 track har en avslutande kolumn final_state;
        • CSV för iq sweep har en avslutande kolumn design_hash, och dess JSON har design_hash och warnings;
        • 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.
      • Å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 --reacquire eller med reacquire=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), varnar iq track/iq sweep (utdata, --summary, svepets JSON), MCP-svaret från iq_track och Python-resultatet från iq_track för att kodslingans jitter och bias inte är representativa. Grundorsaken är dokumenterad med trösklar fastställda i förväg i docs/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/python och MCP IQ-rundturen.
  • C/N0-profiler i syntetiska scener (0.34.0). iq::channel::cn0_profile schemalä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. Referenssidofilens cn0_dbhz följer profilen.

    • Gränssnitt: kshana iq scene … --cn0-profile <toml> och kshana.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.
  • Detekteringsmonitorer för IQ-vägen (0.34.0 "Lab replay"). Ny modul iq::monitor, kommando kshana iq monitor och bindning kshana.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_P och 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 sweep strömmar genom den nya sessionen (se Tillagt).
    • --csv behå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. --json behåller sin form från 0,32 och håller fortfarande varje epok i minnet: använd --epochs för långa inspelningar.
    • iq sweep mä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 kolumn design_hash.
    • Spårtabellen får en kolumn final_state.
    • Användningstexten påstår inte längre att iq track tar front-end-flaggorna; bara iq acquire tillämpar dem.
    • För Python-funktionen iq_track har acq_noncoherent och doppler_max nu standardvärdet None (utformningens värden, 1 och 5000 Hz i den inbyggda utformningen). Dess epoker får de tidiga/sena korrelatorerna, carrier_phase_cycles, bit_edge, bit och state, och resultatet får design och events.

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 till 1 / (3 · N · T_code) Dopplerfel vid överlämning, men den tvåkvadrants FLL som är standard drar bara in 1 / (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å till 0.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 uttryckligt doppler_step_hz eller --doppler-step används som skrivet, och iq acquire (ingen spårningsöverlämning) behåller lärobokssteget. Epokhuvudet och --summary registrerar 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 · T på 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 utformningsnyckel carrier.bn_t_max (standard 0,1) begränsar brusbandbredderna för PLL och FLL till bn_t_max / T nä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 = 0 stä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ån scenarios/clock-ensemble.toml; två dagar senare angav 67fed19e golven för flicker FM i det scenariot (kvant flicker_floor = 1e-16, CSAC flicker_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::scene genererar 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 typen spectrum en SigMF-ögonblicksbild av sin analytiska modell med de konfigurerade jammers i den (brusliknande jammers frekvensintervall för frekvensintervall, toner och chirps som vågformer), och spoof_capture summerar 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 även iq::acq och iq::track). Ingenting i Kshana sänder eller styr radiohårdvara. Statusraden i README, docs/POSITIONING.md, docs/SPECTRUM.md och 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.md har mätningarna.

Tillagt#

  • GNSS-IQ-lager på MCP-servern (fas B.1). kshana-mcp får sex verktyg som styr lagret kshana iq frå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) och iq_frontend (bandpass, notch, blankning, excision, AGC, kvantiserare). IQ-sampel passerar aldrig protokollet: varje verktyg tar filsökvägar inom en arbetskatalog som anges av KSHANA_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 inte overwrite ä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_code och iq::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.json deklarerar de två miljövariablerna. Rundturstester i mcp/kshana-mcp/tests/iq_round_trip.rs genererar 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 av scripts/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::acq hittar 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 track lämnar som standard över från en infångning på ≈4 ms (beteendeändring). Infångningen som initierar varje spårningskanal integrerar nu ceil(4 ms / T_code) kodperioder koherent i stället för en, där T_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 Doppler 2 / (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 track och kshana iq sweep (--acq-coherent), Python kshana.iq_track (acq_coherent=None är nu auto; stub uppdaterad) och MCP-verktyget iq_track. Användare som förlitade sig på den gamla standarden kan ange acq_coherent=1 (--acq-coherent 1). Standardvärdet 1 för --coherent i kshana iq acquire är oförändrat. Nya publika iq::acq::auto_coherent_periods och iq::acq::AUTO_COHERENT_S; regressionstest tests/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 (#0c0b08 botten, #e0bd84 guld) och ett varmt pappersaktigt rapporttema. De hämtar nu varje färg och typsnitt från en enda modul, src/palette.rs, som speglar web/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.rs binder modulen till web/theme.css i båda teman, kontrollerar att docs/assets/palette.json och docs/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 i src/ utanför paletten.
    • tests/published_figures_still_reproduce.rs få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.py lä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ån web/capabilities.json, resultatet clock-holdover och tests/fixtures/sgp4_comparison.md. tools/gen_readme_assets.py läser samma palett, vilket rättar dess drift i ljust tema från sajten. Värdena för sgp4-regime-bars är värstafallskolumnen kshana↔ref i den fixturen (7.31e-9, 8.05e-9, 8.18e-9 och 4.12e-6 km), oförändrade från Matplotlib-figuren, och tests/figures_doc_sync.rs misslyckas nu om den incheckade figuren och fixturen inte stämmer med varandra.
  • docs/assets/figures/domain-coverage-map uppdaterad 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ån web/capabilities.json lä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 typerna jamming, lunar-jamming och interop (tonen i det medföljande exemplet spectrum: 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ätt q_override för att behålla det gamla 1,5.

  • Heltalsutdata från kshana iq scene använder heltalsintervallet. Med enhetseffektbrus och en skrivarskala på 1 blev scener i ci8/ci16 ungefä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 az och den stigande/fallande grenen i stället för själva azimuten, eftersom asin fö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 track och kshana iq sweep tillämpar front-end-flaggorna. Användningstexten annonserade --bandpass/--notch/--blank/--excise/--agc/--bits på track, men track och sweep byggde aldrig kedjan: flaggorna ignorerades tyst, och en flagga utan värde som --notch svalde flaggan efter sig. Båda kommandona tolkar dem nu som iq acquire gö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 som iq frontend skriver för samma flaggor.

  • IQ-scenens data placeras per signal. kshana iq scene --data (och NavData::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 nya SpreadingCode::data_modulation() (DataModulation, satt av varje konstruktor i iq::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, och NavData::Lnav på allt utom L1 C/A. Egna koder behåller den tidigare tidtagningen på 20 ms som standard. En programmatisk Scene som bad om NavData::Lnav på en kod som inte är L1 C/A, eller NavData::Seeded på 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::acquire och spårningskanalerna blandade ned varje kod från enbart if_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 nu SampleSpec::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 in carrier − center i if_hz i 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 frekvenskanal k, och satellit-id:t av typen u32 omsluter en negativ kanal. Referenssidofilen skriver k = -7 som sat_id 4294967289 (k + 2^32). Läs tillbaka den som k med en cast till i32.

[0.32.0] - 2026-10-05#

Tillagt#

  • GNSS-IQ-lagret i CLI och Python (0.32.0 fas A). Den befintliga modulen iq går nu att använda utan att skriva Rust. Fem nya kommandon i kshana iq ansluter till gruppen för datahantering: scene genererar en lång IQ-scen med flera satelliter till en fil med en referenssidofil; acquire kör FFT-infångning av en eller flera PRN över en inspelning och rapporterar varje detektering (PRN, Doppler, kodfas, statistik, tröskel); track infå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; sweep spelar upp en inspelning över flera slingutformningar och rapporterar resulterande jitter- och lågmått per utformning; och labfit anpassar 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 modul iq::cli; scenens egen referenssidofil är den oberoende referensen i tests/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 iq och Python (0.32.0 fas A.2). Bygger på fas A och gör resten av lagret iq tillgängligt utan att skriva Rust:
    • Utbredningskanal i iq scene (och Pythons iq_scene): en jonosfär av första ordningen (--iono-stec/--iono-vtec eller --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-meta med en capture och annotationer per satellit; acquire/track lä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, --bits 1/2/3/8/14) kör stegen i iq::frontend (bandpass-FIR, adaptiv notch, pulsblankning, excision i frekvensdomänen, AGC, kvantiserare); speglat i Python som iq_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 som iq_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 och tests/iq_cli.rs.

[0.31.0] - 2026-10-04#

Tillagt#

  • GNSS-IQ-lager: simulering på signalnivå och bearbetning i programvarumottagare. En ny modul iq tar 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 kommandogruppen kshana 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 verktyget assess_receiver_log i 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 pxform på 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.1 signal.welch inom 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 lstsq på 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_fde i 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 sigma raim::araim_raim och raim::araim_dual_raim INTE ä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 att raim::solution_separation_raim saknar 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_raim ligger 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 handledningen gnss-sim flyttas 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 i docs/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 i tests/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.md bana/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 nDot i 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-loop jitter_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-pnt på 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 i docs/SOLAR-SYSTEM.md och låsningen i mcp/kshana-mcp/tests/round_trip.rs fö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-positioning toa_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.json sä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_srif och cislunar_srif::srif_cross_validation_sqrt, på nya linalg_sr::weighted_lstsq och covariance_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::fit delegerar 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. LunisolarSource låter en geometrisökväg välja den analytiska serien (standard) eller en kärna.
  • Frivillig kärn-måne för lunar-llr-datum och lunar-vlbi-fim: en nyckel planetary_kernel_path läser månens geocentriska centrum ur kärnan; inget annat ändras, och rapporten får ett block moon_ephemeris som 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_utc stä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_ephemeris sä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-fim och lunar-vlbi-fim med 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,6 autocorr_noise_id på 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] och sgp4::gcrs_to_itrs_matrix[_eop]; Sgp4::new_at och Sgp4::propagate_at tar tvådelade epoker. Ny jd2::Jd2::from_utc_calendar (SOFA-konventionen dtf2d för skottsekunddagar), jd2::utc_to_tai, tai_to_utc, utc_to_ut1 (via TAI, som SOFA utcut1), tai_to_tt och en tvådelad jd2::earth_rotation_angle.
  • Polarläget i leo-pvt propagerar med SGP4 vid 2026-01-01T00:00:00 UTC på IAU-kedjan (leo_fusion::polar::latitude_sweep_at tar valfri epok); SGP4-Walker-generatorn roterar till det jordfasta systemet genom IAU-kedjan.
  • Slaget passes kö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 brytare refraction och light_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 geometriska passes::predict_passes är oförändrad.
  • tests/no_private_models.rs hindrar 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/taiutc på 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, pnm06a och ee06a inom 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; slaget passes hö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.toml total åtkomsttid 1675 s -> 1659 s (fem passager som tidigare; bästa maximala elevation 73,25 grader -> 70,08 grader), och varje utdata från passes flyttas med den nya sökvägen (den utskrivna raden i docs/examples/multi-tool-pipeline.md och posten passes i docs/CAPABILITY.md säger nu det); medföljande polar-arctic-leo-coverage GNSS-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 i leo-pvt samt referensbanan i leo_navmsg (deras modeller finns i leo_link::geometry och leo_fusion::geom), och jordutformningar i constellation-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 som xval/lunar-afs/fetch_lsis.sh fyller 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_extensions och sigmf::annotation_extension_fields: en inspelning kan bära tilläggsfält med namnrymd som deklarerats i core: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.sh har 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_jamming och attack_surface var 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 i xval/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_series med 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, med to_mid_rise fö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 .sdrx motsäger det binära huvudet.

  • antenna::GainPattern2D och, i earth_gnss_lunar, kroppssystemet med girstyrning, sändningsazimut och vinklar från nadir, samt transmit_side_db fö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_sdr fyller 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 som SdrLayout::fill_lsb_first och 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_raim anvä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.md som anger källa, licens, hämtningsdatum och SHA-256.
  • Runda 2: araim_reference::add_v42_protection_levels och _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_correction och propagate_second_order; INS-felmodellen med nio tillstånd inertial::coast::ErrorDynamics; partialer för lunar_vlbi::KernelGeometry och indata för lunar-vlbi på 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_m med ITRF2020-stationer; Jacchia 1971-densitet; solar_system::link_on över valfri efemeridleverantör; launch::site_rotation_speed_at; eo_payload::j2_nodal_period och ground_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, en sitemap.xml med datum för när varje sida senast ändrades, llms.txt och llms-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_TOKEN fungerar 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.md listar 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änder navsignal::simpson. LEO-passagens två ingångspunkter delar ett uppsättningssteg. leo_link::geometry importerar vektorhjälparna i leo_fusion::geom i 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 i scenarios/ 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.rs och src/leo_fusion/pvt_units.rs. PVT_UNITS behåller sin publika sökväg. Bara dessa två tabellfiler ansluter till undantagen från kopieringsdetektering för deklarativa kataloger i sonar-project.properties, vilka tests/sonar_cpd_exclusions_are_justified.rs kontrollerar.

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 i src/. Den publicerade siffran var 95,63 % (37 697 av 39 419 rader), uppmätt på b1d350d före 0.28.0; den avrundades till ~96 %. Den nya siffran avrundas till ~95 %, så varje yta som tests/coverage_figure_doc_sync.rs fastlå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 i web/fonts/FONTS.json). web/tools/fetch_third_party.py lärde sig att spara en Google Fonts-delmängd text= 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 .html fungerar fortfarande. Research har en egen länk i sidhuvudet, mellan Evidence och Developers, och i sidfoten. Dokumentationen visar inte längre färdplanen (ROADMAP.md finns 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
    1. 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 (determinism två gånger, advanced_report och animation en gång): 37 minuter tillsammans under täckningsinstrumentering, mot 3 på 0.27.2. De delar nu tests/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: determinism tar 143 s på 14 kärnor mot 612 s med KSHANA_CORPUS_THREADS=1 (den gamla seriella genomgången).
  • 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 av tools/readme_shots.py och registrerad i docs/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-mcp med 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.rs och src/sgp4.rs (0.323_273_64 → 0.323_273_640): SonarQube Cloud tolkade en sista grupp _64 eller _32 som ett saknat suffix f64 eller f32 (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::numat byggde Rx(−(ε̄+Δε))·Rz(Δψ)·Rx(ε̄) där SOFA:s iauNumat bygger Rx(−(ε̄+Δε))·Rz(−Δψ)·Rx(ε̄), så nutation_matrix, nutation_matrix_2000a, teme_to_gcrs och gcrs_to_teme roterade 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:s numat inom 1e-14. tests/frame_reference_vectors.rs::teme_to_gcrs_matches_vallado_gcrf och nutation::tests::nutation_matrix_matches_erfa_numat misslyckas båda med det gamla tecknet. Konsistenstestet för CIO (Celestial Intermediate Origin) i src/cio.rs hade 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: kolumnerna gcrs_r_m och gcrs_v_m_s för slaget ephemeris (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), och Propagator::position_in_frame / state_gcrs fö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 i orbit-sgp4-gps har en CZML-position som stämmer med en ERFA-reduktion av samma TLE (propagerad av Python-paketet sgp4) 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ör leo-navmsg flyttas med det, och likaså steget navmsg i leo-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 i docs/LEO-NAVMSG.md för scenariot med kodning och avkodning var 0x110315 och är 0x19105F, och det avkodade meddelandets SISRE är 0,129 cm. På kshana.dev visade Missions-kortet för leo-navmsg-fit-interval-trade ett 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-jamming dä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-detect av 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.md angav 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öljande leo-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.md bandavvägning: den förstaordningens jonosfärsfördröjning för generic-s är 3,24 m (skrevs ut som 3,25 m) och för generic-c-wide 0,77 m (var 0,78 m). docs/LEO-NAVMSG.md kodning 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.md LEO 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-navmsg och telecom-timing saknades; 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ör oem-interop i docs/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 i orbit-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 exempel scenarios/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 och spectral_separation_coeff_offset.
    • Rapporten skriver ut den C/N0 som slagets jamming representativa 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.
    • Body får Merkurius, Venus, Jupiter, Saturnus, Uranus, Neptunus, Pluto och de sju månarna, en namnuppslagning och en fysisk post; AnalyticSolarSystem ger vilken kropp som helst i förhållande till vilken annan som helst genom den befintliga skarven EphemerisProvider.
    • 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ån body-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 slaget solar-system lade 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ör kshana 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.toml kopplar ihop slaget spectrum med 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 i tests/campaign_composition_reference.rs. constellation-design löser nu sin centralkropp genom Body::by_name, så en konstellation kan läggas kring vilken planet, Pluto eller större måne som helst med de konstanter som slaget solar-system använder.

Kampanjer

  • Kampanjer: många scenarier sammansatta till en körning. Ett nytt slag campaign (src/campaign.rs, dokumenterat i docs/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 av carry, handoff och end_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-road och campaign-monte-carlo-clock-holdover. tests/campaign_composition_reference.rs fastlå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 en manifest.json som 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öljer prefers-color-scheme, och under prefers-reduced-motion visar både SVG-filen och spelaren den färdiga bilden i stället för att röra sig. --animate-fps och --animate-duration anger uppspelningen; kshana::api::animate_toml och kshana::animation::animate_result är bibliotekets ingångspunkter, och result.json får ett block animation bara när --animate kö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 block units), 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 av sweep eller sweep-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ör orbit eller sökvägen med uppmätt registrering för slot-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ätter KSHANA_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-name redan 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.rs rapporterar 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) och tests/advanced_report_cli.rs kör om det registrerade kommandot i en ny katalog och kräver en byte för byte identisk result.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.json bär samma block companions. 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, med gx:Track tidsmä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 slaget spectrum:s syntetiserade IQ-ögonblicksbild (i fas och kvadratur) som ett SigMF-par (Signal Metadata Format) genom den befintliga src/sigmf.rs. --export all skriver varje format som gäller och skriver ut varför de andra inte gör det; --export list rapporterar utan att köra. Rörliga objekt skrivs i Geocentric Celestial Reference System (CZML INERTIAL, STK ICRF) och jordfast WGS 84 (World Geodetic System 1984) longitud, latitud och höjd (KML, GeoJSON); fasta platser i CZML är FIXED. Slaget jamming lägger till två jammerfotavtryck från sina egna länkekvationer. --import-route <file.geojson> skriver en GeoJSON-LineString i spårindata för terrain-nav, terrain-slam, gravity-map och combined-altpnt. Exporterna är byte-deterministiska och bär ingen tidsstämpel. tests/interop_formats.rs validerar 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 slaget spectrum flyttades till en delad funktion och dess resultatdokument är byte för byte identiskt, och PassesScenario får propagator() och epoch_calendar() som används av dess egen körning. Antalen slag, scenariofiler och rader i verifieringsmatrisen är oförändrade. Ett bana- eller integritetsscenario utan epoch dateras 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äggs Sgp4::epoch_jd_utc, Sp3Interpolator::jd_ut1 och Propagator::own_jd_utc till; inget som fanns läser dem.

Navigering i låg jordbana: signal

  • LEO-PNT-signalutformningar och ett multibandsspektrum. Ett nytt slag leo-signal och ett slag spectrum som 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 under data/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 i docs/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; en wideband-jammer (barriär) ansluter till de fyra vågformerna. Rapporten lägger till bands[].tracked_power_dbw, bands[].design och panels, och en post not_modelled. Vanliga band ger samma tal som tidigare. Exempel: scenarios/multi-band-jamming-waterfall.toml.
    • navsignal få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::label skriver 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.
  • 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 koden constellation-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.rs så 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.

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). Se docs/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) och leo-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.rs med 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-ppp och ntn-positioning. Tre nya scenarioslag i src/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 i src/celeste_iod.rs så att de kan hållas tillbaka).
    • leo-pvt har 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) och celeste-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-pass kan namnge en utformning leo-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 paret iono_free använder det också). Ett band utan utformning ger samma utdata som tidigare.
    • leo-pnt-chain kör signal -> passage -> navigeringsmeddelande -> fusionerad gemensam lösning med leo-pvt -> valfri leo-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ämningsterm od_sisre_m i 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, och tests/leo_pnt_chain.rs kontrollerar 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 signalen generic-l), xona-pulsar-end-to-end (den publika X5-signalen), båda medföljer, och den valfria celeste-iod-end-to-end som 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, som build.rs bara kompilerar in när den finns (konfigurationsflaggan kshana_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.rs kontrollerar 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-pvt får t_s och fallen för leo-ppp får t_min, så båda animeras; leo-pass och leo-pnt-chain exporterar CZML-, KML-, GeoJSON- och STK-efemerider, och de andra LEO-slagen anger varför ett format inte gäller.

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.md som översikt över varje LEO-slag och scenario. Varje scenario körs utan några Celeste-data och medföljer.
    • leo-pass få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 i leo_link::spoof. Saknat avsnitt, oförändrat utdata.
    • Varje bandpar i leo-pass rapporterar 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ån leo-pass; inget befintligt tal ändras.
    • Tidssynkroniseringsläget i leo-pvt tar trace = 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) och leo-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 är leo-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 i docs/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.rs kontrollerar ö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-pass flyttas till docs/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ör kshana example och 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_scenario skickade 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_scenarios och get_example_scenario serverar de medföljande referensscenarierna (tabellen kshana example), var och ett med sitt slag och första meningen i sitt eget huvud, byte för byte filen under scenarios/. Ett scenario som finns i förvaret men inte medföljer avvisas med skälet. Varje slag utom lunar-llr-datum (vars dataurval bara levereras med förvaret) har minst ett exempel.
    • report_scenario returnerar körningens rapport som JSON (JavaScript Object Notation) eller som den utskrivbara HTML-sidan (HyperText Markup Language) (docs/REPORTS.md).
    • animate_scenario returnerar 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_interop och import_route serverar interoperabilitetsexporterna och GeoJSON-importen av rutter (docs/INTEROP.md): CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, STK-efemeridformatet (Systems Tool Kit) .e och 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-scenarios som är avstängd som standard och som exponerar tabellen med referensscenarier som kshana::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 under web/, 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.md och 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 av tools/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 till docs/.

Ändrat#

  • <scenario>.report.html är nu den avancerade körrapporten som beskrivs under Added, och CLI:ets rad wrote … nämner även <scenario>.report.json. Det enkelsidiga resultatkort som den ersatte är oförändrat som RunOutput::html_report(), som Python- och WebAssembly-bindningarna fortfarande returnerar. OracleKind::modelled_reason() exponerar meningen som docs/MODELLED-RATIONALE.md skriver 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.json och report.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::Modulation får varianten Mboc, vilket är en brytande ändring för en anropare som matchar den uttömmande. Kindens kolumner gcrs_r_m och gcrs_v_m_s för ephemeris ändras (se "Revisions to published numbers"). En körning reproduceras fortfarande av den motorversion som gjorde den.

Rättat#

  • export_table_csv på MCP-servern nämnde fyra kinds som de enda med en CSV-tabell (kommaseparerade värden); sex publicerar en. Verktyget returnerade alltid tabellen för telecom-timing och för leo-navmsg (dess encode-decode-analys på en kepler16- eller kepler-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.toml kodade en ram med cyklisk redundanskontroll 0x110315 i release-bygget på aarch64 macOS, 0x898BD8 i ett debug-bygge av samma källkod på samma maskin och 0x6A82D9 i WebAssembly-bygget (WASM); leo-navmsg-celeste-iod.toml gav 0x6EDB2D nativt mot 0xC6E4F0 i 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_elements tar den oskulerande inklinationen från en acos och perigeumargumentet från en atan2, 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_distr anropar värdens exp och ln i 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-cratet libm (redan i beroendeträdet, nu namngivet i Cargo.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, eftersom f64::powi har ospecificerad precision, och sanningsklockan drar sina normalavvikelser från portable_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_platform lå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_library läser kindens källfiler från disk och misslyckas vid ett inneboende transcendent anrop, vid en rand_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 fem leo-navmsg-scenarier. Detta flyttar tal och redovisas här som en revision. Kinden leo-navmsg är ny i den här releasen, så inget som publicerats i en tidigare release flyttas, men varje leo-navmsg-värde gör det, nativt och i WASM-bygget, och navmsg-steget i leo-pnt-chain med 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 var 0x110315 och är 0x19105F (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.

  • Seedad omsampling drog andra index på ett 32-bitarsmål. Rng::gen_range över usize tar 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 i eval_stats (bootstrap_ci, bootstrap_auc_ci), blandningen före varje träningsomgång i impairment_ml och permutationstestet i impairment_study. De drar nu genom portable_math::uniform_index, som alltid samplar som u64: 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. Se docs/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ödet realdata-clock kö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, id och from_id tillagda. quantum-trade:s baseline_clock_class accepterar 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 sektionen spoofing i kinden slot-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 till tpl::timing_protection_level_ns fö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å) och docs/DEPLOYMENT-TARGETS.md (var Kshana körs; ingen no_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.tgz som GitHub-förkortningen owner/repo, så npm-jobbet för v0.27.3 försökte klona github.com/npm-dist/kshana-0.27.3.tgz och 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.toml visar 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-nav skriver ut det.

  • Varje gnss-ins-sensor kan ställa in sitt eget filterprior ([imu_quantum.filter_prior] eller [imu_classical.filter_prior], med sigma_accel_bias och sigma_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. En cargo install kshana-användare har den körbara filen men ingen katalog scenarios/, 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ån scenarios/ (src/bundled_scenarios.rs; tabellen finns i CLI-binären, så Python-wheelen och WebAssembly-modulen växer inte). kshana example listar dem; kshana example clock-holdover > clock-holdover.toml skriver ut ett. De övriga två filerna finns bara i repositoryt: lunar-llr-datum läser arkiverad data för månlaseravståndsmätning som bara levereras med repositoryt, och quantum-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.rs hå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 exempel quantum.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ån src/verification.rs genom src/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ör hybrid och fusion har ingen ägande matrisrad, så de listas under untiered i 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, och docs/TELECOM-TIMING.md listar 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.toml visar 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 och web/engine.mjs vidarebefordrar 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-observability bä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 units som 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 blocket units igen 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 literal expect_summary flyttas inte.

  • realtime-frame-eop rapporterar mot vilken sanning varje Earth-orientation-rad bedömdes och hur ofta reservvägen användes. table3_joint_eop[].{ut1, polar_motion,combined} får truth_source och truth_fallback_rows. Golvet final bedöms mot Bulletin B final och kan bara använda epoker som publicerar en; varje dN-rad bedöms mot truth_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-volume avger en storleksmatchad keplersk baslinje. ephemeris_comparison.keplerian_matched kö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 som 360k/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.js också 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.rs spärrar nu invarianten i båda halvorna: ett korts mål för run måste vara medföljande under scenarios/ och erbjudas av katalogen. Mutationstestat mot båda felfallen.

  • moonlight-service-volume avger sin geometri per satellit som <scenario>.table.csv nä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.sh listade varje paket i resolven för standardfunktionerna, inklusive dev-dependencies. Det gjorde att sgp4 och chrono — crates som bara används i test och inte kompileras in i någon artefakt — fanns med i materialförteckningen, och att kedjan --features python som 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, python och wasm (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 standardformen expression.

  • 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-jamming och moonlight-service-volume bara när export_site_lat_deg + export_site_lon_deg är satta). WebAssembly-modulen får table_csv, som returnerar samma text eller undefined. MCP-rundturstestet och Python-bindningarnas tester låser nu den returnerade CSV:n byte för byte mot tests/golden/realtime-frame-eop.csv, och låser att RunOutput.write_csv returnerar 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_all i WebAssembly-modulen: en motorkörning för varje utdata. run, chart_svg, summary och table_csv kö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ör cislunar-arc-recovery i en webbläsare. run_all returnerar {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ör scenarios/gnss-ins.toml ändras enligt följande:

    gnss-ins.toml fö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, i closed_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ör gnss-ins har 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 med TypeError: fetch failed, eftersom paketets init() hämtar sin WebAssembly-binär och Node:s fetch inte kan läsa en lokal fil. Nu:

    • README.crates.md och README.pypi.md bär det scenariot inbäddat, som README.npm.md redan gjorde. Rust-blocket är ett helt program med sin egen main, 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.rs kompilerar det fortfarande byte för byte, och avvisar nu även en dold rad i blocket.
    • README.npm.md skiljer webbläsaren från Node.js och ger ett Node-recept som läser binären från disk och skickar den till initSync. Doc-sync-testet accepterar initSync som den laddare wasm-bindgen genererar.
    • Alla tre bäddar in scenariot med sina provenienssträngar oförkortade, så scenariohashen är 5ba83a232b94 på 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 paketet wasm-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.toml sätter default-run = "kshana". Utan det vägrade cargo med "could not determine which binary to run", vilket varje rad med cargo 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 enradiga ok: vid framgång fanns redan på main. tests/cli_first_run.rs tä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 som scenario_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.md och README.pypi.md sä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.md angav 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ån tests/araim_dual_real_data.rs som propagerade varje satellit från sin egen TLE-epok (parse_propagators slä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 mot araim_dual_constellation_availability, så den enda skillnaden är tidsjusteringen. docs/CAPABILITY.md och docs/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.md och 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.

  • --validate sä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.sh avvisar ett icke-numeriskt REPEAT eller TEST_THREADS. Under bash 3,2 gjorde REPEAT=no att 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.toml flyttades till 1,85 i förra releasen; README-märket, installations- och felsökningstexten, codemeta.json och MCP-cratens egen motivering sa fortfarande 1,75.

  • RunOutput.__repr__ i Python-bindningen rapporterar bytes, inte "chars". Den skrev ut len() 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-name tillsammans. --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.html ignoreras nu som de andra fyra motorutdatafilerna.

  • Ett seed-svep i lekplatsen misslyckas inte längre vid varje körning. Svepet steg heltalsreglaget seed linjärt (1, 10,9, 20,8, …), och motorn, som läste det som u64, 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 inget engine_version eller scenario_hash, så deras nedladdningar fick det vanliga namnet kshana-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 kshana bygger 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 under src/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 bara kshana. I en klon hittas generatorerna fortfarande automatiskt, så cargo run --bin <name> och releasejobbet som kör validation_report är oförändrade. Mätt med cargo 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 --path på den paketerade craten installerade en körbar fil, kshana.

  • Utdata som en tidssynkroniseringsingenjör kan läsa: inga fler p95 0.0ns, inga fler security 0.000 utan 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.0ns medan 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 som 0.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 som 0.000.
    • security är en analytisk gräns för spoofingdetekterbarhet som bara betyder något mot ett konfigurerat angrepp. Kinds clock, orbit, hybrid och fusion konfigurerar inget, så deras sammanfattning skriver nu ut security n/a (no attack) i stället för ett tal som 0.000 som läses som en misslyckad detektering. Värdet finns kvar i fom.security, markerat applicable: false med skälet i figure_tiers, och rapporttabellerna visar "not applicable". Kinden spoof bedömer fortfarande detektering.
    • Två sammanfattningsfastlåsningar i tests/registry_golden.rs flyttades av exakt dessa två skäl och inga andra: golden_clock (kvant-p95 och båda värdena för security) och golden_orbit (båda värdena för security; 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, och tests/tutorials.rs kontrollerar 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.rs låser fast kopplingen från Rust-sidan.
  • Den publika beskrivningen inleder nu med tidssynkronisering och holdover, den bäst validerade domänen. Öppningen av README och docs/POSITIONING.md presenterar 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 kinden telecom-timing och docs/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.md få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.md slutade 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 mot src/verification.rs rä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 parsern oem; 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.md få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ån src/verification.rs och api::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.md anger 95,63 % (37 697 av 39 419 rader) från CI-jobbet coverage på b1d350d, och tests/coverage_figure_doc_sync.rs lå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.rs kontrollerar varje import { … } 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.rs faller om src/lib.rs förlorar #![forbid(unsafe_code)] eller SECURITY.md slutar ange det. tests/no_overclaims.rs söker nu också igenom web/README.md och de tre README-filerna för register, och varje standard på webbplatsen måste ange sin proof uttryckligen.

  • 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 med KSHANA_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.stubtest i bindningsjobbet), vilket är hur csv/write_csv levererades 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_fields går från 21 till 22: ephemeris kräver nu tle|orbit+epoch (ett bart kind = "ephemeris" brukade passera --validate och sedan misslyckas i körningen), och quantum-trade lägger till candidate_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); --validate förstår båda. lunar-joint-od-clock, pvt och earth-gnss-lunar publicerar 9 verkliga valfria fält som de hade utelämnat. docs/SCENARIOS.md säger nu att kind är obligatoriskt för varje kind utom clock. tests/required_fields_are_true.rs kontrollerar 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.sh misslyckas nu om inte den nyaste posten <change-notes> i plugin.xml namnger 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.md sa "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.yml och jetbrains-plugin.yml startar inte längre vid tagg-pushen; release.yml anropar dem från jobb som needs: 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, och verify returnerade 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 nya scripts/check-release-verdict.sh, som kräver en grön verify fö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.py frågar crates.io (kshana och kshana-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-darwin och så vidare), bredvid Linux-binären kshana, vars namn är oförändrat. En fil SHA256SUMS täcker varje tillgång, och verify-release kontrollerar 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 till main medan dess sidor namngav den senaste releasen. pages.yml bygger 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 anropar wheels.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.yml och pages.yml hade 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 att rust-toolchain.toml vä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.sh misslyckas 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.

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) och jetbrains-plugin.yml (Marketplace) tävlar mot publish.yml i stället för att vänta på det, så en felaktigt skuren tagg spärrades bara i ett syskon. Båda kör nu scripts/check-version-sync.sh fö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 rmcp 1,7 till 2,2: tre rådgivningar mot rmcp < 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 i rmcp 2 kräver Rust 1,88, så enbart kshana-mcp deklarerar nu rust-version = "1.88"; biblioteket kshana stannar 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 .rs var 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.rs lö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 verkliga mod tests och 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 nu tests/alternative_complementary_pnt_reference.rs och 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 utdata chart.svg och 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 bredvid scenario-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å att previous_version fö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 registren FieldUnit som upprepas i ensemble, hybrid, fusion, inertial och report, 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.sh hade inget lås för en enda skrivare, och varje körning skrev samma logg. Det handlar inte om ordning och reda: kvittots integration_binaries, tests_passed och tests_ignored lä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, med target/gate-run.log uppdaterad 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.rs på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 till verification::gen — modulen heter artifacts — är rättad i syskonspärrens egen dokumentation.

Ändrat#

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

    Taggarna v0.27.0 och v0.27.1 flyttades medvetet INTE. De pekar fortfarande på 7bba514 och 7864142, 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.json registrerar 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 till main — vilket är varför denna release finns: v0.27.2 ger main en 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.rs innehåller en include_str! på översta nivån av tests/fixtures/llr_geometry/de440_moon_pa.csv, och manifestet exkluderar /tests/fixtures frå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 i src/ 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. Ett package-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-campaign ersatte 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_m som scenarioparameter på lunar-integrity och moonlight-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_deg lägger till en array per_sat_geometry som 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ör antenna.rs anvä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 tabell export_antenna på 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 block antenna_pattern som 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·λ/D grader 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_COEFF och lunar_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 med x = 1.61634, vilket ger den exakta halveffektsbredden 1.02899·λ/D och registrerar ärligt att den konventionella koefficienten 1.02 placerar pattern_gain_dbi vid −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 kurvorna x(τ) 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.csv med 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 varje x med 7, så att bytena inte förgrenas mellan bygget av samma källa. Rent additivt: rapport-JSON är byteidentisk.

  • Rapporten för hybrid-optical-rf beskriver nu sig själv. Ett block link_configuration ekar 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 block units anger 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 bar variance och 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 som ashfordeOU <contact@ashforde.org>, 34 som Chakshu Baweja <contact@ashforde.org> och 94 redan kanoniska. Den enda dependabot[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.0 löses fortfarande upp till trädet 92284e9420605568f1bfabb78cd95d383b40f3e2, 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.0 var dce2dbf7700788cf6de46260c14673c0e5347360 och är nu d4921f3025569e00e425e1747d0acfc261e96e18. Två artefakter registrerade det gamla namnet vid publiceringen och kan inte rättas, eftersom en publicerad registerversion är oföränderlig till sin konstruktion:

    • kshana 0.26.0 på crates.io — .cargo_vcs_info.json registrerar dce2dbf…
    • kshana-mcp 0.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-eop hade som standard en EOP-fil utan prediktionsrader (G12). Scenariot bäddade in ett utdrag av finals2000A med fem rader, endast slutgiltiga, som sin standard för offline, så en bar körning rapporterade predicted_rows.n = 0 och 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 rapporterar predicted_rows.n = 12 och 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ämnat predicted_rows.n på 0. Detta flyttar publicerade tal, under regel R4 och med grundarens tillstånd: tio av de 22 cellerna i den släppta p4_frame_eop.csv och 24 av de 42 ifyllda cellerna i tests/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 i docs/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änsade n_sats till 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ör n_sats > 12.

  • Samma inaktuella begränsning i lunar-differential-pnt. lunar_dpnt begränsade n_sats till 12 med samma följd, och den här nådde en publicerad tabell: dpnt_nsats_sweep.csv har en rad n = 16 som är byteidentisk med sin rad n = 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ör n = 16 blir 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ör n_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å (//! i lib.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ån api::list_scenario_kinds() (den enda källan till sanning) av gen_validation_artifacts och bevakad av tests/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.txt på 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 speglar src/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-surface i 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.sh kompilerar biblioteket med missing_docs, räknar varningarna och misslyckas bara om antalet stiger över ett fastlåst tak (986). En hård #![warn(missing_docs)] under -D warnings hade 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_kinds annonserade "~17 built-in scenario kinds" medan api::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 allantools fö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_vectors på 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.
  • 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 regeln 0.589·(σ₁+σ₂)), korskontrollerade mot kvantiler för rayleigh/maxwell i scipy.stats och 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 en PositioningFom.
  • 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 mot allantools edf_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 under tests/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 mot scipy.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-rader finals2000A; 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 i src/verification.rs).
  • Scenariot lunar-attack-surface (src/attack_surface.rs, kind = "lunar-attack-surface"): en sammansatt, binärnåbar (CLI / Python / MCP / wasm via run_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::SweepAxis och utvärderat genom received_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-formade capture_map.

Ändrat#

  • Detektering med glest övervakningsnätverk (monitor_network) sammansätter nu den fysiska AGC-statistiken spoof_monitors och det selenografiska synlighetsrutnätet lunar_service fö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 i detection. Fälten SurfaceMonitor / 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ältet auth_latency dokumenteras 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 en ExternalPack::register_into med 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 integrate och integrate_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.
  • Ett stycke som namnger AI-klienter från tredje part utelämnas här; det finns i CHANGELOG.md på GitHub.

  • 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.

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-informationsmatrisen M = HᵀWH frå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 en best_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_observability i src/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 av elfo_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.url som 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ältet repository är nu det kanoniska med gemener ashfordeOU, så att den genererade package.json stämmer med proveniensens subjekt och npm-releasen publiceras.

Ändrat#

  • Wheel-bygget låser codegen-units = 1 så 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 under tests/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.rs lä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 av tests/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.xml samt metadata för Open Graph / JSON-LD på kshana.dev; en genererad validation-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.sh upprä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 — unwrap utanför tester har tagits bort eller motiverats; clippy::unwrap_used tillä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 + clippy grö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 med TradeEvidence plus 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.
  • PNT-svit för måne och cislunart rymd. Sju körbara MODELLED kind ovanpå 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.
  • 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 --validate och 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) via cargo 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), med cargo run --release --example resilience_report -- paper-artifacts/resilience-study.json. Korstabell i docs/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, via cargo 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.json och resilience-study.json spåras nu under paper-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.cff och README; 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 nya LICENSING.md (vad varje licens omfattar och när den gäller).
    • LICENSE innehåller nu AGPL-3.0-texten; SPDX-huvuden i alla källor har uppdaterats till AGPL-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.0 och tidigare, som publicerade); från v0.19.0 och framåt gäller AGPL-3.0 / kommersiell licens.

Säkerhet#

  • Höjde pyo3 frå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, och pyo3 är ett valfritt beroende (med funktionen python) — så den verkliga exponeringen var noll — men höjningen håller skanningen ren för efterföljande granskare. Migrerade src/python.rs till API:et i pyo3 0,29 (returtypen Bound för scenario_kinds; explicit skip_from_py_object på pyclass RunOutput). 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>.toml och bär ett uttryckligt MODELLED-märke i sitt resultat-JSON och i den enradiga sammanfattningen (ett test per typ i tests/dominance_demonstrators.rs kontrollerar att märket finns och att utdata aldrig innehåller strängen VALIDATED):

    • 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äsaren parse_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 slumpvandring q_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:erna q_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 (knapparna q_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å till Ukf::update_stats (returnerar NIS för varje uppdatering) och instrumentering för konsistens i TightlyCoupled17::{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-motorn particle_filter, i stället för den satsvisa sökningen från grovt till fint som terrain-nav anvä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 under src/impairment_eval.rs, src/quantum_trade.rs, src/navsignal.rs, src/inertial/quantum_imu.rs, med FutureNAV-verifieringssnitt i src/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 i hybrid-ukf.

  • Projektstyrning. GOVERNANCE.md som dokumenterar beslutsmodellen och gränsen mellan öppet och slutet; raden för community/styrning i förmågekartan går från none → partial fö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 biasprojektionen b_k = Σ_i |s_i|·b_nom per 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. Se docs/ARAIM_REFERENCE.md för den återställda formeln b_k och den ärliga implementationsanmärkningen.

  • Konsistens med χ² i spoofing-monitorn. parity_raim_test använder nu den delade inversa χ²-vägen raim::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-nav kopplat till CLI-dispatchern. Scenariot kunde tidigare bara nås via API:et; det dirigeras nu som kind= precis som alla andra scenarier.

  • Noggrannhet i dokumentation/antal. Antalet scenariotyper i README är nu fastlåst mot api::list_scenario_kinds().len() av ett scenario_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öm EphemerisProvider, 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; scenarioytan mars-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ärren cargo deny och jobbet för MSRV-1.75 är orörda.
  • Markspår med myndighetsnoggrannhet från verklig IERS jordorientering. Scenariot ephemeris tar ett valfritt fält eop_finals2000a — den inlinade kroppen av en verklig IERS-fil finals2000A — och reducerar markspåret genom UT1−UTC och polrörelse per epok, interpolerade ur den (samma EopSeries som precise_od använder), och åsidosätter de nominella skalärerna dut1_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 flagga kshana --eop <finals2000A> för in en verklig fil i scenariot från CLI. Stänger asymmetrin där bara precise_od anvä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_hz valideras. 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 av step_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 IERS finals2000A. 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 hifitime till < 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 ≈ 0 för SGP4 vid anropsstället för GMST (ett rotationsfel på ≤ ~13″, väl inom SGP4:s eget modellfel) och uppdaterade CAPABILITY.md.

0.15.1 - 2026-06-09#

Tillagt#

  • JetBrains-pluginet Kshana — PNT simulator är nu publicerat och har antagits på JetBrains Marketplace. README, kshana.dev och distributionsdokumenten länkar direkt dit.

Rättat#

  • Publiceringen i MCP-registret lyckas nu: server.json description översteg registrets gräns på 100 tecken (HTTP 422). Förkortade den och anpassade servernamnet (och avbildens ägarmärke) till det kanoniska namnrymdsnamnet io.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ör style.css/app.js fö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:n rmcp ä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 runt kshana::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-mcp till crates.io (cargo install kshana-mcp) via publish.yml.
    • kshana-mcp som en OCI-avbild för flera arkitekturer på ghcr.io (docker run ghcr.io/ashfordeou/kshana-mcp) via en ny mcp-publish.yml.
    • kshana-mcp till 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 i kshana (kshana::cio::gcrs_to_itrs_matrix, GCRS→ITRS) mot ANISE (den rena Rust-återimplementationen av NAIF/SPICE) som roterar GCRF→ITRF93 från JPL:s earth_latest_high_prec.bpc, med samma IERS-parametrar för jordorientering finals2000A matade 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 eftersom anise + hifitime är MPL-2.0 / edition-2024 och aldrig får hamna i den publicerade grafen över beroenden för kshana, dess Cargo.lock, licensspärren cargo deny eller MSRV-bygget; ANISE är fastlåst med default-features = false. Innehåller en binär frame-xval (hämtar den ~5 MB stora BPC:n, skriver ut en tabell, skriver report.{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 med workflow_dispatch (blockerar aldrig main). Dokumenterad i docs/VALIDATION.md (CIO-raden) och ROADMAP.md.

Rättat#

  • Mobilvänlig playground. Åtgärdade horisontell överflödning av playgroundens .panel på telefoner (ett CSS-grid-element som som standard har min-width: auto renderades ~100 px bredare än visningsytan) via min-width: 0 och 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_level avvisar 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 giltigt Some — 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 i lunar_look_angle hålls strikt i [0, 360). (5) SphericalHarmonicField::from_gfc avvisar 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 genererar kshana-validation-summary.html och 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 med auditwheel show i wheel-bygget.
  • Handledningar och utbildning: docs/tutorials/ (tre genomarbetade handledningar, annoterade scenarier per domän, övningar på nivå 1/2/3) med tests/tutorials.rs som 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, plus FUNDING.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 scenariotyperna terrain-nav och combined-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_level bildar den viktade geometrimatrisen ur varje satellits elevation/azimut och felbudgeten för UDRE/GIVE/flyg/tropo, inverterar normalmatrisen (delad orbit::invert4) och projicerar varianserna till HPL/VPL via K-faktorerna i DO-229E (PA 6.0/5.33, NPA 6,18). iono_free_l1l5 lä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_map spårar kraven i DO-316/DO-229E till de funktioner som implementerar dem. Validerad mot slutna definitioner av K-faktorer, numpy-referensgeometrin inv(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 i docs/COMPLIANCE.md.
  • Fullständig tesseral gravitation med sfäriska harmoniska funktioner — EGM2008-fältet till grad/ordning 70. Ett nytt gravity_sh::SphericalHarmonicField utvärderar geopotentialen och dess acceleration i det jordfasta systemet ur fullnormaliserade koefficienter C̄_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 i egm2008_data.rs och reproduceras bit för bit av tools/gen_egm2008.py ur den incheckade tools/egm2008_to70.gfc; vilken ICGEM-modell .gfc som helst läses in via from_gfc. Validerad mot tre oberoende referenser: sammanfall till punktmassa (enbart C̄00 = −μr/|r|³), ett fält med enbart zonala termer som reproducerar den befintliga forces::zonal_accel till ~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 flagga ForceModel::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 Propagator som förenar de analytiska och numeriska banpropagatorerna. Den numeriska Cowell-propagatorn med kraftmodell är nu en förstklassig jämlike till SGP4: en ny typ NumericalPropagator (begynnelsetillstånd + ForceModel + Tolerance + val av steghalvering eller Dormand–Prince Integrator) och Sgp4 implementerar båda propagator::Propagator, vars state_at(t_seconds) -> StateVector returnerar det tröghetsbundna TEME-tillståndet i SI-enheter (m, m/s) så att de två är utbytbara bakom en Box<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 ett PropagatorError lyfter 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 i src/) 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.rs Stanford + 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 i api::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.svg eller från HTML-resultatkortet — identifierar sin version, sitt scenarioavtryck och sin källa. Hashen är märkt scenario för tydlighetens skull och kommer från resultatets scenario_hash dä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 i docs/PROVENANCE.md.

Rättat#

  • raim::chi2_quantile och 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 i read_dir, från de nya ARAIM-scenarierna). chi2_quantile skyddar nu p/k som normal_quantile (returnerar ett gränsvärde i stället för att panikera med assert!), och Normal fö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-matrix kö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 i tests/golden/ av nya tests/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.md dokumenterar uppdelningen.
  • Täckningsspärr för kod i CI. Ett nytt jobb coverage kör cargo-tarpaulin med 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 referenstabellen tcppver.out. Den incheckade jämförelsetabellen (tests/fixtures/sgp4_comparison.md, omgenererad via KSHANA_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 standard from_elements med 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 scenario orbit kan nu publiceras som en CCSDS 502.0-B-2 OMM-katalog — ett OMM KVN-meddelande per satellit som definieras av TLE — via kshana <orbit.toml> --export-omm out.omm, eller så skriver export_omm = true i 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 nya tle::parse_tle_identity; namnraden blir OBJECT_NAME (annars OBJECT <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 satelliter gps-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 i web/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 i web/app.js; skillnadslogiken är enhetstestad i web/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 i web/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 officiella igrf14coeffs.txt av tools/gen_igrf.py till src/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över run/run_full med sträng in/sträng ut exponerar modulen nu en typad klass RunOutput (.json, .svg, .summary och en åtkomstmetod .data() som returnerar resultatet tolkat till en inbyggd Python-dict — ingen ny JSON-tolkning, kan omslutas av NumPy), plus run_typed, scenario_kinds() (tolkad lista med metadata-dictar) och validate_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 i docs/PYTHON_API.md. De befintliga funktionerna är oförändrade.
  • Förstklassiga utdatasystem för propagatorer (src/orbit.rs enum Frame + position_in_frame + state_gcrs). Varje Propagator (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-rotationen gcrs_to_itrs enligt IAU 2006/2000A — och sitt fullständiga GCRS-tillstånd (position + hastighet) via state_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-koordinater X, Y avlästa ur matrisen för bias-precession-nutation enligt IAU 2006/2000A (återanvänder den validerade FW-precessionen + 2000A-nutationen med justeringen P03 för eraNut06a), serien med 66 termer för CIO-lokalisatorn s (eraS06, maskingenererad ur ERFA-referensen av tools/gen_s06.py till src/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ör eraXys06a (X=0.5791308482835292617e-3, Y=0.4020580099454020310e-4, s=-0.1220032294164579896e-7 vid JD_TT 2453736,5), eraC2ixys och eraEra00. 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.rs nutation_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-referensen nut00a av tools/gen_nut00a.py till src/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ör eraNut00a (Δψ = −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_2000a exponerar 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.rs LunarScenario → south_pole_hpl_pass) i scenariokörningen med ett JSON-LunarReport och 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 till araim_dual_constellation_availability (den avancerade ARAIM-motorn — fel hos enskilda satelliter och fel i hela konstellationen — körd över ett tidsrutnät) och visible_positions_labeled, och kopplar in den i körningen för IntegrityScenario via en flagga araim_dual så 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 i src/lunar.rs.
  • IERS-polrörelse och reduktionen TEME→ITRF (src/frames.rs). Lägger till polar_motion_matrix (SOFA iauPom00: W = Rx(−y_p)·Ry(−x_p)·Rz(s′) med TIO-lokalisatorn s′), pef_to_itrf / itrf_to_pef och teme_to_itrf — GMST-baserad rotation TEME→PEF följd av polrörelse — vilket fullbordar en ITRF-precis jordfast position ovanpå den enbart GMST-baserade teme_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 accelerationsbiasen 2·Ω×v via coriolis_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 till cai_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.md uppdaterad. Ä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) och south_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 uttryckligt IntegritySupportMessage (σ_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 motorerna araim_raim för enkelfel och araim_dual_raim för fel i hela konstellationen), en fristående renderare stanford_svg av Stanford-integritetsdiagrammet (de fyra zonerna, gränsen PL = error, larmgränsernas hjälplinjer, en färgkodad markör per epok) och docs/ARAIM_REFERENCE.md som 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 av araim_dual_raim i 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 nutationsmatrisen iauNumat i SOFA, samt Valladokedjan AIAA-2006-6980 TEME→TOD (ekvinoktiernas ekvation) → TOD→MOD (nutation) → MOD→GCRS (bias-precession), exponerad som teme_to_gcrs(r, v, jd_tt) / gcrs_to_teme. Serien, argumenten och enhetskonstanterna är avskrivna ur IAU SOFA / ERFA-referensen nut00b och validerade bit för bit mot den publicerade testvektorn för eraNut00b (Δψ, Δε 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 (se ROADMAP.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 β = γ = 1 enligt 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 formen 3μ²/(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 vinkelradier a = asin(R☉/d☉), b = asin(Rₑ/|r|) med skenbart centrumavstånd c, och ν är ett minus den andel av solskivan som Jordens skiva skymmer (cirkel–cirkel-linsens överlappsarea) — fullt solljus för c ≥ a+b, total umbra för c ≤ b−a, ringformig för c ≤ a−b och en kontinuerlig penumbra däremellan. srp_accel anvä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ärdet forces::SOLAR_RADIUS. Validerad fristående: ν = 1 i fullt solljus och ν = 0 djupt i umbran (exakt), en mjuk monoton penumbra (ν stiger 0 → ~½ vid c = 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 är 0 < ν < 1 för konen). Den enklare cylindrical_shadow finns 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 stegregulator 0.9·(1/err)^(1/5), så den är ett utbytbart alternativ; propagator::propagate_dopri exponerar 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) integrerar y' = y till e och 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); och propagate_dopri klarar 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 draget a = −½ · ρ(h) · (C_D·A/m) · |v_rel| · v_rel mot den medroterande atmosfären v_rel = v − ωₑ ẑ × r (forces::EARTH_ROTATION_RATE = 7.2921151467e-5). Eftersom draget beror på hastigheten får ForceModel en ny accel_rv(t, r, v) och integratorns högerled skickar nu hastigheten (f(t,[r;v]) = [v; a(t,r,v)]); den rent positionsberoende accel_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ör C_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 SRP a = ν · P☉ · cᵣ · (A/m) · (AU/d)² · d̂ med en förmörkelsefaktor för cylindrisk skugga (forces::cylindrical_shadow, ν ∈ {0 1}): strålningstrycket P☉ = Φ☉/c frå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 Solen ephem en gång vid den framflyttade epoken epoch_jd_tt + t/86400 som 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åne ephem vid den framflyttade epoken epoch_jd_tt + t/86400 (återanvänder precession::julian_centuries_tt fö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 med third_body_accel utvärderad vid efemeridens position för det ögonblicket vid både t = 0 och t = 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 kroppsoberoende forces::third_body_accel nu 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 modulen ephem med 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ör J2..J6), inkopplad i propagatorn som ForceModel::with_zonals_j2_j6(). Accelerationen är den exakta analytiska gradienten av den zonala störpotentialen R(r) = −(μ/r)·Σ Jₙ(Re/r)ⁿPₙ(z/r) (Legendre-polynom med rekursion uppåt), validerad på tre oberoende sätt: den reduceras till j2_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 termerna J3 mot de jämna J2/J4..J6 uppvisar sin karakteristiska (anti)symmetri nord–syd under z → −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) som f(t,[r;v]) = [v; a(r)], med en växel ForceModel. 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 slutna j2_secular_rates till första ordningens teori (inom 2 %, resten av ordningen O(J2²)). Lägger också till solve_kepler_checked, en Newton-lösare för Keplers ekvation som returnerar Err i stället för ett tyst felaktigt svar när den inte konvergerar inom en begränsad iterationsbudget (fallet nära perigeum e = 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 scenario scenarios/gps-denied-gravity-nav.toml. Raden docs/CAPABILITY.md fö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-0 kopplat Kalman-filter för klocka + position, OC-2 jamming J/S→C/N₀→förlorad låsning, OC-7 fysik för Mach–Zehnder-CAI, OC-8 ARAIM 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.rs lä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-funktionerna P̄₁₁=√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 ihop mapmatch + 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 inkopplingen kind= 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.rs lä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.rs bä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öghet C ≈ 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ärledda q_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 ny ROADMAP.md på 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.rs får walker_design_sweep, som kör ett rutnät planes × 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_front flaggar de icke-dominerade utformningarna (färre satelliter, mer täckning, lägre PDOP, kortare återbesök), och WalkerDesignReport::to_json serialiserar cellerna och Pareto-fronten — inklusive fälten för återbesökstid — som JSON. Ny validering fastlåser generatorn mot Walker-formeln i:T/P/F: satelliter på samma plats i angränsande plan visas avbildas på varandra genom en exakt rotation R_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åndet 2π/S i medeltal. Bygger på den incheckade verkliga ögonblicksbilden från Celestrak gps-ops frå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.rs bygger de operativa överföringsmetoderna ovanpå de levererade slutna formerna för Sagnac/common-view och verktygen för Allan-stabilitet. twstft_sagnac ger 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 oberoende twstft_sagnac_bipm); run_twstft ger en endygnsserie T_A − T_B och dess TDEV. gnss_common_view_series enkeldifferentierar 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_parameter och den lognormala lognormal_fading med 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 koefficienter h_α enligt IEEE-1139 till Allan-variansens kurva (alla fem kanoniska brusprocesser samtidigt) med den dominerande processen rapporterad per τ-decad. ensemble_timescale bildar 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.rs får parse_ionex, som läser filformatet IONEX (definition av rutnät i huvudet + block START/END OF TEC MAP) till en sekvens av IonexMap — och normaliserar filens latitudordning från norr till söder till ett TecGrid med positivt steg och skalar värden med 10^EXPONENT. interpolate_tec_in_time blandar två på varandra följande kartor till en frågeepok, och obliquity_factor / slant_tec avbildar den vertikala TEC på en sned stråle via faktorn för tunt enkelskikt M(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.rs får min_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 halvbredd c dimensioneras den nära polära konstellationen för kontinuerlig enkel global täckning som p = ⌈π/(2c)⌉ plan (till exempel behöver ett plan med 4 satelliter på GPS-höjd 2 plan, 8 satelliter), och rapporterar None nä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 via pdop_sweep och 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.rs får det tredje och sista detektionslagret och sammanvägningssteget: parity_raim_test anpassar 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_layers kombinerar 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.rs kvantifierar 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 levererade CoupledPntFilter) 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.rs kopplar 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) och range_rate/Doppler (ρ̇ = (p − sᵢ)·(v − ṡᵢ)/|p − sᵢ| + d) — i stället för en förberäknad positionsbestämning, så TightlyCoupled (med propagate/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.rs levererar 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) och map_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 sampler Fn(lat, lon) -> value som helst, så den kan sättas ihop med det bilinjära rutnätet i src/ionex.rs eller en closure. Två tester förankrar den — sannolikheten har sin topp (=1) vid perfekt matchning och faller till e^(−½) 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.rs tillämpar ARAIM-motorn MHSS för jordsidan på en navigeringstjänst för månen i stil med LunaNet med månparametrarna (σ_URE ≈ 30 m mot GPS 0,6 m, P_sat ≈ 1e-4): månkonstanter, en selenocentrisk bas Öst/Nord/Upp och en hjälpfunktion för himmelsgeometri, samt lunar_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.rs lägger till Jd2, ett julianskt datum delat i ett heltal day och en bråkdel frac i [0,1) (konventionen i SOFA/hifitime), med new/from_parts/add_seconds/diff_seconds/total. Skillnader mellan närliggande epoker förblir exakta ned till golvet för f64 där ett JD med en enda f64 tappar ~50 µs nära J2000. Fyra tester förankrar den: tur och retur, normalisering av bråkdelen, exakt återfinnande av mikrosekunder (med felet hos enkel f64 demonstrerat bredvid) och additiv/reversibel aritmetik med sekunder.
  • Skrivare för CCSDS OMM (Orbit Mean-Elements Message). En ny src/omm.rs kompletterar efemeridskrivaren oem med meddelandet om medelelement: OmmFile::from_tle avbildar SGP4/TLE-medelelement till OMM-enheterna (medelrörelse i varv/dygn, vinklar i grader, plus BSTAR), och to_omm_kvn serialiserar 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.rs lä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), systematisk resample, degenereringsmonitorn effective_sample_size och 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 i ionex skulle fungera lika bra för en gravitations-/terrängkarta).
  • TEC-jonosfärskartor i IONEX-stil. En ny src/ionex.rs lägger till ett uppmätt jonosfärsalternativ till den utsända Klobuchar-modellen: en TecGrid (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 m vid L1 med 1/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.rs lä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 i timetransfer: sagnac_correction (Δt = (ω_E/c²)·(x₁y₂ − x₂y₁), den fördröjning som den roterande jorden ger — tiotals ns för kontinentala baslinjer) och common_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.rs lä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) och gravity_accel som summerar dem — använd den tillsammans med src/integrator.rs som f(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.rs lägger till en beroendefri Base64-kodek enligt RFC 4648 (standardalfabetet +/ med utfyllnad och ett URL-säkert alfabet -_ utan utfyllnad) samt omslagen encode_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-bindningarna encode_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.rs lägger till den skattningskärna som en banbestämning i batch (eller vilken parameteranpassning som helst) vilar på: gauss_newton linjäriserar en användarlevererad modell h(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är a·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.rs lägger till två oberoende spoofingdetektorer i mottagarens front-end, som komplement till den klockstödda tidsspoofingmonitorn i spoof: en AGC-effektmonitor (combine_power_dbm inkoherent effektsumma + AgcMonitor) som flaggar den överskottseffekt som en spoofingsändare ger utöver en konfigurerbar dB-marginal, och en signalkvalitetsmonitor (bpsk_autocorr triangulä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, aggregatet 10·log10(N), den triangulära R(τ)=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.rs lä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örstaordningssystem y' = f(t, y) som helst, och en adaptiv drivrutin (integrate) som styr det lokala felet genom stegdubbling (Richardson-extrapolation) med den vanliga stegstyrningen 0.9·(tol/err)^(1/5) och logik för att acceptera eller förkasta steg. Sex tester förankrar den mot exakta lösningar: exponentialfunktionen y' = y → e till < 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 en NumericalPropagator är kommande steg.
  • Unscented (sigma-punkts) Kalman-filter. En ny src/fusion/ukf.rs lägger till det skalade unscented Kalman-filtret (Julier & Uhlmann; Wan & van der Merwe) som en allmän skattare med n tillstå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-fri P⁺ = 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_raim utvidgar 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 apriori P_const (en ny DualFaultPriors { p_sat, p_const }). Varje hypotes lägger en term till samma MHSS-integritetssumma, så VPL/HPL är de minsta gränser vars totala P_HMI uppfyller budgeten över felfri + enskild SV + fel per konstellation (Bonferroni-fördelningen av falsklarm sker över alla N + C hypoteser). Med P_const = 0 är resultatet bit för bit araim_raim; en användare med en enda konstellation får None mot 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.rs implementerar 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-konstruktionen iauFw2m (precession_matrix, med hjälpfunktionerna gcrs_to_mod / mod_to_gcrs). Detta är den första delen för tröghetssystem ovanpå den befintliga GMST-baserade reduktionen frames. Å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 och det = +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.rs modellerar en atominterferometer av Mach–Zehnder-typ med tre pulser utifrån första principer i stället för ett datablad: effektiv vågvektor k_eff = 4π/λ, interferometerfas Φ = k_eff·a·T², kvantprojektionsbrus (skottbrus) σ_Φ = 1/(C·√N), accelerationskänslighet per skott, kontrastavklingning C(t) = C₀·e^(−t/τ) och — själva poängen — CaiAccelerometer::q_va(), som härleder den vita accelerations-PSD som den klassiska AccelModel redan 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 bandintegral vibration_phase_variance_band), den rang-1-projicerade beam_axis_projection längs strålen samt CaiAccelerometer::vibration_phase_noise / vibration_limited_accel (den senare reducerad till det k_eff-oberoende golvet √(S_a/(3T))). Elva tester verifierar fysiken för hand (Rb-87 k_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/√N och skalningslagarna för T³). Ärlig avgränsning i docs/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) eller QuantumCai när den har ett valfritt [cai]-block (CaiCfg: våglängd, pulsavstånd, atomantal, kontrast, cykeltid och en valfri plattforms-vibration_psd). En quantum_cai-sensors PSD för hastighetsslumpvandring q_va hä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ältet cai är skip_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 mellan Classical/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.rs får optimize_walker_design, en gradientfri nätoptimerare som söker i utformningsrymden {planes × sats × inclination} och returnerar den bästa Walker-utformningen under ett valt DesignObjective — MinSatellitesForCoverage, MaxCoverage eller MinWorstPdop — ö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 ε) − ε) och street_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, eller export_sp3 = true i scenariot skriver automatiskt <scenario>.sp3 (api::export_sp3 / auto_export_sp3, OrbitClockScenario::to_sp3_string, valfri epoch). Ett tur-och-retur-test (tests/sp3_export_roundtrip.rs) propagerar den verkliga ögonblicksbilden gps-ops frå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.rs CoupledPntFilter är ett enda staplat [pos, vel, phase, freq]-filter (uppdateringar i Joseph-form) vars pseudoavståndsmätning ρ = g·pos + c·phase + noise verkligen 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ör P[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 at R=1e-26 / Q≈1e-30). A new src/filter_health.rsruns a Monte-Carlo consistency assessment (Bar-Shalom §5.4): pooled **NIS** (normalised innovation², target 1) and **NEES** (normalised estimation error², target 2) against 95% χ² bands, surfaced as afilter_health { nis_mean, nis_chi2_lower_95, nis_chi2_upper_95, nees_mean, nees_chi2_lower_95, nees_chi2_upper_95, consistent } block in the clock result JSON and as a green/amber card in the playground. A Q/R-mismatch sweep test proves the monitor flips to inconsistent when the process noise is mistuned by ×0.1–×10. Adds a general χ² quantile (detection::chi2_inv_cdf`, Wilson–Hilferty, kontrollerad mot tabell).
  • 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, Celestrak gps-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 de provenance-strängar per körning som redan följer med i resultat-JSON.
  • Typat scenario-API. Dispatch sker nu på en typad enum ScenarioKind i 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ändrade run_toml som returnerar en sträng: run_scenario(src) -> Result<RunOutput, KshanaError> med en strukturerad felklassificering (InvalidInput / NonConvergence / Unsupported / IoError, var och en med en stabil kind_tag()); ett Scenario-trait och en ExternalPack-utvidgningspunkt (paketet jamming är kopplat genom den som arbetsexempel); samt introspektionen list_scenario_kinds() (namn, beskrivning, obligatoriska och valfria fält per slag). Python- och WebAssembly-bindningarna får list_kinds() och error_kind(). Dokumenterat i docs/ARCHITECTURE.md.
  • Verklig GPS-konstellation + täckning av driftområdet. scenarios/orbit-sgp4-gps.toml levererar nu en verklig ögonblicksbild gps-ops från Celestrak (2021-07-28, 30 satelliter) i stället för syntetiska Walker-TLE:er, med strict_checksum = true så att den bara läses in när varje TLE-kontrollsumma är giltig; scripts/fetch_tles.sh dokumenterar reproducerbar uppdatering och README anger öppna data som källa. Nya tests/scenario_coverage.rs prö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.md få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 + multipath och 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-array gnss_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). Nya src/gnss_sim.rs och scenarios/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 falsklarm target_pfa, och sannolikheten för missad detektering P_md redovisad både på sluten form och med Monte Carlo (mc_runs försök per hypotes — de två stämmer överens inom några ×1/√N). Kvalitetsmåttet Säkerhet är nu 1 − P_md vid den operativt skadliga (specificerade) storleken. Nya src/detection.rs (gaussiska svansfunktioner, NP-/energitest, Monte Carlo P_fa/P_md) och scenarios/spoof-meaconing.toml. Bakåtkompatibelt: ett ensamt [attack] rate_ns_per_s godtas fortfarande som en linjär ramp.

Ändrat#

  • Definition av kvalitetsmåttet Säkerhet (slaget spoof): från den analytiska detekterbarhetsgränsen 1 − min_detectable/threshold till den stokastiska detektorns 1 − P_md. Klockpaketets fält security ä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 separationsfaktorn Q; Kaplan & Hegarty §9,4) och en konfigurerbar spårningströskel, poängsatt över en Walker-konstellation som kvalitetsmåttet availability_under_jamming. Nya src/jamming.rs och scenarios/jamming-demo.toml. Den ärliga avgränsningen (ingen flervägsutbredning, terrängskuggning, AGC eller adaptiv nollning) dokumenteras i docs/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-nd varierar 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 exempel scenarios/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 befintliga gnss-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 = 1 reduceras exakt till den enkla nd_sweep med 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 i navego_example_allan.m på 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 .mat på 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 omslaget ClosedLoopInsGnss::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-funktionen tight_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 exempel scenarios/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 modul walker ger 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_sweep tabellerar täckning och median/sämsta PDOP över ett utformningsnät {planes × sats × inclination}, och coverage_revisit redovisar 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-ögonblicksbild gps-ops frå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_adev implementerar 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 enum PowerLawNoise och classify_power_law identifierar 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), och overlapping_adev_curve kopplar nu den identifierade brustypen, dess edf och ett konfidensband på 95% till varje punkt i den exporterade ADEV-kurvan (AdevPoint får noise/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::TwoWayLink ersä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 till 1/sqrt(2)), och residualen är den icke-reciproka differentialfördröjningen — modellerad som en färgad process av vitt FM + slumpvandrings-FM (den validerade ClockModel), vilket ger synkroniseringsfelserien en realistisk Allan-signatur (sigma_y^2(tau) = q_rw*tau/3) i stället för plant vitt brus. LinkCfg får q_wf_s/q_rw_s (serde-standardvärde 0 ⇒ det äldre beteendet med enbart vitt brus, bit för bit), länkens kvalitetsmått redovisar adev_tau0 (modellens Allan-deviation vid grundsteget), och scenariot timetransfer samt 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-lagen tau/3 via länkens egen step(), ekvivalens med det äldre beteendet vid q=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.rs validerar 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 scenarioslaget integrity exporterar 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. IntegrityScenario får ett fält seed (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_raim härleder de horisontella och vertikala skyddsnivåerna ur en uttrycklig integritetsriskbudget i stället för en fast K_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öser araim_protection_level ut 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 tilldelade P_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_compensate viker 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 en NavState::step_increments med 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 typalias ScalarErrorBudget ger den äldre modellen AccelModel med 1-DOF sitt rätta namn, skilt från den treaxliga navigatorn NavState.
  • Tolkare för RINEX-observationsfiler. Den nya modulen rinex_obs lä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_obs avkodar huvudet (version/typ, listorna SYS / # / OBS TYPES per 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 oem exporterar 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_propagators samplar 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, och OemFile::to_oem_string serialiserar huvudet CCSDS_OEM_VERS/CREATION_DATE/ ORIGINATOR plus ett META_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 dess epoch X Y Z X_DOT Y_DOT Z_DOT-rader (km, km/s). CREATION_DATE anges 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::interpolator bygger en Sp3Interpolator per 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 som Propagator::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_nav läser RINEX 3-posterna R, 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 som Propagator::Glonass, så att GLONASS-satelliter går genom kedjan för konstellation, sikt och integritet vid sidan av Kepler-systemen; ett enda konstellationsblock rinex kan 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 som Propagator::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 sp3 tolkar 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 strukturerad Sp3File (huvud, epoknät, position per satellit km→m, klocka µs och hastighet dm/s→m/s för V-produkter), med SP3:s sentineller för felaktiga värden bevarade. Den omvända riktningen täcks också: Sp3File::from_propagators bygger en SP3 av en propagerad konstellation (TEME→ECEF per epok) och to_sp3_string serialiserar 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 alternativet tle, 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. Nytt scenarios/orbit-rinex.toml visar 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 RinexEphemeris konverteras nu till en orbit::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_nav lä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 en RinexEphemeris med Kepler-element och klockkorrektioner, med fältnamn och enheter enligt IS-GPS-200. Hanterar Fortran-flyttalsformatet med D-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 av D-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 veckoskifte tk). 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 klockpolynomet af0 + af1·Δt + af2·Δt² kring Toc plus den relativistiska excentricitetstermen F·e·√A·sin Ek (IS-GPS-200 §20.3.3.3.3.1). En ny EpochUtc::gps_time_of_week omvandlar 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. Grupplatensen TGD för L1 exponeras men räknas medvetet inte in. Ärlig avgränsning: en Propagator-källa, Galileo/BeiDou/GLONASS och SP3 återstår som nästa steg. (docs/CAPABILITY.md uppdaterad 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 ett IntegrityScenario (användarbana, en eller flera GNSS-konstellationer, elevationsmask och integritetskonfigurationen (sigma, P_fa, P_md, AL_H, AL_V)), kör constellation_raim_availability och 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.toml skriver 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_availability gö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-Propagator som motorn använder), beräknar skyddsnivåerna utan fel och bedömer tillgängligheten mot de horisontella/vertikala larmgränserna, och returnerar en serde-serialiserbar RaimAvailabilityReport (per epok n_visible/HPL/VPL/available plus tillgänglighetsandelen). En RaimConfig samlar (sigma, P_fa, P_md, AL_H, AL_V), och raim_availability_epoch per 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, och None-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 diagonalen y = x och larmgränsen, som Available (PL begränsar felet, inom AL), SystemUnavailable (PL begränsar felet men överskrider AL — säkert, oanvändbart), MisleadingInformation (PL < fel ≤ AL) eller HazardouslyMisleadingInformation (PL < fel och fel > AL — det osäkra felet). classify_stanford är den rena klassificeraren; StanfordDiagram ackumulerar (error, PL)-punkter mot en fast larmgräns och exponerar antal per område, tillgänglighet, summor av integritetshändelser och serde-serialiserbara punkter för ritning/JSON-export. Fyra tester: varje område (inklusive gränsfallet error == PL fö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 χ²-monitorn snapshot_raim fö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 kovarians Cov(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-tilldelningen PL = max(K_md·σ₀, max_k[K_fa·σ_ss,k + K_md·σ_k]), med K_fa = Φ⁻¹(1−P_fa/2), K_md = Φ⁻¹(1−P_md). Nya beroendefria normal_cdf/normal_quantile byggda 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). ClosedLoopInsGnss kopplar 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 (nya mechanization::radii_of_curvature; NavState::omega_ie_n/omega_en_n exponeras). 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·dt och 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-funktion tight_coupling spä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ärkningen P/(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). ImuErrorModel fö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å att ImuErrorModel::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 scenariopaketet inertial kö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år sculling_increment (½ Δθ × Δv, Groves ekv. 5,82) och löser kroppens hastighetsinkrement genom en ny inkrementbaserad uppdatering NavState::step_increments med 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 med step(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 integrerar v̇ = 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 ger v_N ≈ a·t och 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 enhetskvaternion Quaternion (skalär först, Hamilton-konvention) som bär rotationen från kropp till nav, med en DCM-vy (to_dcm/from_dcm via 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åttet coning_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 modulkatalogen src/inertial/; den publika sökvägen crate::inertial är oförändrad.)
  • Geodetiskt korrekt sikt från markstation (src/frames.rs). elevation, is_visible och visible_count berä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-bindings bygger nu hjulet med PyO3/maturin-action (manylinux-container) i stället för ett rått maturin build på värden, vilket tar bort en intermittent rustup-konflikt mellan rustfmt-preview/cargo-fmt på runner-avbilden. Jobbet deny installerar cargo-deny som en förbyggd binär via taiki-e/install-action i stället för den Docker-baserade cargo-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_eci och Propagator::state_eci (som returnerar StateEci { 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_eci ger 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_opts och den nya flaggan strict_checksum på 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::validate avvisar ett icke-ändligt, nollställt, negativt eller för stort tidsnät (ett steg som är större än varaktigheten, eller fler än MAX_TIME_STEPS sampel) 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 = N i 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 flagga monte_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_sweep utvärderar ett mätvärde över hela den kartesiska produkten av flera SweepAxis-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 enkel f64 (~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 om libm mellan plattformar och tillvägagångssättet med golden-fastlåsning dokumenteras i docs/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::validate få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 libm mellan plattformar), och ersätter de tidigare kontrollerna som bara bestod av olikheter, så att en tyst numerisk regression upptäcks omedelbart.
  • schema_version i resultatartefakter har höjts från 0.1 till 0.7 (den var fryst medan motorn gick vidare).
  • cargo-deny nekar 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ån Cargo.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 spoof injicerar 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 referensscenario spoof-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 referensscenario orbit-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 fusion kö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 referensscenario fusion-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_instability och q_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 referensscenario orbit-real-tle.toml.

0.4.0 - 2026-06-02#

Tillagt#

  • Parametersvepningar för avvägningsstudier. Ett nytt scenarioslag sweep varierar en parameter (threshold_ns, duration_s, quantum_q_wf eller classical_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 referensscenario sweep-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 referensscenario clock-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_deg och j2, samt ett referensscenario orbit-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ält sigma_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öde pages bygger och publicerar den på GitHub Pages, och en ny WebAssembly-export summary ligger 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_bias och q_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 orbit och referensscenariot orbit-gnss-challenged.toml (en rymdfarkost inuti GNSS-skalet med intermittent täckning).
  • Valfritt Python-tillägg (PyO3, abi3) som exponerar run, run_full och version, paketerat med maturin (pyproject.toml) och byggt för Linux, macOS och Windows av ett arbetsflöde wheels vid 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_svg och version, byggd med wasm-pack under funktionen wasm; getrandom är målspärrad för att använda webbläsarens entropikälla på wasm32.
  • Gemensam dispatch av api::run_toml som 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 nu inertial (var accelerometer), 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 efter kind.
  • 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 referensgranskad provenance.
  • 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 NOTICE med varumärkesmeddelande, godkännande enligt Developer Certificate of Origin (DCO) för bidrag och cargo-deny som 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.cff så att programvaran kan citeras.