SKILL.md
Skill Standardization
When to use this skill
- Creating a new SKILL.md file from scratch
- Auditing existing skills for Agent Skills specification compliance
- Converting legacy skill formats (non-standard headings, frontmatter) to standard
- Improving skill descriptions to trigger more reliably on relevant prompts
- Adding evaluation test cases (
evals/evals.json) to a skill
- Batch-validating all skills in a directory for consistency
Agent Skills Specification Reference
Frontmatter fields
Field
Required
Constraints
name
Yes
1–64 chars, lowercase alphanumeric + hyphens, no leading/trailing/consecutive hyphens, must match parent directory name
description
Yes
1–1024 chars, must describe what skill does AND when to trigger
allowed-tools
No
Space-delimited list of pre-approved tools
compatibility
No
Max 500 chars, environment requirements
license
No
License name or reference to bundled file
metadata
No
Arbitrary key-value map for additional fields
Standard directory structure
skill-name/
├── SKILL.md # Required
├── scripts/ # Optional: executable scripts
├── references/ # Optional: detailed documentation
├── assets/ # Optional: templates, images, data
└── evals/ # Optional: evaluation test cases
└── evals.json
Progressive disclosure tiers
Tier
What's loaded
When
Token budget
- Catalog
name + description
Session start
~100 tokens per skill
- Instructions
Full SKILL.md body
On activation
< 5000 tokens (500 lines max)
- Resources
scripts/, references/
When needed
Varies
Instructions
Step 1: Validate an existing skill
Run the validation script on a skill directory:
bash scripts/validate_skill.sh path/to/skill-directory
Validate all skills in a directory:
bash scripts/validate_skill.sh --all .agent-skills/
The script checks:
- Required frontmatter fields (
name,description)
nameformat: lowercase, no consecutive hyphens, matches directory name
descriptionlength: 1–1024 characters
allowed-toolsformat: space-delimited (not YAML list)
- Recommended sections present
- File length: warns if over 500 lines
Step 2: Write an effective description
The description field determines when a skill triggers. A weak description means the skill never activates; an over-broad one triggers at wrong times.
Template:
description: >
[What the skill does — list specific operations.]
Use when [trigger conditions]. Even if the user doesn't explicitly
mention [domain keyword] — also triggers on: [synonym list].
Principles (from agentskills.io):
- Imperative phrasing — "Use this skill when..." not "This skill does..."
- User intent, not implementation — describe what the user wants to achieve
- Be explicit about edge cases — "even if they don't say X"
- List trigger keywords — synonyms, related terms the user might type
- Stay under 1024 characters — descriptions grow during editing; watch the limit
Before / After:
# Before (weak — never triggers)
description: Helps with PDFs.
# After (optimized — reliable triggering)
description: >
Extract text and tables from PDF files, fill forms, merge and split documents.
Use when the user needs to work with PDF files, even if they don't explicitly
say 'PDF' — triggers on: fill form, extract text from document, merge files,
read scanned pages.
Step 3: Create a new SKILL.md
Use this template as the starting point:
---
name: skill-name
description: >
[What it does and specific operations it handles.]
Use when [trigger conditions]. Triggers on: [keyword list].
allowed-tools: Bash Read Write Edit Glob Grep
metadata:
tags: tag1, tag2, tag3
version: "1.0"
---
# Skill Title
## When to use this skill
- Scenario 1
- Scenario 2
## Instructions
### Step 1: [Action]
Content...
### Step 2: [Action]
Content...
## Examples
### Example 1: [Scenario]
Input: ...
Output: ...
## Best practices
1. Practice 1
2. Practice 2
## References
- [Link](url)
Step 4: Convert legacy section headings
Legacy heading
Standard heading
## Purpose
## When to use this skill
## When to Use
## When to use this skill
## Procedure
## Instructions
## Best Practices
## Best practices
## Reference
## References
## Output Format
## Output format
Step 5: Add evaluation test cases
Create evals/evals.json with 2–5 realistic test prompts:
{
"skill_name": "your-skill-name",
"evals": [
{
"id": 1,
"prompt": "Realistic user message that should trigger this skill",
"expected_output": "Description of what success looks like",
"assertions": [
"Specific verifiable claim (file exists, count is correct, format is valid)",
"Another specific claim"
]
}
]
}
Good assertions are verifiable: file exists, JSON is valid, chart has 3 bars. Avoid vague assertions like "output is good."
Available scripts
- **
scripts/validate_skill.sh** — Validates a SKILL.md against the Agent Skills spec
Examples
Example 1: Validate a skill directory
bash scripts/validate_skill.sh .agent-skills/my-skill/
Output:
Validating: .agent-skills/my-skill/SKILL.md
✓ Required field: name = 'my-skill'
✓ Required field: description present
✗ Description length: 1087 chars (max 1024)
✓ Name format: valid lowercase
✗ Name/directory mismatch: name='myskill' vs dir='my-skill'
✓ Recommended section: When to use this skill
✓ Recommended section: Instructions
⚠ Missing recommended section: Examples
✓ File length: 234 lines (OK)
Issues: 2 errors, 1 warning
Example 2: Batch validate all skills
bash scripts/validate_skill.sh --all .agent-skills/
Example 3: Fix common frontmatter issues
# WRONG — tags inside metadata is non-standard for some validators
metadata:
tags: [tag1, tag2] # list syntax
platforms: Claude # non-spec field
# CORRECT — per Agent Skills spec
metadata:
tags: tag1, tag2 # string value
allowed-tools: Bash Read Write # space-delimited, not a YAML list
Best practices
- Description quality first — weak descriptions mean the skill never activates; improve it before anything else
- Keep SKILL.md under 500 lines — move detailed reference docs to
references/
- Pin script versions — use
uvx ruff@0.8.0not justruffto ensure reproducibility
- No interactive prompts in scripts — agents run in non-interactive shells; use
--flaginputs, never TTY prompts
- Structured output from scripts — prefer JSON/CSV over free-form text; send data to stdout, diagnostics to stderr
- Add evals before publishing — at least 2–3 test cases covering core and edge cases