Evals

Running evals

run is the default command and it's the same shape for every tier. This page covers what's shared — selecting tiers, the flags, parallelism, and isolation. Each tier then has its own page for how it seeds and grades: Triage, Code fix, and PR review.

Selecting tiers

Give run one or more tiers, or none to pick interactively (a non-TTY run falls back to the cheapest tier). From a Separate-layout workspace the overlay and datasets auto-detect; a Plain workspace adds --overlay ..

lastlight-evals run                       # default model, default tier
lastlight-evals run triage                # one tier
lastlight-evals run triage code-fix       # multiple tiers → combined tabbed report
lastlight-evals run --compare             # cross-vendor set (key-gated)
lastlight-evals run triage --runs 3       # repeat each case 3× (worst-case verdict, mean metrics)
lastlight-evals run pr-review --limit 3   # only the first 3 cases (controlled / cheap)

Grading, in one sentence per tier

Grading is deterministic — the one exception being the PR-review judge. Each tier page has the detail; the summary:

TierGraded on
triageBehavioral — recorded GitHub mutations (labels, comments, state) vs the gold expectation.
code-fixExecution — held-out tests must go red → green and stay green (SWE-bench's resolved criterion).
pr-reviewJudge — an LLM judge scores the posted review against a human gold set (F1).

Run flags

FlagMeaning
--mode <models|config>Comparison axis (default models; a TTY with no flags asks). See Models.
--overlay <dir>Layer a deployment's workflows / skills + evals over the built-ins. Repeatable in --mode config.
--model <m[,m2]>Select model(s), fuzzy-matched; in config mode, override each config's default.
--compareCross-vendor set (only models whose provider key is present).
--instance <id[,id]>Run only these exact instance_id(s) (or EVAL_INSTANCE) — not a substring.
--limit <n>First n instances per tier (applied after --instance).
--runs <n>Repeat each case n× — worst-case verdict, mean metrics.
--f-beta <n>PR-review F-beta β (default 1 = F1). See PR review.
--judge-with-diffPR-review: feed the PR diff to the judge (off by default).
--no-inject-contextPR-review: don't inject synthetic repo context into the checkout (a clean A/B control; or EVAL_INJECT_CONTEXT=0). See PR review.
--sandbox <backend>none (default, in-process, fast/CI) or gondolin (QEMU micro-VM isolation; or EVAL_SANDBOX).
--serialForce serial execution across provider families.
--datasets <dir>Extra datasets root to discover tiers from.
--models-file <f>Use an explicit models.json.
--no-openDon't open / auto-serve the dashboard (also implied by CI=1).

Parallelism & exit codes

Provider families (OpenAI / Anthropic / Fireworks, keyed by envKey) run concurrently but serial within a family, so one provider's rate limit is never hammered. Config runs stay serial. Force serial everywhere with --serial. The runner exits non-zero only if the harness itself errors — a weak model scoring badly is the measurement, not a build failure.

Isolation

The default --sandbox none runs the agent in-process: fast and CI-friendly, but with no filesystem restriction — a capable model could read host gold data. --sandbox gondolin runs the agent's bash/file tools in a QEMU micro-VM that only sees its own workspace, while keeping github_* in-process so the fake GitHub still works (this is why gondolin, not docker/smol, is the supported backend). It needs QEMU with hardware acceleration and adds a one-time cold start; a fail-fast preflight aborts rather than hanging.