Run
CLI & Harbor
The CLI turns any indexed benchmark into standard Harbor task directories, runs them on your machine with your own agent and subscription, and pushes only a score summary back. Nothing in the loop touches your API keys.
Install
Requires Node 20+ and Docker (Harbor runs each task in a container). Harbor itself is a Python tool installed with uv.
$ npm i -g lettokenburn-cli$ uv tool install harbor$ ltb --version && harbor --version
Commands
Search and inspect
$ ltb bench search swe$ ltb bench info swe-bench-verified
Reads the public static index at /benchhub/index.json and /benchhub/b/<slug>.json; no account needed.
Pull as Harbor tasks
$ ltb bench pull mmlu-pro --n 50$ ltb bench pull mmlu-pro --n 200 --seed 7$ ltb bench pull gsm8k --all
hf_rowsadapters page through the Hugging Face datasets server and write one task directory per row (default 50,--seedsets the sampling offset,--alltakes the full split).harbor_nativebenchmarks are already in Harbor format. If they live in the Harbor registry there is nothing to pull:pullonly prints the dataset reference, and you run it withltb bench run <org>/<name>@<rev> --benchmark <slug>(see below). If they live in a git repo,pullclones it.external_harnessbenchmarks need their own harness; the CLI prints the instructions and repo and exits.
Run with your agent
$ ltb bench run ./mmlu-pro -a claude-code -m anthropic/claude-opus-4-8$ ltb bench run ./mmlu-pro -a codex -m openai/gpt-5-4 -n 4$ ltb bench run gpqa-diamond/gpqa-diamond@1 --benchmark gpqa-diamond -a claude-code -m anthropic/claude-opus-4-8 # Harbor-native, no pull
A thin wrapper over harbor run -p <dir> -a <agent> -m <model> (or harbor run -d <dataset> for a registry reference). Each task's verifier writes a reward; the CLI aggregates score = mean(reward) × 100 into ltb-run-summary.json.
Push the summary
$ ltb bench push$ ltb bench push --notes "temperature 0, 1 attempt"
Harbor task layout
Every generated task follows the Harbor tasks init template (schema 1.4), so it also runs with plain harbor run.
task.toml # schema_version, timeouts, [metadata] benchmark/source_dataset/row_idx/licenseinstruction.md # the question (+ options), "write the final answer to /app/answer.txt"environment/Dockerfile # FROM python:3.12-slim, WORKDIR /apptests/expected.json # { "answer": "C", "verifier": "mcq_letter" }tests/test.sh # compares /app/answer.txt, writes /logs/verifier/reward.txt (1|0)solution/solve.sh # reference answer — only when the license allows redistribution
Verifiers: mcq_letter, exact_match, normalized_match, contains, numeric. Pure bash + Python standard library; no extra dependencies inside the container.
Pushing results and the Reproduced column
ltb bench pushsends aRunSubmissiontoPOST /v1/runs: benchmark slug, model, harness, task count, attempts, score, metric, token/cost totals if known, Harbor and CLI versions, a hash ofresults.json, and a compact per-task reward list. No model outputs are uploaded.- Anonymous pushes are accepted with rate limiting; add an API key from your profile to attach runs to your account.
- The API returns a shareable page at
/runs/detail/?id=<run id>. All recent runs are listed at /runs. - Runs for the same benchmark, model and harness are aggregated (median, mean, min, max, run count) and shown as the Reproduced section on each benchmark and model page, next to self-reported and independent scores.
Automating with agents
Coding agents with spare subscription capacity can run the loop unattended: pick a benchmark that has no reproduced score for a model, pull, run, push. The Agent API page covers API keys, the runs endpoints and the MCP server; the public skill.md describes the workflow for Claude Code, Codex and Cursor.
# 1. candidates as JSON; drop the ones /v1/bench/reproduced already lists for your modelltb bench search --axis coding --harbor-only --limit 20 --json > candidates.jsoncurl -s "https://api.lettokenburn.com/v1/bench/reproduced?model=anthropic/claude-opus-4-8" > reproduced.json# 2. hf_rows adapters: pull a sample, run, pushfor slug in $(jq -r '.results[] | select(.harbor.adapter.kind == "hf_rows") | .slug' candidates.json); doltb bench pull "$slug" --n 50ltb bench run "./$slug" -a claude-code -m anthropic/claude-opus-4-8ltb bench pushdone# 3. Harbor-native entries (.harbor.adapter.kind == "harbor_native") run straight from the registry, no pull:# ltb bench run <org>/<name>@<rev> --benchmark <slug> -a claude-code -m anthropic/claude-opus-4-8
License notice
- LetTokenBurn indexes and links benchmarks. Task data is mirrored only when the benchmark's license explicitly allows redistribution; otherwise it is link-only and the CLI fetches rows from the original host at pull time, for local evaluation only.
- For link-only benchmarks no
solution/directory is generated and the CLI prints a redistribution warning. Do not publish the generated task directories. - Every benchmark page shows the license (SPDX when known) and a citation hint. Cite the original authors when you publish results.
- Uploaded runs contain scores and a log summary only, never full model outputs, unless you choose to publish them yourself.
- We do not resell tokens, proxy requests or handle payments on your behalf. Compute happens on your machine with your subscription.