結果スキーマ — Kshana の *.result.json の読み方
実行のたびに、シナリオの隣にバージョン付きの自己記述型 JSON(JavaScript Object Notation)アーティファクトが書き出されます。このページは、交換用エンベロープと、時計と軌道の結果の形についての、手書きの読者向けガイドです。各フィールドの単位、ソース内で計算される場所、読み方を説明します。正式な型は src/report.rs 内の RunResult であり、性能指標は src/fom.rs 内の FoMScores です。
これは完全なフィールドリファレンスではありません。エンジンはこの二つよりはるかに多くの kind にディスパッチし、それぞれが固有のパックを出力します。すべての組み込み kind のすべての数値フィールドについての単位、出所の区分、定義を載せた完全なリファレンスは、手書きではなく生成されます。下のすべての kind の、フィールドごとの単位と出所を参照してください。
交換用エンベロープ(KIF、Kshana Interchange Format)— アーティファクトの認識とバージョン確認#
Kshana のアーティファクトは、中立で自己記述型の交換用エンベロープで包むことができ、サードパーティのツールは、ペイロードのスキーマに踏み込む前に、そのファイルを認識して、読めるかどうかを判断できます。正式な型は src/interchange.rs 内の Envelope です。
| キー | 型 | 意味 |
|---|---|---|
format |
文字列 | 常に "kshana-interchange"(FORMAT_TAG)です。外部のツールが Kshana のアーティファクトを認識するための目印です。 |
schema_version |
文字列 | MAJOR.MINOR のスキーマバージョン(SCHEMA_VERSION。クレート全体の唯一の情報源)。 |
kind |
文字列 | アーティファクトの種類。例:"scenario"、"run-result"、"trade-study"。利用側は、本体を解析しなくても振り分けることができます。 |
engine_version |
文字列 | ペイロードを生成したクレートのバージョン(Cargo.toml)。 |
payload |
オブジェクト | 正規の JSON としてラップされたアーティファクト(Scenario、RunResult など)。 |
互換性の契約。バージョンは MAJOR.MINOR です。新しいフィールドは #[serde(default)] 付きで追加されるため(追加のみの規律)、リーダーは、同じメジャーかつ同等以下のマイナーのアーティファクトであれば、どれでも解析できます(Compatible)。厳密に新しいマイナー(ForwardIncompatible)は、このリーダーが扱えないフィールドを含むことがあり、異なるメジャー(MajorIncompatible)は構造上の断絶です。どちらも Envelope::parse によって拒否されます。これは、外部の入力を黙って誤解析するのではなく、境界でフォーマットタグとバージョンを検証します。
決定性。エンベロープにはタイムスタンプがありません。これは、Kshana の再現性の約束(scenario + seed + engine_version で実行を再現できること)が求めているためです。出所の情報は engine_version と、ペイロード自身の scenario_hash にあります。
型付きの読み戻し(Envelope::payload_as::<T>())は、Deserialize を実装するペイロード(例:Scenario)であれば動作します。結果アーティファクトは設計上シリアライズ専用であり、生の payload JSON 値として読みます。
トップレベル(時計と軌道のパック)#
| キー | 型 / 単位 | 意味 | 出典 |
|---|---|---|---|
schema_version |
文字列 | 結果スキーマのバージョン(エンジンのバージョンとは独立)。 | report.rs |
engine_version |
文字列 | ファイルを生成したクレートのバージョン(Cargo.toml)。 |
report.rs |
scenario_hash |
十六進文字列 | 正規のシナリオ JSON に対する SHA-256(SHA:Secure Hash Algorithm)。実行は scenario + seed + engine_version から再現できます。 |
report.rs:hash_scenario |
seed |
u64 | 量子の実行に使う乱数生成器(RNG)のシード(従来型は seed + 0x9e3779b97f4a7c15 を使います)。 |
run.rs |
threshold_ns |
ナノ秒 | タイミング仕様:±threshold_ns 以内の誤差は「仕様内」です。 |
シナリオ |
quantum |
オブジェクト(ClockRun) |
量子センサーの実行(下を参照)。 | report.rs |
classical |
オブジェクト(ClockRun) |
比較用の、従来型センサーの実行。 | report.rs |
units |
オブジェクト | このドキュメントのフィールドごとの単位と出所の対応表で、フィールドパスをキーとします。下の「単位と出所」の節を参照してください。 | field_schema.rs:units_block |
evidence |
オブジェクト | (0.40)実行のエビデンスラベル:tier(VALIDATED、MODELLED、PARTNER。行のうち最も弱いステータスなので、最も弱い行以上のことを主張することはありません)、matrix(docs/VERIFICATION-MATRIX.md)、id_rule と rows。後者は、実行が使った検証マトリクスの行ごとに一つ(その行は advanced_report::KIND_CAPABILITIES による、高度なレポートの一覧にあるもの)で、id(VM- と、その行の要件テキストの SHA-256 の最初の 8 桁の十六進数)、requirement、status を持ちます。すべてマトリクスから読み取られ、入力されたものはありません。api::run_toml により、すべての kind の結果に追加され、末尾の figure_tiers ブロックがある場合はその前に置かれます(そのブロックは最後のキーのままです)。evidence_label::strip_json はこれをバイト単位で取り除きます。同じ実行のグラフ SVG と CSV の表にも、同じラベルが付きます(<metadata id="kshana-evidence"> とグラフの下の見える一行、CSV の先頭の # evidence: のコメント行)。別の kind の結果に埋め込まれたキャンペーンメンバーには付きません。外側の文書が持ちます。数値は含みません。 |
evidence_label.rs |
figure_tiers |
オブジェクト | 報告される各性能指標の検証ティアで、常にドキュメントの最後のキーです。figures には、存在する指標ごとに 一つのエントリを列挙します。path(例:quantum.fom.timing_p95_ns)、tier(VALIDATED = 独立した外部のオラクルと照合して確認済み、MODELLED = 第一原理に基づき、内部でテスト済み)、requirement(ティアの根拠となる検証マトリクスの行)、applicable。applicable は、攻撃が設定されていないすべてのシナリオにおける security について、reason 付きで false になります。境界は fom.security に残りますが、シナリオが問う問いには答えていません。untiered には、どの検証マトリクスの行にも属さない指標(hybrid と fusion の位置の指標)を、ティアを付ける代わりに列挙します。clock(単一の実行とモンテカルロのアンサンブル)、orbit、hybrid、fusion の kind が、それぞれの実行の中で作成して出力します。また、それ以外のすべての kind が、主要な指標について(0.36、RM-04)、kind ごとの表 fom_label::kind_figures から実行後に付け加えて出力します。api::without_figure_tiers は、これをバイト単位で同一のティアなしのドキュメントに戻します。lunar-station-coverage は出力しません。その結果は固定された事前登録済みの予測だからです(docs/predictions/lunar-reference-station.md)。新しい日付付きの予測に置き換わるまで、その kind には figure_tiers がありません。leo-ppp、solar-system、optical-atmosphere(0.37。サイトごとの配列)、sweep、sweep-nd も出力しません。これらにはスカラーの代表指標がないためです。lunar-attack-surface も出力しません。そのドキュメントはコンパクトな JSON だからです(fom_label::KINDS_EXCLUDED_FROM_FIGURE_TIERS が理由をそれぞれ示します)。キャンペーンの埋め込みメンバードキュメントも同様です。数値は含みません。 |
fom_label.rs:figure_tiers, fom_label.rs:kind_figure_tiers |
geometry |
オブジェクト、任意 | 軌道パックのジオメトリ要約:samples_total、samples_with_fix、sigma_uere_m(m、衛星ごとの測距誤差バジェットをモデル化したもの)、best_pdop / median_pdop(無次元)、best_position_sigma_m / median_position_sigma_m(m、PDOP(位置の精度低下率)× sigma_uere_m)。軌道パックのみ。 |
orbit.rs |
eci_track |
[x, y, z] km の配列、任意 |
ユーザー宇宙機の、伝搬させた地球中心慣性系の軌跡で、サンプリングした時刻ごとに一つのエントリがあります。軌道パックのみで、それ以外では省略されます。出力専用で、ハッシュ化されません。 | report.rs |
meta |
オブジェクト(StudyMeta)、任意 |
追加のレポートメタデータ(スタディのタイトル、生成スタンプ、作成者、免責事項)。ない場合は省略されるため、メタデータのない実行は従来の出力とバイト単位で同一です。出力専用で、ハッシュ化されません。 | report.rs |
ClockRun(quantum / classical のそれぞれ)#
| キー | 型 / 単位 | 意味 |
|---|---|---|
spec.id |
文字列 | センサーの識別子(例:optical-sr-lattice)。 |
spec.kind |
文字列 | モデルの種類(例:clock)。 |
spec.provenance |
文字列 | センサーのパラメーターの出典・引用元。 |
spec.params |
オブジェクト | 使用した生のモデルパラメーター。 |
series |
{t, error_ns, gnss} の配列 |
ステップごとの時系列:t は秒、error_ns はナノ秒で表した時刻誤差、gnss は nominal/degraded/denied のいずれか。 |
fom |
オブジェクト(FoMScores) |
採点された性能指標(下を参照)。 |
adev_curve |
{tau_s, adev, n_samples, noise, edf, ci_lo, ci_hi} の配列 |
オーバーラッピングのアラン偏差:tau_s は平均化時間(s)、adev は無次元の周波数偏差の安定度 σ_y(τ)、n_samples はその点の背後にあるオーバーラップ数、noise は MDEV(修正アラン偏差)の傾きから特定したべき乗則の雑音の種類(例:WhiteFm)、edf は雑音の種類に固有の有効自由度、ci_lo/ci_hi はその τ における adev についての χ² に基づく 95% 信頼区間です。allan.rs:overlapping_adev_curve で計算されます。 |
filter_health |
オブジェクト、任意 | カルマンフィルターの整合性評価(NIS/NEES(NIS:正規化イノベーション二乗、NEES:正規化推定誤差二乗)を χ² の区間に照らしたもの)で、filter_health.rs で計算されます。評価しない実行では省略されます。 |
FoMScores(fom オブジェクト)#
| フィールド | 単位 | 意味 | 出典 | 注意点 |
|---|---|---|---|---|
timing_rms_ns |
ns | 停止期間中の時計位相(タイミング)誤差の RMS(二乗平均平方根)。 | fom.rs:score |
位置ではなくタイミングの指標 |
timing_p95_ns |
ns | 停止期間中のタイミング誤差の 95 パーセンタイル値。 | fom.rs:score |
|
holdover_s |
s | 停止区間のうち、仕様内でコーストできる最悪(最短)の時間。 | fom.rs:worst_case_holdover |
グリッドで制限される — 時間ステップの分解能における下限 |
resilience_slope_ns_per_s |
ns/s | 停止期間中の |誤差| の最小二乗による増加率。 | fom.rs:score |
|
availability |
比率 [0,1] | 実行全体のうち、仕様内の解が得られた割合。 | fom.rs:score |
|
integrity |
比率 [0,1]、または null | フィルターの自己整合性:停止中のサンプルのうち、真の誤差がカルマンの k-σ 境界の内側に収まったものの割合。 | run.rs |
HPL/VPL/RAIM(HPL:水平保護レベル、VPL:垂直保護レベル、RAIM:受信機自律型インテグリティ監視)のインテグリティではありません — INTEGRITY.md を参照 |
security |
比率 [0,1]、または null | 時計の安定度から求めたスプーフィング検出可能性の解析的な境界。 | run.rs + security.rs |
攻撃を設定した場合にのみ意味を持つため、攻撃を設定しない時計パックと軌道パックでは、figure_tiers で applicable: false と示し、要約では n/a (no attack) と表示します。複数衛星の RAIM 検出器ではありません。 |
「良い」状態の見方#
- より静かな時計(
adev_curveが低い)ほど、holdover_sが長くなり、securityの検出可能性の境界が高くなります。これが量子と従来型の対比です。 availabilityが 1.0 に近いことは、実行のほぼ全体でシステムが仕様内に留まったことを意味します。長い停止の間は、雑音の大きい時計ではこの値が下がります。integrityが 1.0 に近いことは、フィルター自身の不確かさの境界がその誤差について正直であったことを意味します。これは自己整合性についての記述であり、人命安全(safety-of-life)の保証ではありません。
その他のシナリオ kind#
それ以外の kind は、それぞれ固有の結果の形を出力します。よく使われるものを少し挙げます。
- inertial:メートルで表した位置領域の性能指標(
pos_rms_m、pos_p95_m)。単一軸(1-DOF(DOF:自由度))、単一シードです(CAPABILITY.mdを参照)。 - hybrid / fusion:トップレベルの
timing_spec_nsとposition_spec_m、および側ごとの、一つのセンサースイートのタイミングと位置の指標(position_p95_m、position_holdover_s、および、どちらかの仕様を破るまでの時間であるpnt_holdover_s)。時計パックと同様のfigure_tiersブロックがあり、そこでは位置の指標がuntieredとして列挙されます。 - spoof:ステップごとのスプーフィングオフセットと時計の検出境界の比較、および検出前にスプーフィングが仕様に達したかどうか(
src/spoof.rs)。 - skyline(
user_site、gnss-sim、jamming、leo-pvt、leo-passを伴うorbitとintegrity。シナリオに[skyline]セクションがある場合にのみ存在するため、ないシナリオは変わりません):トップレベルのskylineオブジェクトで、source(文字列:preset:<name>、preset:<name>+overrides、custom)、open_fraction(max(mask_deg, skyline)より上の上半球の立体角の割合 [0,1])、provenance(文字列)を持ちます。サンプルごとにmasked_by_skyline(マスクより上だが skyline の背後にある衛星の数:integrityとjammingのepochs[]、gnss-simのgnss_measurements[]、leo-pvtのjoint.epochs[])、そしてleo-passにはsatellites[].pass.epochs_masked_by_skyline(エポックの数)があります。これらの単位と出所の区分はunitsブロックにあります(src/skyline.rsUNITS、SKYLINE.md)。
任意の kind の正確なフィールドの集合については、下にある field-units-schema.json のその kind の項目、SCENARIOS.md のその kind の節、または src/ にある対応する *Result 構造体を参照してください。
実行で書き出されるその他のファイル#
<scenario>.result.json のほかに、CLI(コマンドラインインターフェース)は <scenario>.chart.svg、印刷可能な <scenario>.report.html、および同じレポートを <scenario>.report.json として書き出します。その reproducibility ブロックには、エンジンのバージョン、シナリオファイルの SHA-256、シード、プラットフォーム、正確なコマンドが記録されます(REPORTS.md と REPRODUCIBILITY.md を参照)。再現性の表を公開する kind は、<scenario>.table.csv(CSV:カンマ区切り値)も書き出します。--export は交換用ファイルを書き出し(INTEROP.md を参照)、--animate はアニメーションを書き出します(ANIMATION.md を参照)。
すべての kind の、フィールドごとの単位と出所#
このページは手書きで、時計パックと軌道パックを扱っています。機械可読な対になるものは、すべての組み込み kind を扱っています。
- 結果そのものの中に。各シナリオの結果ドキュメントは、出力されたフィールドのパスを
{"unit", "provenance", "note"}に対応づけるトップレベルのunitsオブジェクトを持ちます。パスの文法(配列は、その行で共有される、[]を接尾辞とする一つのセグメントを加えます。*は、データをキーとするオブジェクトに対する単一セグメントのワイルドカードです)と、閉じた出所の語彙は、src/field_schema.rsで定義されています。 - 一つのファイルとして。
field-units-schema.jsonは収集した和集合です。すべての kind について、明記された情報源で出力するすべての数値フィールドを、その単位、出所の区分、エビデンスのティア、定義とともに載せ、まだそれらを持たないフィールドも、省略せずに名前を挙げて載せています。そのcoverageブロックに件数があります。
どちらも tests/field_units_global.rs によって強制されます。これは登録済みのすべての kind を実行し、出力した数値フィールドに単位と出所の区分がなければ失敗します。まだ対象になっていない kind は、そのファイルの UNCOVERED_KINDS に、それぞれが未対応である理由とともに個別に名前が挙げられており、件数は固定されているため、このリストは減る方向にしか変わりません。
レポートの形、または units ブロックを変更した後は、JSON を再生成してください。
cargo test --test field_units_global zzz_emit_field_units_schema -- --ignored