Run and evaluate verifiers tasksets. Set up the necessary config files and observe the runs and their results.
60
71%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./skills/evaluate-environments/SKILL.mdSet up an evaluation for a taskset in the correct way to reproduce results from others or evaluate a model and harness combination on a given taskset.
Use the eval entrypoint
uv run eval <MY_ENV>uv run eval <MY_ENV> --dry-runvalidate:uv run validate <MY_ENV> --runtime.type subprocessuv run eval <MY_ENV> -m deepseek/deepseek-v4-flash -n 3 -r 1When the user requests a full run, do not restrict the number of tasks. Ask for the appropriate harness to use (if not specified)
A plugin id names an installed package (e.g. my-taskset); verifiers imports it and never installs anything itself.
The leading ID is shorthand for --env.taskset.id. A harness belongs to an agent — --env.agent.harness.* on the single-agent env, --env.<agent>.harness.* on a multi-agent one (there is no run-level --harness.*):
uv run eval my-task-v1 --env.agent.harness.id codex --env.agent.runtime.type primeThe env — the control flow between agents — owns the whole [env] block. Empty --env.id
keeps the taskset's own story (its exported Env subclass, else the single-agent
env); --env.id pairs a reusable env with any taskset, its knobs typed under --env.*:
uv run eval my-task-v1 --env.id best-of-n --env.n 8 # pass@k / rejection sampling
uv run eval my-task-v1 --env.id agentic-judge \
--env.judge.runtime.type docker # a judge agent verifies each attempt in a sandboxAlmost every harness comes with a disabled_tools list, which can be used to disable one or multiple tools:
[env.agent.harness]
disabled_tools = ["shell_tool"]The names of these tools are set by the respective harness. Research the relevant first party documentation for the given harness for the relevant name(s). Some harnesses do not offer support to disable tools.
The CLI help is generated from the current config classes. Include the taskset and env ids you plan to use before --help so their concrete config fields are loaded:
uv run eval my-task-v1 \
--env.id best-of-n \
--helpFor implementation details and defaults, start at verifiers/v1/configs/cli/eval.py and follow its fields into verifiers/v1/configs/. Client configs live in verifiers/v1/configs/client.py, sampling in verifiers/v1/types.py, and runtime- and harness-specific configs next to their implementations in verifiers/v1/runtimes/ and verifiers/v1/harnesses/. Custom taskset and env config fields live next to those implementations.
Taskset settings:
uv run eval my-task-v1 --env.taskset.split test --env.taskset.difficulty hardHarness and runtime settings:
uv run eval my-task-v1 \
--env.agent.harness.id rlm \
--env.agent.runtime.type docker \
--env.agent.runtime.cpu 4 \
--env.agent.runtime.memory 8Sampling:
uv run eval my-task-v1 \
--sampling.temperature 0.7 \
--sampling.top-p 0.95 \
--sampling.max-tokens 2048 \
--sampling.reasoning-effort mediumAlways research the correct sampling parameters first. This is one of the most important settings, so make sure to find the correct values. For open models, you can find them on Hugging Face in the README and/or in the generation config.
Your parameter selection or settings should leave room for full runs, and you should not restrict things like tokens or number of turns unless specified by the user.
Leave optional settings unset unless the user asks for them. Always confirm the harness, runtime, and sampling parameters before running an evaluation.
You can also use a TOML:
model = "openai/gpt-5-mini"
[env.taskset]
id = "my-task-v1"
split = "test"
[env.agent]
runtime = { type = "subprocess" }
[env.agent.harness]
id = "bash"
[sampling]
temperature = 0.7uv run eval @ configs/my-eval.tomlWhole-rollout retry is opt-in. That means if something fails in the rollout, the whole rollout is retried. This is very useful for large-scale runs. You can also restrict certain errors from the retries:
uv run eval my-task-v1 \
--env.agent.retries.max-retries 2 \
--env.agent.retries.include SandboxError ProviderError \
--env.agent.retries.exclude TaskErrorA run writes to output_dir / run.dir (-o sets output_dir, default outputs; run.dir defaults to the auto-generated run name):
outputs/<env>--<model>--<harness>--<short-id>/
├── configs/eval.json
├── logs/eval.log
└── traces.jsonlconfigs/eval.json is the run's resolved config, re-runnable via @. traces.jsonl is one episode per line — the episode's traces plus their shared standing — appended after each episode finishes, so an episode is durable whole or not at all (a torn last line is the whole episode redone on resume).
Resume in place by re-running the run's own saved config with --resume (it re-runs only the missing/errored rollouts; any config drift from the saved run is refused):
uv run eval @ <run-dir>/configs/eval.json --resumeTo overwrite a run dir and start fresh instead, use --clean.
For each representative sample inspect:
task and prompt fields;branches, assistant messages, tool messages, and stop condition;rewards, aggregate reward, and metrics;info artifacts;error/errors and boundary type;calls records (model, sampling, finish reason, usage, timing, error) linked to the graph;Classify outcomes:
Do not average these categories together without reporting failure rate.
c51c094
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.