Skip to content

Configuration

evolve reads at most one config file from the repository root:

  • .evolve.yaml
  • .evolve.yml
  • .evolve.json
  • .evolve.jsonc

Settings are layered, lowest to highest precedence:

  1. Built-in defaults
  2. The config file
  3. EVOLVE_* environment variables
  4. Explicit CLI flags

Common settings

Key Purpose
layout Force a repository layout (auto / single / multi / marketplace).
models Default providers / model ids to run.
harnesses Default agent CLIs (harnesses) to drive.
cache_dir Where to cache run state.
results_format json, jsonc or yaml for stored results and rollups.
max_turns Default per-case turn cap for behavioral evals.
stale_results keep or drop results outside the active models set.
checks.* Every rule the static checks apply.
report.thresholds.* Pass-rate and per-plugin maturity gates for report --check.
providers.<name>.models Replace a provider's builtin model matrix.
# yaml-language-server: $schema=https://raw.githubusercontent.com/bitwise-media-group/evolve/main/docs/config/config.schema.json
# evolve configuration — every value below is the built-in default.
# Generated by `evolve docs --format config`.

# Terraform-style semver constraint ("0.4.0", "~> 0.4", ">= 0.4, < 1") the
# evolve binary must satisfy before run triggers/evals/all or report will
# rewrite results. Non-release builds (dev and snapshot/prerelease
# versions) warn and skip the check.
# Default: unset — any evolve version may run.
# version: "~> 0.4"

# Repository layout: auto, marketplace, multi, or single.
layout: "auto"

# Restriction on which models exist: provider ids, canonical model ids
# (anthropic/claude-sonnet-4-6), or all. Unlisted models are unavailable.
# --model filters within it.
# Default: unset — every model runnable by an available harness.
# models: ["anthropic/claude-sonnet-4-6"]

# Restriction on which agent CLIs (claude, codex, gemini, cursor, copilot,
# antigravity, grok) may drive models. --harness filters within it.
# Default: unset — every harness found on PATH.
# harnesses: ["claude","copilot"]

# Directory holding the token-count cache.
# Default: unset — the OS user cache dir.
# cache_dir: "~/.cache/evolve"

# Format for committed results files and the EVALUATION rollup: json,
# jsonc, or yaml.
results_format: "json"

telemetry:
  # Directory for the OpenTelemetry JSON exporter (traces.json,
  # metrics.json, logs.json); the --telemetry-dir flag overrides it and both
  # win over OTEL_* env vars.
  # Default: unset — telemetry disabled.
  # dir: "./telemetry"

# Default maximum agent turns per behavioral eval; --max-turns and a
# per-eval max_turns override it.
max_turns: 20

# Model that grades LLM assertions (a canonical or bare model id), driven
# by any installed harness that supports it; --judge-model overrides for
# one run. Keep it consistent across runs so verdicts stay comparable
# between them and the providers under test.
judge_model: "anthropic/claude-sonnet-5"

# Benchmark each eval without the skill (the skill's lift over no skill),
# recomputed only when the eval or its fixtures change. --baseline
# overrides for one run.
baseline: true

# How run/report treat stored results for models outside the `models`
# restriction: keep or drop. --stale-results overrides.
# Default: unset — prompt on a terminal, otherwise keep.
# stale_results: "keep"

remote:
  # Patchy remote-evaluation service URL, used by evolve login/logout and
  # remote runs; --remote-url overrides for one command.
  # Default: unset — no remote configured.
  # url: "https://patchy-evals.example.com"

  # Execute runs on the configured remote by default; --remote/--local force
  # either way for one run. False runs locally unless --remote.
  default: false

sandbox:
  # Confine agent writes with an OS sandbox (sandbox-exec on macOS,
  # bubblewrap on Linux); --no-sandbox overrides for one run.
  enabled: true

  # Directories kept read-only to agent runs so an escaping agent cannot
  # modify other source repositories; the workspace stays writable. Reads,
  # the network, and tool caches outside these roots are unaffected.
  # Default: unset — the parent directory of the repository under test.
  # protected_roots: ["~/Repos"]

checks:
  # License every SKILL.md must declare; when unset, skills must not declare
  # one.
  # Default: unset — the license field is forbidden.
  # license: "MIT"

  # Regex every skill description must match.
  description_pattern: "Use (when|after|before)"

  # Maximum SKILL.md line count.
  max_skill_lines: 500

  # Ideal SKILL.md line count for the advisory size signal (full at or
  # below; zero at the cap).
  ideal_skill_lines: 200

  # Emit the advisory skill-quality signals after run checks; the
  # --no-signals flag forces them off.
  signals: true

  # Plugin manifests every plugin must ship: claude
  # (.claude-plugin/plugin.json) and/or codex (.codex-plugin/plugin.json).
  # With both, a hooks/ directory is forbidden (codex and claude hooks.json
  # are incompatible).
  plugin_manifests: ["claude","codex"]

  # Validate marketplace manifests (marketplace layout only).
  marketplace: true

report:
  thresholds:
    # Minimum triggers pass rate (0-1); report --check exits 1 below it and
    # the run dashboard rolls a failing group to an orange check while its
    # rate stays at or above it.
    triggers_min_pass_rate: 0.5

    # Minimum evals pass rate (0-1); report --check exits 1 below it and the
    # run dashboard rolls a failing group to an orange check while its rate
    # stays at or above it.
    evals_min_pass_rate: 0.66

    # Model keys (provider/model-id) the thresholds apply to.
    # Default: unset — every model with stored results.
    # models: ["anthropic/claude-fable-5"]

    # Plugin maturity levels whose Tier 1/Tier 2 evidence issues fail report
    # --check; other levels only warn (evidence still renders). A plugin's
    # maturity comes from its manifest version: stable (>= 1.0.0), unstable (<
    # 1.0.0), or prerelease (a SemVer prerelease tag). The --maturity flag
    # overrides it.
    maturity: ["stable","unstable","prerelease"]

  # Path for a JUnit XML test-results file (one testcase per eval/trigger
  # case per model); the --junit flag overrides it.
  # Default: unset — no JUnit file written.
  # junit: "coverage/junit.xml"

  # Path for a Cobertura XML coverage file marking each skill covered by a
  # current eval result; the --cobertura flag overrides it.
  # Default: unset — no Cobertura file written.
  # cobertura: "coverage/cobertura-coverage.xml"

  # Require the configured model matrix: report --check holds every defined
  # model to the thresholds, and the Cobertura output covers a skill only
  # when every defined model has a current result. The --strict flag
  # overrides it.
  strict: false

# Per-provider overrides: providers.<name>.models replaces that provider's
# builtin model matrix (model ids, display names, USD-per-mtok pricing).
# Default: unset — every provider keeps its builtin models.
# providers:
#   cursor:
#     models:
#       - id: "composer-2.5"
#         display: "Cursor Composer 2.5"
#         input_per_mtok: 3.0
#         output_per_mtok: 15.0
// evolve configuration — every value below is the built-in default.
// Generated by `evolve docs --format config`.
{
  "$schema": "https://raw.githubusercontent.com/bitwise-media-group/evolve/main/docs/config/config.schema.json",

  // Terraform-style semver constraint ("0.4.0", "~> 0.4", ">= 0.4, < 1") the
  // evolve binary must satisfy before run triggers/evals/all or report will
  // rewrite results. Non-release builds (dev and snapshot/prerelease
  // versions) warn and skip the check.
  // Default: unset — any evolve version may run.
  // "version": "~> 0.4",

  // Repository layout: auto, marketplace, multi, or single.
  "layout": "auto",

  // Restriction on which models exist: provider ids, canonical model ids
  // (anthropic/claude-sonnet-4-6), or all. Unlisted models are unavailable.
  // --model filters within it.
  // Default: unset — every model runnable by an available harness.
  // "models": ["anthropic/claude-sonnet-4-6"],

  // Restriction on which agent CLIs (claude, codex, gemini, cursor, copilot,
  // antigravity, grok) may drive models. --harness filters within it.
  // Default: unset — every harness found on PATH.
  // "harnesses": ["claude","copilot"],

  // Directory holding the token-count cache.
  // Default: unset — the OS user cache dir.
  // "cache_dir": "~/.cache/evolve",

  // Format for committed results files and the EVALUATION rollup: json,
  // jsonc, or yaml.
  "results_format": "json",

  "telemetry": {
    // Directory for the OpenTelemetry JSON exporter (traces.json,
    // metrics.json, logs.json); the --telemetry-dir flag overrides it and both
    // win over OTEL_* env vars.
    // Default: unset — telemetry disabled.
    // "dir": "./telemetry",
  },

  // Default maximum agent turns per behavioral eval; --max-turns and a
  // per-eval max_turns override it.
  "max_turns": 20,

  // Model that grades LLM assertions (a canonical or bare model id), driven
  // by any installed harness that supports it; --judge-model overrides for
  // one run. Keep it consistent across runs so verdicts stay comparable
  // between them and the providers under test.
  "judge_model": "anthropic/claude-sonnet-5",

  // Benchmark each eval without the skill (the skill's lift over no skill),
  // recomputed only when the eval or its fixtures change. --baseline
  // overrides for one run.
  "baseline": true,

  // How run/report treat stored results for models outside the `models`
  // restriction: keep or drop. --stale-results overrides.
  // Default: unset — prompt on a terminal, otherwise keep.
  // "stale_results": "keep",

  "remote": {
    // Patchy remote-evaluation service URL, used by evolve login/logout and
    // remote runs; --remote-url overrides for one command.
    // Default: unset — no remote configured.
    // "url": "https://patchy-evals.example.com",

    // Execute runs on the configured remote by default; --remote/--local force
    // either way for one run. False runs locally unless --remote.
    "default": false
  },

  "sandbox": {
    // Confine agent writes with an OS sandbox (sandbox-exec on macOS,
    // bubblewrap on Linux); --no-sandbox overrides for one run.
    "enabled": true

    // Directories kept read-only to agent runs so an escaping agent cannot
    // modify other source repositories; the workspace stays writable. Reads,
    // the network, and tool caches outside these roots are unaffected.
    // Default: unset — the parent directory of the repository under test.
    // "protected_roots": ["~/Repos"],
  },

  "checks": {
    // License every SKILL.md must declare; when unset, skills must not declare
    // one.
    // Default: unset — the license field is forbidden.
    // "license": "MIT",

    // Regex every skill description must match.
    "description_pattern": "Use (when|after|before)",

    // Maximum SKILL.md line count.
    "max_skill_lines": 500,

    // Ideal SKILL.md line count for the advisory size signal (full at or
    // below; zero at the cap).
    "ideal_skill_lines": 200,

    // Emit the advisory skill-quality signals after run checks; the
    // --no-signals flag forces them off.
    "signals": true,

    // Plugin manifests every plugin must ship: claude
    // (.claude-plugin/plugin.json) and/or codex (.codex-plugin/plugin.json).
    // With both, a hooks/ directory is forbidden (codex and claude hooks.json
    // are incompatible).
    "plugin_manifests": ["claude","codex"],

    // Validate marketplace manifests (marketplace layout only).
    "marketplace": true
  },

  "report": {
    "thresholds": {
      // Minimum triggers pass rate (0-1); report --check exits 1 below it and
      // the run dashboard rolls a failing group to an orange check while its
      // rate stays at or above it.
      "triggers_min_pass_rate": 0.5,

      // Minimum evals pass rate (0-1); report --check exits 1 below it and the
      // run dashboard rolls a failing group to an orange check while its rate
      // stays at or above it.
      "evals_min_pass_rate": 0.66,

      // Model keys (provider/model-id) the thresholds apply to.
      // Default: unset — every model with stored results.
      // "models": ["anthropic/claude-fable-5"],

      // Plugin maturity levels whose Tier 1/Tier 2 evidence issues fail report
      // --check; other levels only warn (evidence still renders). A plugin's
      // maturity comes from its manifest version: stable (>= 1.0.0), unstable (<
      // 1.0.0), or prerelease (a SemVer prerelease tag). The --maturity flag
      // overrides it.
      "maturity": ["stable","unstable","prerelease"]
    },

    // Path for a JUnit XML test-results file (one testcase per eval/trigger
    // case per model); the --junit flag overrides it.
    // Default: unset — no JUnit file written.
    // "junit": "coverage/junit.xml",

    // Path for a Cobertura XML coverage file marking each skill covered by a
    // current eval result; the --cobertura flag overrides it.
    // Default: unset — no Cobertura file written.
    // "cobertura": "coverage/cobertura-coverage.xml",

    // Require the configured model matrix: report --check holds every defined
    // model to the thresholds, and the Cobertura output covers a skill only
    // when every defined model has a current result. The --strict flag
    // overrides it.
    "strict": false
  }

  // Per-provider overrides: providers.<name>.models replaces that provider's
  // builtin model matrix (model ids, display names, USD-per-mtok pricing).
  // Default: unset — every provider keeps its builtin models.
  // "providers": {
  //   "cursor": {
  //     "models": [
  //       { "id": "composer-2.5", "display": "Cursor Composer 2.5", "input_per_mtok": 3.0, "output_per_mtok": 15.0 }
  //     ]
  //   }
  // }
}

Both examples above are generated and committed under docs/config/; the same structure applies in every supported format (.evolve.json and .evolve.yml too), and JSONC additionally tolerates comments and trailing commas. The full generated reference follows below. All of it is regenerated by make docs.

Repository layouts

evolve auto-detects three shapes (override with --layout):

Layout Marker Skills Evals
single .claude-plugin/plugin.json skills/<skill>/ evals/<skill>/
multi plugins/*/.claude-plugin/plugin.json plugins/<p>/skills/<skill>/ plugins/<p>/evals/<skill>/
marketplace .claude-plugin/marketplace.json at root plugins/<p>/skills/<skill>/ plugins/<p>/evals/<skill>/

A multi repo is a marketplace repo without marketplace manifests — marketplace checks are skipped. In a single repo the repository root is the plugin.

Configuration Reference

Key Type Default Description
version string unset — any evolve version may run Terraform-style semver constraint ("0.4.0", "~> 0.4", ">= 0.4, < 1") the evolve binary must satisfy before run triggers/evals/all or report will rewrite results. Non-release builds (dev and snapshot/prerelease versions) warn and skip the check.
layout string "auto" Repository layout: auto, marketplace, multi, or single.
models list of strings unset — every model runnable by an available harness Restriction on which models exist: provider ids, canonical model ids (anthropic/claude-sonnet-4-6), or all. Unlisted models are unavailable. --model filters within it.
harnesses list of strings unset — every harness found on PATH Restriction on which agent CLIs (claude, codex, gemini, cursor, copilot, antigravity, grok) may drive models. --harness filters within it.
cache_dir string unset — the OS user cache dir Directory holding the token-count cache.
results_format string "json" Format for committed results files and the EVALUATION rollup: json, jsonc, or yaml.
telemetry.dir string unset — telemetry disabled Directory for the OpenTelemetry JSON exporter (traces.json, metrics.json, logs.json); the --telemetry-dir flag overrides it and both win over OTEL_* env vars.
max_turns int 20 Default maximum agent turns per behavioral eval; --max-turns and a per-eval max_turns override it.
judge_model string "anthropic/claude-sonnet-5" Model that grades LLM assertions (a canonical or bare model id), driven by any installed harness that supports it; --judge-model overrides for one run. Keep it consistent across runs so verdicts stay comparable between them and the providers under test.
baseline bool true Benchmark each eval without the skill (the skill's lift over no skill), recomputed only when the eval or its fixtures change. --baseline overrides for one run.
stale_results string unset — prompt on a terminal, otherwise keep How run/report treat stored results for models outside the models restriction: keep or drop. --stale-results overrides.
remote.url string unset — no remote configured Patchy remote-evaluation service URL, used by evolve login/logout and remote runs; --remote-url overrides for one command.
remote.default bool false Execute runs on the configured remote by default; --remote/--local force either way for one run. False runs locally unless --remote.
sandbox.enabled bool true Confine agent writes with an OS sandbox (sandbox-exec on macOS, bubblewrap on Linux); --no-sandbox overrides for one run.
sandbox.protected_roots list of strings unset — the parent directory of the repository under test Directories kept read-only to agent runs so an escaping agent cannot modify other source repositories; the workspace stays writable. Reads, the network, and tool caches outside these roots are unaffected.
checks.license string unset — the license field is forbidden License every SKILL.md must declare; when unset, skills must not declare one.
checks.description_pattern string "Use (when\|after\|before)" Regex every skill description must match.
checks.max_skill_lines int 500 Maximum SKILL.md line count.
checks.ideal_skill_lines int 200 Ideal SKILL.md line count for the advisory size signal (full at or below; zero at the cap).
checks.signals bool true Emit the advisory skill-quality signals after run checks; the --no-signals flag forces them off.
checks.plugin_manifests list of strings ["claude","codex"] Plugin manifests every plugin must ship: claude (.claude-plugin/plugin.json) and/or codex (.codex-plugin/plugin.json). With both, a hooks/ directory is forbidden (codex and claude hooks.json are incompatible).
checks.marketplace bool true Validate marketplace manifests (marketplace layout only).
report.thresholds.triggers_min_pass_rate float 0.5 Minimum triggers pass rate (0-1); report --check exits 1 below it and the run dashboard rolls a failing group to an orange check while its rate stays at or above it.
report.thresholds.evals_min_pass_rate float 0.66 Minimum evals pass rate (0-1); report --check exits 1 below it and the run dashboard rolls a failing group to an orange check while its rate stays at or above it.
report.thresholds.models list of strings unset — every model with stored results Model keys (provider/model-id) the thresholds apply to.
report.thresholds.maturity list of strings ["stable","unstable","prerelease"] Plugin maturity levels whose Tier 1/Tier 2 evidence issues fail report --check; other levels only warn (evidence still renders). A plugin's maturity comes from its manifest version: stable (>= 1.0.0), unstable (< 1.0.0), or prerelease (a SemVer prerelease tag). The --maturity flag overrides it.
report.junit string unset — no JUnit file written Path for a JUnit XML test-results file (one testcase per eval/trigger case per model); the --junit flag overrides it.
report.cobertura string unset — no Cobertura file written Path for a Cobertura XML coverage file marking each skill covered by a current eval result; the --cobertura flag overrides it.
report.strict bool false Require the configured model matrix: report --check holds every defined model to the thresholds, and the Cobertura output covers a skill only when every defined model has a current result. The --strict flag overrides it.