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]
| Flag | Default | Meaning |
|---|---|---|
--from <RUN_JSON> | required | A file written by kanros run --format json, or - to read stdin. |
--format <FMT> | terminal | Output format (see below). |
-o, --output <FILE> | stdout | Write the report to this file instead of stdout. |
--exit-zero | off | Exit 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:
| Code | Meaning |
|---|---|
0 | Every cell in the saved run passed (or --exit-zero was given). |
1 | The saved run has at least one failed or errored cell. |
2 | The 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.