test.sh script (typically running pytest) checks the agent’s output against ground-truth expectations and writes a reward value to /logs/verifier/reward.txt. The reward is a float between 0.0 and 1.0: some tasks use binary scoring, while a few give partial credit based on test pass rate. No judge model is needed, so grading incurs no API cost.
Data versions
SkillsBench has two data versions, both containing the same 87-task roster but with different file layouts. Thedata_version parameter controls which layout the benchmark uses, defaulting to "1.1".
data_version also determines the image pulled from Docker Hub: v1.1 → ailabdocker/ac-skillsbench-v1-1:<task_id>, v1.0 → ailabdocker/ac-skillsbench-v1-0:<task_id>.
How it works
A SkillsBench run has two stages — agent execution and verification.Agent execution
The model under test acts as a coding agent inside a Docker container. Driven by the harness (verified harnesses:openhands, openclaw, or claude_code), the agent receives the task description, explores the workspace, writes code, invokes skills, and produces the required output files.
Verification
After the agent finishes (or times out), the benchmark performs the following steps:- Upload verifier scripts (
test.sh+ test files) from the local dataset into the container at/verifier/(v1.1) or/tests/(v1.0). - Run
test.shin the agent’s modified workspace. The script typically installspytest, runs test cases, and writes a reward value to/logs/verifier/reward.txt(some tasks use1/0binary scoring, while a few give0.0~1.0partial credit based on test pass rate). - Read the reward — the score is deterministic and reproducible.
Task data format
Each task directory contains:
The data version (v1.1 / v1.0) is set explicitly via the
data_version parameter, which determines both the file layout above and the corresponding image. See Data versions above.
Parameters
Pass a JSON object via--benchmark-params '{...}'; it can also be written into the benchmark.params block of the YAML given to --config, with CLI taking precedence on shared keys. See Benchmark overview for merge precedence.
| Parameter | Type | Default | Choices / values | Description |
|---|---|---|---|---|
data_version | string | ”1.1" | "1.1” / “1.0” | Data layout version; also determines the image (v1.1 → ac-skillsbench-v1-1, v1.0 → ac-skillsbench-v1-0). Defaults to “1.1”. |
sample_ids follow Benchmark Parameters. SkillsBench declares scalar score as its primary Metric Contract observation and binary passed as an auxiliary observation. At k>1, use avg to aggregate complete observations; selecting pass fails preflight because the primary is scalar. See Metrics and Aggregation.
Task categories (click to expand)
Task categories (click to expand)
Difficulty distribution: easy (6), medium (53), hard (28). Total: 87 tasks.
Run examples
The SkillsBench run command has this form:skillsbench— the benchmark id;<harness>— the harness that drives the coding agent inside the container. AgentCompass recommendsopenhands;openclawandclaude_codeare also supported.<model>— the model under test; its access credentials are passed via--model-base-url/--model-api-key.
--env docker — each task runs inside its own Docker container. The skillsbench_docker recipe is auto-applied and resolves the correct image for each task from Docker Hub: v1.1 pulls ailabdocker/ac-skillsbench-v1-1:<task_id>, v1.0 pulls ailabdocker/ac-skillsbench-v1-0:<task_id>, determined by data_version.
Recommended harness
AgentCompass recommends theopenhands harness.
- Smoke test (single task end-to-end)
- Custom parameters
- AgentCompass recommended config
Use
sample_ids to evaluate a single task, verifying that the end-to-end agent and verifier flow works correctly.Other optional harnesses
claude_code and openclaw are two other supported harnesses. The command form is identical to openhands — just replace the second positional argument with the corresponding harness id.
- Claude Code
- OpenClaw
Run the Claude Code harness on a single task as a smoke test:
Outputs
A run writes per-task details and the aggregate viewssummary.md and metrics.json under the run directory.
Metric Contract and aggregate series
summary.md keeps the traditional metric and detail tables at k=1; at k>1, it shows the attempt plan plus headline and auxiliary series with independent Evaluated, Error, Unavailable, and Total counts. metrics.json preserves every series and breakdown.
SkillsBench declares scalar primary metric score, the reward from 0.0 to 1.0, and binary auxiliary metric passed. A completed attempt has passed=true exactly when its reward is 1.0; partial credit therefore contributes to score without counting as a pass. At k=1, score.native@1 is the headline and appears before passed.native@1. At k>1, the avg strategy emits score.avg@k, passed.avg@k, and passed.pass@k. Selecting the pass execution strategy still fails during preflight because the primary is scalar; the auxiliary passed.pass@k series does not enable early stopping.
Per-task details (details/)
Each task has one JSON file. Key fields for tracing the verification verdict:
When verification does not produce a readable reward, the attempt has
status=eval_error and passed=false; the failure reason is recorded in its error and meta.benchmark.verify_log fields.