skill-frontmatter-best-practices
Skill Frontmatter Best Practices
Skill frontmatter is the YAML header that tells Claude when to invoke a skill. The name field identifies the skill. The description field determines whether the skill gets triggered. A bad description means the skill never fires when it should, or fires when it shouldn't.
The principle: the description is a matching function, not a marketing pitch. Its only job is to help Claude decide "should I use this skill for this user request?" Write it for precision matching, not for humans to read.
Frontmatter Structure
Required fields
---
name: cold-outbound-email-writing
description: This skill should be used when the user asks to "write cold outbound", "draft a cold email sequence", "write a sales sequence", "write outbound copy", "build a Lemlist sequence", "build an Outreach sequence", "write B2B cold emails", "draft a 3-email sequence", or any variation of writing outbound email copy for a B2B SaaS audience.
version: 0.1.0
---
| Field | Format | Rules |
|---|---|---|
| name | kebab-case slug | Must match the directory name. cold-outbound-email-writing not Cold Outbound Email Writing |
| description | Single string starting with "This skill should be used when the user asks to..." | Contains 6-10 trigger phrases in quotes, plus a catch-all closing phrase |
| version | Semantic version | Start at 0.1.0. Bump minor for content changes. Bump major for structural changes |
Writing the Name
Name rules
- Kebab-case.
cold-outbound-email-writingnotcoldOutboundEmailWritingorcold_outbound_email_writing - Match the directory. If the skill lives in
skills/cold-outbound-email-writing/SKILL.md, the name iscold-outbound-email-writing. No exceptions - Descriptive, not clever.
email-warmup-strategynotwarming-upordeliverability-boost. The name should tell you what the skill does without reading the description - 2-4 words.
cold-email-openersis ideal.advanced-enterprise-multi-channel-cadence-design-frameworkis too long. If you need more than 4 words, the skill scope is too broad. Split it
Name patterns
| Pattern | Example | When to use |
|---|---|---|
| [topic]-[action] | cold-email-writing, list-building |
When the skill produces output (writes, builds, designs) |
| [topic]-[comparison] | mcp-vs-tool-use, outreach-vs-salesloft |
When the skill compares options |
| [tool]-[feature] | hubspot-deal-stages, lemlist-warmup |
When the skill is about a specific tool |
| [concept]-[framework] | icp-definition-framework, bant-qualification |
When the skill teaches a methodology |
Writing the Description
The description is the most important field. It determines matching accuracy. A good description triggers on relevant queries and ignores irrelevant ones.
Description structure
This skill should be used when the user asks to
"[trigger 1]", "[trigger 2]", "[trigger 3]",
"[trigger 4]", "[trigger 5]", "[trigger 6]",
"[trigger 7]", "[trigger 8]",
or any variation of [catch-all summary].
Trigger phrase rules
- 6-10 trigger phrases. Fewer than 6 and you miss valid queries. More than 10 and the description gets noisy
- Each trigger is a different phrasing of the same intent. Not 10 different tasks. 10 different ways to ask for the same task
- Include natural language variations. Users say "write cold emails" not "cold outbound email writing." Include the conversational phrasing
- Include tool-specific triggers. If the skill applies to Lemlist, include "build a Lemlist sequence." Users often ask by tool name
- Include problem-phrasing triggers. Not just "write cold emails" but "improve my cold email reply rates." Users sometimes state the problem, not the task
- Include abbreviated and full-form triggers. Both "set up SPF DKIM DMARC" and "configure email authentication for cold outbound"
- Wrap each trigger in double quotes. Consistent formatting helps with matching
Good vs bad trigger phrases
| Good trigger phrase | Bad trigger phrase | Why bad is bad |
|---|---|---|
| "write cold outbound" | "emails" | Too generic. Would match any email-related query |
| "draft a cold email sequence" | "help with sales" | Too broad. Matches discovery calls, demos, pricing |
| "build a Lemlist sequence" | "use Lemlist" | Too vague. Could be about Lemlist reporting, settings, anything |
| "write B2B cold emails" | "outbound" | Matches outbound calling, LinkedIn outbound, not specific enough |
| "improve cold email reply rates" | "get more replies" | Ambiguous. Replies to what? Cold emails? Support tickets? |
The catch-all phrase
The final phrase ("or any variation of...") is the safety net. It should:
- Summarize the skill's core intent in one phrase
- Include the domain qualifier (e.g., "for B2B SaaS")
- Be specific enough to exclude adjacent skills
Good catch-all:
or any variation of writing outbound email copy
for a B2B SaaS audience
Bad catch-all:
or any variation of email-related tasks
The bad version would match email verification, email warmup, email analytics. Those are different skills.
Avoiding Trigger Collisions
What a collision is
Two skills fire on the same query because their descriptions overlap.
Skill A: cold-outbound-email-writing
Trigger: "write cold emails"
Skill B: cold-email-personalization
Trigger: "personalize cold emails"
User query: "write personalized cold emails"
→ Both skills match. Claude picks one. Might be wrong.
Collision prevention rules
- Each skill owns a specific verb. Email writing owns "write", "draft", "compose." Personalization owns "personalize", "customize", "tailor." Don't overlap verbs
- Scope by specificity. A broader skill (cold-outbound-email-writing) handles general requests. A narrower skill (cold-email-subject-lines) handles specific requests. The narrow skill's triggers should be narrow enough that the broad skill doesn't match
- Test for collisions. Before finalizing a description, check 5 other skills in the same category. Would any of their triggers fire on your skill's queries? Would your triggers fire on their queries?
- Use exclusion language in the catch-all when needed. "Any variation of personalizing cold email content (not full sequence writing)" clarifies the boundary
Common collision pairs
| Skill A | Skill B | Resolution |
|---|---|---|
| cold-outbound-email-writing | cold-email-personalization | Writing owns "write/draft a sequence." Personalization owns "personalize/customize the first line" |
| discovery-call-design | discovery-call-questions | Design owns "design/structure a discovery call." Questions owns "what questions to ask on discovery" |
| hubspot-sequences-setup | hubspot-workflows-design | Sequences owns "set up sequences." Workflows owns "design workflows." Different HubSpot features |
| list-building-cold-outbound | icp-list-from-linkedin-sales-nav | List building owns general list queries. Sales Nav owns LinkedIn-specific queries |
Version Management
Versioning rules
| Change type | Version bump | Example |
|---|---|---|
| Typo fix, minor wording | Patch: 0.1.0 → 0.1.1 | Fixed a trigger phrase spelling |
| New section, updated examples | Minor: 0.1.0 → 0.2.0 | Added anti-pattern section, updated proof points |
| Restructured skill, changed scope | Major: 0.1.0 → 1.0.0 | Merged two skills or split one skill into two |
| Initial draft | 0.1.0 | Always start here |
| Production-ready after testing | 1.0.0 | Promoted after eval passes |
Version rules
- Start every new skill at 0.1.0. Not 1.0.0. The
0.xprefix signals "draft, not yet validated" - Bump to 1.0.0 when the skill passes eval. Run the skill on 10 test queries. If it triggers correctly and produces good output, promote to 1.0
- Never skip versions. 0.1.0 → 0.2.0 → 0.3.0, not 0.1.0 → 0.5.0. The version log should show a clear progression
Formatting Rules
YAML formatting
- Three dashes to open and close.
---on its own line before and after the YAML block - No trailing spaces. YAML is whitespace-sensitive. Trailing spaces can cause parsing errors
- Description on one line. Even if it's long. Don't break the description across multiple lines with YAML multi-line syntax. One continuous string is more reliable for matching
- No quotes around the name.
name: cold-outbound-email-writingnotname: "cold-outbound-email-writing" - Double quotes for the description value. Only if it contains special characters. Otherwise, no quotes needed. But if in doubt, use quotes
Common YAML mistakes
| Mistake | What happens | Fix |
|---|---|---|
Missing closing --- |
Skill body parsed as YAML. Entire skill breaks | Always close with --- on its own line |
| Colon in description without quotes | YAML parser breaks on the colon | Wrap description in quotes if it contains colons |
| Tab characters | YAML requires spaces, not tabs | Use 2-space indentation |
| Unicode characters in name | Directory name won't match on some systems | ASCII only in the name field |
Pre-Publish Checklist
Before publishing a skill's frontmatter:
- [ ] Name is kebab-case and matches the directory name
- [ ] Name is 2-4 words, descriptive
- [ ] Description starts with "This skill should be used when the user asks to"
- [ ] Description contains 6-10 trigger phrases in double quotes
- [ ] Trigger phrases are natural language (how users actually ask)
- [ ] Trigger phrases include tool-specific variations where relevant
- [ ] Trigger phrases include problem-phrasing variations
- [ ] Catch-all phrase includes domain qualifier ("for B2B SaaS")
- [ ] No trigger collisions with skills in the same category (checked 5 adjacent skills)
- [ ] Version is 0.1.0 for drafts, 1.0.0+ for validated skills
- [ ] YAML parses without errors (tested with a YAML validator)
Anti-Pattern Check
- Description is a marketing pitch. "This powerful skill helps teams unlock the potential of cold outbound by leveraging AI-driven personalization." Claude doesn't need to be sold. It needs trigger phrases. Write for matching, not marketing
- Only 2 trigger phrases. The skill fires on "write cold emails" and "draft outbound sequences" but misses "build a Lemlist campaign," "create a cold email," and "write a sales email." Include 6-10 diverse phrasings
- Trigger phrases are all synonyms. "Write cold emails", "compose cold emails", "author cold emails", "craft cold emails." These are the same query phrased 4 ways. Include different angles: tool-specific, problem-phrased, abbreviated
- Catch-all is too broad. "Any variation of email tasks" matches email verification, deliverability, analytics, and writing. Narrow to "any variation of writing outbound email copy for B2B SaaS"
- Name doesn't match directory.
name: cold-email-writingbut the directory iscold-outbound-email-writing/. The mismatch causes routing failures. Always verify name matches directory exactly - Never updating the version. The skill has been edited 12 times and is still at version 0.1.0. Bump the version on every meaningful change so you can track which version is deployed
- Description broken across multiple YAML lines. Using
>or|for multi-line strings. This can cause matching issues. Keep the description as one continuous string, even if it's long