Relatórios de execução
Cada execução da interface de linha de comandos (CLI) escreve um relatório ao lado do seu resultado: uma página HyperText Markup Language (HTML) imprimível, <scenario>.report.html, e um documento JavaScript Object Notation (JSON) legível por máquina, <scenario>.report.json, com o mesmo conteúdo. O relatório funciona para qualquer tipo de cenário e para campanhas.
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
O documento de resultado responde a o que o motor calculou. O relatório acrescenta o que um leitor precisa antes de agir com base nele: o que entrou, em que assentam os números, o que ficou de fora, e como obter novamente os mesmos bytes. Não inventa nada disso. Cada secção é lida de uma fonte que o motor já mantém, e nomeia a fonte junto ao que cita.
O construtor é kshana::advanced_report (src/advanced_report.rs). É uma função pura da saída da execução, dos bytes do ficheiro de cenário e da linha de comandos: não lê nenhum relógio, nenhum ficheiro e nenhuma rede, e compila para WebAssembly.
Secções#
| # | Secção | O que contém | Lido de |
|---|---|---|---|
| 1 | Resumo executivo | o que o tipo de cenário faz, o resumo de uma linha da execução, valores principais, a etiqueta de honestidade ao nível da execução, a contagem de capacidades VALIDATED / MODELLED / PARTNER usadas | o catálogo de tipos de cenário (kshana kinds --json), o label do resultado, o seu bloco figure_tiers ou bloco de figuras de mérito, os percentis de uma campanha Monte Carlo |
| 2 | Entradas | todos os campos que o ficheiro de cenário define, aplanados até ao seu caminho, com a sua unidade e a origem da unidade | o ficheiro de cenário; unidades do bloco units do resultado (o esquema de unidades de campo, docs/field-units-schema.json), senão o sufixo do nome do campo (_s, _ns, _m, _deg, _dbw, …); uma unidade que nenhum dos dois indica é impressa como não indicada |
| 3 | Resultados | o gráfico da execução, todos os escalares do documento de resultado com a sua unidade, e um resumo de contagem / mínimo / máximo / primeiro / último de cada coluna numérica | o documento de resultado e o seu bloco units |
| 3a | Agregação (campanhas e varrimentos) | a tabela de nós de um varrimento; a média, o desvio-padrão, os percentis 5 / 50 / 95 e o intervalo de confiança de 95% da média de uma execução Monte Carlo, com um histograma por métrica; a tabela de fases de uma cadeia; as condições partilhadas, os membros e o resumo combinado de uma composição | a secção sweep, monte_carlo, timeline ou compose do resultado da campanha; a grelha de um resultado sweep ou sweep-nd |
| 3b | Animação e exportações | o desenho animado da execução (a saída --animate svg) incorporado como imagem inerte, ou a razão de não existir; ligações aos ficheiros de animação e de interoperabilidade que o mesmo comando escreveu junto ao relatório; cada formato de exportação, com a indicação de se se aplica ao cenário, porque não, e a sua especificação |
o exportador de animação (src/animation.rs), interop::plan e os ficheiros que a linha de comandos escreveu (--animate, --export) |
| 4 | Cronologia de eventos | janelas temporizadas e eventos pontuais, desenhados e tabelados no eixo temporal da execução | tabelas de cenário com t0/t1, on_s/off_s, start_s/end_s ou um instante de início; o intervalo da execução time.duration_s; qualquer matriz events no resultado; as fases e transferências de uma campanha |
| 5 | Etiquetas de verificação | cada linha da matriz de verificação que os tipos de cenário da execução exercitam, com a sua etiqueta, referência independente e evidência de testes, e os níveis por valor que o resultado indica | a matriz de verificação (src/verification.rs, docs/VERIFICATION-MATRIX.md), através da correspondência entre tipo de cenário e linhas advanced_report::KIND_CAPABILITIES |
| 6 | Não modelado, e pressupostos | cada limitação, citada | os blocos not_modelled, not_implemented e honesty do resultado; as cláusulas MODELLED do catálogo de tipos de cenário; os comentários do cenário e o texto de entrada que dizem "not modelled"; a razão por que cada linha MODELLED da matriz continua modelada (docs/MODELLED-RATIONALE.md) |
| 7 | Registo de reprodutibilidade | versão do motor, commit de origem, resumos Secure Hash Algorithm de 256 bits (SHA-256) do ficheiro de cenário e do documento de resultado, semente, plataforma, o comando exato, a regra do diretório de trabalho, o resumo de cada outro ficheiro de entrada | a compilação, os ficheiros, a linha de comandos |
Uma secção sem nada para listar diz porquê numa frase (por exemplo, "No timed event: the scenario scripts no window or onset time and the result reports no event"). Nenhuma secção fica alguma vez vazia e muda.
O que significa uma etiqueta no relatório#
Uma etiqueta de verificação classifica a capacidade indicada numa linha da matriz, tal como a matriz a regista. Não classifica a configuração do cenário, e uma linha VALIDATED não torna medidas as entradas de uma execução. Uma linha PARTNER é uma disciplina em que a execução se apoia e que o Kshana não fornece (hardware de antena para os tipos de cenário de radiofrequência, a carga útil quântica para os tipos de cenário quânticos, a plataforma da nave para o orçamento de atitude); o relatório mostra-a como assumida, não fornecida.
A correspondência de tipo de cenário para linhas é uma tabela de cadeias requirement da matriz. A etiqueta, a referência independente e a evidência são lidas de novo da matriz quando o relatório é construído, pelo que mover uma linha entre VALIDATED e MODELLED move com ela todos os relatórios. Uma campanha traz a linha do seu modo (cadeia, varrimento ou Monte Carlo, composição) mais todas as linhas de todos os tipos de cenário membros que executou; sweep-nd traz as linhas do tipo de cenário que varreu. Cada execução traz também a linha "Reproducibility & software assurance", em que assenta o registo de reprodutibilidade.
Uma linha que classifica apenas um caminho de entrada de um tipo de cenário só é listada quando a execução seguiu esse caminho (advanced_report::PATH_GATED_CAPABILITIES): orbit e ephemeris trazem a linha "Orbit propagation & determination" apenas com um tle (o caminho Simplified General Perturbations 4 (SGP4); uma órbita analítica é uma propagação de dois corpos), e slot-timing traz a linha do registo medido apenas com um oscillator.record. A mesma tabela condiciona a linha multibanda de spectrum à execução que desenha [[panels]], e as linhas dos tipos de cenário de órbita terrestre baixa (LEO) ao caminho que cada execução seguiu: uma linha de chuva, entrada em edifícios, baixa energia ou spoofer de leo-pass ou leo-pnt-chain só quando o cenário define esse termo, a linha de cintilação a menos que o cenário a desligue, uma linha de leo-navmsg, leo-pvt ou de posicionamento de ponto preciso em cadeia só para a análise ou o modo que o resultado traz, e a linha de predefinição de sistema LEO só quando é usada uma predefinição com nome. A linha do leitor da Shuttle Radar Topography Mission (SRTM) não é trazida por nenhum tipo de cenário: terrain-nav e terrain-slam executam-se sobre um modelo digital de elevação (DEM) sintético, e nenhum campo de cenário lê um mosaico SRTM. Uma linha VALIDATED em que a execução nunca tocou reivindicaria, de outro modo, evidência que a execução não tem.
Reproduzir uma execução a partir do seu relatório#
report.json → reproducibility contém tudo o que é necessário:
"command": "kshana clock-holdover.toml",
"argv": ["kshana", "clock-holdover.toml"],
"scenario_sha256": "430c364d…",
"result_sha256": "ee5ebb0a…",
"seed": 42,
- Verifique o ficheiro de cenário face a
scenario_sha256, e qualquer ficheiro eminput_files(um ficheiro de orientação da Terra--eop) face ao seu resumo. - Execute
commanda partir do diretório em que a execução original foi iniciada. O caminho do cenário, e qualquer caminho de dados relativo dentro do cenário, são resolvidos a partir dele. - O novo
result.jsontem o SHA-256 deresult_sha256, e o novoreport.jsone o novoreport.htmlsão idênticos ao byte aos antigos.
tests/advanced_report_cli.rs faz exatamente isto para um cenário de relógio, uma campanha encadeada, uma campanha de varrimento e uma execução de órbita com um ficheiro --eop: lê o comando do relatório, executa-o num diretório novo que contém apenas as entradas registadas, e compara bytes.
scenario_sha256 é o resumo dos bytes exatos do ficheiro. O scenario_hash do próprio resultado é outra coisa, a impressão digital do cenário feita pelo tipo de cenário (muitas vezes de uma forma canónica), e o relatório imprime ambos, etiquetados.
Semente. A semente é a seed do cenário, ou então a que o resultado indica. Para um tipo de cenário que não usa semente, o relatório di-lo, e diz que só o ficheiro de cenário e a compilação do motor fixam o resultado.
Commit de origem. O motor só regista o commit se tiver sido compilado com a variável de ambiente KSHANA_GIT_COMMIT definida, lida em tempo de compilação:
KSHANA_GIT_COMMIT=$(git rev-parse HEAD) cargo build --release
Uma compilação sem ela comunica o commit como não registado, e a versão do motor identifica a edição. Nada é adivinhado.
Plataforma. Sistema operativo, arquitetura e família da compilação. Os resultados são idênticos ao byte numa mesma plataforma; entre plataformas, os resultados de vírgula flutuante podem diferir nos últimos algarismos (ver REPRODUCIBILITY.md).
Determinismo e a única marca temporal#
O mesmo conjunto de bytes de cenário, semente e compilação do motor dá um report.json e um report.html idênticos ao byte. O relatório não traz nenhuma marca temporal. A única leitura de relógio em toda a crate é a que --study-name faz, que carimba meta.generated_utc no documento de resultado; o relatório mostra então esse carimbo e diz que é o único campo que uma reprodução não irá igualar. Para o evitar, execute sem --study-name. tests/advanced_report.rs constrói duas vezes o relatório de cada ficheiro de cenário em scenarios/ (exceto o manifesto da suite), e volta a executar seis cenários (entre eles uma campanha de cada um dos modos cadeia, varrimento e composição) para verificar isto de ponta a ponta.
Imprimir para PDF#
O motor não escreve ficheiros Portable Document Format (PDF). Um escritor de PDF que desenhasse os gráficos significaria uma dependência nova e pesada, pelo que não existe a opção --report pdf. Em vez disso, report.html traz uma folha de estilos de impressão: abra-o num navegador, imprima e escolha "Guardar como PDF".
A folha de estilos é escrita tanto para A4 como para US Letter. Não define nenhum tamanho de papel (aplica-se a escolha da caixa de diálogo de impressão), mantém margens de 15 mm / 14 mm que servem em qualquer das folhas, passa a preto sobre branco, repete os cabeçalhos das tabelas em todas as páginas, impede que linhas de tabela, figuras e cartões se dividam entre páginas, mantém os títulos com o texto que se segue, e inicia as secções de entradas, resultados, etiquetas de verificação e reprodutibilidade numa página nova. A barra de navegação fica oculta na impressão.
O documento JSON#
report.json tem report_schema = "kshana-report" e report_schema_version = "1.0", depois kind e title e uma chave por secção: executive_summary, inputs, results, aggregation (apenas campanhas e varrimentos), events, capabilities, not_modelled, companions (secção 3b: animation, exports e export_command) e reproducibility. Uma secção de lista tem items, omitted (as linhas que o limite da página deixou de fora; o documento de resultado traz todos os valores) e, quando items está vazio, uma statement que diz porquê. Um valor mantém a sua forma JSON em bruto em value e o texto que a página mostra em display; um valor em falta é null em value e "no value" em display.
Limites, indicados com clareza#
- Unidades. Quando nem o esquema de unidades de campo nem o nome do campo dão uma unidade, o relatório diz "not stated" em vez de adivinhar. As entradas aninhadas nos cenários membros de uma campanha são resolvidas apenas face ao bloco de unidades da própria campanha e ao sufixo do nome do campo, pelo que mais delas surgem como "not stated" do que numa execução autónoma.
- Juízo sobre a correspondência. As linhas da matriz que um tipo de cenário exercita são uma tabela curada, verificada por um teste para nomear exatamente uma linha existente por entrada e para cobrir todos os tipos de cenário incorporados. Se cada correspondência é a certa é um juízo humano, como a escolha da própria matriz quanto à referência independente.
- Limites. A página lista no máximo 400 entradas, 150 resultados escalares, 60 colunas numéricas e 200 eventos;
omittedconta os restantes. Uma tabela com mais de 24 linhas dentro de um cenário (uma série ingerida) é resumida por coluna. - Suites.
kshana --study <suite.toml>mantém os seus próprios<suite>.study.jsone<suite>.study.html; não escreve este relatório. - Ligações. As ligações (bindings) de Python e WebAssembly mantêm
RunOutput::html_report(), o painel de resultados de uma página; o relatório descarregável do espaço de experimentação é uma página própria (web/studio/lib/report.mjs). Este relatório é escrito pela CLI, e os chamadores em Rust podem construí-lo comkshana::advanced_report::build. O servidor Model Context Protocol (MCP) devolve-o a partir da sua ferramentareport_scenario, como JSON ou como página HTML; o nome do ficheiro de cenário no seu comando de reprodução é o que o chamador passa (predefiniçãoscenario.toml), e não lista nenhum ficheiro acompanhante, porque o servidor não escreve nenhum.