HEMRA

Evaluate · Compare · Improve

Know whether your agent harness actually got better.

HEMRA runs AI agent harnesses on pinned benchmark tasks, records every attempt on your machine, and compares them task by task with the benchmark's own scorer.

# pin a dataset, run two harnesses on it three times each, compare
hemra dataset add hf:harborframework/terminal-bench-2.1/tasks --name tb
hemra run -H claude-code -H gemini-cli -d tb -k 3
hemra compare <run>
  • Claude Code
  • Claude Agent SDK
  • Codex SDK
  • Gemini CLI
  • Goose
  • OpenCode
  • ChatGPT agent mode
  • Codex
  • Pi
  • any Harbor agent
  • your own harness
12
commands
6
ways to run an agent
4
dataset sources, pinned
0
accounts or telemetry

Four nouns, thirteen commands

Everything in HEMRA is a dataset, a harness, a sandbox or a run. A run is datasets × harnesses × attempts, recorded under one ID, and every result is filed under a run.

Dataset

Pinned by digest

Tasks are copied into the store and pinned, never referenced. Sources: a local Harbor-format folder, harbor:name@version, swebench:verified and hf:org/repo@rev, pinned at one commit and hash-checked.

Harness

One TOML file

A harness file's via says how the agent runs: program, cli, sdk, acp, computer-use or harbor. Versions and models are pinned; environment variables are named, never stored.

Sandbox

Docker or local

By default each trial runs in the task's own image in a hardened container: no network, no capabilities, no-new-privileges, bounded memory, CPU and PIDs. --sandbox local runs it as a process.

Run

Queued and durable

One job per trial in a durable queue that survives restarts. Only infrastructure failures are retried, always as a new attempt. --detach hands the run to hemra serve.

Any agent, through its own interface

Native drivers run an agent the way its users do and translate what it does into HEMRA's event protocol. They report what the agent did, keep its raw transcript, and never turn an agent's claim of success into a score.

via = "cli"

Command-line agents

Each agent through its own JSON output: claude -p --output-format stream-json, codex exec --json and pi --mode json, with isolated agent profiles and recorded transcripts per tested version.

Claude CodeCodexPi
via = "sdk"

Agent SDKs

Agent SDKs driven from TypeScript, with permission requests answered by the profile.

Claude Agent SDKCodex SDK
via = "acp"

Agent Client Protocol

An ACP client for any ACP agent. File and terminal requests are served only inside the workspace, and permission requests are answered by the profile.

Claude Code ACPCodex ACPGemini CLIGooseOpenCode
via = "computer-use"

Agent products in a browser

Operates a product's own UI in Chromium with a scripted recipe. A login wall or outage is an infrastructure error, never a task failure.

ChatGPT agent mode
via = "harbor"

Harbor agents

One supervised Harbor job per dataset. HEMRA keeps everything Harbor wrote and imports the official reward unchanged.

CodexPiany Harbor agent
via = "program"

Your own harness

Anything that speaks the HEMRA harness protocol: versioned JSON lines on stdio, in any language. The TypeScript SDK gives you the bootstrap and the session rules.

@hemra/sdkPOSIX sh

Built so the numbers hold up

A harness finishing is not a task passing. HEMRA keeps how a run ended and whether the task passed apart, and says where every number came from.

Scored by the task's own verifier

Native runs are scored with the task's unchanged tests/test.sh in a separate container, on a snapshot of the agent's work. Multi-step tasks run step by step from each step's snapshot, every step scored by its own verifier. Verifier problems are evaluation failures, never task failures.

Judges, kept apart

A rubric judge that ships with a dataset is read criterion by criterion, with every judge's reasoning. Your own judges in judges/ score the answer, the artifacts, the tools used or the workspace, with no network and the key held on the host, and never pair with the benchmark's score.

Official scores, imported

hemra import reads Harbor job directories and SWE-bench runs, keeps their files byte for byte and copies rewards verbatim. Versions are pinned and tested against recorded fixtures.

Paired, honest comparison

hemra compare pairs results task by task, only where the scorer fingerprint matches. It flags differing models, unpinned or drifting versions and differing tool sets, and never adds up across datasets.

MCP through a recording proxy

Declare pinned MCP servers in the harness file. Agents reach them only through HEMRA's proxy, which records every tools/call, digests the tool list, and applies allow rules.

Everything recorded locally

Attempts, transitions, event logs streamed as they arrive, and content-addressed artifacts, in SQLite and JSONL on your machine. Export any run as a bundle. No account, no telemetry.

Remote workers

hemra worker leases jobs from a controller over HTTPS. Results commit only under the live lease and generation; anything else is refused and never stored.

Live traces

hemra serve gives you a read-only API and a web dashboard: follow an attempt's events live, open artifacts, read run reports and compare runs, and browse the pinned datasets, the harness files runs used, and every scorer and judge behind the scores.

Checks before you spend

hemra doctor lists the tools it found, the sandboxes and what each enforces. --require fails closed before anything is recorded; --prune removes containers a killed runner left behind.

A Mac app

Browse a store, build and start runs, watch them live, cancel, import and export, get notified when a run finishes, and lease the queue to remote workers. Download

See every step an agent took

The same views in the web dashboard and the Mac app. Recorded from HEMRA's own end-to-end runs.

An attempt's trace: Claude Code in a task's Docker image, scored passed by the task's verifier, with its model, tool and metric events.
A Claude Code attempt in the task's own image, scored by the task's verifier.
Paired comparison of an oracle Harbor run and a native Claude Code run, task by task, with a flag that the execution paths differ.
Paired comparison, with a flag where the two sides ran differently.
The Mac app's run report: each harness against the oracle baseline, per dataset.
A run report in the Mac app: each harness against a baseline, per dataset.
The Mac app's run builder: pick datasets and harnesses, preview, start.
Building a run in the Mac app from pinned datasets and harness files.

The command surface

Thirteen top-level commands. New ways to run an agent add a via, not a command.

CommandWhat it does
hemra dataset add|list|show|rmPin tasks from a folder, harbor:, swebench: or hf:.
hemra harness add|list|show|checkWrite, inspect and try harness files; check runs one trivial task and compares versions.
hemra judge add|list|show|checkWrite and try your own judges; run --judge applies one, compare --judge compares by it.
hemra runRun harnesses × datasets × attempts, in Docker or locally, now or detached.
hemra runs, hemra showList runs; show any run, import, job or attempt, its events or its report.
hemra comparePair two imports or run cells, or report a whole run against its baseline.
hemra import, hemra exportBring in a Harbor job or SWE-bench run (detected); export anything as a bundle.
hemra cancelCancel a run, job or attempt.
hemra serve, hemra workerAPI, dashboard and queue workers; remote workers leasing the same queue.
hemra doctorTools, sandboxes and their guarantees; prune leftover containers.

Try it in a minute

HEMRA is in early development (v0.1, Linux and macOS). Build it with Rust 1.80 or later and run the sample harness on the one-task example dataset.

Local first. The store is a folder (.hemra by default). HEMRA makes no network calls of its own and keeps environment variable names only, never values.
git clone https://github.com/UmaiTech/hemra && cd hemra
cargo build -p hemra-cli
# pin the example tasks and run the sample shell harness on them
target/debug/hemra dataset add examples/tasks --name examples
target/debug/hemra run -H echo-sh --harness-dir examples/harness-sh \
  -d examples -k 3 --sandbox local
# read it back, then open the dashboard
target/debug/hemra runs
target/debug/hemra serve