Reports
Every eb run writes a timestamped directory of results and prints a summary to the console. This page covers what you get and how the verdict is computed.
Output directory layout
Each run creates a directory under the configured output_dir (default .eval-banana/results), keyed by a run id:
.eval-banana/results/<run_id>/
├── report.json # machine-readable, the full report
├── report.md # human-readable Markdown summary
└── checks/
├── <check_id>.json # per-check result
├── <check_id>.stdout.txt # captured stdout (only if non-empty)
└── <check_id>.stderr.txt # captured stderr (only if non-empty)report.jsonis the complete, structured report — parse this in tooling.report.mdis a condensed, human-readable summary;report.jsonremains the full record.checks/<check_id>.jsonholds one check's status, score, and reason..stdout.txt/.stderr.txtare written only when the check produced output — for deterministic checks, this is where the diagnostics you printed tostderrland.
Console summary
The console output prints these labels:
Run ID:— the run id;Score:—points_earned/total_points;Percentage:— the pass ratio as a percentage;Passed:—yesorno;- a per-check list, showing each check's
reason(or, for errored checks, the error detail).
The three statuses
Every check resolves to exactly one status, which sets its score:
| Status | Meaning | Score |
|---|---|---|
passed | The condition held (exit 0, or judge score == 1) | 1 |
failed | The condition did not hold (non-zero exit, or judge score == 0) | 0 |
error | The check could not be run or its verdict could not be read (script file missing or OS launch failure; malformed/absent judge verdict; harness timeout) | 0 |
All checks carry equal weight, so the run score is simply points_earned / total_points.
How a run passes
A run passes only when both conditions hold:
run_passed = (points_earned / total_points) >= pass_threshold
AND errored_checks == 0Two things follow:
pass_thresholddefaults to1.0, so by default every check must pass. Lower it in configuration to tolerate some failures.- A single
errorfails the entire run, no matter the threshold or how many other checks passed. Anerrormeans a check could not be trusted to give a verdict, so the run is not clean.
Exit code
eb run exits 0 when run_passed is true and 1 otherwise. That makes it a drop-in CI gate:
- name: Run evals
run: eb run # non-zero exit fails the jobIf a check keeps landing in error, fix the check itself — a script the runner can't locate or launch, or a judge whose output contains no valid {"score": 0|1} verdict — before trusting the run. (A script that runs and exits non-zero is a failed, not an error.) See Troubleshooting.