Resultatschema — att läsa en Kshana-*.result.json
Varje körning skriver en versionshanterad, självbeskrivande JSON-artefakt (JavaScript Object Notation) bredvid scenariot. Den här sidan är den handskrivna läsarguiden till utbyteskuvertet och till resultatformerna för klocka och bana: varje fälts enhet, var det beräknas i källkoden och hur det ska läsas. Den kanoniska typen är RunResult i src/report.rs; kvalitetsmåtten är FoMScores i src/fom.rs.
Den är inte den fullständiga fältreferensen. Motorn skickar vidare över många fler typer än dessa två, och var och en ger sitt eget paket. Den fullständiga referensen — enhet, proveniensklass och definition för varje numeriskt fält i varje inbyggd typ — är genererad, inte handskriven: se Enheter och proveniens, per fält, för varje typ nedan.
Utbyteskuvert (KIF, Kshana Interchange Format) — att känna igen och versionskontrollera en artefakt#
Kshana-artefakter kan paketeras i ett neutralt, självbeskrivande utbyteskuvert så att ett tredjepartsverktyg kan känna igen filen och avgöra om det kan läsa den innan det binder sig vid ett nyttolastschema. Den kanoniska typen är Envelope i src/interchange.rs.
| Nyckel | Typ | Betydelse |
|---|---|---|
format |
sträng | Alltid "kshana-interchange" (FORMAT_TAG) — så känner ett främmande verktyg igen en Kshana-artefakt. |
schema_version |
sträng | Schemaversionen MAJOR.MINOR (SCHEMA_VERSION, den enda sanningskällan för hela cratet). |
kind |
sträng | Artefakttyp, t.ex. "scenario", "run-result", "trade-study" — låter en konsument styra utan att tolka innehållet. |
engine_version |
sträng | Crate-version (Cargo.toml) som producerade nyttolasten. |
payload |
objekt | Den paketerade artefakten som kanonisk JSON (en Scenario, en RunResult, …). |
Kompatibilitetsavtal. Versioner är MAJOR.MINOR. Nya fält läggs till med #[serde(default)] (den additiva disciplinen), så en läsare kan tolka varje artefakt med samma huvudversion och en lika gammal eller äldre delversion (Compatible). En strikt nyare delversion (ForwardIncompatible) kan bära fält som den här läsaren inte kan hantera, och en annan huvudversion (MajorIncompatible) är ett strukturellt brott — båda avvisas av Envelope::parse, som validerar formattaggen och versionen vid gränsen istället för att i tysthet feltolka främmande indata.
Determinism. Kuvertet bär ingen tidsstämpel — Kshanas reproducerbarhetslöfte (scenario + seed + engine_version reproducerar en körning) kräver det. Proveniensen finns i engine_version och nyttolastens egen scenario_hash.
En typad återläsning (Envelope::payload_as::<T>()) fungerar för varje nyttolast som implementerar Deserialize (t.ex. Scenario). Resultatartefakter är avsiktligt enbart serialiserbara och läses som det råa JSON-värdet payload.
Översta nivån (paketen för klocka och bana)#
| Nyckel | Typ / enhet | Betydelse | Källa |
|---|---|---|---|
schema_version |
sträng | Resultatschemats version (oberoende av motorversionen). | report.rs |
engine_version |
sträng | Crate-version (Cargo.toml) som producerade filen. |
report.rs |
scenario_hash |
hexsträng | SHA-256 (SHA: Secure Hash Algorithm) över det kanoniska scenariots JSON — körningen är reproducerbar utifrån scenario + seed + engine_version. |
report.rs:hash_scenario |
seed |
u64 | Frö för RNG (slumptalsgenerator) för kvantkörningen (den klassiska använder seed + 0x9e3779b97f4a7c15). |
run.rs |
threshold_ns |
nanosekunder | Tidssynkroniseringens specifikation: ett fel inom ±threshold_ns är "in spec". |
scenario |
quantum |
objekt (ClockRun) |
Kvantsensorns körning (se nedan). | report.rs |
classical |
objekt (ClockRun) |
Den klassiska sensorns körning, för jämförelse. | report.rs |
units |
objekt | Karta över enhet/proveniens per fält för det här dokumentet, nycklad på fältsökväg. Se §Enheter och proveniens nedan. | field_schema.rs:units_block |
evidence |
objekt | (0,40) Körningens evidensetikett: tier (VALIDATED, MODELLED eller PARTNER: den svagaste statusen bland raderna, så den hävdar aldrig mer än sin svagaste rad), matrix (docs/VERIFICATION-MATRIX.md), id_rule och rows, en per rad i verifieringsmatrisen som körningen använde (de rader som dess avancerade rapport listar, från advanced_report::KIND_CAPABILITIES): id (VM- och de första 8 hexsiffrorna i SHA-256 för radens kravtext), requirement och status, alla lästa från matrisen, inga inskrivna. Läggs till av api::run_toml i varje typs resultat, före det avslutande blocket figure_tiers när det finns ett (det blocket förblir den sista nyckeln); evidence_label::strip_json tar bort den byte för byte. Diagrammets SVG och CSV-tabellen från samma körning bär samma etikett (<metadata id="kshana-evidence"> och en synlig rad under diagrammet; kommentarsraderna # evidence: först i CSV). Kampanjmedlemmar som är inbäddade i en annan typs resultat bär ingen: det yttre dokumentet gör det. Bär inga tal. |
evidence_label.rs |
figure_tiers |
objekt | Verifieringsnivån för varje rapporterat kvalitetsmått, och alltid dokumentets sista nyckel. figures listar en post per närvarande värde: path (t.ex. quantum.fom.timing_p95_ns), tier (VALIDATED = kontrollerad mot en oberoende extern referens, MODELLED = utifrån grundprinciper, internt testad), requirement (den rad i verifieringsmatrisen som nivån läses från) och applicable. applicable är false, med ett reason, för security i varje scenario utan konfigurerad attack: gränsen finns kvar i fom.security, men den besvarar ingen fråga som scenariot ställer. untiered listar varje värde som ingen matrisrad äger (positionsvärdena för hybrid och fusion), istället för att ge det en nivå. Ges av typerna clock (enskild körning och Monte Carlo-ensemble), orbit, hybrid och fusion, som bygger det inuti sin körning, och (0,36, RM-04) av varje annan typ för sina huvudvärden, tillagt efter körningen från tabellen per typ fom_label::kind_figures; api::without_figure_tiers tar bort det igen till det onivåindelade dokumentet byte för byte. Ges inte av lunar-station-coverage, vars resultat är en frusen, förhandsregistrerad prediktion (docs/predictions/lunar-reference-station.md): den typen har inget figure_tiers förrän en ny daterad prediktion ersätter den. Ges inte heller av leo-ppp, solar-system, optical-atmosphere (0,37; arrayer per plats), sweep och sweep-nd, som saknar ett skalärt huvudvärde, eller av lunar-attack-surface, vars dokument är kompakt JSON (fom_label::KINDS_EXCLUDED_FROM_FIGURE_TIERS anger skälet för var och en), eller av en kampanjs inbäddade medlemsdokument. Bär inga tal. |
fom_label.rs:figure_tiers, fom_label.rs:kind_figure_tiers |
geometry |
objekt, valfritt | Geometrisammanfattning för banepaketet: samples_total, samples_with_fix, sigma_uere_m (m, det modellerade felbudgeten för avstånd per satellit), best_pdop / median_pdop (dimensionslösa) och best_position_sigma_m / median_position_sigma_m (m, PDOP (position dilution of precision) × sigma_uere_m). Endast banepaketet. |
orbit.rs |
eci_track |
array av [x, y, z] km, valfri |
Propagerat jordcentrerat tröghetsspår för användarens rymdfarkost, en post per samplad tidpunkt. Endast banepaketet; utelämnas annars. Endast utdata — hashas inte. | report.rs |
meta |
objekt (StudyMeta), valfritt |
Additiv rapportmetadata (studietitel, genereringsstämpel, författare, friskrivning). Utelämnas när den saknas, så en körning utan meta är byte för byte identisk med äldre utdata. Endast utdata — hashas inte. | report.rs |
ClockRun (var och en av quantum / classical)#
| Nyckel | Typ / enhet | Betydelse |
|---|---|---|
spec.id |
sträng | Sensoridentifierare (t.ex. optical-sr-lattice). |
spec.kind |
sträng | Modelltyp (t.ex. clock). |
spec.provenance |
sträng | Citat/källa för sensorns parametrar. |
spec.params |
objekt | De råa modellparametrar som användes. |
series |
array av {t, error_ns, gnss} |
Tidsserie per steg: t sekunder, error_ns tidsfelet i nanosekunder, gnss ett av nominal/degraded/denied. |
fom |
objekt (FoMScores) |
De bedömda kvalitetsmåtten (nedan). |
adev_curve |
array av {tau_s, adev, n_samples, noise, edf, ci_lo, ci_hi} |
Överlappande Allan-deviation: tau_s medelvärdestiden (s), adev den dimensionslösa fraktionella frekvensstabiliteten σ_y(τ), n_samples överlappsantalet bakom den punkten, noise den potenslagstyp som identifierats utifrån lutningen för MDEV (modifierad Allan-deviation) (t.ex. WhiteFm), edf de brustypsspecifika effektiva frihetsgraderna, och ci_lo/ci_hi det χ²-baserade 95-procentiga konfidensbandet på adev vid det τ. Beräknas i allan.rs:overlapping_adev_curve. |
filter_health |
objekt, valfritt | Bedömning av Kalmanfiltrets konsistens (NIS/NEES (NIS: normaliserat innovationskvadrat; NEES: normaliserat skattningsfelskvadrat) mot deras χ²-band), beräknad i filter_health.rs; utelämnas för körningar som inte bedömer den. |
FoMScores (objektet fom)#
| Fält | Enhet | Betydelse | Källa | Förbehåll |
|---|---|---|---|---|
timing_rms_ns |
ns | RMS (kvadratmedelvärde) för klockfasfel (tidssynkronisering) under avbrottet. | fom.rs:score |
ett mått på tidssynkronisering, inte position |
timing_p95_ns |
ns | 95:e percentilen av tidsfelet under avbrottet. | fom.rs:score |
|
holdover_s |
s | Sämsta (kortaste) glidning inom specifikation över avbrottssegmenten. | fom.rs:worst_case_holdover |
rutnätsbundet — en nedre gräns vid tidstegsupplösningen |
resilience_slope_ns_per_s |
ns/s | Tillväxttakt för |fel| under avbrottet enligt minsta kvadrat. | fom.rs:score |
|
availability |
andel [0 1] | Andel av hela körningen med en lösning inom specifikation. | fom.rs:score |
|
integrity |
andel [0 1] eller null | Filtrets självkonsistens: andel av avbrottets samplingar vars verkliga fel håller sig inom Kalmanfiltrets k-σ-gräns. | run.rs |
INTE integritet enligt HPL/VPL/RAIM (HPL: horisontell skyddsnivå; VPL: vertikal skyddsnivå; RAIM: receiver autonomous integrity monitoring) — se INTEGRITY.md |
security |
andel [0 1] eller null | Analytisk gräns för detekterbarhet av spoofing utifrån klockans stabilitet. | run.rs + security.rs |
meningsfull bara med en konfigurerad attack, så paketen för klocka och bana (som inte konfigurerar någon) markerar den applicable: false i figure_tiers och skriver ut den som n/a (no attack) i sammanfattningen; inte en RAIM-detektor för flera satelliter |
Hur "bra" ser ut#
- En tystare klocka (lägre
adev_curve) ger en längreholdover_soch en högre gräns för detekterbarhet avsecurity— det är kontrasten mellan kvant och klassisk. availabilitynära 1,0 betyder att systemet höll sig inom specifikation nästan hela körningen; under ett långt avbrott sjunker det för den brusigare klockan.integritynära 1,0 betyder att filtrets egen osäkerhetsgräns var ärlig om sitt fel — ett påstående om självkonsistens, inte en garanti för liv och säkerhet.
Andra scenariotyper#
Varje annan typ ger sin egen resultatform. Några av de vanligaste:
- inertial: kvalitetsmått i positionsdomänen i meter (
pos_rms_m,pos_p95_m) — enaxlig (1-DOF (DOF: frihetsgrad)), ett enda frö (seCAPABILITY.md). - hybrid / fusion:
timing_spec_nsochposition_spec_mpå översta nivån, och per sida tidssynkroniserings- och positionsvärdena för en sensorsvit (position_p95_m,position_holdover_sochpnt_holdover_s, tiden tills någon specifikation överskrids), med ett blockfigure_tierslikt klockpaketets där positionsvärdena listas somuntiered. - spoof: spoofingens offset per steg mot klockans detektionsgräns, plus om spoofingen nådde specifikationen före detektion (
src/spoof.rs). - skyline (
orbitochintegritymeduser_site,gnss-sim,jamming,leo-pvt,leo-pass; finns bara när scenariot har ett avsnitt[skyline], så ett scenario utan ett är oförändrat): ett objektskylinepå översta nivån medsource(sträng:preset:<name>,preset:<name>+overridesellercustom),open_fraction(andel [0 1] av den övre halvsfärens rymdvinkel ovanförmax(mask_deg, skyline)) ochprovenance(sträng); per samplingmasked_by_skyline(antal satelliter över masken men bakom skylinen:epochs[]avintegrityochjamming,gnss_measurements[]avgnss-sim,joint.epochs[]avleo-pvt); och förleo-passsatellites[].pass.epochs_masked_by_skyline(antal epoker). Deras enheter och proveniensklasser finns i blocketunits(src/skyline.rsUNITS;SKYLINE.md).
För den exakta fältuppsättningen för en viss typ, läs dess post i field-units-schema.json (nedan), typens avsnitt i SCENARIOS.md, eller motsvarande struct *Result i src/.
Andra filer som en körning skriver#
Bredvid <scenario>.result.json skriver CLI (kommandoradsgränssnitt) <scenario>.chart.svg, en utskrivbar <scenario>.report.html och samma rapport som <scenario>.report.json, vars block reproducibility registrerar motorversionen, SHA-256 för scenariofilen, fröet, plattformen och det exakta kommandot (se REPORTS.md och REPRODUCIBILITY.md). Typer som publicerar en reproducerbarhetstabell skriver också <scenario>.table.csv (CSV: kommaseparerade värden). --export skriver utbytesfiler (se INTEROP.md) och --animate en animering (se ANIMATION.md).
Enheter och proveniens, per fält, för varje typ#
Den här sidan är handskriven och täcker paketen för klocka och bana. Den maskinläsbara motsvarigheten täcker varje inbyggd typ:
- I själva resultatet. Varje scenarios resultatdokument bär ett objekt
unitspå översta nivån som kopplar ett utsänt fälts sökväg till{"unit", "provenance", "note"}. Sökvägsgrammatiken (en array bidrar med ett segment med suffixet[]som delas av dess rader;*är ett jokertecken för ett segment för dataindexerade objekt) och det slutna proveniensvokabuläret definieras isrc/field_schema.rs. - Som en fil.
field-units-schema.jsonär den insamlade unionen: för varje typ, varje numeriskt fält den ger vid en angiven källa, med dess enhet, proveniensklass, evidensnivå och definition — och, namngivet snarare än utelämnat, varje fält som ännu inte har någon. Dess blockcoveragebär antalen.
Båda upprätthålls av tests/field_units_global.rs, som kör varje registrerad typ och misslyckas om ett utsänt numeriskt fält saknar enhet och proveniensklass. Typer som ännu inte täcks namnges var för sig i filens UNCOVERED_KINDS med skälet till att var och en är öppen, och antalet är fastlåst så att listan bara kan krympa.
Generera om JSON efter varje ändring av en rapports form eller av ett block units:
cargo test --test field_units_global zzz_emit_field_units_schema -- --ignored