Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when authoring a Claude Code Agent Skill: emit a SKILL.md whose frontmatter has exactly name and description (no other keys) and whose description includes a 'Use when' trigger clause.
.claude/skills/claude-code-skill-spec/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 83% | 6 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +59% | +70% | 0% | 22 | 54d ago |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-14 | ✗→✓ | ▲ Improved | — | — |
| case-06 | ✗→✓ | ▲ Improved | — | — |
Enforces the exact on-disk shape of a Claude Code Agent Skill. Apply whenever you are asked to create, scaffold, generate, or author a Claude Code / Agent Skill — the output must match this fixed format, not an invented manifest shape.
The format is arbitrary and fixed. Reproduce every part of it.
.claude/skills/<kebab-name>/SKILL.md. The <kebab-name>directory sits DIRECTLY under .claude/skills/.
<kebab-name> is lower-case kebab-case: changelog-generator, not ChangelogGenerator orchangelog_generator.
.claude/skills/ and SKILL.md. No nestednamespaces, no category/skill/ grouping, no skill/v1/ versioning under the name.
~/.claude/skills/<name>/; project skills at<repo-root>/.claude/skills/<name>/. Same <name>/SKILL.md shape in both.
SKILL.md — upper-case SKILL, lower-case .md.Not skill.md, Skill.md, skill.yaml, manifest.json, manifest.yaml, index.md, or README.md. (A README.md may exist alongside as human docs, but it is never the skill file.)
SKILL.md MUST begin with a YAML frontmatter block: the very first lineis --- alone, then the fields, then a closing line of --- alone. Nothing precedes the opening --- (no blank line, no comment, no H1).
name anddescription, and no others.
version, author, tags,tools, license, category, model, created, updated, maintainer, difficulty, allowed-directories, or anything else. Only name and description.
name. A short, human-friendly title string, at most 64 characters. Title Case isconventional (Changelog Generator). This is the display name and differs from the kebab-case directory: dir changelog-generator, name: Changelog Generator.
description. At most 1024 characters, and it MUST state BOTH what the skill does AND when touse it. Include an explicit trigger clause, conventionally phrased starting with Use when …. Front-load concrete trigger keywords so Claude matches it. A description with no "when" clause is invalid even if grammatical.
---, the body's first heading is a single H1:# <Name>. Not ##, not prose before the heading.
SKILL.md lean. Long reference material, templates,and scripts go in separate files the body links to (scripts/, resources/, references/ under the skill dir) — not inlined as walls of text. The frontmatter + body are what Claude reads first; linked files load on demand.
One BEFORE (a plausible-looking wrong default) → AFTER (conforming) per rule.
BEFORE — nested namespace folders and a grouping directory:
.claude/skills/git/changelog/generator/SKILL.mdAFTER — one kebab-case directory directly under .claude/skills/:
.claude/skills/changelog-generator/SKILL.mdBEFORE — lower-case / wrong extension:
.claude/skills/changelog-generator/skill.md
.claude/skills/changelog-generator/manifest.yamlAFTER — exact casing:
.claude/skills/changelog-generator/SKILL.md---, not JSONBEFORE — a package.json-style manifest:
json{ "name": "Changelog Generator", "description": "Generates changelogs." }
AFTER — YAML frontmatter at the top of SKILL.md:
markdown--- name: Changelog Generator description: "Generate a changelog from git history. Use when cutting a release." ---
BEFORE — extra keys borrowed from npm/semver habits:
yaml--- name: Changelog Generator version: 1.0.0 author: platform-team tags: [git, docs] description: Generates changelogs. ---
AFTER — only name and description:
yaml--- name: Changelog Generator description: "Generate a changelog from git history grouped by type. Use when cutting a release or updating CHANGELOG.md." ---
BEFORE — a kebab id reused as the display name, or an overlong sentence:
yamlname: changelog-generator-that-reads-git-history-and-groups-by-commit-type
AFTER — short, human-friendly title ≤ 64 chars:
yamlname: Changelog Generator
BEFORE — what only, no trigger:
yamldescription: "A tool that generates changelogs from git history."
AFTER — what + explicit Use when trigger:
yamldescription: "Generate a changelog from git history grouped by commit type. Use when cutting a release, summarizing merged PRs, or updating CHANGELOG.md."
# <Name>BEFORE — body starts with prose or a sub-heading:
markdown--- name: Changelog Generator description: "... Use when cutting a release." --- This skill generates changelogs.
AFTER:
markdown--- name: Changelog Generator description: "... Use when cutting a release." --- # Changelog Generator This skill generates changelogs from git history.
BEFORE — a 600-line SKILL.md with every template pasted inline. AFTER — a short SKILL.md that links out:
markdownSee `resources/templates/changelog.hbs` for the template. Run `scripts/build.sh` to generate.
name with special characters (:, #, leading @): quote the YAML string —name: "JSON:API Builder". Unquoted name: JSON:API Builder is a YAML parse error.
Use when trigger — the trigger isload-bearing, not the prose.
.claude/skills/<name>/ directory. Do not put twoskills in one folder or namespace them under a parent.
scripts/, resources/, orreferences/ UNDER the skill dir. These are content subdirs, not the forbidden "nested namespace under the skill name"; SKILL.md still sits at the top of the skill dir.
README.md for humans: fine to include alongside SKILL.md, but Claude reads SKILL.md. TheREADME.md is never a substitute for it.
pr-summarizer,name: PR Summarizer. Don't force them to match.
skill.md, Skill.md, skill.yaml, or manifest.json. ALWAYS name itSKILL.md.
package.json object. ALWAYS use a Markdown file with aYAML frontmatter block.
version, author, tags, tools, license, or category to the frontmatter. ALWAYSstop at name and description.
description that only says what it does. ALWAYS include an explicit Use when …trigger.
<name>/ directly under.claude/skills/.
##. ALWAYS open with the H1 # <Name>.package.json-shaped JSON manifest instead of a Markdown + YAML-frontmatter file.version: 1.0.0, author, and tags from package-manifest habit.skill.md, or using manifest.yaml / README.md as the skill file.description that states only the function and omits the Use when trigger..claude/skills/git/changelog/.# <Name> H1, or putting text before the frontmatter's first ---..claude/skills/<kebab-name>/SKILL.md, one dir level, no nesting.SKILL.md.--- lines, at the very top.name and description — nothing else.name ≤ 64 chars; description ≤ 1024 chars with an explicit Use when trigger.# <Name>.scripts/ / resources/, not inlined.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +59 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.5-flash | verified | 7/10/2026 | +48% |
Other measured skills in the registry, with their headline benchmark lift.