Tier 3: Live Agent Evaluation

View as Markdown

Tier 3 answers the question the other tiers can’t: does your skill actually make an agent better at the task? It is the one tier that needs real infrastructure — an evaluator LLM key, the selected agent’s own credential, and Docker or another sandbox. This guide takes you from a skill directory to a finished with-skill vs. without-skill comparison.

What a live eval measures

SkillEvaluator runs a real agent (codex, claude-code, or opencodeclaude is accepted as an alias for claude-code) against the same eval cases twice: once with the skill installed (the with-skill arm) and, unless you pass --skip-baseline, once without it (the baseline arm). Both arms execute inside a selected Harbor environment. Harbor is the open-source agent evaluation framework that runs the trial, so the only experimental variable is the skill itself. Skill Lift is the signed difference between the two arms — the direct measurement of what your skill contributes. With multiple attempts per case, pass@k adds a reliability signal alongside it.

With default or default_plus_custom grading, reports lead with five human-readable dimensions:

DimensionQuestion answered
SecurityIs it safe to use?
CorrectnessDoes it do what it’s supposed to?
DiscoverabilityIs it loaded when it should be?
EffectivenessIs it better with the skill than without?
EfficiencyDoes it use fewer tool calls and tokens?

In custom_only mode, your own grader defines the score instead — see Custom Graders & Tasks.

Before you start

Every row below is checkable in seconds; the linked guide covers setup in depth.

RequirementHow to checkCovered in
The tier3 extra installed ([all] includes it)skillevaluator health-checkInstallation
An evaluator LLM provider keyskillevaluator doctor --agents codex --env-mode docker names any missing keyProviders & Credentials
The agent and its credentialSame doctor run, with your agents; tier3 evaluate re-validates before any runAgents & Sandboxes
Docker running (the default environment)docker infoAgents & Sandboxes

Run your first evaluation

1

Check readiness

Verify the runtime before spending compute
$skillevaluator doctor --agents codex --env-mode docker

doctor takes seconds and names anything missing: the evaluator provider, the selected backend’s prerequisites, and unsupported agent names. Add --verify-models to live-probe each agent’s model against the provider’s catalog — one pass/fail row per agent — and --agent-model AGENT=MODEL to check an override before committing to a run. skillevaluator health-check is the quicker CLI-and-backend variant; Agents & Sandboxes covers both in depth.

2

Generate an eval dataset

Write the four-bucket dataset to evals/evals.json
$skillevaluator create-eval-dataset ./my-skill --full

--full generates four case buckets — explicit, implicit, and contextual positives plus a negative case that should not trigger the skill. Generation uses your configured evaluator provider; --no-llm falls back to keyless local templates. The dataset format, EVAL.md guidance, and refinement options live in Eval Datasets.

3

Review the cases

Open evals/evals.json. Each entry has an id, a prompt the agent will receive, an expected_output, and optional assertions the grader checks. Edit freely — the generated cases are a starting point, and the run is only as good as its dataset.

4

Run the comparison

With-skill vs. without-skill in Docker
$skillevaluator tier3 evaluate ./my-skill --agents codex --env-mode docker \
> --agent-model codex=gpt-5.4-mini

Every supported agent harness works the same way:

Choose an agent harness
$skillevaluator tier3 evaluate ./my-skill --agents opencode --env-mode docker
$skillevaluator tier3 evaluate ./my-skill --agents codex --env-mode docker
$skillevaluator tier3 evaluate ./my-skill --agents claude-code --env-mode docker

Use --agent-model AGENT=MODEL whenever the evaluator provider’s default model is not valid for that agent — for example, codex needs an OpenAI-compatible Responses model. When the run completes, results land in a timestamped directory:

Something went wrong!
5

Read the report

Open the HTML report, then compare across agents
$skillevaluator view ./my-skill
$skillevaluator compare ./my-skill

view opens the latest HTML report; compare summarizes stored results across agents and arms. Reports & Results explains everything the run wrote and how to interpret it.

How a run works

tier3 evaluate reads the accepted dataset (or native task source) and builds a Harbor task bundle. Before spending the full A/B matrix, a runtime preflight runs one real, bounded smoke task per agent to confirm each agent runtime actually works (on by default; disable with --no-agent-runtime-preflight). Harbor then starts the selected environment and runs the agent in both arms; with standard grading, each transcript is judged against the case’s expected output and assertions using the configured evaluator provider. Finally, SkillEvaluator collects the artifacts and computes the dimension scores, pass rates, and Skill Lift. Harbor task and job directories are transient: they are deleted after collection whether the run succeeds or fails, unless you pass --harbor-keep-jobs.

Two credential roles are involved: the evaluator provider generates datasets and performs standard grading, while the live agent uses its own native credential. Both come only from the host environment — a checked-out skill can never supply, replace, or reroute them:

CredentialUsed forHow to set
Evaluator LLM providerDataset generation and standard gradingSKILL_EVAL_LLM_PROVIDER plus the provider key — see Providers & Credentials
Live agent credentialThe agent actually performing the taskExport it in the host environment where you run skillevaluator
Agent credentials are host-environment exports, never config entries
$export SKILL_EVAL_LLM_PROVIDER=openai
$export OPENAI_API_KEY=sk-... # evaluator, and codex's runtime
>export ANTHROPIC_API_KEY=sk-ant-... # claude-code's runtime

evals/config.yml may still add permitted task-scoped values through harbor.runtime_env, but any entry that names — or ${VAR}-references — an operator-owned credential (OPENAI_API_KEY, ANTHROPIC_API_KEY, NVIDIA_API_KEY, the base-URL variables, AWS_*) fails the run with a hard error. This prevents a skill from swapping a credential or routing a trusted key to an attacker-controlled endpoint. Providers & Credentials lists every blocked name.

runtime_env also cannot override host launcher, language-runtime, Docker, Compose, proxy, or tracing controls. Configure the selected backend in the host environment instead.

One deliberate exception collapses the two roles: with the nv_build provider in --env-mode docker or local, a single NVIDIA_API_KEY powers the evaluator and all three agents. Direct OpenCode talks to NVIDIA Build directly; Codex and experimental Claude Code use a Docker or local compatibility bridge. SkillEvaluator never changes models silently: explicit overrides are preserved. Without an override, bridged agents default to Nemotron Super (nvidia/nemotron-3-super-120b-a12b); direct OpenCode defaults to nvidia/nemotron-3-nano-30b-a3b (rendered nvidia/nvidia/nemotron-3-nano-30b-a3b). Override models explicitly when you want to compare harnesses or models:

NVIDIA Build model overrides
$skillevaluator tier3 evaluate ./my-skill --agents opencode --env-mode docker \
> --agent-model opencode=nvidia/nvidia/nemotron-3-super-120b-a12b
$skillevaluator tier3 evaluate ./my-skill --agents codex --env-mode docker \
> --agent-model codex=nvidia/nemotron-3-super-120b-a12b
$skillevaluator tier3 evaluate ./my-skill --agents claude-code --env-mode docker \
> --agent-model claude-code=nvidia/nemotron-3-super-120b-a12b
$skillevaluator tier3 evaluate ./my-skill --agents opencode --env-mode docker \
> --agent-model opencode=nvidia/meta/llama-3.1-8b-instruct

On cloud env-modes the bridges are unavailable: opencode still works with NVIDIA_API_KEY directly, but codex and claude-code fall back to their own native credentials and explicit models — see Agents & Sandboxes.

Where agents run

Docker is the default and needs only a running daemon. The same --env-mode flag also selects local mode, which runs the agent CLI directly on the host under an OS-sandbox policy, and 14 additional Harbor-native backends (such as daytona, e2b, and modal), each requiring the matching Harbor environment extra. The complete environment matrix, Docker resource tuning, local-mode safety controls, and workspace modes live in Agents & Sandboxes.

Local mode executes the agent on your host rather than in a container. It is experimental and intended for trusted skills and workspaces — use Docker or a cloud backend for untrusted code.

Two ways to run Tier 3

Use caseCommandWhen to use
Full validationskillevaluator validate ./my-skill --tier3Add advisory Tier 3 results after the standard validation stages
Focused evaluationskillevaluator tier3 evaluate ./my-skill --agents codexIterate on datasets, agents, environments, and grading settings

Attached to validate, Tier 3 is advisory: its results appear in the combined reports but never change the exit code. --full is the one-shot variant — Tier 1+2+3 with --autopilot dataset generation — and --autopilot on its own enables Tier 3 while generating an eval case when none exists.

validate forwards a dedicated Tier 3 flag group (--agents, --env-mode, --grading-mode, and the rest) to the live-eval engine whenever Tier 3 is enabled — via --tier3, --autopilot, --full, or the --agent-eval alias. --agent-eval is a supported compatibility alias and is not currently deprecated. See the CLI Reference for the full group.

Plan for cost

Tier 3 performs live model and agent calls, so it can incur provider charges and, with a managed cloud environment, sandbox charges. A useful estimate of the trial volume is:

eval cases × agents × attempts × arms

A standard comparison has two arms (with-skill and without-skill). Each trial can make multiple agent-model requests, standard grading adds evaluator-model calls, dataset generation can add more, and the default runtime preflight adds one small smoke task per agent. Actual charges therefore depend on the selected models, token usage, agent behavior, and environment pricing; SkillEvaluator does not estimate a fixed dollar amount. Check the current pricing for your NVIDIA API Catalog, OpenAI, Anthropic, or Amazon Bedrock provider and, when applicable, your cloud sandbox vendor.

Start with one agent, a small reviewed dataset, and --n-attempts 1. During dataset iteration, --skip-baseline removes the without-skill arm and usually cuts the live trial count roughly in half, but that run cannot produce Skill Lift. Re-enable the baseline for any result you intend to compare or publish. For multi-attempt runs, --stop-on-pass can avoid remaining attempts after a pass; it is not applicable with --n-attempts 1. By contrast, --n-concurrent and --max-agents control parallelism and elapsed time; they do not reduce the total planned trials or model work.

Cost and local mode

--env-mode local avoids managed cloud-sandbox charges by running the agent on your machine. It does not automatically eliminate model charges: a hosted evaluator or agent provider is still billed normally, and local compute and runtime become your responsibility. If both the evaluator and agent are configured to use compatible locally hosted models, external API charges may also be avoided.

Small local trial
$skillevaluator tier3 evaluate ./my-skill --agents codex --env-mode local \
> --n-attempts 1

Local mode is experimental and provides weaker isolation than Docker or a managed sandbox. Use it only for trusted skills and workspaces; saving sandbox cost is not worth running untrusted code directly on the host.

Tune the run

The high-signal flags, with defaults:

FlagDefaultEffect
--n-attempts1Attempts per eval case; values above one add pass@k context
--pass-threshold0.5Score an attempt needs to count as passed
--n-concurrent4Concurrent eval cases per agent
--max-agentsselected-agent countMaximum agents run in parallel
--skip-baselineoffSkip the without-skill arm; faster, but no Skill Lift
--stop-on-passoffStop a case’s remaining attempts once one passes
--agent-runtime-preflightonOne real, bounded smoke task per agent before the full A/B matrix; --no-agent-runtime-preflight skips it
--progressautoProgress rendering: auto, rich (live TTY view with secret redaction), plain, or off
--autopilotoffWhen no evaluation source exists, generate exactly one eval case — with the configured provider, falling back to a deterministic keyless template — never overwriting an existing source
--grading-modedefaultdefault, default_plus_custom, or custom_only — see Custom Graders & Tasks
--results-direvals/results, or SKILLEVALUATOR_RESULTS_DIR when setWrite results under an external root instead of the skill directory
--harbor-keep-jobsoffRetain Harbor job directories for inspection
--timeout-multiplier1.0Scale Harbor step timeouts
--copy-repooffCopy the surrounding repository into the task environment
--include-skillsnoneStage additional skill directories; requires --skill-workspace-mode group

Every tier3 evaluate flag, including resource overrides and Dockerfile modes, is in the CLI Reference.

While iterating on a dataset, --skip-baseline roughly halves the runtime. Re-enable the baseline arm for any run whose Skill Lift you intend to trust.

Reading results

In the terminal, a finished run renders Results by Evaluator — each evaluator’s metrics plus Skill Lift — and Results by Dimension, the five rollups, followed by a compact Artifacts panel pointing at the report and output directory. A failed run renders the same structured display instead of a bare exception.

Each dimension receives a score and a verdict: PASS at 0.7 or above, NEUTRAL from 0.4, FAIL below. Skill Lift gets its own verdict with a deliberate noise band, because live agent runs are noisy at low attempt counts: Pass at +0.05 or above, Fail at −0.10 or below, Neutral in between.

With multiple attempts, pass@k shows whether at least one attempt per case met --pass-threshold — reliability context alongside Skill Lift, not a replacement for the dimensions. In custom_only mode, pass@k uses the custom overall reward; the dimension rows stay visible but read NO SCORE, and custom metrics are never re-labeled as standard dimensions.

Missing metrics are never coerced to 0.0: an unscored run reports an overall_score of None, averages omit unscored metrics, and the affected cells render NO SCORE. compare likewise ignores stored summaries whose execution_status is not succeeded.

Reports & Results covers the full on-disk layout, the machine-readable JSON contract, and how to judge whether a given lift is good.

Troubleshooting

Set SKILL_EVAL_LLM_PROVIDER and the corresponding evaluator-provider key. See Providers & Credentials.

Export the agent’s credential in the host environment where you run skillevaluator — agent credentials are read only from the host, never from evals/config.yml. It is a separate role from the evaluator key, except with nv_build in Docker or local mode, where one NVIDIA_API_KEY covers both.

Start Docker or configure the selected --env-mode, then re-run skillevaluator doctor with the same agent and environment.

Run skillevaluator create-eval-dataset ./my-skill, or add an accepted dataset file under evals/. See Eval Datasets.

Supply a model valid for that agent with --agent-model AGENT=MODEL. The evaluator provider’s default model is not automatically valid for every agent.

Re-run with --harbor-keep-jobs — Harbor artifacts are transient and deleted by default whether the run succeeds or fails. With retention on, the Artifacts panel prints the exact skillevaluator tier3 harbor-view <JOBS_DIR> command to browse the retained jobs; skillevaluator view opens the HTML report.

Next steps