Skip to main content
The goal is simple: a prompt tweak, model swap or tool change that breaks a customer rule should fail the build, the same way a broken unit test does. sandtable gives you two tiers for that.

Exit codes

Every command exits 1 when it should block a merge, so they work as plain CI steps: In run, when only some trials end in an error, each counts as a failed trial, not a skipped one. In leaderboard, any crashed trial turns that model into an error row instead of a score, and the board exits 1 only when every model is one. Reporting infrastructure errors separately is planned (#27).

A GitHub Actions workflow

This assumes the domain lives in ./sandtable, sandtable-ai is pinned in your devDependencies, and your agent can be started as a local service on port 8787.
.github/workflows/sandtable.yml
The uploaded artifact holds report.html and results.json, so a reviewer can open the failing transcripts from the pull request.
While sandtable is alpha, pin an exact version of sandtable-ai in package.json (for example npm install --save-dev --save-exact sandtable-ai): the spec and outputs may change between releases.

Other agent setups

A .ts agent module needs Node 22.18 or later on the runner.

Choosing the threshold and k

  • Measure first. Run the suite a few times on main and set --fail-under a little below what the current agent reliably scores. Raise it as the agent improves.
  • Know the floor. Run the noop baseline once. A threshold close to the noop score gates nothing.
  • Use k of 3 or 4 on pull requests. It catches tasks that fail one time in three. Raising k with the same threshold makes the gate stricter. See choosing k.
  • Keep the simulated user fixed and cheap. --user claude:claude-haiku-5-5 keeps cost down, and a fixed caller means a score change comes from the agent.
  • Expect noise on small suites. With 10 tasks, one flaky task moves the score by up to 10 points.

Cost

Each run costs tasks × k conversations. For scale: the first 10 tasks of the bundled freight example, 2 trials each, with Claude Opus 5.5 as the agent and Claude Haiku 5.5 as the caller, cost about $0.58 at list prices (results). The terminal summary and report show an estimated cost for Claude models, and for any other model whose prices you pass with --prices; without a price, cost shows n/a.

Coming next

Comparing a run against a stored baseline and posting pass^k deltas as a pull request comment are planned (#12, #13), as are critical tasks that fail the build on their own (#28).