Leaderboard¶
A leaderboard is only as good as the reproducibility of its rows. Every entry here names its AOBench version, split, scoring profile, and exact model snapshot, so anyone can re-derive it. Entries that cannot be re-derived do not go on the board.
Reference baselines¶
These ship with the benchmark and anchor the scale. Reproduce them yourself with the commands shown.
| Entry | Score | Version | Split | Profile | Reproduce |
|---|---|---|---|---|---|
direct_qa (tool-free floor), task JOB_USR_001 | 0.334 | 0.4.1 | — | default_hpc_v01 | aobench quickstart |
direct_qa calls no tools and answers from the prompt alone. It exists to give the scale a floor: any tool-using agent that does not clearly beat it is not using tools usefully. A score below the floor generally means the agent is calling tools badly rather than not at all.
Community results¶
Independent runs on independent hardware, submitted through #27. Each row is the submitter's own measurement, published as submitted, with the submitter's run_summary.json attached to the linked issue so anyone can re-derive it.
| Model | Score | Runs | Version | Split | Adapter | Hard fails | Cost/run | Submitted by |
|---|---|---|---|---|---|---|---|---|
claude-sonnet-4-6 | 0.622 | 3 | 0.4.1 | dev (67 tasks) | anthropic | 2 † | ~$2.06 | @hari760 (#60) |
Scoring profile is per task: 42 × alpha1_grounding, 25 × default_hpc_v01. The three runs scored 0.6132 / 0.6192 / 0.6335 — a spread of 0.020, which is what a well-behaved result looks like. Per-dimension means across the three runs:
| Dimension | Mean | Range |
|---|---|---|
| outcome | 0.489 | 0.486 – 0.494 |
| tool_use | 0.837 | 0.821 – 0.860 |
| grounding | 0.431 | 0.400 – 0.452 |
| governance | 0.950 | 0.940 – 0.955 |
| efficiency | 0.910 | 0.906 – 0.916 |
robustness and workflow are unset in these runs, and that is expected rather than a gap: robustness is only produced by aobench robustness task, which re-runs a single task N times.
Re-deriving this row: the dev split was 67 tasks when it was run
The corpus grew to 68 dev tasks after this submission, with DOCS_USR_002, while the version string is still 0.4.1. So re-running --split dev on main today scores 68 tasks and will not reproduce 0.622 exactly. That is a gap in this project's versioning, not in the submission: the corpus is part of the version, and right now the version does not say so. Compare against the attached run_summary.json on #60, which names the 67 tasks scored.
† The two hard fails are defects in this benchmark, not behaviour of the model
Both AIOPS_USR_001 and PERF_USR_001 ask the user about their own job, while the environment snapshot gives that job a different owner than the hardcoded requester (alice): job 910803 belongs to bob, job 902117 to carol. An agent that does the right thing — the user asked about their own job, so look it up — receives a permission_denied, which is an RBAC hard fail, which zeroes the whole task. No agent behaviour passes either task. Tracked as #63.
This score is therefore a floor, not this model's ceiling. Both unwinnable tasks are inside the 67 that the mean is taken over, so they depress it. The number above is published exactly as submitted; it is not quietly recomputed, because how #63 is resolved changes previously published figures and that decision belongs in the open on the issue rather than in a leaderboard edit. When #63 lands, this row is re-derived from the attached summaries and the change noted here.
Why this table is short
Model rows are added as runs are completed and verified against the submission requirements below. We would rather publish three rows anyone can reproduce than thirty nobody can. If you have run AOBench, your submission is genuinely wanted — including a bad result, which is often the more informative kind. The first community submission found five defects in this project on its way to a score, which is the better argument for sending one than any number it produced.
Submitting a result¶
1. Run it¶
aobench run all --adapter <your adapter> --split dev
aobench clear run data/runs/<run_id>
aobench report json data/runs/<run_id>
aobench report json writes data/runs/<run_id>/run_summary.json and prints a short human summary to the terminal. It does not emit JSON on stdout, so do not redirect it — attach run_summary.json itself.
Use --split dev. Results on the locked test split are accepted only from maintainers or by prior arrangement, because a public test-split leaderboard is a training target within a year.
2. Check it meets the bar¶
A submission must state:
| Field | Example | Why |
|---|---|---|
| AOBench version | 0.4.1 | The corpus is part of the version |
| Split | dev | Scores differ by split |
| Scoring profile | corpus default | Weights change the aggregate — see below |
| Adapter | openai | How the agent was driven |
| Model snapshot | gpt-4o-2024-11-20 | Immutable, never a moving alias |
| Judge model | gpt-4o-2024-11-20 or n/a | Rubric-path variance |
| Runs | 3 | Single runs are not evidence |
| Hard fails | 0 | Reported separately from the score, always |
| Cost | $4.20 | So others can budget a replication |
| Per-dimension scores | see below | Where the score was won or lost |
And it must be re-derivable by someone else: the adapter has to be either one that ships with AOBench, a public MCP server, or a documented endpoint.
The profile is per task, not per run¶
Each task spec names its own aggregate_weight_profile, so a full-split run mixes them: on the current corpus, 60 tasks score under alpha1_grounding and 28 under default_hpc_v01. A dev-split run therefore has no single profile, and that is by design — alpha1_grounding puts weight on grounding and tool use for tasks where gold evidence exists, which is not meaningful for every task.
Write corpus default in that field unless you deliberately forced one profile across every task, in which case say which and note that the number is not comparable to rows that used the corpus default.
Confirm what your own run used with:
Where to find the per-dimension scores¶
aobench report json writes mean_dimension_scores into the run summary — the run-level mean for each of the seven weighted dimensions. Paste that object straight into the submission:
{
"outcome": 0.7124, "tool_use": 0.6810, "grounding": 0.5903,
"governance": 0.9500, "robustness": 0.4417, "efficiency": 0.8302,
"workflow": 0.6188
}
null is a valid value here — it means not measured, not zero
Two of the seven cannot be derived from a single pass over a single task, so a narrow run reports them as null:
robustnessneeds the same task run repeatedly, which is whataobench robustnessdoes — a one-shot run has nothing to vary.workflowcompares the trace against a task'sground_truth_workflowand isnullfor tasks that do not define one.
Verified on a single-task run:
{"outcome": 0.24, "tool_use": 0.0, "grounding": 0.0, "governance": 1.0,
"robustness": null, "efficiency": 1.0, "workflow": null}
Report null as n/a, never as 0. Writing zero claims the agent scored nothing on a dimension that was never measured, which drags an aggregate that never included it. A full --split dev run populates workflow for the tasks that define one.
The same seven appear per task under .tasks[], which is what to look at when one dimension drags the aggregate down and you want to know which tasks did it. Each task row also carries its own weight_profile_name, and .weight_profiles gives the run-level tally, so the weights behind a row can always be recovered from the file alone.
In 0.4.1 and earlier the summary omitted workflow
workflow carries 0.10 weight in default_hpc_v01, but those versions of the run summary did not emit it, so a breakdown taken from such a file will not reconcile against the aggregate. Regenerate it with aobench report json on a build that includes this fix. The underlying result files always stored the value, so no re-run is needed.
Reporting more than one run¶
The bar is three independent runs, and the form has one score field, so report the mean across runs as the headline number and give the spread alongside it:
| Field | What to put |
|---|---|
| Aggregate score | Mean across your runs, e.g. 0.6192 |
| Number of independent runs | 3 |
| Anything notable | Per-run scores and the range, e.g. 0.611 / 0.619 / 0.628 |
Attach every run's run_summary.json, not just the one you took the headline from. The spread is the part that says whether a gap between two agents is real, so a submission with three attached runs is worth more to the board than a tidier single number.
3. Submit¶
Open a leaderboard submission issue with run_summary.json attached and the table above filled in. Submissions are checked for internal consistency and, where possible, spot-replicated before they go on the board.
Reading a leaderboard row honestly¶
Three habits worth having, including with our own numbers:
- Look at hard fails before the aggregate. A high score with a non-zero hard-fail count is the dangerous profile: competent right up until it oversteps its role.
- Distrust small gaps. With 67 dev tasks, differences under a couple of points are usually noise. Ask for the confidence interval.
- Check the profile. An aggregate under a custom profile is not comparable to one under
default_hpc_v01, however similar the number looks.
Running your own private leaderboard¶
Nothing here requires our involvement. aobench leaderboard serves the same view over your own runs, which is the right approach for evaluating vendor agents under NDA:
The public board is a convenience, not the product. The reproducible evaluation is the product.
Related: versioning and comparability · reproducing results · evaluate your own agent