evaluate-skill
Skill2 starsChanged 19 days agoMITView on GitHub
Run a skill's fixed scenarios on each model from throwaway homes, once or several times, and judge each record by script: a review's, or whether a request started the skill. Use it before a pull request that changes a skill's prompt, description, model guidance, or reviewer instructions. Each run calls models.
8 other projects use a version of this.
Adopted by
Most recently taken up by
- foverse/seoversetheir own version, first seen Nov 8, 2026
- edonadei/calipertheir own version, first seen Nov 7, 2026
- chenwei791129/agent-skillstheir own version, first seen Oct 19, 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
- edonadei/caliper★ 230same name
- hawkyre/hawk-skills★ 30same name
- foverse/seoverse★ 4same name
- pat-lewczuk/skills★ 3same 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 repository30 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- audit-repositorySkill
- change-skillSkill
- evaluate-skillSkill
- implement-changeSkill
- review-repositorySkill
- runtime-canarySkill
- shepherd-pull-requestsSkill
- audit-repositorySkill
- change-skillSkill
- implement-changeSkill
- review-repositorySkill
- runtime-canarySkill
- shepherd-pull-requestsSkill
- audit-ai-configSkill
- audit-skillSkill
- curate-agent-memorySkill
- dotnet-dependenciesSkill
- dotnet-formatSkill
- ejryan89-code-review-coreSkill
- ejryan89-skill-coreSkill
- flag-review-findingSkill
- github-activity-reportSkill
- repo-cleanupSkill
- review-documentSkill
- review-insightsSkill
- review-prsSkill
- update-coding-agent-skillsSkill
- update-pr-dashboardSkill
The file
We split this skill into the rules it gives an agent
2 rules. 0 are common, 0 are distinctive, and 2 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.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 19
Run python -B tools/skill_evals.py --help for the accepted model names and the concurrency and timeout defaults.
- Very specific: line 42
When a reason is not enough, search the run's TRANSCRIPT file, which is stream-json, for the failing step, for permission_denials, or for a …
“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 a skill
tools/skill_evals.py runs a skill's scenarios, the folders under tests/fixtures/skill-evals/<skill>/, on each model, each in a headless Claude Code session started in a throwaway home where this checkout is deployed, and checks every expectation against the record the run wrote. A review scenario varies the reviewers' model; a trigger scenario gives each of its requests, and each near miss, to a session of its own on the model and checks whether the session started the skill. The script does every deterministic step: the deployment, the runs, the checks, each failure's kind, the table, the pull request's citation, the results file, and which passing run's transcript to read. Your part is choosing what to run, saying what a failure means, and reading that transcript against its verdicts. Its docstring lists every output line and what still comes from the user's own setup.
It is a manual gate, never part of tests/run_validation.py. A full run is one session per scenario per model per run, and one per request of a trigger scenario, each calling models. After deploying the homes, the script runs up to --jobs sessions concurrently and stops each at --timeout seconds.
1. Choose the run
Run python -B tools/skill_evals.py --help for the accepted model names and the concurrency and timeout defaults. The script's MODELS constant is the authoritative list of reviewer models.
For a pull request, run every scenario on every model: only that run may record its result. One run is one sample, so for a change to a reviewer's model, effort, or guidance, where the comparison decides, add --runs 3. Add --scenario <name> or --model <model> (each repeatable) only to rerun a failure, and leave out --write, which a narrowed run refuses. A skill without a folder under tests/fixtures/skill-evals/ has no scenarios, and the run says so with FAILED.
2. Run it
From the worktree, in the background, since it outlasts a command's time limit, and wait for it to end. For another skill with scenarios, put its name in place of review-prs; for a repository reviewer such as review-repository, put the reviewer's name, and the script starts review-prs on a throwaway copy of each fixture holding the reviewer's files from this checkout:
python -B tools/skill_evals.py review-prs --writeThe first line is HOME "<dir>", then a DEPLOYED <model> <source> line for each model's home and RUNTIME claude <version>, the Claude Code it runs, which the cited block repeats; none needs anything from you. A FAILED or DEPLOY_FAILED line instead means nothing ran: report what it names, such as Claude Code missing from PATH or the log of a deployment that failed.
3. Say what each failure means
A NOT_COUNTED line names each run whose record counts for nothing, and every FAIL line names its kind before its reason. Explain each before anyone changes the skill:
judgment: the evaluation's result for that model. With--runs, read the scenario'sRUNSline before calling it anything:allis a steady pass,nonea steady failure, andsomean inconsistent result, neither a regression nor a pass, which you report as such. After a single run, one failure is one sample: rerun that scenario on that model with--runs 3before calling it a regression.runorrecord: the run recorded no review, or its record does not show the model judged, so it is not a judgment of the model. Say what the reason shows went wrong.
For a trigger scenario, a starts failure means the description did not lead that model to the skill, and a does_not_start failure that it took a near miss: a neighbour's request, or one no skill serves, which means it takes whatever comes. Say which words of the description the request or near miss shares.
When a reason is not enough, search the run's TRANSCRIPT file, which is stream-json, for the failing step, for permission_denials, or for a reviewer's hook_response events, which say whether the guard ran, rather than reading it whole.
4. Record the result
--write replaced the skill's rows in docs/skill-evaluations.md, which the WROTE line names: commit it with the change. A KEPT <model> line names a model no record of which counted, whose committed row the run kept rather than replacing it with a result that measured nothing: say so in the pull request, and run again once what its NOT_COUNTED lines name is fixed. Paste the lines between CITATION BEGIN and CITATION END into the pull request's Validation section as they are, and add your reading of each NOT_COUNTED and FAIL line in it. Without a REMOVED line, the HOME directory keeps the transcripts; give the user its path to delete when they are done with it.
5. Read the sampled transcript
A script grader that passes a wrong run fails nothing, so every run with --write samples one passing run for you to read: its SAMPLE <scenario> <model> line, before WROTE, names it, with run=<run> after the model when --runs is above 1, and the next recorded run samples the next scenario and model. SAMPLE none means no run passed, and there is nothing to read. Otherwise, for each PASS line of that run, search its TRANSCRIPT for what the expectation claims, such as the finding at its line, the verdict, or the Skill tool call that started the skill, and check that the transcript shows it. Then record the reading, which writes docs/skill-evaluations.md again and prints WROTE <file>; commit that edit with the run's rows:
python -B tools/skill_evals.py review-prs --sample-read agreesUse disagrees instead when a PASS is not what the transcript shows: that is a defect of the script grader, its kind's check in tools/skill_evals_scenarios.py or the judging in tools/skill_evals_judging.py. Open a bug issue from the template against it, name it in the pull request, and do not change the skill to suit the grader. A FAILED line names a row already read or missing; report it. Validation fails while a committed row is still unread.
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.

