The index
Most skills are fine.
That is not the same as free.
A skill's frontmatter loads at session start for every skill you have installed, whether or not it ever fires, and its instructions load in full the moment it does. That is a budget too. So we graded every public Agent Skill in three repositories, pinned to exact commits, with the same command you can run against your own.
The Agent Skills Quality Index
efaimo v0.5.0 · 2026-09-0497%
of the 36 public Agent Skills in this corpus score an A from
check --skill. Most skills are fine. That is the finding,
and it is not the same as free.
grade distribution
Nothing scored B, D, F. One skill carries an error-level finding.
what the median costs you
1,632
tokens of instructions, loaded the moment the skill triggers. The spec recommends staying under 5,000.
38.5 tokens of metadata, loaded at session start for every installed skill whether it fires or not.
The one that is not fine claude-api scores C (73), and it is also the heaviest in the corpus: 18,419 tokens of instructions, about
11 times the median. It is Anthropic's own skill for
their own API, which is the useful part. A curated set maintained by the
people who wrote the spec still has one, so a set nobody audits has more.
3 repositories, pinned to exact commits:
anthropics-skills, anthropics-claude-cookbooks, obra-superpowers. Reproduce any row with npx efaimo check --skill <dir>.
And again, seven weeks later
efaimo v0.2.0 · 2026-07-17 → 2026-09-03The index above is a photograph. This is the same three repositories at those same July commits, and then at HEAD seven weeks on, measured with one version of the tool on both sides so that anything that moved is the skills rather than the ruler.
| what it costs you | when it loads | July | September | move |
|---|---|---|---|---|
| metadata | always in context | 2,154 | 2,137 | -0.8% |
| body | loads on trigger | 87,308 | 93,454 | +7.0% |
| referenced files | loads on demand | 138,980 | 224,289 | +61.4% |
Read the third row with the second one beside it.
claude-api alone is 96.5% of the
movement in that column, going from 81,236 to 163,786 tokens
of referenced material. Take it out and the other 35 moved +4.8%.
Adding the three rows together would give you one large percentage that
describes none of them, so this page does not print that number anywhere.
Grades moved one way. Of the 36 skills present on both dates,
0 improved, 4 got worse and
32 held.
claude-api C (73) → C (72), writing-skills A (90) → B (80), subagent-driven-development A (95) → B (85), brainstorming A (100) → A (99).
The uncomfortable reading points at us. This ruleset has a size threshold for metadata and one for the body, and none at all for referenced-file weight. The two columns being watched held. The one nothing was watching grew. That is what happens to any quantity with no instrument pointed at it, and the instrument was ours to build.
Both runs pin the corpus with the manifest and the tool with a tag, so you
can reproduce either side:
git checkout v0.2.0, then
node scripts/skills-corpus.mjs and
node scripts/skills-index.mjs.
The full write-up and both raw runs are in the repository under
research/skills-delta-2026-09-03/.
And ours, by the same rules
efaimo publishes skills too, so they are graded by the same call and kept out of every number above. A corpus statistic is a claim about work other people did; folding our own in would quietly make "97% score an A" a sentence about a population that includes the author. The build fails if the two ever merge.
| skill | grade | metadata, always on | body, on trigger | referenced, on demand |
|---|---|---|---|---|
efaimo | A (100) | 75 | 1,039 | none |
mcp-stateless-migration | A (100) | 104 | 1,517 | 3 files, 3,690 |
claim-sweep | A (100) | 92 | 1,657 | 2 files, 2,647 |
red-before-green | A (100) | 97 | 967 | 2 files, 2,601 |
honest-chart | A (100) | 91 | 923 | 3 files, 2,391 |
read-back | A (100) | 81 | 1,172 | 1 files, 1,717 |
unreleased-guard | A (100) | 96 | 1,143 | 1 files, 997 |
denominator | A (100) | 65 | 1,012 | 2 files, 1,906 |
The three level split is the whole reason to care: what a skill costs you when it is installed and idle is a different number from what it costs when it runs, and both are different from what it costs when it is read to the end.
And the comparison runs both ways. On the column this page opened with, the always resident one, our median is 91.5 tokens against the corpus median of 38.5: 2.4 times, with 8 of 8 above it. A description is what a host matches against, so ours enumerate the situations that should trigger them, and that trade is deliberate. What was not deliberate was paying for prose: four of them also explained how the skill works, in the one place that is resident whether the skill fires or not. That moved to the body, and installing all 8 of them now costs 701 tokens before any of them has done anything. On the column nobody counts, the referenced files the panel above shows growing fastest, our average is 1,994 tokens against 3,861, 52% of it, and 1 of our skills ship no referenced files at all. Both numbers are read out of the same run as the table above.
Install any of them
npx -y --allow-git=all github:efaimo-ai/mcp-stateless-migration
npx -y --allow-git=all github:efaimo-ai/claim-sweep
npx -y --allow-git=all github:efaimo-ai/red-before-green
npx -y --allow-git=all github:efaimo-ai/honest-chart
npx -y --allow-git=all github:efaimo-ai/read-back
npx -y --allow-git=all github:efaimo-ai/unreleased-guard
npx -y --allow-git=all github:efaimo-ai/denominator Those are repository URLs, not package names, and that
is the honest form today. The skills are not on npm yet.
Printing the short form, npx and the
skill's bare name, would hand you a command that 404s, and this
site has one rule above the others: it describes what you can
actually get. The commands above install nothing globally and
there is nothing to clone. When the packages publish, each line
loses its middle and nothing else here changes.
And nobody should enjoy typing
--allow-git=all. npm 12 refuses git
specs by default, which is a good default; that flag switches it
off for the one command, and a narrower value is refused too. It
was missing from these lines until 2026-09-04, which made every one
of them fail with EALLOWGIT for anyone on
current npm, while working perfectly on the machine they were
written on, where npm was one major behind. The alternative is that
a skill is markdown: copy SKILL.md and its
references/ out of the repository and there
is nothing to trust. Both of these disappear on publish, because
npx plus a package name needs no flag on
either major.
Which of those two paragraphs you are reading is not an editorial
decision. It is read from a registry probe committed on 2026-09-04,
and the build fails if a command here disagrees with it. The
installer copies SKILL.md and its
references/, reads every byte back, and
refuses rather than guesses when what landed is not what it wrote.
Add --global to install for every project
instead of this one, --check to ask whether
what you have is current, or --print to read
the skill on stdout without installing anything.
efaimo is in the table above and not in that
list, on purpose. It is the CLI, and its package ships a
SKILL.md that gets graded like any other, but
npx efaimo runs the auditor rather than
installing a skill. A line that looks like the others and does
something else is worse than no line.
What this is not
A grade here is a lint-quality signal, not a security audit and not a
measure of whether a skill helps. A well-formed skill can still make an
agent worse at the task, which is a different question, measured a
different way, on the commands page. The injection checks in
check --skill are surface heuristics and are
reported without ever moving a grade.