Authoring skills with evals
Skill vemodalen-x/VEMO_SKILLS/skills/governance/authoring-skills-with-evals
Author, evaluate, and improve skills with an eval-driven loop instead of by intuition. Use when creating a new skill, revising an existing one, judging whether a skill's description actually triggers, or tuning that description for better trigger accuracy. Runs a with-skill-vs-baseline behavioral eval with variance, a trigger-rate eval, and a train/test-split description optimizer via the repo's skill-creator harness, modeled on Anthropic's official skill-creator. Triggers include create a skill, write a SKILL.md, run a skill eval, benchmark a skill, description not triggering, improve a skill description, skill quality, eval-driven authoring.From its SKILL.md
npx -y skills add vemodalen-x/VEMO_SKILLS --skill authoring-skills-with-evalsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.5 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it
Authoring Skills with Evals
Create and improve a skill the way you would tune a model: draft it, measure it on realistic
prompts, and iterate on evidence — not on a hunch that "the description reads fine". This skill
is the VEMO_SKILLS adaptation of Anthropic's official skill-creator meta-skill; it keeps that
loop but binds it to this home's single-source model and its release scorer.
Two layers, do not confuse them.
tools/vemo_skills_check.py(the release scorer, threshold 9.5) lints a skill's shape — frontmatter, naming, catalog parity, decoupling. It cannot tell you whether the skill works.tools/skill_creator.py(this skill's harness) measures behavior — does the description trigger, and does the body produce a better result than no skill at all. A skill is only "done" when it passes both.
When to use
- Creating a new skill from scratch, or splitting/merging existing ones.
- A skill under- or over-triggers (fires when it shouldn't, or stays silent when it should).
- You want to optimize a
description:for trigger accuracy without overfitting to a few queries. - Auditing a skill's authoring provenance (the
.skill-validated.jsonmarker).
The loop (eval-driven authoring)
See references/eval-loop.md for the full rationale and prompt-design rules. In short:
- Draft the
SKILL.md. Put all the "when to use it" signal indescription:— it is the only text the model sees when deciding to invoke the skill. Write it in the imperative and make it a little "pushy": the model tends to under-trigger skills. - Write an eval set — 6-12 realistic prompts as JSON, each
{"query": "...", "should_trigger": true|false}. Include hard negatives (near-misses that must NOT trigger) and messy, real-sounding positives. - Lint the shape:
python3 tools/skill_creator.py validate skills/<cat>/<name>. On pass it writes.skill-validated.jsonwithtier: "lint"— an honest marker that says only the shape was checked. - Measure triggering:
python3 tools/skill_creator.py trigger-eval skills/<cat>/<name> --eval-set evals.json. Reports a per-query trigger rate over N runs (triggering is nondeterministic — one sample is noise). - Improve the description:
python3 tools/skill_creator.py describe-improve skills/<cat>/<name> --eval-set evals.json --model <model>. Splits the eval set train/test, optimizes on train, and picks the winner by held-out test score so it cannot memorize the eval set. - Re-run until the trigger eval is clean and a with-skill run beats the no-skill baseline.
Commands
| command | what it does | needs claude CLI |
|---|---|---|
validate <dir> [--no-marker] | lint frontmatter + naming; write .skill-validated.json (tier=lint) | no |
trigger-eval <dir> --eval-set f.json | measure description trigger rate (tri-state per run) | yes |
describe-improve <dir> --eval-set f.json --model M | train/test-split description optimization | yes |
selftest (vemo-skills author-selftest) | hermetic check of the deterministic core | no |
The two model-in-the-loop commands degrade gracefully: if the claude CLI is not on PATH they
report status: skipped and exit 0. An infrastructure gap is reported as skipped, never scored as
"the description failed to trigger" — a run that could not execute is an error, excluded from the rate.
Provenance marker (honest tiers)
.skill-validated.json carries a tier:
lint— frontmatter + naming only. Does not claim a behavioral/trigger eval ran.trigger— lint plus a trigger eval that met the pass threshold.
It also records validator_sha (sha256 of the harness itself, so a changed validator is detectable)
and the git_commit. Never hand-edit the marker; regenerate it with validate.
Boundaries
- Does not adopt. Producing/validating a skill is not the same as putting it in a project's toolset
(a user-consent decision). Registration/placement is
publishing-skills; naming conformance isnaming-skills; this skill owns the eval loop and complements both. - Render-nothing / send-nothing. It writes only the skill under authoring and its marker; it never publishes, announces, or edits the catalog.
- Zero project identity in any skill body (this home's red line) — the harness only reads shape and triggering, so keep evals free of project-specific values too.
References
references/eval-loop.md— the full loop, the two eval types (trigger vs output-quality), variance / baseline discipline, the train/test split, and description-writing rules.- Anthropic Agent Skills — best practices: https://docs.claude.com/en/docs/agents-and-tools/agent-skills/best-practices
- Anthropic engineering — equipping agents with Agent Skills (the official skill-creator's home).
What ships with it: 2 files
5.8 KB alongside SKILL.md
references/
- eval-loop.md4.0 KB
- .skill-validated.json1.8 KB