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:
- Built-in defaults
- The config file
EVOLVE_*environment variables- 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. |