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:
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-17dec32). - 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 benchmark auto-detects the data version (
data_version: "auto") by checking for the presence of task.md vs instruction.md.
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 | ”auto" | "auto” / “1.0-17dec32” / “1.1” | Data layout version. “auto” detects per task (has task.md = v1.1, has instruction.md = v1.0-17dec32). Specifying explicitly forces all tasks to use the same layout. |
dataset_source_dir | string | "" | local path | Path to a local tasks directory. Not needed if the data is already under data/skillsbench/tasks/. |
dataset_zip_url | string | "" | URL | Remote ZIP URL for downloading the dataset when local data is absent. |
timeout_multiplier | float | 1.0 | positive float | Multiplier applied to both agent inference and verifier timeouts. Increase for slower agents; the base verifier timeout comes from each task’s frontmatter (agent.timeout_sec). |
k, avgk, and sample_ids follow the conventions in Benchmark Parameters.
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 takes the formagentcompass run skillsbench <harness> <model>, whose three positional arguments are:
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 (ailabdocker/ac-skillsbench-v1-1:<task_id>).
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 produces two kinds of results, both underresults/skillsbench/<model>/<run>/: aggregate metrics (summary.md, overall performance) and per-task details (details/, per-task verification logs).
Aggregate metrics (summary.md)
summary.md contains a run overview and metrics.
Run overview
Metrics
The single headline metric is
mean_score: the average of per-task reward values. The reward ranges from 0.0 to 1.0, where some tasks are binary (0 or 1) and a few support fractional scores. Therefore mean_score approximately but not exactly equals the fraction of correctly solved tasks — partial-credit tasks allow mean_score to take non-integer values.
Per-task details (details/)
Each task has one JSON file. Key fields for tracing the verification verdict:
When verification fails (test.sh crashed, container unreachable, etc.), the task is recorded as
correct=false with status=EVAL_ERROR, and the failure reason is recorded in error and extra.verify_log.