evaluate-skill
Skill230 starsChanged 5 days agoMITView on GitHub
Run, read, and diagnose a skill's Caliper eval — its success rate over k attempts, whether it fires, and whether it beats the agent without it. Use when the user wants to run, validate, interpret, or compare a skill's eval, or write an .eval.yaml spec whose tasks they have already decided.
8 other projects use a version of this.
Adopted by
Most recently taken up by
- foverse/seoversetheir own version, first seen Nov 8, 2026
- chenwei791129/agent-skillstheir own version, first seen Oct 19, 2026
- EJRyan89/coding-agent-skillstheir own version, first seen Oct 17, 2026
- rahulrajaram/rahulskillstheir own version, first seen Oct 13, 2026
- openai/pluginstheir own version, first seen Oct 13, 2026
- every-app/open-seotheir own version, first seen Oct 8, 2026
Other versions8 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 8
- every-app/open-seo★ 27ksame name
- openai/plugins★ 7.8ksame name
- hawkyre/hawk-skills★ 30same name
- foverse/seoverse★ 4same name
- pat-lewczuk/skills★ 3same name
- EJRyan89/coding-agent-skills★ 2same name
- chenwei791129/agent-skills★ 0same name
- rahulrajaram/rahulskills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository2 other files it gives its agents.
- AGENTS.mdAGENTS.md
- grill-skillSkill
The file
We split this skill into the rules it gives an agent
3 rules. 0 are common, 0 are distinctive, and 3 are very specific to this project.
0
Common
Most of the 7 edited versions we read keep these.
0
Distinctive
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 49
When you write a spec, every task with expect: or assert: also asserts activates:, refusals included: the skill, plus any declared skill it …
- Very specific: line 90
If the user hasn't decided what to test (a skill with no .eval.yaml, or an eval whose gaps they want found), suggest grill-skill: it …
- Very specific: line 94
every task has an observable criterion, and at least one has a deterministic assert:.
“Common” is measured: kept by at least 6 in 10 of the 7 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Evaluate Skill
Operate Caliper: run a skill's eval, read what the results say, and trace each failure to the place that fixes it.
Prerequisites
The caliper CLI must be on PATH. This skill can be copied into an agent without the Caliper repo, so install it if missing:
pipx install caliper-evalcaliper <command> --help is the authority on flags. REFERENCE.md covers the full spec format, engines, and what the results mean.
The four questions
A skill eval answers four separate questions. Each has its own measurement and its own fix location, so keep them apart: a blended number hides which half broke.
| Question | Measured by | A failure is fixed in |
| Fires: does the agent reach for the skill when it should, and only then? | activates: on tasks, and trigger probes | the skill's description frontmatter |
| Works: once it fires, does it get the job done? | expect: / assert:, scored as the success rate | the skill's body |
| Earns: does it beat the agent without it? | the control (--ablate <skill-name>: the declared neighbourhood minus this skill) and caliper compare. For a truly bare agent, ablate every declared skill and every declared mcp: server, and isolate the run | the tasks: if the control passes too, the task is too easy |
| Holds: does it stay good across edits and over time? | caliper compare of each full run against the previous one, skill drift | the edit that moved it |
Spec shape
skills:
- ./SKILL.md # relative to the spec; installed, never preloaded
tasks:
- name: What success looks like
prompt: <what a real user would type; never names the skill>
expect: <natural-language pass/fail criterion>
assert: | # optional deterministic Python check
assert ...
activates: [my-skill] # frontmatter name: of the skill that should fire
- name: Unrelated work stays unrelated
prompt: <work no declared skill should answer>
activates: [] # a trigger probe: no judge, cheapWhen you write a spec, every task with expect: or assert: also asserts activates:, refusals included: the skill, plus any declared skill it delegates to on that task, and every prompt reads like a real user's request with the skill left unnamed.
The spec has no backend/model or judge: block. The engine is chosen at run time, independently for the skill and the judge: caliper run <spec> --model codex runs and grades on codex, and --judge-model picks a different judge. Backends are claude-code (default), codex, pi, and hermes. Each attempt runs in a fresh, empty workdir, so setup: builds fixtures there with relative paths.
Running
caliper validate <spec>. It never touches the network.caliper run <spec> --k 1to shake out spec and harness errors. Fix those before reading any score.caliper run <spec> --k 3 --ablate <skill-name>, once (writeskill:<skill-name>if anmcp:server shares the name). This is the control: the declared neighbourhood without this skill. The skill isn't installed, so editingSKILL.mdcan't move its number. Keep its results path (caliper list <spec-name>marks ablated runs) and re-diff against it. Re-run it only when the tasks or the declared skills change.caliper run <spec> --k 3, thencaliper compare <control.json> <spec-name>to see whether it earns its place. After each edit, also compare against the previous full run's path to see whether the edit held: a skill that got worse can still beat the control. A bare spec name resolves to that spec's latest run.
If a run stops with Not logged in, ask the user whether to run the login command the error names. With their consent, run it (it opens a browser for them to finish) and rerun; never run it without consent. hermes model is an interactive picker, so ask the user to run it in their own terminal instead.
Reading results
The success rate (successes / usable) is the headline. pass@k and pass^k are secondary views under --verbose. Activation is a separate scoreboard, over a different population: report it beside the success rate, never averaged into it.
Trace every failing task to where its fix belongs:
| Signal | Where the fix belongs |
Run exits 2 (backend misconfigured, unavailable model, failed hook or MCP server, or every attempt unusable) | The environment or the task's hooks. Report it as a configuration problem, not a task failure |
⊘ unusable attempts (infra_error, timeout, judge_error) | Not the skill: rate limits, auth, or the judge. They are excluded from the score; re-run |
cheat outcome | The task: it leaks its answer. Tighten the task or sandbox: |
| Activation fails: an expected skill didn't fire | That skill's description |
| Activation fails: an unexpected skill fired too | The extra skill's description, or the overlap between the two |
Activation fails because one of the user's own skills fired (skill: in the report header) | Not the description alone: that skill is real competition in their setup. Decide with the user whether to sharpen the description or isolate the run |
| Activation passes, score low | The skill's body |
The judge's reasoning shows expect: was ambiguous | The task's grading: make the criterion observable, or add an assert: |
| Full run ≈ control, and the skill fired in the full run | The task: it doesn't need the skill. If the skill never fired, the fix is its description (above) |
At k=3 one attempt is a 33-point swing. Before calling a change a win or a regression, re-run at k≥5. caliper compare flags any drop and never gates. A rewritten or shortened skill is safe to ship when, at k≥5, it stays within about 5% of the previous score and still beats the control.
Whose setup is measured
Runs load the user's own customizations by default (user skills, plugins, rules, settings and connectors; see REFERENCE.md for backend exceptions), which answers "does my skill work in my agent?". Isolate (--no-user-customizations, or user_customizations: false in the spec) when comparing backends or models, when the number leaves this machine (shared, published, compared with someone else's run), or when measuring the bare agent: each setup is different, so otherwise part of the delta is the setups. --ablate of the user's own skill needs no isolation, since both runs load the same setup.
Always tell the user which mode ran and what it loaded, from the report header's user customizations: line (absent means isolated), and relay any fix caliper compare suggests about it.
No eval yet?
If the user hasn't decided what to test (a skill with no .eval.yaml, or an eval whose gaps they want found), suggest grill-skill: it interviews them and writes the spec. To design tasks yourself, follow "Designing evals" in REFERENCE.md.
Done when
- every task has an observable criterion, and at least one has a deterministic
assert:; - execution tasks assert
activates:, and the spec has at least one trigger probe; - the full run beats the control on execution tasks, and holds against the previous full run. Trigger probes have no execution score: read them from the full run's activation;
- the spec passes
caliper validate; - the user has been told to commit the
.eval.yamlbesideSKILL.md. Saved runs under.caliper/results/are useful for diffing over time and safe to gitignore.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

