结果模式:解读Kshana的*.result.json
每次运行都会在场景旁写出一份带版本、自描述的JSON(JavaScript对象表示法)工件。本页是面向读者、由人工编写的指南,介绍交换信封以及时钟和轨道的结果结构:每个字段的单位、它在源代码中的计算位置,以及如何解读。规范类型是src/report.rs中的RunResult;性能指标是src/fom.rs中的FoMScores。
它不是完整的字段参考。引擎调度的类型远多于这两种,每种都输出自己的包。完整的参考(每种内置类型的每个数值字段的单位、溯源类别和定义)是生成的,而不是人工编写的:见下文每种类型逐字段的单位与溯源。
交换信封(KIF,Kshana交换格式):识别并检查工件的版本#
Kshana工件可以包裹在中立的、自描述的交换信封中,使第三方工具能在确定载荷模式之前识别该文件并判断自己能否读取。规范类型是src/interchange.rs中的Envelope。
| 标注 | 类型 | 含义 |
|---|---|---|
format |
字符串 | 始终为"kshana-interchange"(FORMAT_TAG):外部工具借此识别Kshana工件。 |
schema_version |
字符串 | MAJOR.MINOR模式版本(SCHEMA_VERSION,整个crate的唯一事实来源)。 |
kind |
字符串 | 工件类型,例如"scenario"、"run-result"、"trade-study":使使用方无需解析正文即可路由。 |
engine_version |
字符串 | 产生该载荷的crate版本(Cargo.toml)。 |
payload |
对象 | 以规范JSON形式给出的被包裹工件(一个Scenario、一个RunResult等)。 |
兼容性约定。版本号形如MAJOR.MINOR。新字段以#[serde(default)]方式添加(即只增不改的原则),因此读取方可以解析主版本相同且次版本相等或更旧的任何工件(Compatible)。次版本严格更新(ForwardIncompatible)的工件可能带有本读取方无法支持的字段,而主版本不同(MajorIncompatible)则是结构性断裂;这两种情形都会被Envelope::parse拒绝,它在边界上校验格式标签和版本,而不是悄悄地错误解析外来输入。
确定性。信封不含时间戳,这是Kshana的可复现性承诺(scenario + seed + engine_version可复现一次运行)所要求的。溯源信息保存在engine_version和载荷自身的scenario_hash中。
对于任何实现了Deserialize的载荷(例如Scenario),都可以进行类型化读回(Envelope::payload_as::<T>())。结果工件按设计只能序列化,并作为原始payload JSON值读取。
顶层(时钟与轨道包)#
| 标注 | 类型/单位 | 含义 | 来源 |
|---|---|---|---|
schema_version |
字符串 | 结果模式版本(与引擎版本无关)。 | report.rs |
engine_version |
字符串 | 产生该文件的crate版本(Cargo.toml)。 |
report.rs |
scenario_hash |
十六进制字符串 | 对规范场景JSON计算的SHA-256(SHA:安全哈希算法);该次运行可由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加到每种类型的结果中,位于结尾的figure_tiers块之前(若有该块;该块仍是最后一个键);evidence_label::strip_json可逐字节去掉它。同一次运行的图表SVG和CSV表格带有相同的标签(<metadata id="kshana-evidence">和图表下方的一行可见文字;CSV前面的# evidence:注释行)。嵌入另一种类型结果中的测评活动成员不带标签:由外层文档携带。不含数字。 |
evidence_label.rs |
figure_tiers |
对象 | 所报告的每项性能指标的验证等级,并且始终是文档的最后一个键。figures为存在的每项指标列出一个条目:path(例如quantum.fom.timing_p95_ns)、tier(VALIDATED = 对照独立的外部参考基准(oracle)核对,MODELLED = 基于第一性原理、经内部测试)、requirement(该等级所读取的验证矩阵行)和applicable。对于没有配置攻击的每个场景中的security,applicable为false,并附有reason:该界限仍保留在fom.security中,但它并不回答该场景所提出的问题。untiered列出任何不属于矩阵某一行的指标(hybrid和fusion的位置指标),而不是给它一个等级。由clock(单次运行和蒙特卡罗集合)、orbit、hybrid和fusion类型输出,它们在运行内部构建它;其他每个类型(0.36,RM-04)则为其关键指标输出,在运行之后依据各类型的表fom_label::kind_figures追加;api::without_figure_tiers可将其剥离,还原为未分级的文档,逐字节一致。lunar-station-coverage不输出它,其结果是冻结的预先登记的预测(docs/predictions/lunar-reference-station.md):在新的带日期的预测将其取代之前,该类型没有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意味着滤波器自身的不确定度界限如实反映了它的误差,这是自洽性的陈述,不是生命安全保证。
其他场景类型#
其他每种类型都输出自己的结果结构。以下是几种常见的:
- 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(高于截止角但在天际线之后的卫星数: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)。
要了解任一类型的确切字段集,请阅读(下文)field-units-schema.json中它的条目、SCENARIOS.md中该类型的一节,或src/中对应的*Result结构体。
一次运行写出的其他文件#
除<scenario>.result.json之外,命令行界面(CLI)还写出<scenario>.chart.svg、可打印的<scenario>.report.html,以及同一份报告的<scenario>.report.json,其reproducibility块记录引擎版本、场景文件的SHA-256、随机种子、平台和精确的命令(见REPORTS.md和REPRODUCIBILITY.md)。发布可复现性表格的类型还会写出<scenario>.table.csv(CSV:逗号分隔值)。--export写出交换文件(见INTEROP.md),--animate写出动画(见ANIMATION.md)。
每种类型逐字段的单位与溯源#
本页由人工编写,涵盖时钟和轨道包。与之对应的机器可读版本涵盖每一种内置类型:
- 在结果本身中。每个场景的结果文档都带有顶层的
units对象,将所输出字段的路径映射到{"unit", "provenance", "note"}。路径语法(数组贡献一个带[]后缀、由其各行共享的段;*是针对以数据为键的对象的单段通配符)以及封闭的溯源词汇,定义在src/field_schema.rs中。 - 作为一个文件。
field-units-schema.json是汇集得到的并集:对每种类型,它在所声明的来源处输出的每个数值字段,连同其单位、溯源类别、证据等级和定义;并且,对于尚无这些信息的每个字段,不是省略,而是逐一列名。其coverage块带有计数。
两者都由tests/field_units_global.rs强制执行,它运行每个已注册的类型,并在某个输出的数值字段缺少单位和溯源类别时失败。尚未覆盖的类型在该文件的UNCOVERED_KINDS中逐一列名并说明各自尚未完成的原因,其数量被锁定,因此该列表只会缩短。
在报告的结构或units块发生任何变化之后,重新生成该JSON:
cargo test --test field_units_global zzz_emit_field_units_schema -- --ignored