What a skill actually is
Strip the branding and a skill is a directory with one required file. SKILL.md opens with YAML frontmatter carrying a name and a description, then continues as ordinary Markdown instructions. The folder can also hold scripts the instructions invoke, reference documents, and asset templates. That is the whole format, and it is deliberately boring: a skill is a procedure written down, packaged so an agent can find it.
---
name: brand-audit
description: Check UI code against the project design system. Use when reviewing components, screens, or PRs for hardcoded colors, off-scale spacing, or fonts that bypass the tokens in DESIGN.md.
---
# Brand audit
1. Read DESIGN.md at the repo root before judging anything.
2. Flag any literal hex value, arbitrary Tailwind color, or font-family
that does not come from the token set.
3. Report violations as file:line with the token that should be used.The same format now works beyond Claude Code: it grew into an open agent-skills convention that OpenAI's Codex and Cursor have adopted with their own discovery paths, which is why a skill you write once increasingly travels with you. We cover the Codex side in Codex skills.
The loading mechanism, which explains everything else
Claude Code does not read your skills into every conversation. At session start it indexes only the frontmatter: each skill contributes its name and description to context, a couple of lines, nothing more. The full body, the scripts, the reference files load only when Claude decides the current task matches a description, or when you invoke the skill explicitly. Anthropic calls this progressive disclosure, and it is the design decision the whole feature hangs on.
Two practical consequences follow. First, installing fifty skills costs you almost nothing in context, so hoarding is cheap; a hundred descriptions weigh less than one loaded skill body. Second, and this is the part the roundup posts miss, a skill with a weak description is *installed but unreachable*. Claude cannot match a task to "Helps with frontend stuff." The complaints that fill Reddit threads, I installed twenty skills and nothing changed, are usually this: the bodies were fine, the descriptions never gave the model a reason to open them.
The description is the API
Write descriptions the way you would write a function signature for a caller who cannot read the implementation. Name the trigger situations ("use when reviewing components or PRs"), the inputs it expects, and the surface it touches. A concrete description is both the trigger condition and the promise the skill has to keep.
Where skills live
~/.claude/skills/<skill-name>/SKILL.md: personal skills, available in every project you open..claude/skills/<skill-name>/SKILL.md: project skills, committed to the repo so every collaborator and every agent session gets them.- Plugins: a plugin can bundle skills alongside commands and agents, which is how teams distribute a set in one install.
The repo location matters more than it looks. A personal skill fixes your sessions; a committed one fixes your teammate's sessions and your CI agent's sessions too. Anything that encodes a project contract, how we review UI, how we write migrations, how we apply the design system, belongs in .claude/skills/ next to the code it governs.
Skills, CLAUDE.md, or a subagent?
Claude Code gives you three places to put knowledge, and they answer different questions. CLAUDE.md is always loaded: it is for constraints that apply to every request, and every line in it is paid for on every prompt, so it should stay short. A skill loads on demand: it is for procedures that are only sometimes relevant, and it can be long because it costs nothing until it fires. A subagent is a separate context entirely: it is for work whose intermediate output would pollute your session.
| Loads | Best for | Cost when idle | |
|---|---|---|---|
| CLAUDE.md / rules | Every request | Hard constraints: build commands, never-do rules | Every line, every prompt |
| Skill | When the task matches its description | Procedures: reviews, releases, audits, design application | Two lines of frontmatter |
| Subagent | When delegated | Work with noisy intermediate output | Nothing |
The dividing line for the full file taxonomy, including AGENTS.md and DESIGN.md, is in CLAUDE.md vs AGENTS.md vs SKILL.md vs DESIGN.md.
How to write a skill that fires
- 1
Start from a repeated correction
The best skill candidates are the things you keep typing: the review checklist you paste, the deploy sequence you re-explain. If you have never corrected the agent about it twice, it does not need a skill yet.
- 2
Write the description first, as trigger conditions
Before the instructions, write the sentence that decides when this loads: the verbs and situations a matching request would contain. If you cannot name the situations, the skill will not fire and you have discovered that early.
- 3
Make the body an executable procedure
Numbered steps, exact commands, exact file paths. Reference files in the skill folder for anything long. An agent follows a procedure far more reliably than it channels a vibe.
- 4
Point at artifacts, not adjectives
A skill that says "keep the UI consistent" does nothing. A skill that says "read DESIGN.md and use only its tokens" works, because the judgment is externalized into a file the agent can open. Put the knowledge in an artifact and let the skill be the pointer.
- 5
Test it by asking, not invoking
Do not test with an explicit invocation; that proves nothing about the trigger. Phrase a request the way you naturally would and check whether the skill loads. If it does not, the description, not the body, is what needs editing.
The worked example: a design skill and the file behind it
Design is the perfect skill use case, and the perfect illustration of the artifact rule above. Anthropic ships a frontend design skill for Claude Code, and it genuinely improves single screens; we tested it and wrote up exactly what it does and what it misses. What it misses is memory between screens: the skill carries taste, not your values, so screen twenty drifts from screen one. Taste generalizes; identity does not.
The fix is the pattern from step four: the skill stays a thin procedure, and the identity lives in an artifact, a DESIGN.md at the repo root with real tokens, type choices, spacing rules, and do-not rules. The brand-audit skill at the top of this page is only twelve lines because everything it enforces is defined in that one file. That is what a design system for an agent is: not a plugin, a readable contract.
Ambient Sage
Live renderRendered from the kit's actual tokens, fonts, and treatments
Typography
Plus Jakarta Sans
Color system
28 semantic roles, light + dark
Agent outputs
DESIGN.md, CSS, Tailwind, shadcn
Give your skills something to enforce
Every kit exports a complete DESIGN.md: semantic tokens in light and dark, typography, spacing, motifs, and agent rules. Install one and your design skill stops improvising.
npx --yes identityforge@latest install --client claude-codeSkills across tools: the same idea is spreading
The skill format stopped being Claude-specific in a way that matters for what you invest in. OpenAI's Codex discovers SKILL.md folders under .agents/skills/ and ~/.agents/skills/ and invokes them with $; Cursor added Agent Skills with the same on-demand loading next to its always-on Rules, and has been steering long procedural rules toward skills. The convention is converging on the same shape everywhere: frontmatter that advertises, a body that instructs, loading that waits for relevance. Skills you write against artifacts in your repo, rather than against one tool's quirks, survive the tool churn.
Why do my installed Claude Code skills never do anything?
Almost always the description. Claude only sees each skill's name and description until it decides to load one, so a vague description ("helps with testing") gives it nothing to match against your request. Rewrite the description to name concrete trigger situations and inputs, then test by phrasing a natural request rather than invoking the skill explicitly.
What is the difference between a skill and CLAUDE.md?
CLAUDE.md is loaded on every request, so it is for short, always-true constraints, and every line costs context on every prompt. A skill loads only when your task matches its description, so it is for longer procedures that are only sometimes relevant. If you find yourself pasting a checklist into CLAUDE.md, it probably wants to be a skill.
Where do I put a skill so my whole team gets it?
Commit it to the repository at .claude/skills/<name>/SKILL.md. Personal skills in ~/.claude/skills/ follow you across projects but reach nobody else; a plugin is the distribution path when one set of skills should install across many repos.
Can a skill make Claude Code follow my design system?
Yes, and it is the highest-leverage design move in Claude Code, but the skill should be thin: a procedure that says read DESIGN.md, use only its tokens, never hardcode a color. The system itself, tokens, typography, spacing, rules, belongs in that file, not in the skill. Any Identity Forge kit exports a complete DESIGN.md to fill that role.
How many skills is too many?
Idle skills are nearly free, since only the name and description sit in context. The real ceiling is discrimination: many skills with overlapping, vague descriptions blur together and misfire. Fewer skills with sharp, situation-naming descriptions beat a large fuzzy library.