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
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
- JS/TS module
- Claude on Bedrock
- OpenAI-compatible
.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
mainand set--fail-undera 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-5keeps 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.