Skip to main content
All you need is a local directory containing SKILL.md to evaluate a Skill with comet eval. Even if you have not written evaluation cases in advance, Eval can automatically generate 2–4 evaluation cases from the Skill content and run them. This page follows the practical order: get one run working, choose an Agent and evaluation backend, configure tasks, generate reports, and diagnose failures.

What You Need

Required

  • @rpamis/comet installed. The npm package includes the eval harness; you do not need to clone the Comet repository.
  • A local Skill directory containing SKILL.md.
  • For a real evaluation run: uv, Python 3.11+, Docker, the selected Agent CLI, and its model credentials.
--collect only performs static discovery and configuration checks. It does not start the Agent, Docker, plugins, credentials, or network requests, so you can check a Skill before preparing the full model environment. Before choosing an Agent other than Claude Code, read Eval Agent startup configuration to confirm its CLI, authentication method, and model protocol.

User-level .env configuration

Ordinary users do not need to clone the Comet repository or enter its eval/ directory. On the first comet eval command, the CLI automatically creates the complete user-level configuration file:
  • Windows: %USERPROFILE%\\.comet\\eval\\.env
  • macOS/Linux: ~/.comet/eval/.env
The CLI creates the file only when it is missing and never overwrites an existing file. The first run prints the actual path; edit that file as needed and run the command again. Environment variables already present in the current shell take precedence over .env. The generated template contains all user-configurable parameters, grouped as follows: All parameters in the template are commented out by default, so unused entries do not change the default behavior. Keep real API keys only in the user-level .env or current shell; never put them in a Skill, manifest, report, or public repository.

Supported Evaluation Agents

comet eval uses claude-code by default. The subject Agent, user simulator, and optional Judge can use the following Agents:
Custom Agent adapters are a user-level advanced capability and do not require a Comet source checkout. Clone the source only when you need to modify the built-in Eval harness, tasks, or Docker environment; see advanced configuration.
For the registration path, credentials, and CLI contract for a non-built-in Agent, see Extend Eval with a custom Agent. Putting an executable on PATH is not enough to enable it. If an evaluation finishes instantly without a real run, Docker, the Agent CLI, or model credentials are usually not ready. In these cases the harness normally skips instead of fabricating a successful run.

First Run

Start with a model-free pre-check, then run a low-cost smoke test, and finally run the configured or generated task set:
When there is no comet/eval.yaml, or the manifest has neither evaluation.tasks nor recommendedTasks, a normal run automatically generates 2–4 evaluation cases from the Skill content, freezes and caches them, and then executes them. You do not need to write tasks before starting an evaluation. --quick does not use these generated cases; it always runs generic-skill-smoke, which checks that the Skill can be injected, invoked, and produce result.md.

Passing the Target

You can pass a directory, a direct SKILL.md, or a manifest as the target:
Without a manifest, Comet creates the basic configuration in memory and does not rewrite the Skill source. If the Skill is outside the current repository, use --project to specify the project directory where runtime state and reports are stored:

Configure the Evaluation Agent and Judge

The simplest way to choose the subject Agent is on the command line:
You can also create comet/eval.yaml under the root of the Skill being evaluated to configure the default Agent. The layout is:
When you run comet eval ./my-skill, Comet automatically discovers ./my-skill/comet/eval.yaml. You can also pass the file directly as the target:
Configure the default Agent in eval.yaml. CLI options take precedence over the manifest:
The subject Agent and the LLM-as-Judge can use different Agents, models, API endpoints, and credentials. The Judge does not silently inherit the subject Agent’s model or credentials; when you enable it, provide a separate Judge configuration.

Choose an Evaluation Backend

Use --suite to select the evaluation backend. All three backends use the same target, task, and Agent configuration; they differ in whether results are synchronized to an external evaluation service: Langfuse example:
If you only want to check task and configuration discovery, any backend can be used with --collect:
--collect --suite langfuse does not initialize an SDK, connect to the network, or download plugins.

Report Types

Evaluation state and reports are written to the following directory under the target project by default:
Without --html, the evaluation still generates summary.md. To generate HTML, run:
You can also customize report outputs with --report-config <path> or COMET_EVAL_REPORT_CONFIG. The CLI prints Experiment and Report path; use those values when locating a specific report. When reading a report, start with three questions:
  1. Did the evaluation pass?
  2. Is the failure attributed to harness, workflow, task, or model?
  3. Are expected artifacts missing, or are token, cost, or duration values unusual?
In general, harness means an environment or dependency problem, workflow means the Skill flow did not meet expectations, task means the task definition or validation condition needs attention, and model means model behavior or invocation was unstable.

Customize Tasks

Tasks are selected in this order:
  1. The task specified with --task.
  2. generic-skill-smoke selected by --quick.
  3. evaluation.tasks in the manifest.
  4. recommendedTasks or a task package referenced by source.
  5. 2–4 evaluation cases automatically generated and cached from the Skill content when no usable task is available.
If the automatically generated tasks do not fit your Skill well, create or edit comet/eval.yaml under the root of the Skill being evaluated, and declare an inline task under evaluation.tasks. For example:

Reference a Task Package Inside the Skill

If a task needs its own task.toml, instruction.md, Docker environment, or validation script, keep the task package inside the Skill directory and reference it with source. A recommended layout is:
In comet/eval.yaml at the Skill root, use evaluation.tasks[].source to point to the task package. The source path is relative to the Skill package root (the directory containing SKILL.md), not to the comet/ directory:
Here is minimal example content for the files in this task package. For the complete task.toml fields, validation scripts, profiles, and Docker configuration, see Configuring Evaluations and Custom Tasks. task.toml declares the task metadata, Docker environment, expected artifact, and validation script:
instruction.md contains the task instruction sent to the Agent:
environment/Dockerfile provides the base environment for the task and its validation:
validation/test_summary.py runs inside the task container and checks whether the Agent produced the expected file:
eval-tasks/writes-summary/task.toml describes the task environment and validation, while instruction.md contains the task instruction sent to the Agent. Put any Dockerfile or deterministic validation script in the task package’s environment/ and validation/ directories. A source task cannot also define the inline task fields prompt or expect, and Comet checks that the package contains both task.toml and instruction.md. You can pass the Skill directory and let Comet discover comet/eval.yaml, or pass the manifest directly:
Tasks can check files, text, JSON, or command results; the task workspace and expected artifacts must remain inside the allowed Skill package or evaluation workspace. Only continue to Configuring Evaluations and Custom Tasks when you need a custom Docker environment, validation scripts, a profile, or a treatment.

Further Reading

Last modified on August 13, 2026