机器翻译,未经母语人士审校。以英文版为准。

输出与导出在GitHub上编辑来源:docs/REPORTS.md

运行报告

命令行界面(CLI)的每次运行都会在其结果旁写出一份报告:可打印的超文本标记语言(HTML)页面<scenario>.report.html,以及内容相同的机器可读JavaScript对象表示法(JSON)文档<scenario>.report.json。该报告适用于任何场景类别和测评活动。

kshana scenarios/clock-holdover.toml
# wrote scenarios/clock-holdover.result.json, scenarios/clock-holdover.chart.svg,
#   scenarios/clock-holdover.report.html, and scenarios/clock-holdover.report.json

结果文档回答的是引擎计算了什么。报告补充的是读者在据此行动之前需要的内容:输入了什么、这些数值依据什么、略去了什么,以及如何再次得到相同的字节。这些内容报告一概不凭空编造。每个部分都读取自引擎已保存的某个来源,并在所引内容旁注明该来源。

构建器是kshana::advanced_report(src/advanced_report.rs)。它是运行输出、场景文件字节和命令行的纯函数:不读取时钟、文件或网络,并可构建为WebAssembly。

各部分#

# 部分 包含内容 读取自
1 执行摘要 该类别的作用、运行的一行式摘要、主要指标、运行层面的诚实性标注,以及所用VALIDATED / MODELLED / PARTNER能力的数量 类别目录(kshana kinds --json)、结果的label、其figure_tiers块或性能指标块、蒙特卡罗测评活动的百分位数
2 输入 场景文件设置的每个字段,展平为其路径,并附其单位及单位的来源 场景文件;单位取自结果的units块(字段单位模式,docs/field-units-schema.json),否则取自字段名后缀(_s、_ns、_m、_deg、_dbw、……);两者都未说明的单位印作未说明
3 结果 运行的图表、结果文档中每个带单位的标量,以及每个数值列的计数/最小值/最大值/首值/末值摘要 结果文档及其units块
3a 汇总(测评活动与扫描) 扫描的节点表;蒙特卡罗运行的均值、标准差、第5/50/95百分位数以及均值的95% 置信区间,每个指标附直方图;链的阶段表;组合的共享条件、成员和合并摘要 测评活动结果的sweep、monte_carlo、timeline或compose部分;sweep或sweep-nd结果的网格
3b 动画与导出 作为惰性图像嵌入的运行动画图(--animate svg输出),或说明为何没有;指向同一命令在报告旁写出的动画和互操作文件的链接;每种导出格式,注明其是否适用于该场景、不适用的原因及其规范 动画导出器(src/animation.rs)、interop::plan以及命令行写出的文件(--animate、--export)
4 事件时间线 有时间的窗口和点事件,在运行的时间轴上绘出并列表 带t0/t1、on_s/off_s、start_s/end_s或起始时间的场景表;运行跨度time.duration_s;结果中的任何events数组;测评活动的阶段和交接
5 验证标注 运行所涉及类别所对应的每一行验证矩阵,附其标注、参考基准(oracle)和测试证据,以及结果所声明的各项指标的等级 验证矩阵(src/verification.rs、docs/VERIFICATION-MATRIX.md),经由类别到行的对照表advanced_report::KIND_CAPABILITIES
6 未建模的内容与假设 每项限制,均予引述 结果的not_modelled、not_implemented和honesty块;类别目录中的MODELLED条款;场景注释和输入文本中写有“未建模”的内容;矩阵中说明每个MODELLED行为何仍由模型计算得出的理由(docs/MODELLED-RATIONALE.md)
7 可复现性记录 引擎版本、源代码提交、场景文件和结果文档的安全哈希算法256位(SHA-256)摘要、随机种子、平台、确切的命令、工作目录规则、每个其他输入文件的摘要 构建、文件、命令行

没有内容可列的部分会用一句话说明原因(例如“无定时事件:场景未设定窗口或起始时间,结果也未报告事件”)。任何部分都不会既为空又不作说明。

报告中的标签含义#

验证标签评定的是矩阵某一行所列的能力,依矩阵所记录的为准。它不评定场景的配置,VALIDATED行也不意味着某次运行的输入是实测的。PARTNER行是该运行所依赖、但Kshana不提供的专业环节(射频类场景的天线硬件、量子类场景的量子载荷、姿态预算的航天器平台);报告将其显示为依赖而非提供。

从场景类型到各行的对照表,是一张由矩阵requirement字符串组成的表。标签、参考基准(oracle,独立参照)和证据均在生成报告时从矩阵读回,因此把某一行在VALIDATED与MODELLED之间移动,所有相关报告都会随之变动。一个测评活动带有其模式(链式、扫描或蒙特卡罗、组合)对应的行,加上它所运行的每个成员类型的全部行;sweep-nd带有其所扫描类型的行。每次运行还带有“Reproducibility & software assurance”这一行,可复现性记录即以此为依据。

若某一行只评定某类型的一条输入路径,则仅当该运行走了这条路径时才会列出(advanced_report::PATH_GATED_CAPABILITIES):orbit和ephemeris仅在带有tle时才带有“Orbit propagation & determination”行(简化通用摄动4(SGP4)路径;解析轨道是二体传播),slot-timing仅在带有oscillator.record时才带有实测记录行。同一张表还规定:仅当运行采用[[panels]]时才带有spectrum多频段行;低地球轨道(LEO)类型的各行取决于每次运行所走的路径:leo-pass或leo-pnt-chain的降雨、建筑物进入、低能量或欺骗源行,仅当场景设置了该项时才有;闪烁行,除非场景将其关闭;leo-navmsg、leo-pvt或链式精密单点定位行,仅对结果所带有的分析或模式才有;LEO系统预设行,仅在使用具名预设时才有。航天飞机雷达地形测绘任务(SRTM)读取器行不属于任何类型:terrain-nav和terrain-slam运行于合成数字高程模型(DEM)之上,没有任何场景字段读取SRTM图块。若某一VALIDATED行从未被该运行用到,却仍然列出,就会声称该运行并不具备的证据。

依据报告复现一次运行#

report.json → reproducibility包含所需的全部内容:

"command": "kshana clock-holdover.toml",
"argv": ["kshana", "clock-holdover.toml"],
"scenario_sha256": "430c364d…",
"result_sha256": "ee5ebb0a…",
"seed": 42,
  1. 将场景文件与scenario_sha256核对,并将input_files中的任何文件(如--eop地球定向文件)与其摘要核对。
  2. 在最初启动该次运行的目录下运行command。场景路径以及场景内的任何相对数据路径,都相对于该目录解析。
  3. 新的result.json具有result_sha256中的SHA-256,新的report.json和report.html与旧文件逐字节一致。

tests/advanced_report_cli.rs对时钟场景、链式测评活动、扫描测评活动以及带有--eop文件的定轨运行,正是这样做的:从报告中读出命令,在仅含所记录输入的全新目录中运行,并逐字节比较。

scenario_sha256是文件精确字节的摘要。结果自身的scenario_hash则是另一回事,它是该类型对场景的指纹(常常基于规范形式),报告会将两者都打印出来并加以标注。

随机种子。种子取场景的seed,否则取结果所声明的种子。对于不使用种子的类型,报告会如实说明,并说明仅由场景文件和引擎构建即可确定结果。

源代码提交。仅当构建时设置了KSHANA_GIT_COMMIT环境变量(在编译时读取),引擎才会记录该提交:

KSHANA_GIT_COMMIT=$(git rev-parse HEAD) cargo build --release

未设置该变量的构建会将提交报告为未记录,此时由引擎版本标识发布版本。不作任何猜测。

平台。构建所用的操作系统、体系结构和系列。在同一平台上结果逐字节一致;跨平台时,浮点结果的末几位可能不同(参见REPRODUCIBILITY.md)。

确定性与唯一的时间戳#

相同的场景字节、随机种子和引擎构建,会得到逐字节一致的report.json和report.html。报告不带时间戳。整个crate中唯一读取时钟的地方是--study-name所做的那一次,它把meta.generated_utc写入结果文档;报告随后显示该时间戳,并说明这是复现时唯一不会一致的字段。若要避免,请不带--study-name运行。tests/advanced_report.rs会为scenarios/下每个场景文件(套件清单除外)两次构建报告,并重新运行六个场景(其中包括链式、扫描和组合模式各一个测评活动),以端到端地检验这一点。

打印为PDF#

引擎不写出便携式文档格式(PDF)文件。要有一个能渲染图表的PDF写入器,就需要引入新的、沉重的依赖,因此没有--report pdf选项。作为替代,report.html带有打印样式表:在浏览器中打开、打印,并选择“另存为PDF”。

该样式表同时适用于A4和US Letter。它不设定纸张尺寸(以打印对话框的选择为准),保留15 mm / 14 mm的页边距,两种纸张均适用;切换为白底黑字,在每一页重复表头,不让表格行、图和卡片跨页拆分,让标题与其后的文字保持在一起,并让输入、结果、验证标签和可复现性各部分另起一页。导航栏在打印时隐藏。

JSON文档#

report.json含有report_schema = "kshana-report"和report_schema_version = "1.0",然后是kind和title,以及每个部分对应的一个键:executive_summary、inputs、results、aggregation(仅限测评活动和扫描)、events、capabilities、not_modelled、companions(第3b节:animation、exports和export_command)以及reproducibility。列表类部分含有items、omitted(页面行数上限所省略的行;结果文档带有全部取值),并且当items为空时,含有说明原因的statement。取值以其原始JSON形式保存在value中,页面所显示的文本保存在display中;缺失的值在value中为null,在display中为“no value”。

局限,直白陈述#

  • 单位。当字段单位模式和字段名都没有给出单位时,报告会写“not stated”,而不是猜测。嵌套在测评活动成员场景内的输入,仅依据该测评活动自身的单位块和字段名后缀来解析,因此与独立运行相比,更多输入会显示为“not stated”。
  • 对照表的判断。某类型涉及矩阵的哪些行,是一张经人工整理的表,并由测试检查:每个条目恰好指向一个现有的行,且覆盖每一种内置类型。每一项对应关系是否恰当,则是人工判断,如同矩阵自身对参考基准(oracle,独立参照)的选择。
  • 上限。页面最多列出400个输入、150个标量结果、60个数值列和200个事件;omitted统计其余部分。场景内超过24行的表(如导入的序列)按列汇总。
  • Suites. kshana --study <suite.toml>保留其自己的<suite>.study.json和<suite>.study.html;它不写出本报告。
  • 绑定。Python和WebAssembly绑定保留RunOutput::html_report(),即单页记分卡;演练场可下载的报告是它自己的页面(web/studio/lib/report.mjs)。本报告由命令行界面写出,Rust调用方可用kshana::advanced_report::build构建。模型上下文协议(MCP)服务器通过其report_scenario工具返回它,形式为JSON或HTML页面;其复现命令中的场景文件名是调用方传入的名称(默认scenario.toml),并且不列出任何配套文件,因为服务器不写出配套文件。