---
title: reeval history, show, compare, checkout
description: Read recorded runs, diff two of them and reproduce one.
---
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.reeval.ai/llms.txt
> Use this file to discover all available pages before exploring further.

Four commands read the history: recorded runs, plus unrecorded scratch runs where noted.

```bash
npx reeval history             # pass/fail per eval across runs
npx reeval show latest --md    # one run as Markdown
npx reeval compare             # latest vs its nearest recorded ancestor
npx reeval checkout latest     # a worktree at that run's commit
```

## reeval history

[//]: # (generated:cli-help:history)

```text
reeval history [filter]       Pass/fail per recorded eval over recent runs
                              --limit <n> --all (include unrecorded runs) --json
```

[//]: # (/generated:cli-help:history)

The filter is a case-insensitive substring of the eval id. Runs go oldest to newest, left to right.

```text
2 runs, oldest → newest: 20260926T173922Z_7e5376d_ada-lovelace_31fh (7e5376d) … 20260926T173923Z_7e5376d_ada-lovelace_t2ea (7e5376d)

  ✓✓    2/2  evals/hello.eval.ts › greet module › creates a tested greet module
  ✓✓    2/2  evals/hello.eval.ts › greet module › adds a default name in a follow-up turn
…
✓ pass  ✗ fail  ! infra error  ↓ skipped  ○ not gated  · not run  ¦ eval or stack changed
```

`¦` marks a run where the eval's fingerprint changed from the last run that had the same cell, so a filtered run and the full run after it don't count as a change. `○` marks a study's run (every cell `gate: 'none'`), which the pass rate leaves out; `--json` gives its outcome as `not_gated`.

## reeval show

[//]: # (generated:cli-help:show)

```text
reeval show [run]             One run: result blocks, --md (summary.md) or --json (the record)
```

[//]: # (/generated:cli-help:show)

The default output is a state table (commit, dirty patch, lockfiles, images, harnesses, environments, judge, agent context, packages, runner), then the result blocks and tally `reeval run` ended with. `--md` prints the run's `summary.md`; `--json` prints the record. A run with an `insights.json` (from `reeval run` or [`reeval analyze --insights`](/reference/cli/analyze#insights)) prints its sentences in the blocks, as text and `--md`. A run that raised [remarks](/reference/cli/run#remarks), recorded or not, ends with the concerns it printed.

## reeval compare

[//]: # (generated:cli-help:compare)

```text
reeval compare [base] [head]  Diff two runs; base defaults to head's nearest recorded ancestor
                              --md --json --fail-on-regression
  -v, --verbose               Also each cell's lift and effort, base → head, and the stack changes
```

[//]: # (/generated:cli-help:compare)

- **Defaults:** head is `latest`. Base is the nearest recorded, complete run on head's git ancestry, falling back to the previous run by time.
- **Blocks:** one per eval that changed, in file order: `regressed` (both run ids and each check that flipped, `pass → fail` with its message, or `not run`), `fixed` (the checks that pass now), `can't compare` (what changed, and each side's id and result), `infra error`, `new` and `removed`. Runs of unchanged evals collapse to `+N same`. The last line is the tally, regressed first, zeros left out.
- **Can't compare** means a fingerprint part or the grader changed, and reeval names it: `changed  evals/helpers.ts`.
- **Not run:** a check head never reached reads `not run`, never `fail`, and a check neither side reached is never a flip.
- **Unfinished runs:** when base or head was interrupted or stopped at its duration budget, a note above the tally says so, since some of its evals didn't run to the end.
- **Cancelled evals:** an eval that failed only because Ctrl-C cancelled its attempts reads `can't compare`, with that side's result `cancelled`, never `regressed` or `fixed`. In `--json` its row is `drift` with `cancelled: ["head"]` (or `"base"`).
- **Filtered runs:** when base and head ran different cells of an eval, the eval is classified on the cells both ran, and the rest are listed as `cells added` or `cells removed`. With no cell in common, it can't compare them.
- `-v` adds each cell's lift and effort, base → head, and every stack change. The default output has no statistics.
- `--md` prints a `### reeval compare: head vs base` heading and the same blocks in a text block, for a PR comment. `--json` returns `{ base, head, changes, rows }`.
- **No earlier recorded run:** `No earlier recorded run to compare <run> with, so every eval is new.`, then head's result blocks and `N new evals`; `--json` has `base: null`. That's not an error.
- `--fail-on-regression` exits 1 when any eval regressed, or when a `new` or `can't compare` eval fails, since no comparable earlier run vouches for it. A changed eval that passes, or one whose head was cancelled, doesn't count. Without the flag, `reeval compare` exits 0.

```text
regressed        greets in the house style
  base             20261020T231407Z_ea2a649_ada-lovelace_8h1n
  head             20261020T231408Z_b2c98b4_ada-lovelace_fypq
  house greeting   pass → fail
    expected command to succeed, exit code 1
  sign-off         not run
  +1 more passed

+2 same
…
1 regressed · 1 fixed · 1 can't compare · 1 new · 1 removed · 4 same
```

## reeval checkout

[//]: # (generated:cli-help:checkout)

```text
reeval checkout [run] [dir]   A git worktree at the run's commit, with its worktree.patch applied
                              (default dir: .reeval/checkouts/<run>)
```

[//]: # (/generated:cli-help:checkout)

It runs `git worktree add --detach` at the run's commit, then applies the run's `worktree.patch` if it was dirty. Remove the worktree with `git worktree remove <dir>`.

<Warning>
  The default directory is inside `.reeval/`. Deleting `.reeval/` leaves a stale worktree entry until you run `git worktree prune`.
</Warning>

## Related

- [History](/guide/history)
- [Fingerprints and drift](/concepts/fingerprints)
- [The run record](/reference/record)
