pinchbench/skill repository at v1.1.0. That release contains 23 tasks in 15 categories: 9 use automated grading, 7 use an LLM judge, and 7 combine both. The typical stack is the openclaw harness with a recipe-backed docker, daytona, or modal environment.
How it works
A PinchBench run separates task loading, agent execution, and grading:- Resolve task data. The controller uses
AGENTCOMPASS_PINCHBENCH_SKILL_DIRwhen it is set. Otherwise it clonesskill_repo_urlatskill_repo_taginto<data_dir>/pinchbench/skill. It discovers sortedtasks/task_*.mdfiles and parses their YAML frontmatter plus thePrompt,Expected Behavior,Grading Criteria,Automated Checks, andLLM Judge Rubricsections. - Select tasks.
suiteis applied first, thenlimit, and finally the runtime appliessample_ids. Unknown task ids fail fast. Each task supplies its category, grading type, timeout, initial workspace files, and optional sequence of user messages. - Prepare an isolated workspace. The PinchBench recipe selects
ailabdocker/ac-openclaw:pinchbench-v1unless the environment explicitly supplies an image. Docker, Daytona, and Modal recipes default to/workspace; the benchmark creates a unique<root>/pinchbench/<task-id>/<random-id>directory. Inline files are written there and referenced files are uploaded from the skill repository’sassets/directory. - Run OpenClaw. The harness creates a unique OpenClaw agent for the task, sends the task prompt or its
sessionsprompts in order in one OpenClaw session, and records the final answer and ACTF_v1.0 trajectory. See OpenClaw for model onboarding, search credentials, context limits, and install behavior. - Grade in the same environment. AgentCompass uploads its self-contained grading runner and invokes it with
python3from the task workspace. Automated graders can inspect both the raw OpenClaw transcript and files produced in the workspace. LLM and hybrid tasks also call the configuredjudge_modelfrom inside that environment.
The current OpenClaw harness sends all prompts declared under a task’s
sessions field through one OpenClaw session. Additional session metadata such as the upstream new_session flag is not interpreted by the AgentCompass integration.All 23 task ids in v1.1.0 (click to expand)
All 23 task ids in v1.1.0 (click to expand)
task_00_sanity, task_01_calendar, task_02_stock, task_03_blog, task_04_weather, task_05_summary, task_06_events, task_07_email, task_08_memory, task_09_files, task_10_workflow, task_11_clawdhub, task_12_skill_search, task_13_image_gen, task_14_humanizer, task_15_daily_summary, task_16_email_triage, task_16_market_research, task_17_email_search, task_18_spreadsheet_summary, task_20_eli5_pdf_summary, task_21_openclaw_comprehension, task_22_second_brain.Selectors use the id in each task’s frontmatter, not the Markdown filename. In particular, the pinned release intentionally exposes task_16_market_research and task_18_spreadsheet_summary; there is no task_19_* id.Category and grading-type counts (click to expand)
Category and grading-type counts (click to expand)
Categories:
comprehension (4); file_ops (3); research (3); writing (2); and basic, calendar, coding, complex, content_transformation, context, creative, data_analysis, memory, organization, and synthesis (1 each).Grading types: automated (9), llm_judge (7), and hybrid (7).Data and dependencies
There is no separaterequirements/pinchbench.txt. A normal AgentCompass installation already provides the controller-side Python dependencies. PinchBench additionally requires:
giton the controller for the default skill-repository clone;- a configured Docker, Daytona, or Modal environment that can obtain the runner image;
openclawandpython3in a custom runner image (the recipe’s default image is prepared for them);- network reachability from the task environment to the model-under-test endpoint and, for LLM/hybrid tasks, the judge endpoint.
BRAVE_API_KEY in the shell or a private OpenClaw harness config. It is not required by the PinchBench loader itself, and tasks that do not need web search can run without it.
On first use, the default loader runs a shallow clone of skill_repo_url at skill_repo_tag. A cached checkout is reused only when git describe --tags --exact-match HEAD matches the requested tag. A mismatched checkout under <data_dir>/pinchbench/skill is removed and cloned again, so do not keep local edits in that cache. Set AGENTCOMPASS_PINCHBENCH_SKILL_DIR to an external checkout when developing custom tasks.
Parameters
Pass benchmark parameters as JSON through--benchmark-params '{...}', or configure the equivalent fields under benchmarks.pinchbench in YAML. Harness and environment options are documented separately on their respective reference pages.
Task and grading parameters
| Parameter | Type | Default | Allowed values | Description |
|---|---|---|---|---|
suite | string / list | all | all, automated-only, comma-separated task ids, or a task-id list | Selects the upstream suite before limit. A list always means exact task ids. |
limit | int | 0 | integer >= 0 | Keeps the first N tasks after suite filtering; 0 means no limit. |
judge_model | dict | {} | id, base_url, api_key, api_protocol, params | Judge model spec. Supply a reachable endpoint for llm_judge and hybrid tasks; it is unnecessary for automated-only. |
judge_timeout_seconds | float | 360.0 | positive float | Timeout for one judge request; independent of the overall evaluation deadline. |
Data parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
skill_repo_url | string | https://github.com/pinchbench/skill.git | Git repository cloned under <data_dir>/pinchbench/skill when no environment-variable override is set. |
skill_repo_tag | string | v1.1.0 | Branch or tag passed to git clone —depth 1 —branch and used to validate the cache. |
Judge model spec
judge_model must contain an id. A complete independent spec also provides base_url, api_key, and api_protocol; request options go under params. The grader supports openai-chat, openai-responses, and anthropic. Although omitted connection fields can inherit from the model-under-test spec during plan construction, use a complete, fixed judge endpoint for comparable full-suite results.
When judge_model is empty, the grader supplies only the fallback id openrouter/anthropic/claude-opus-4.5; it has no base URL, credential, environment-variable lookup, or other connection fallback. The judge call therefore fails before sending an HTTP request. An llm_judge task scores zero, while a hybrid task gets a zero LLM component but may retain the weighted contribution from its automated component. Treat judge_model as required for any suite containing those tasks.
The judge receives the task prompt, expected behavior, rubric, and a compact transcript summary containing user messages, tool calls, and shortened tool results. It does not independently open workspace files. The expected response is JSON with per-criterion scores, a total in the 0-1 range, and optional notes.
The removed verifier_timeout_multiplier scaled a single judge request. To preserve its previous behavior, set judge_timeout_seconds to the previous request timeout (default 360) multiplied by the old multiplier; for example, multiplier 2 becomes judge_timeout_seconds: 720. PinchBench has no default evaluation phase deadline. To bound the entire evaluator, set execution.evaluation_timeout_seconds; evaluation_timeout_multiplier alone cannot create a deadline.
Run examples
The command shape isagentcompass run pinchbench openclaw <model>. The runner image already contains OpenClaw, so the default auto install strategy resolves to preinstalled for the recipe-backed environments. Replace any context or completion limits in your private OpenClaw config with the model’s real values.
- Smoke test (single task end-to-end)
- Custom parameters
- AgentCompass recommended config
task_00_sanity is automatically graded, so this checks task loading, image startup, OpenClaw execution, and in-environment grading without requiring a judge endpoint.--env daytona or --env modal with the provider credentials described on the Daytona and Modal pages. Their PinchBench recipes select the same default runner image unless the common setup.image is explicitly configured.
Outputs
Every grading path returnsscore, max_score=1.0, a per-criterion breakdown, and notes:
- Automated: the grader extracts the Python
grade(transcript, workspace_path)function embedded in the task’sAutomated Checkssection. The task score is the arithmetic mean of the numeric values in the returned dictionary. - LLM judge: the configured judge scores the task from the rubric and compact transcript summary. Its normalized
totalbecomes the task score; parse failures, empty responses, endpoint failures, and timeouts produce a zero score with diagnostics. - Hybrid: the automated and LLM scores are combined using the task frontmatter’s
grading_weights. If weights are absent or sum to zero, the two sides receive equal weight. Breakdown keys are prefixed withautomated.andllm_judge..
metrics.score is the normalized score ratio and remains the primary headline observation. The Metric Contract also emits auxiliary passed=true only when score >= max_score (normally a perfect 1.0) and that attempt’s Harness execution and grading both complete successfully. The underlying grading diagnostic may also contain its own correct field, but metrics.passed is the binary observation used for aggregate series. If the grading runner itself fails, the diagnostic records score=0, max_score=1, an empty breakdown, and the failure text in notes, while the attempt has an error status and passed=false.
Aggregate scoring
PinchBench declares the canonical scalar primary metricscore, displayed as “Score Ratio,” and the binary auxiliary metric passed, displayed as “Full-Score Pass Rate.” At k=1, reports expose score.native@1 as the headline before passed.native@1. At k>1, strategy=avg emits score.avg@k, passed.avg@k, and passed.pass@k; it averages exactly k valid score ratios for each task before run-level aggregation. strategy=pass remains unsupported because the primary metric is scalar—the auxiliary passed.pass@k series does not enable early stopping. micro_weighted averages valid task values, while category_mean averages valid category means. See Metrics and Aggregation.
Output files
Per-task records are written to the run directory’sdetails/ subdirectory; run-level output uses summary.md and metrics.json. Each task file contains an attempts map. The most relevant fields are:
Workspace deliverables are available to the grader inside the task environment but are not automatically copied into the result directory. Pass
--keep-environment while debugging if you need to inspect those files directly. For params.json, progress files, logs, and the common reuse behavior, see Results.