Quickstart

evalctl treats eval cases as files, runners as shell commands, and results as durable artifacts. This walks the full loop: scaffold, author, run, report.

1. Scaffold

evalctl init --json

init writes an evals/ tree with a sample code-review suite. Re-running is a conflict unless you pass --force.

2. Author a suite

You can build a suite without hand-editing suite.json or cases.jsonl:

evalctl suite add demo --runner-argv "python3 $EVALCTL_WORKSPACE/r.py" --json
evalctl case add demo --task "do X" --workspace fixtures/x --expect-json '{"exact":"ok"}' --json
evalctl scorer add demo --name exact --required --json

Authoring verbs are idempotent: re-adding the same canonical object returns created:false; reusing a key with different content returns E_RUN_CONFLICT.

3. Validate

Always validate before executing local code:

evalctl validate demo --json

This checks suite.json, cases.jsonl, fixtures, scorer references, and runner config.

4. Run

evalctl run demo --acknowledge-unsandboxed-runner --json

The runner is arbitrary local code โ€” evalctl is not a sandbox. run and replay refuse with exit 2 until the invoker acknowledges this, either with --acknowledge-unsandboxed-runner or by setting EVALCTL_ACKNOWLEDGE_UNSANDBOXED_RUNNER=1. Once acknowledged, the run produces a portable, resumable run directory, and every run envelope still carries the W_UNSANDBOXED_RUNNER warning.

5. Inspect and report

evalctl status <run-id> --json
evalctl report <run-id> --format json

Use --format markdown for a human-readable report instead.

The full loop

export EVALCTL_ACKNOWLEDGE_UNSANDBOXED_RUNNER=1  # or pass --acknowledge-unsandboxed-runner per run
evalctl init --json
evalctl suite add demo --runner-argv "python3 $EVALCTL_WORKSPACE/r.py" --json
evalctl case add demo --task "do X" --workspace fixtures/x --expect-json '{"exact":"ok"}' --json
evalctl scorer add demo --name exact --required --json
evalctl run demo --json
evalctl run --resume <run-id> --json
evalctl jobs list --json
evalctl run demo --queue spoolctl --slots 4 --json
evalctl replay --failed <run-id> --json
evalctl report <run-id> --format json

Next: the full command surface, or how to drive evalctl from an agent.