Resultatskjema — slik leser du en Kshana *.result.json
Hver kjøring skriver en versjonert, selvbeskrivende JSON-artefakt (JavaScript Object Notation) ved siden av scenarioet. Denne siden er den håndskrevne leserveiledningen til utvekslingskonvolutten og til resultatformene for klokke og bane: hvert felts enhet, hvor det beregnes i kildekoden og hvordan det leses. Den kanoniske typen er RunResult i src/report.rs; kvalitetsmålene er FoMScores i src/fom.rs.
Den er ikke den fullstendige feltreferansen. Motoren fordeler over langt flere kind-er enn disse to, og hver gir ut sin egen pakke. Den fullstendige referansen — enhet, proveniensklasse og definisjon for hvert numeriske felt i hver innebygde kind — er generert, ikke håndskrevet: se Enheter og proveniens, per felt, for hver kind nedenfor.
Utvekslingskonvolutt (KIF, Kshana Interchange Format) — gjenkjenne og versjonskontrollere en artefakt#
Kshana-artefakter kan pakkes inn i en nøytral, selvbeskrivende utvekslingskonvolutt slik at et tredjepartsverktøy kan gjenkjenne filen og avgjøre om det kan lese den før det forplikter seg til et nyttelastskjema. Den kanoniske typen er Envelope i src/interchange.rs.
| Nøkkel | Type | Betydning |
|---|---|---|
format |
streng | Alltid "kshana-interchange" (FORMAT_TAG) — slik gjenkjenner et fremmed verktøy en Kshana-artefakt. |
schema_version |
streng | Skjemaversjonen MAJOR.MINOR (SCHEMA_VERSION, den eneste kilden til sannhet for hele craten). |
kind |
streng | Artefakttype, for eksempel "scenario", "run-result", "trade-study" — lar en forbruker rute uten å tolke innholdet. |
engine_version |
streng | Crate-versjonen (Cargo.toml) som laget nyttelasten. |
payload |
objekt | Den innpakkede artefakten som kanonisk JSON (en Scenario, en RunResult, …). |
Kompatibilitetskontrakt. Versjoner er MAJOR.MINOR. Nye felt legges til med #[serde(default)] (den additive disiplinen), slik at en leser kan tolke enhver artefakt med samme hovedversjon og lik eller eldre underversjon (Compatible). En strengt nyere underversjon (ForwardIncompatible) kan ha felt denne leseren ikke kan ta hensyn til, og en annen hovedversjon (MajorIncompatible) er et strukturelt brudd — begge avvises av Envelope::parse, som kontrollerer formattaggen og versjonen ved grensen i stedet for å feiltolke fremmed inndata i det stille.
Determinisme. Konvolutten har ingen tidsstempel — det kreves av Kshanas reproduserbarhetsløfte (scenario + seed + engine_version reproduserer en kjøring). Proveniens ligger i engine_version og i nyttelastens egen scenario_hash.
En typet tilbakelesing (Envelope::payload_as::<T>()) fungerer for enhver nyttelast som implementerer Deserialize (for eksempel Scenario). Resultatartefakter kan bare serialiseres, etter utforming, og leses som den rå JSON-verdien payload.
Toppnivå (pakkene for klokke og bane)#
| Nøkkel | Type / enhet | Betydning | Kilde |
|---|---|---|---|
schema_version |
streng | Resultatskjemaets versjon (uavhengig av motorversjonen). | report.rs |
engine_version |
streng | Crate-versjonen (Cargo.toml) som laget filen. |
report.rs |
scenario_hash |
heksadesimal streng | SHA-256 (SHA: Secure Hash Algorithm) over den kanoniske scenario-JSON-en — kjøringen kan reproduseres fra scenario + seed + engine_version. |
report.rs:hash_scenario |
seed |
u64 | Seed for RNG (tilfeldighetsgenerator) for kvantekjøringen (den klassiske bruker seed + 0x9e3779b97f4a7c15). |
run.rs |
threshold_ns |
nanosekunder | Tidsspesifikasjonen: en feil innenfor ±threshold_ns er «innenfor spesifikasjonen». |
scenario |
quantum |
objekt (ClockRun) |
Kvantesensorens kjøring (se nedenfor). | report.rs |
classical |
objekt (ClockRun) |
Den klassiske sensorens kjøring, til sammenligning. | report.rs |
units |
objekt | Kart over enhet og proveniens per felt for dette dokumentet, med feltsti som nøkkel. Se §Enheter og proveniens nedenfor. | field_schema.rs:units_block |
evidence |
objekt | (0,40) Bevismerkelappen for kjøringen: tier (VALIDATED, MODELLED eller PARTNER: den svakeste statusen blant radene, så den aldri hevder mer enn sin svakeste rad), matrix (docs/VERIFICATION-MATRIX.md), id_rule og rows, én per verifikasjonsmatriserad kjøringen brukte (radene den avanserte rapporten lister, fra advanced_report::KIND_CAPABILITIES): id (VM- og de første 8 heksadesimale sifrene av SHA-256 for radens kravtekst), requirement og status, alt lest fra matrisen, ingenting skrevet for hånd. Legges til av api::run_toml i resultatet for hver type, før den avsluttende figure_tiers-blokken når det finnes en (den blokken forblir siste nøkkel); evidence_label::strip_json fjerner den byte for byte. Diagram-SVG-en og CSV-tabellen fra samme kjøring bærer den samme merkelappen (<metadata id="kshana-evidence"> og en synlig linje under diagrammet; # evidence:-kommentarlinjer foran CSV-en). Kampanjemedlemmer innebygd i resultatet til en annen type bærer ingen: det ytre dokumentet gjør det. Inneholder ingen tall. |
evidence_label.rs |
figure_tiers |
objekt | Verifikasjonsnivået til hvert oppgitte kvalitetsmål, og alltid dokumentets siste nøkkel. figures lister én oppføring per mål som er til stede: path (for eksempel quantum.fom.timing_p95_ns), tier (VALIDATED = kontrollert mot en uavhengig ekstern referanse, MODELLED = fra første prinsipper, internt testet), requirement (raden i verifikasjonsmatrisen nivået leses fra) og applicable. applicable er false, med en reason, for security i hvert scenario uten angrep konfigurert: grensen blir stående i fom.security, men den svarer ikke på et spørsmål scenarioet stiller. untiered lister ethvert mål som ingen matriserad eier (posisjonsmålene for hybrid og fusion), i stedet for å gi det et nivå. Gis ut av kind-ene clock (enkeltkjøring og Monte Carlo-ensemble), orbit, hybrid og fusion, som bygger det inne i kjøringen, og (0,36, RM-04) av alle andre kind-er for hovedmålene sine, lagt til etter kjøringen fra tabellen per kind fom_label::kind_figures; api::without_figure_tiers fjerner det igjen til det ikke-nivåinndelte dokumentet byte for byte. Gis ikke ut av lunar-station-coverage, hvis resultat er en frosset forhåndsregistrert prediksjon (docs/predictions/lunar-reference-station.md): den kind-en har ingen figure_tiers før en ny datert prediksjon erstatter den. Gis heller ikke ut av leo-ppp, solar-system, optical-atmosphere (0,37; matriser per sted), sweep og sweep-nd, som ikke har noe skalart hovedmål, eller av lunar-attack-surface, hvis dokument er kompakt JSON (fom_label::KINDS_EXCLUDED_FROM_FIGURE_TIERS gir hver begrunnelse), eller av de innebygde medlemsdokumentene i en kampanje. Inneholder ingen tall. |
fom_label.rs:figure_tiers, fom_label.rs:kind_figure_tiers |
geometry |
objekt, valgfritt | Geometrisammendrag for banepakken: samples_total, samples_with_fix, sigma_uere_m (m, det modellerte avstandsfeilbudsjettet per satellitt), best_pdop / median_pdop (dimensjonsløse) og best_position_sigma_m / median_position_sigma_m (m, PDOP (presisjonsfortynning i posisjon) × sigma_uere_m). Bare banepakken. |
orbit.rs |
eci_track |
matrise med [x, y, z] km, valgfri |
Propagert jordsentrert-inertielt spor for brukerens romfartøy, én oppføring per samplet tidspunkt. Bare banepakken; utelatt ellers. Bare utdata — ikke hashet. | report.rs |
meta |
objekt (StudyMeta), valgfritt |
Additive rapportmetadata (studietittel, genereringsstempel, forfatter, ansvarsfraskrivelse). Utelatt når de mangler, slik at en kjøring uten metadata er byte-identisk med eldre utdata. Bare utdata — ikke hashet. | report.rs |
ClockRun (hver av quantum / classical)#
| Nøkkel | Type / enhet | Betydning |
|---|---|---|
spec.id |
streng | Sensoridentifikator (for eksempel optical-sr-lattice). |
spec.kind |
streng | Modelltype (for eksempel clock). |
spec.provenance |
streng | Sitat/kilde for sensorens parametere. |
spec.params |
objekt | De rå modellparametrene som ble brukt. |
series |
matrise med {t, error_ns, gnss} |
Tidsserie per steg: t sekunder, error_ns tidsfeilen i nanosekunder, gnss én av nominal/degraded/denied. |
fom |
objekt (FoMScores) |
De vurderte kvalitetsmålene (nedenfor). |
adev_curve |
matrise med {tau_s, adev, n_samples, noise, edf, ci_lo, ci_hi} |
Overlappende Allan-avvik: tau_s midlingstiden (s), adev den dimensjonsløse stabiliteten i brøkfrekvens σ_y(τ), n_samples antall overlapp bak det punktet, noise potenslovtypen identifisert fra MDEV-stigningen (modifisert Allan-avvik) (for eksempel WhiteFm), edf de støytypespesifikke effektive frihetsgradene og ci_lo/ci_hi det χ²-baserte 95%-konfidensbåndet på adev ved den τ. Beregnet i allan.rs:overlapping_adev_curve. |
filter_health |
objekt, valgfritt | Vurdering av Kalman-filterets konsistens (NIS/NEES (NIS: normalisert innovasjonskvadrat; NEES: normalisert estimeringsfeilkvadrat) mot χ²-båndene sine), beregnet i filter_health.rs; utelatt for kjøringer som ikke vurderer det. |
FoMScores (objektet fom)#
| Felt | Enhet | Betydning | Kilde | Forbehold |
|---|---|---|---|---|
timing_rms_ns |
ns | RMS (kvadratisk middelverdi) for klokkefasefeil (tidssynkronisering) over bortfallet. | fom.rs:score |
et tidssynkroniseringsmål, ikke posisjon |
timing_p95_ns |
ns | 95-persentilen av tidsfeilen over bortfallet. | fom.rs:score |
|
holdover_s |
s | Verste (korteste) coasting innenfor spesifikasjonen over bortfallssegmentene. | fom.rs:worst_case_holdover |
rutenettbegrenset — en nedre grense ved tidstrinnets oppløsning |
resilience_slope_ns_per_s |
ns/s | Vekstrate for |feil| under bortfallet etter minste kvadraters metode. | fom.rs:score |
|
availability |
brøk [0 1] | Andelen av hele kjøringen med en løsning innenfor spesifikasjonen. | fom.rs:score |
|
integrity |
brøk [0 1] eller null | Filterets selvkonsistens: andelen av bortfallssamplene der den sanne feilen holder seg innenfor Kalman-grensen k-σ. | run.rs |
IKKE integritet etter HPL/VPL/RAIM (HPL: horisontalt beskyttelsesnivå; VPL: vertikalt beskyttelsesnivå; RAIM: mottakerens autonome integritetsovervåking) — se INTEGRITY.md |
security |
brøk [0 1] eller null | Analytisk grense for påviselighet av spoofing fra klokkestabilitet. | run.rs + security.rs |
bare meningsfullt med et konfigurert angrep, så pakkene for klokke og bane (som ikke konfigurerer noe) merker det applicable: false i figure_tiers og skriver det som n/a (no attack) i sammendraget; ikke en RAIM-detektor for flere satellitter |
Hvordan «bra» ser ut#
- En roligere klokke (lavere
adev_curve) gir en lengreholdover_sog en høyere grense for påviselighet forsecurity— det er kontrasten mellom kvante og klassisk. availabilitynær 1,0 betyr at systemet holdt seg innenfor spesifikasjonen nesten hele kjøringen; under et langt bortfall synker den for den mer støyende klokken.integritynær 1,0 betyr at filterets egen usikkerhetsgrense var ærlig om feilen sin — en utsagn om selvkonsistens, ikke en garanti for liv og sikkerhet.
Andre scenario-kind-er#
Hver av de andre kind-ene gir ut sin egen resultatform. Noen av de vanligste:
- inertial: kvalitetsmål i posisjonsdomenet i meter (
pos_rms_m,pos_p95_m) — enkeltakset, enkelt seed (1-DOF (DOF: frihetsgrad)) (seCAPABILITY.md). - hybrid / fusion:
timing_spec_nsogposition_spec_mpå toppnivå, og per side tids- og posisjonsmålene for én sensorsuite (position_p95_m,position_holdover_sogpnt_holdover_s, tiden til en av spesifikasjonene brytes), med en blokkfigure_tierssom i klokkepakken, der posisjonsmålene er oppført somuntiered. - spoof: spoofingavvik per steg mot klokkens deteksjonsgrense, pluss om spoofingen nådde spesifikasjonen før deteksjon (
src/spoof.rs). - skyline (
orbitogintegritymeduser_site,gnss-sim,jamming,leo-pvt,leo-pass; bare til stede når scenarioet har en seksjon[skyline], så et scenario uten den er uendret): et toppnivåobjektskylinemedsource(streng:preset:<name>,preset:<name>+overridesellercustom),open_fraction(brøk [0 1] av den øvre halvkulens romvinkel overmax(mask_deg, skyline)) ogprovenance(streng); per samplemasked_by_skyline(antall satellitter over masken men bak horisontlinjen:epochs[]forintegrityogjamming,gnss_measurements[]forgnss-sim,joint.epochs[]forleo-pvt); og forleo-passsatellites[].pass.epochs_masked_by_skyline(antall epoker). Enhetene og proveniensklassene deres står i blokkenunits(src/skyline.rsUNITS;SKYLINE.md).
For det nøyaktige feltsettet til en hvilken som helst kind, les oppføringen i field-units-schema.json (nedenfor), kind-ens avsnitt i SCENARIOS.md, eller den tilsvarende structen *Result i src/.
Andre filer en kjøring skriver#
Ved siden av <scenario>.result.json skriver CLI (kommandolinjegrensesnittet) <scenario>.chart.svg, en utskriftsvennlig <scenario>.report.html og den samme rapporten som <scenario>.report.json, hvis blokk reproducibility registrerer motorversjonen, SHA-256 for scenariofilen, seed, plattformen og den nøyaktige kommandoen (se REPORTS.md og REPRODUCIBILITY.md). Kind-er som publiserer en reproduserbarhetstabell skriver også <scenario>.table.csv (CSV: kommaseparerte verdier). --export skriver utvekslingsfiler (se INTEROP.md) og --animate en animasjon (se ANIMATION.md).
Enheter og proveniens, per felt, for hver kind#
Denne siden er håndskrevet og dekker pakkene for klokke og bane. Den maskinlesbare motparten dekker hver innebygde kind:
- I selve resultatet. Hvert scenarios resultatdokument har et toppnivåobjekt
unitssom kobler et utgitt felts sti til{"unit", "provenance", "note"}. Stigrammatikken (en matrise bidrar med ett segment med suffikset[]som deles av radene;*er et jokertegn for ett segment for datanøklede objekter) og det lukkede proveniensvokabularet er definert isrc/field_schema.rs. - Som én fil.
field-units-schema.jsoner den innhøstede unionen: for hver kind, hvert numeriske felt den gir ut ved en oppgitt kilde, med enhet, proveniensklasse, evidensnivå og definisjon — og, navngitt i stedet for utelatt, hvert felt som ennå ikke har det. Blokkencoveragebærer antallene.
Begge håndheves av tests/field_units_global.rs, som kjører hver registrerte kind og feiler hvis et utgitt numerisk felt mangler enhet og proveniensklasse. Kind-er som ennå ikke er dekket nevnes enkeltvis i UNCOVERED_KINDS i den filen med begrunnelsen for hver åpne, og antallet er festet slik at listen bare kan bli kortere.
Generer JSON-en på nytt etter enhver endring av en rapports form eller av en blokk units:
cargo test --test field_units_global zzz_emit_field_units_schema -- --ignored