| name | skill-creator |
| description | Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. |
Skill Creator
A skill for creating new skills and iteratively improving them.
At a high level, the process of creating a skill goes like this:
- Decide what you want the skill to do and roughly how it should do it
- Write a draft of the skill
- Create a few test prompts and run claude-with-access-to-the-skill on them
- Help the user evaluate the results both qualitatively and quantitatively
- Rewrite the skill based on feedback from the user's evaluation of the results
- Repeat until satisfied
- Expand the test set and try again at larger scale
Your job when using this skill is to figure out where the user is in this process and then jump in and help them progress through these stages.
Communicating with the user
The skill creator is liable to be used by people across a wide range of familiarity with coding jargon. Pay attention to context cues to understand how to phrase your communication. In the default case:
- "evaluation" and "benchmark" are borderline, but OK
- for "JSON" and "assertion" you want to see serious cues from the user that they know what those things are before using them without explaining them
Creating a skill
Capture Intent
Start by understanding the user's intent. The current conversation might already contain a workflow the user wants to capture.
- What should this skill enable Claude to do?
- When should this skill trigger? (what user phrases/contexts)
- What's the expected output format?
- Should we set up test cases to verify the skill works?
Interview and Research
Proactively ask questions about edge cases, input/output formats, example files, success criteria, and dependencies. Wait to write test prompts until you've got this part ironed out.
Write the SKILL.md
Based on the user interview, fill in these components:
- name: Skill identifier
- description: When to trigger, what it does. This is the primary triggering mechanism — include both what the skill does AND specific contexts for when to use it. All "when to use" info goes here, not in the body. Note: make descriptions a little bit "pushy" to combat undertriggering.
- the rest of the skill :)
Skill Writing Guide
Anatomy of a Skill
skill-name/
├── SKILL.md (required)
│ ├── YAML frontmatter (name, description required)
│ └── Markdown instructions
└── Bundled Resources (optional)
├── scripts/ - Executable code for deterministic/repetitive tasks
├── references/ - Docs loaded into context as needed
└── assets/ - Files used in output (templates, icons, fonts)
Progressive Disclosure
Skills use a three-level loading system:
- Metadata (name + description) - Always in context (~100 words)
- SKILL.md body - In context whenever skill triggers (<500 lines ideal)
- Bundled resources - As needed (unlimited, scripts can execute without loading)
Key patterns:
- Keep SKILL.md under 500 lines; add additional hierarchy with clear pointers if approaching limit
- Reference files clearly from SKILL.md with guidance on when to read them
- For large reference files (>300 lines), include a table of contents
Writing Patterns
Prefer using the imperative form in instructions.
Defining output formats:
## Report structure
ALWAYS use this exact template:
# [Title]
## Executive summary
## Key findings
## Recommendations
Writing Style
Try to explain to the model why things are important in lieu of heavy-handed MUSTs. Use theory of mind and try to make the skill general and not super-narrow to specific examples. Start by writing a draft and then look at it with fresh eyes and improve it.
Test Cases
After writing the skill draft, come up with 2-3 realistic test prompts. Share them with the user, then run them.
Save test cases to evals/evals.json:
{
"skill_name": "example-skill",
"evals": [
{
"id": 1,
"prompt": "User's task prompt",
"expected_output": "Description of expected result",
"files": []
}
]
}
Running and evaluating test cases
This section is one continuous sequence — don't stop partway through.
Put results in <skill-name>-workspace/ as a sibling to the skill directory. Within the workspace, organize results by iteration (iteration-1/, iteration-2/, etc.) and within that, each test case gets a directory.
Step 1: Spawn all runs in the same turn
For each test case, spawn two subagents in the same turn — one with the skill, one without. Don't spawn with-skill runs first and then come back for baselines later.
With-skill run:
Execute this task:
- Skill path: <path-to-skill>
- Task: <eval prompt>
- Input files: <eval files if any, or "none">
- Save outputs to: <workspace>/iteration-<N>/eval-<ID>/with_skill/outputs/
- Outputs to save: <what the user cares about>
Baseline run: Same prompt, no skill path, save to without_skill/outputs/.
Step 2: While runs are in progress, draft assertions
Draft quantitative assertions for each test case and explain them to the user. Good assertions are objectively verifiable and have descriptive names.
Step 3: Grade, aggregate, and launch the viewer
Once all runs are done:
-
Grade each run — evaluate each assertion against the outputs. Save results to grading.json. The grading.json expectations array must use fields text, passed, and evidence.
-
Aggregate into benchmark — run the aggregation script:
python -m scripts.aggregate_benchmark <workspace>/iteration-N --skill-name <name>
-
Launch the viewer:
nohup python <skill-creator-path>/eval-viewer/generate_review.py \
<workspace>/iteration-N \
--skill-name "my-skill" \
--benchmark <workspace>/iteration-N/benchmark.json \
> /dev/null 2>&1 &
IMPORTANT: Generate the eval viewer BEFORE evaluating inputs yourself. Get them in front of the human ASAP!
Improving the skill
After improving the skill:
- Apply improvements to the skill
- Rerun all test cases into a new
iteration-<N+1>/ directory
- Launch the reviewer with
--previous-workspace pointing at the previous iteration
- Wait for user to review and tell you they're done
- Read new feedback, improve again, repeat
Keep going until:
- The user says they're happy
- The feedback is all empty
- You're not making meaningful progress
How to think about improvements
- Generalize from feedback — create skills that work millions of times, not just for test examples
- Keep the prompt lean — remove things that aren't pulling their weight
- Explain the why — LLMs are smart; explain reasoning rather than just issuing mandates
- Look for repeated work — if test runs all wrote the same helper script, bundle it in
scripts/
Description Optimization
After creating or improving a skill, offer to optimize the description for better triggering accuracy.
Generate trigger eval queries
Create 20 eval queries — a mix of should-trigger and should-not-trigger:
[
{"query": "the user prompt", "should_trigger": true},
{"query": "another prompt", "should_trigger": false}
]
Queries must be realistic and specific, with context and detail. Bad: "Format this data". Good: descriptive, contextual prompts a real user would type.
Run optimization loop
python -m scripts.run_loop \
--eval-set <path-to-trigger-eval.json> \
--skill-path <path-to-skill> \
--model <model-id-powering-this-session> \
--max-iterations 5 \
--verbose
This handles the full optimization loop automatically. It returns best_description — apply it to the skill's SKILL.md frontmatter.
Reference Files
agents/grader.md — How to evaluate assertions against outputs
agents/comparator.md — How to do blind A/B comparison
agents/analyzer.md — How to analyze why one version beat another
references/schemas.md — JSON structures for evals.json, grading.json, etc.