kanros report

Re-render a saved run in another output format — without calling any provider. Run the eval once, keep the JSON, and produce as many reports from it as your pipeline needs:

kanros run --format json > run.json          # the only step that calls models
kanros report --from run.json --format junit --output junit.xml
kanros report --from run.json --format markdown >> "$GITHUB_STEP_SUMMARY"
kanros report --from run.json --format github  # PR annotations

Usage

kanros report --from <RUN_JSON> [--format <FMT>] [--output <FILE>] [--exit-zero]
FlagDefaultMeaning
--from <RUN_JSON>requiredA file written by kanros run --format json, or - to read stdin.
--format <FMT>terminalOutput format (see below).
-o, --output <FILE>stdoutWrite the report to this file instead of stdout.
--exit-zerooffExit 0 even when the saved run had failed or errored cells.

Formats

The same reporters as kanros run --format: terminal, json, jsonl, junit, sarif, html, csv, markdown, github. Rendering --format json reproduces the input file.

Input

--from takes the pretty JSON written by kanros run --format json: the full run summary plus the top-level pass_count / fail_count / error_count / total_count roll-ups (these are ignored on read and recomputed). Files from older kanros versions load too — fields added later default to empty.

Other shapes (--format jsonl, --output-format promptfoo) are not accepted; a file that is not a run summary fails with exit code 2:

× `results.jsonl` is not a kanros run summary (expected the output of
│ `kanros run --format json`): …

Exit codes

The exit code mirrors the saved run's verdict, so kanros report can sit in the same CI gate position as kanros run:

CodeMeaning
0Every cell in the saved run passed (or --exit-zero was given).
1The saved run has at least one failed or errored cell.
2The input could not be read or is not a run summary, or --output could not be written.

Examples

Publish JUnit and a Markdown job summary from one run, and let only the eval step gate the job:

# GitHub Actions
- run: kanros run --format json > run.json
- if: always()
  run: |
    kanros report --from run.json --format junit -o junit.xml --exit-zero
    kanros report --from run.json --format markdown --exit-zero >> "$GITHUB_STEP_SUMMARY"

Pipe straight from a run:

kanros run --format json | tee run.json | kanros report --from - --format csv > cells.csv

See also

  • kanros run — produces the JSON this command reads.
  • kanros diff — compare two runs from the run history.