00A verifier-centric security-repair benchmark

Repair the vulnerability. The verifier decides.

The score is never self-reported. An agent gets a contamination-safe copy of a vulnerable repo, submits a diff, and a frozen, held-out verifier returns the verdict — the same one for everyone, forever.

real cases
languages
L0–L3
info tiers
Exhibit — one session
session · repo/cJSON.cCVE-2019-11834
@@ cJSON_Minify — heap read past the buffer end
void cJSON_Minify(char *json) { - while (*json) { + while (json && *json) { switch (*json) { - default: skip_oneline(&json); + default: json = skip_oneline(json); }
frozen verifier — heldout + anti-spec
PASS
sha256:9f3a·41 · verif-1
01the online judge

Three calls, one authoritative verdict.

You work locally with your own tools. The server owns only what must be authoritative: the workspace it hands you, and the score it hands back.

POST /sessions

Get the case

Open a session and receive the vulnerable repository plus the task — at a chosen info tier. The fix, the oracle, and the hidden tests never leave the server.

← workspace · task.md · repo/ · budget
POST /check

Iterate for free

Run the public tests on your diff as often as you like. It's feedback, not the grade — it costs no scored attempt, so iterate until they're green.

→ patch.diff   ← public PASS
POST /submit

Face the verifier

The frozen verifier scores the diff and records the attempt. The verdict is coarse — a verdict and a digest — so no number of tries reconstructs the oracle.

PASS / FAIL · digest · pass@k

Less to go on, harder to solve.

The information tier is server-chosen — you can't self-elevate. It's the board you compete on.

L0Code onlythe zero-day setting — no advisoryheadline
L1Advisory prosethe reported symptom, in wordsbaseline
L2Location hintwhere to lookassisted
L3Reference patcha known-good fix to adaptwarm-up

Why the verdict holds.

Passing the public tests isn't passing. The hardened verifier is built to catch the shortcuts.

Held-out variantsThe exploit you can see is one of many. Blocking only that one doesn't pass.
Anti-spec-hackingDelete a test, special-case a witness, or hide the fix behind a flag — the verifier catches it.
One frozen tripleEvery run is compared under the same suite, verifier version, and reward-spec digest.
02the corpus

Every case is a real advisory.

Held-out, differential, contamination-safe. Click any case for its info tiers, live difficulty, and how to open it.

Browse all cases
Loading cases…
03standings

The leaderboard is pass@k.

Iterating is the game, not cheating — submitters are ranked by unbiased pass@k over decisive attempts, with Wilson intervals, all under one frozen triple.

Full standings
frozen triplesuite hardenedverifier v1reward sha256:d0be
live · pass@1
Loading standings…
04quickstart

Install the skill, run the benchmark.

One command installs the rrg client and the agent skill for Claude Code and Codex — no repo clone, no Python package. Then drive a case yourself, or let an agent run a whole suite.

1 · install

Installs the stdlib-only rrg client to ~/.local/bin and the skill into Claude Code and Codex. Requires Python 3.11+ and git.

# one command — installs rrg + the reporepair-bench skill (Claude Code + Codex)
curl -fsSL https://b3.bua.sh/claude-plugins/install.sh | bash
export PATH="$HOME/.local/bin:$PATH"

# point the client at this deployment + your participant key
export RRG_API_URL=https://b3.bua.sh/api
export RRG_ACCOUNT_KEY=rrg_…your_key…

rrg cases            # list the corpus (no key needed)
2 · solve one yourself

Interactive

Lease a case, edit the code in repo/, and let the client build the diff for you (via git). check is free public-test feedback; submit is the scored, held-out verdict.

rrg case open --case canonical-path-containment-001 --info-level 1
# … edit files under ./repo to fix the vulnerability …
rrg check            # run the public tests (free)
rrg submit           # scored by the frozen verifier → PASS/FAIL
rrg finish           # end the episode (best result counts)
A passing submit doesn't end the run — iterating is the intended game; your best result wins.
3 · run a suite with an agent

Claude Code / Codex

The runner leases a session per case and launches an agent through a loopback token-broker (your credential never enters the agent's env). Resume any run; solve several cases in parallel.

# solve the whole corpus with Claude Code, 4 cases at a time
rrg run all --agent claude --parallel 4

# or a language / a specific case, with Codex
rrg run python --agent codex
rrg run canonical-path-containment-001 --agent claude --info-level 3

rrg -r <workdir>       # resume where you left off
Run the agent from a clean shell (ideally under OS isolation) — it executes untrusted model output.
05reference

The session API.

Base URL https://b3.bua.sh/api. Two-layer auth: a participant key opens a session; the returned session token authorizes in-session calls. Scored work runs async via a job you poll.

EndpointAuthWhat it does
GET/casespublicList the corpus: [{case_id, language, title, information_levels}]. Optional ?language=.
GET/leaderboardpublicSubmitter pass@k over one frozen triple, with Wilson intervals + per-tier / per-language slices.
GET/leaderboard/casespublicPer-case difficulty: solve rate across submitters, by tier.
POST/sessionsBearer keyOpen a session for a case_id at an information_level. Returns the session token, task, tool catalog, budget.
GET/sessions/{id}/workspaceBearer tokenDownload the contamination-safe public workspace (tar.gz): the vulnerable repo/ + task.md.
POST/sessions/{id}/checkBearer tokenRun the public tests on a unified-diff patch — free feedback, not scored. Returns a job id.
POST/sessions/{id}/submitBearer tokenScore a patch with the frozen held-out verifier (bounded by the attempt budget). Returns a job id.
GET/jobs/{id}Bearer tokenPoll an async job (?wait=N long-poll). Terminal status carries the coarse verdict + result digest.
DELETE/sessions/{id}Bearer tokenEnd the session and reclaim its sandbox. Recorded results persist.

Most people never call this directly — the rrg client and the agent skill wrap it. But it's a plain HTTP online judge:

# open a session (participant key)
curl -s https://b3.bua.sh/api/sessions \
  -H "Authorization: Bearer $RRG_ACCOUNT_KEY" -H "Content-Type: application/json" \
  -d '{"case_id":"canonical-path-containment-001","information_level":1,
       "submitter":{"model":"m","agent":"a","config_hash":"h"}}'

# submit a patch (session token) → poll the job for the verdict
curl -s https://b3.bua.sh/api/sessions/$SID/submit \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"patch":"… unified diff …"}'