64 / 1024 / 1536 / 500 / 100 / 3. Only two of those six will ever actually stop you. Mix them up and you'll economize in exactly the wrong place.
How long should SKILL.md be? How many files? What makes a description trigger reliably? Anthropic answers all of it on one page — Skill authoring best practices — and answers in numbers. The problem is that the page runs several thousand words, and finishing it with only "be concise" in your head is the same as not reading it. This issue compresses it into one lookup table, then asks of every rule: why this number? Because once you know the mechanism, you know which rules bend and which ones break things. Every skill and doc named below is a link you can open; section 03 uses only skills that actually ship in the official repository, and section 04 covers where the guide itself will trip you up.
# 1. Copy the official minimal skeleton (template/ holds exactly one file)
mkdir -p .claude/skills/analyzing-invoices
curl -o .claude/skills/analyzing-invoices/SKILL.md \
https://raw.githubusercontent.com/anthropics/skills/main/template/SKILL.md
# 2. Fill in name / description per the table, then check the YAML (v2.1.233+)
/plugin validate
# 3. See what this skill costs you in the listing — that's your standing tax
/context
# 4. Want the evaluation machinery? Install the official skill-creator
/plugin install skill-creator@claude-plugins-official
# 5. Two weeks later, audit: which skills never fired (v2.1.252+, interactive)
/skill-doctor
Because it is injected into the system prompt. The guide's own wording: an inconsistent point of view "can cause discovery problems." "Processes Excel files and generates reports" is right; "I can help you process Excel files" and "You can use this to process Excel files" are both wrong — a first-person blurb appearing inside a system prompt blurs the line between the model's own identity and a candidate tool. And the description is the only retrieval key you get: the docs state plainly that Claude uses it to pick the right skill "from potentially 100+ available Skills." However good your body text is, it never enters that round of selection.
The guide reports a very specific observed behavior: with nested references (SKILL.md → advanced.md → details.md), Claude often doesn't read the file whole — it previews with something like head -100 and walks away with incomplete information. So the rule isn't "don't nest too much," it's "every reference file links directly from SKILL.md." The same mechanism explains the neighboring rule: reference files over 100 lines need a table of contents at the top, because a partial read may be all you get, and a ToC at least tells the model what else is in there.
Look at the last row of the loading table: scripts execute through bash, their code never enters context, and only their output is billed. So shipping a validate.py versus having the model improvise validation code each time isn't a matter of taste — three things improve at once: reliability (it doesn't come out different every run), tokens (the code stays off the context window), and speed (nothing to generate). The guide also insists you state whether Claude should execute or read: "Run analyze_form.py to extract fields" and "See analyze_form.py for the extraction algorithm" are different instructions — the first is nearly free, the second costs you the whole file.
The official analogy treats Claude as a robot walking a path. A narrow bridge with cliffs on both sides has exactly one safe route, so you give exact instructions and guardrails (low freedom). The doc's example is a database migration: "Run exactly this script: python scripts/migrate.py --verify --backup", immediately followed by "Do not modify the command or add additional flags." An open field with no hazards has many routes, so you give direction and get out of the way (high freedom) — the example is code review: analyze structure, check for bugs and edge cases, suggest readability improvements, verify project conventions. Four lines, not one concrete command. The middle rung is pseudocode or a parameterized script, for when a preferred pattern exists but variation is fine. The single criterion is how fragile the task is.
anthropics/skills. Copy the instance, not the page — because the paths in the docs' examples don't match the real skills.SKILL.md keeps only the quick start and hands everything else to sibling files — FORMS.md, REFERENCE.md, EXAMPLES.md — each read only when needed. Right for a skill that does one thing but has a few deep ends.
claude-apiThe doc's illustration is a BigQuery skill with reference/finance.md, sales.md, product.md, marketing.md, and a SKILL.md that is pure navigation. The reasoning is concrete: when someone asks about sales metrics, the model shouldn't be forced to load the finance and marketing schemas. The official claude-api skill is this structure in finished form (it ships bundled with Claude Code), split by language and by topic across a dozen-plus files. The guide even suggests putting grep commands in SKILL.md — grep -i "revenue" reference/finance.md — so the model can fish for itself. When not to: splitting a single-domain skill into many files just adds a round trip.
docxBasics live in the body, advanced branches hang off links: simple edits go straight to the XML; tracked changes → see REDLINING.md; OOXML internals → see OOXML.md. But the part of the real docx skill most worth stealing is its validation loop — unzip, run scripts/merge_runs.py to coalesce fragmented runs so text is findable, edit word/document.xml in place (with an explicit "do NOT reformat or pretty-print"), rezip, and then:
python scripts/office/validate.py out.docx --original doc.docx
# XSD checks; --auto-repair fixes common issues; add --author for redlining
Note a real inconsistency here: the best-practices page writes that example command as python ooxml/scripts/validate.py unpacked_dir/, while the repository's own skills/docx/SKILL.md actually runs scripts/office/validate.py out.docx --original doc.docx. The path in the docs is illustrative, not runnable. Copy commands from the skill, not from the guide.
The guide only tells you to write "what it does and when to use it." But look at the real thing — the docx description ends with: "Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation." Negative triggers are a move the docs never mention and the shipping skills use anyway. Once your library holds several adjacent skills (docx / pdf / pptx / xlsx being the obvious set), stating what a skill is not for buys more accuracy than another positive keyword.
"Create evaluations BEFORE writing extensive documentation" is set in bold at the top of the evaluation section. The five steps: (1) run Claude on representative tasks with no skill and document the specific failures, (2) build three scenarios around those gaps, (3) measure the baseline, (4) write just enough content to close the gaps, (5) run the evals, compare against baseline, refine. One sentence of justification: this way you're solving actual problems.
There's a catch. The guide gives an evaluation JSON structure (skills / query / files / expected_behavior), then a Note immediately underneath says there is not currently a built-in way to run these evaluations — you build your own harness. So walking the five steps means writing a runner yourself, or installing skill-creator, which brings its own pipeline (evals/evals.json → grading.json → benchmark.json, running with-skill and without-skill groups side by side). The two tracks are not interchangeable; one eval file will not run everywhere.
The recommended iteration loop uses two instances: Claude A helps you write and refine the skill; Claude B, a fresh instance with the skill loaded, does real work with it. You watch where B stumbles and bring that back to A. The doc's own example is precise — "I asked B for a regional sales report and it wrote the query but forgot to filter out test accounts, even though the skill mentions this rule. Maybe it isn't prominent enough?" A might respond by reorganizing, or by hardening "always filter" into "MUST filter." The value is that it forces you to use observed behavior as evidence, instead of the feeling that things got better.
name and description, but the fields Claude Code supports fill a whole table — allowed-tools, disallowed-tools, paths, model, effort, context: fork, hooks, disable-model-invocation and more, with license and compatibility flagged as Agent Skills spec fields. Write in Claude Code habits and your skill degrades silently elsewhere.ServerName:tool_name — BigQuery:bigquery_schema, GitHub:create_issue. Drop the prefix and, with several MCP servers connected, the model may simply fail to find the tool. The official mcp-builder follows this rule throughout./skill-doctor lists each skill's token cost and invocation frequency and flags the ones that never fired at all — usually not because they're useless, but because the description never made it through selection. Delete them or rewrite the description; leaving them is pure rent.Do these three first: (1) copy template/SKILL.md into .claude/skills/ as your standing stub — plain text, zero cost, never expires; (2) install skill-creator (/plugin install skill-creator@claude-plugins-official) for its baseline-comparison evaluation machinery, not for drafting; (3) make /context and /skill-doctor a fortnightly habit.
When copying structure: one thing with several deep ends → pattern 1 (flat FORMS.md / REFERENCE.md); several domains → copy the official claude-api; correctness that must hold → copy the official docx loop of unpack, edit, scripts/office/validate.py, repack. Take commands from the skill itself, never from an illustrative path in the docs.
Numbers to keep handy: name <= 64 · description <= 1024 and third person · Claude Code listing truncates at 1,536 (a real cut) · body under 500 lines (a guideline) · references one level deep · reference files over 100 lines get a ToC · at least 3 evaluations · test on Haiku, Sonnet and Opus · ~100 tokens of standing metadata per skill · body under 5k tokens.
Order of operations: run the real task with no skill → write down the specific failures → build three scenarios → measure the baseline → write just enough → iterate against the baseline. Never documentation first.
name and description; individual harnesses may add fields of their own.TIMEOUT = 47). The guide asks that every configured value be justified: if you don't know the right value, how would Claude?/skill-doctor (v2.1.252+), /plugin validate (v2.1.233+), /context, and the skill directory hierarchyskills/, spec/, template/ and the plugin manifestscripts/office/validate.py, scripts/merge_runs.py, and the negative trigger closing its descriptionServerName:tool_name ruleskill-creator and mcp-builder, and why the category splits into three layers