Skills Best Practices
Comprehensive best practices for developing Claude Skills, based on Anthropic's official guidelines and our experience with AI Design Components.
Core Principles
1. Conciseness is Critical
Context window is a public good - minimize token usage
- Only include what Claude doesn't already know
- Remove general knowledge; focus on specialized, domain-specific information
- Keep SKILL.md under 500 lines
- Use progressive disclosure for additional content
Example:
- ❌ Bad: "React is a JavaScript library for building user interfaces. It was created by Facebook..."
- ✅ Good: "Use React Hook Form for forms. It reduces re-renders by 30-40% vs Formik."
2. Appropriate Degrees of Freedom
Choose the right format based on how deterministic the task is:
High Freedom (Text Instructions):
- Multiple valid approaches exist
- Context-dependent decisions
- Creative problem-solving needed
- Example: "Design a dashboard layout considering user's data density preferences"
Medium Freedom (Templates/Config):
- Preferred patterns with acceptable variation
- Structured but flexible
- Example: Component templates with configurable props
Low Freedom (Executable Scripts):
- Fragile operations requiring consistency
- Deterministic processes
- Example: Token generation, validation scripts
Key Insight: Scripts execute WITHOUT being loaded into context = zero token cost!
3. Progressive Disclosure Design
Structure information in layers:
Level 1: Metadata (name + description) - Always in context (~100 words) Level 2: SKILL.md body - Loaded when triggered (<5k words ideal) Level 3: Bundled resources - Loaded/executed as needed (unlimited)
Rules:
- Main SKILL.md references additional files (one level deep only)
- Avoid deeply nested references (SKILL.md → file.md → another.md is BAD)
- All reference files should link directly from SKILL.md
- Use descriptive filenames:
chart-types.md, notdoc2.md
4. Evaluation-Driven Development
Build skills through iteration:
- Identify gaps - Run tasks without Skill first, document failures
- Create evaluations - Build 3+ test scenarios
- Establish baseline - Measure performance without Skill
- Write minimal instructions - Just enough to pass evaluations
- Iterate - Execute evaluations and refine
Two-Claude Method:
- Claude A (expert) - Designs and refines the Skill
- Claude B (agent) - Uses the Skill for real work
- Test with Claude B on real tasks, return to Claude A with observations
Skill Development Guidelines
Naming Convention
Use gerund form (verb + -ing):
- ✅ Good:
building-forms,visualizing-data,processing-pdfs,analyzing-spreadsheets - ❌ Bad:
form-builder,data-viz-helper,pdf-processor,tools
Requirements:
- Lowercase with hyphens only
- Max 64 characters
- Descriptive and action-oriented
- No starting/ending hyphens or consecutive hyphens
SKILL.md Structure
Frontmatter (Required):
---
name: skill-name # lowercase, hyphens, gerund form
description: What this skill does AND when to use it (max 1024 chars)
---
Description Requirements:
- Include both WHAT and WHEN
- Use third-person ("This skill helps...")
- Max 1024 characters
- No angle brackets or special characters
Content Structure:
-
Purpose (2-3 sentences)
- What the skill does
- Primary use cases
-
When to Use (specific triggers)
- Concrete scenarios
- Decision criteria
-
How to Use (reference resources)
- Link to bundled resources
- Provide decision frameworks
- Include working examples
-
Decision Frameworks (not option lists)
- Help Claude choose between alternatives
- Provide clear criteria
-
Examples (concrete, not abstract)
- Working code examples
- Real-world scenarios
Writing Style:
- Use imperative/infinitive form (NOT second person)
- ✅ "To build a form, use React Hook Form..."
- ✅ "Reference validation-patterns.md for details..."
- ❌ "You should use React Hook Form..."
- ❌ "If you want to build a form..."
File Structure
skills/[skill-name]/
├── SKILL.md # Main skill file (<500 lines)
├── references/ # Detailed documentation (loaded on-demand)
│ ├── guide-name.md
│ └── patterns.md
├── examples/ # Code examples by language/framework
│ ├── react/
│ ├── vue/
│ └── python/
├── scripts/ # Utility scripts (executed without loading!)
│ └── helper.py
└── assets/ # Templates, schemas, etc.
└── template.json
File Path Convention:
- Always use forward slashes:
references/guide.md - Never use backslashes:
references\guide.md(Windows-style)
Quality Checklist
Before finalizing a skill, verify:
Core Quality
- Description includes both WHAT and WHEN
- SKILL.md body under 500 lines
- No time-sensitive information
- Consistent terminology throughout
- Examples are concrete, not abstract
- File references are one level deep from SKILL.md
Naming and Structure
- Name uses gerund form (verb + -ing)
- Name: lowercase, hyphens only, max 64 chars
- Description: max 1024 chars, non-empty
- File paths use forward slashes (not backslashes)
- Frontmatter format correct (starts and ends with
---)
Code and Scripts
- Scripts solve problems rather than punt to Claude
- Error handling is explicit and helpful
- No "voodoo constants" - all values justified
- Required packages listed and verified
Testing
- At least 3 evaluations created
- Tested with relevant models (Haiku, Sonnet, Opus)
- Tested with real usage scenarios
- Performance and token usage acceptable
Anti-Patterns to Avoid
1. Windows-Style Paths
❌ Bad: references\guide.md, scripts\helper.py
✅ Good: references/guide.md, scripts/helper.py
2. Deeply Nested References
❌ Bad: SKILL.md → intermediate.md → actual-content.md ✅ Good: SKILL.md → actual-content.md (one level only)
3. Offering Too Many Options
❌ Bad: "You could use library A, B, C, D, E, or F..." ✅ Good: "Use library A for most cases. Use B if you need feature X."
4. Assuming Package Availability
❌ Bad: "Run the script" (script fails due to missing packages) ✅ Good: "Install: pip install pandas numpy. Then run the script."
5. Including Unnecessary Context
❌ Bad: "React is a JavaScript library created by Facebook in 2013..." ✅ Good: "Use React Hook Form for performant form handling."
6. Time-Sensitive Information
❌ Bad: "The latest version is 2.5.1 (as of March 2024)" ✅ Good: "Check npm for the latest version"
7. Inconsistent Terminology
❌ Bad: Using "form", "input form", "data entry form" interchangeably ✅ Good: Choose "form" and use it consistently
Testing Across Models
Different Claude models require different levels of guidance:
Haiku:
- Needs more detailed guidance
- More explicit examples
- Step-by-step instructions
Sonnet:
- Balanced approach
- Moderate detail
- Decision frameworks sufficient
Opus:
- Can handle less guidance
- More inference capability
- Higher-level patterns work
Best Practice: Test with all three models and adjust detail level accordingly.
Token Efficiency Patterns
Scripts are Token-Free
Most important pattern:
Scripts in scripts/ can be EXECUTED without being LOADED into context.
= Infinite code complexity with ZERO token cost.
Applications:
- Token generation scripts (free)
- Validation scripts (free)
- Theme building (free)
- Complex algorithms (free)
Progressive Disclosure
3-Level Loading:
Level 1: Metadata (name + description) - Always in context (~100 words)
Level 2: SKILL.md body - Loaded when triggered (<5k words ideal)
Level 3: Bundled resources - Loaded/executed as needed (unlimited)
Our structure:
- init.md = master plan (planning phase)
- SKILL.md = actual skill (implementation phase)
- references/, scripts/, examples/, assets/ = bundled resources
Component Design Best Practices
Decision Frameworks Over Lists
❌ Bad: Option List
For forms, you can use:
- React Hook Form
- Formik
- React Final Form
- Unform
- Final Form
✅ Good: Decision Framework
For forms:
- **Primary: React Hook Form** - Best performance, smallest bundle (8KB)
- Use for: 95% of projects
- Pros: Minimal re-renders, excellent TypeScript, great DX
- **Alternative: Formik** - More opinionated, larger ecosystem
- Use when: Need extensive Yup integration, team familiar with it
- Pros: Large community, many examples
- Cons: 3x larger bundle, more re-renders
Accessibility First
Always include accessibility considerations:
For UI Components:
- ARIA patterns
- Keyboard navigation
- Screen reader support
- Color contrast
- Focus management
Example:
## Accessibility Requirements
- ✅ ARIA labels for all interactive elements
- ✅ Keyboard navigation (Tab, Enter, Escape)
- ✅ Screen reader tested with NVDA/JAWS
- ✅ WCAG 2.1 AA color contrast
- ✅ Focus visible on all interactive elements
Performance Considerations
Include performance guidance:
For Data-Heavy Components:
- Bundle size benchmarks
- Virtualization thresholds
- Lazy loading strategies
- Memoization patterns
Example:
## Performance Guidelines
- **Bundle Size:** <10KB gzipped (check with bundlephobia.com)
- **Virtualization:** Enable for >100 items
- **Lazy Loading:** Use React.lazy() for modal content
- **Memoization:** Wrap expensive calculations with useMemo
Documentation Style Guide
Write in Active Voice
❌ Bad: "The form can be validated using Zod" ✅ Good: "Validate forms using Zod"
Use Imperative Form
❌ Bad: "You should create a validation schema" ✅ Good: "Create a validation schema"
Be Specific, Not General
❌ Bad: "Use a form library" ✅ Good: "Use React Hook Form for form management"
Include Working Examples
❌ Bad: "Configure the library with appropriate options" ✅ Good:
import { useForm } from 'react-hook-form'
const { register, handleSubmit } = useForm({
mode: 'onBlur', // Validate on blur
reValidateMode: 'onChange' // Re-validate on change
})
Validation Requirements
Frontmatter Validation
Check before submitting:
- Starts with
--- - Ends with
--- -
name:is hyphen-case (lowercase, hyphens only) -
description:is third-person - No angle brackets in description
- Name doesn't start/end with hyphen
- No consecutive hyphens in name
Content Validation
- Under 500 lines (excluding frontmatter)
- All links work (internal and external)
- Code blocks have language tags
- File paths use forward slashes
- No TODO or FIXME comments
- All examples are complete and runnable
Multi-Language Support
When creating backend skills, provide patterns for multiple languages:
Structure:
examples/
├── typescript/
│ ├── fastify/
│ └── hono/
├── python/
│ ├── fastapi/
│ └── django/
├── rust/
│ └── axum/
└── go/
└── chi/
Language Coverage:
- TypeScript (primary for frontend, backend)
- Python (data, ML, backend)
- Rust (performance-critical, systems)
- Go (infrastructure, services)
Summary
Key Takeaways:
- Conciseness is critical - Only specialized knowledge
- Progressive disclosure - 3-level information architecture
- Scripts are token-free - Execute without loading
- Evaluation-driven - Build through testing
- Decision frameworks - Not just option lists
- Accessibility first - Always include WCAG guidance
- Multi-language - Backend skills support 4 languages
Remember:
- Keep SKILL.md under 500 lines
- Use gerund form for naming
- Test across Haiku, Sonnet, Opus
- Validate with checklist before submitting
Next Steps
- Creating Skills - Complete implementation guide
- Research Methodology - Library validation process
- Skills Overview - Explore existing skills
Resources
Following these best practices ensures high-quality, maintainable skills that maximize Claude's effectiveness while minimizing token usage.