Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Autonomously create, test, and optimize skills by detecting reusable patterns in your own work. Use when you notice repeated tool sequences, recurring code patterns across attempts, or insights that should be captured as a packaged skill. Also use to benchmark and iterate on existing skills.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 98% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 391% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 168% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 189% | 0% |
| case-20 | ✓→✗ | ▼ Worse | 109% | 0% |
Create skills by analyzing your own work patterns — you are both creator and evaluator. No human input required at any step.
Core loop: analyze context → draft SKILL.md → generate test cases → run + grade → iterate → optimize description → package
Before drafting, identify what skill to build and confirm it doesn't already exist.
Scan these sources for repeated, reusable patterns:
git log --stat -10 and git diff HEAD~5 — look for repeated file types, similar transformations, recurring helper scripts written independently across commits.coral/attempts/ JSON files — which approaches recur? What tool sequences appear in multiple successful attempts?coral notes --read all — patterns under "Patterns That Work" not yet captured as skills are prime candidates.coral/graph_state/state.yaml siblings: — if multiple agents converged on the same technique independently, it deserves a skillBefore creating a new skill, check existing skills:
coral skillsRead each relevant SKILL.md frontmatter. If an existing skill has 70%+ overlap with your candidate, update that skill instead of creating a new one.
Produce a structured spec before writing:
Skill name: <kebab-case>
Purpose: <what it enables, one sentence>
Triggers: <when should this skill activate>
Output format: <what the skill produces>
Source evidence: <which patterns/diffs/insights led to this>Based on your context analysis, draft the 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)Skills use a three-level loading system:
These word counts are approximate and you can feel free to go longer if needed.
Key patterns:
Domain organization: When a skill supports multiple domains/frameworks, organize by variant:
cloud-deploy/
├── SKILL.md (workflow + selection)
└── references/
├── aws.md
├── gcp.md
└── azure.mdClaude reads only the relevant reference file.
Skills must not contain malware, exploit code, or any content that could compromise system security. A skill's contents should not surprise the user in their intent if described.
description field is the primary triggering mechanism. Include both what the skill does AND specific contexts for when to use itPrefer using the imperative form in instructions.
Defining output formats:
markdown## Report structure ALWAYS use this exact template: # [Title] ## Executive summary ## Key findings ## Recommendations
Examples pattern:
markdown## Commit message format **Example 1:** Input: Added user authentication with JWT tokens Output: feat(auth): implement JWT-based authentication
Explain to the model why things are important rather than relying on heavy-handed MUSTs. Use theory of mind and make the skill general rather than narrow to specific examples. Write a draft, then review it with fresh eyes and improve it.
Create 3-5 test cases derived from the real contexts that triggered your pattern detection.
Write 2-4 assertions per test case upfront. Good assertions are:
json{ "skill_name": "my-skill", "evals": [ { "id": 1, "prompt": "Task prompt derived from real pattern", "expected_output": "Description of expected result", "files": [], "expectations": [ "Output file exists and contains valid JSON", "All required fields are present", "Processing completes without errors" ] } ] }
See references/schemas.md for the full schema.
This section is one continuous sequence — execute all steps without stopping.
Put results in <skill-name>-workspace/ as a sibling to the skill directory. Organize by iteration (iteration-1/, iteration-2/, etc.) and within that, each test case gets a directory (eval-0/, eval-1/, etc.).
For each test case, spawn two subagents in the same turn — one with the skill, one without (baseline).
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: <relevant output files>Baseline run (same prompt, no skill):
Execute this task:
- Task: <eval prompt>
- Input files: <eval files if any, or "none">
- Save outputs to: <workspace>/iteration-<N>/eval-<ID>/without_skill/outputs/
- Outputs to save: <relevant output files>Write an eval_metadata.json for each test case. Give each eval a descriptive name.
json{ "eval_id": 0, "eval_name": "descriptive-name-here", "prompt": "The task prompt", "assertions": ["assertion text 1", "assertion text 2"] }
When each subagent completes, the task notification contains total_tokens and duration_ms. Save immediately to timing.json in the run directory:
json{ "total_tokens": 84852, "duration_ms": 23332, "total_duration_seconds": 23.3 }
This data only comes through the notification — capture it as each run completes.
Once all runs finish, grade each run using the grader agent instructions from agents/grader.md. Save results to grading.json in each run directory.
The grading.json expectations array must use fields text, passed, and evidence (not name/met/details). For assertions checkable programmatically, write and run a script rather than eyeballing it.
bash python -m scripts.aggregate_benchmark <workspace>/iteration-N --skill-name <name> Produces benchmark.json and benchmark.md with pass_rate, time, and tokens per configuration (mean ± stddev and delta).
agents/analyzer.md and surface patterns the aggregate stats might hide: non-discriminating assertions, high-variance evals, time/token tradeoffs.bash python eval-viewer/generate_review.py <workspace>/iteration-N \ --skill-name "my-skill" \ --benchmark <workspace>/iteration-N/benchmark.json \ --static <workspace>/iteration-N/review.html
Analyze failures and improve the skill automatically. The goal is to make the skill genuinely better, not to overfit to test cases.
scripts/ and reference it from the skill.For each iteration:
grading.json failures — read evidence fields to understand root causeseval_feedback.suggestions — check for assertion quality issuesiteration-<N+1>/, re-grade, re-aggregateStop iterating when any condition is met:
| Condition | Action | |-----------|--------| | pass_rate >= 0.80 AND delta > 0.15 over baseline | STOP — success | | pass_rate == 1.0 | STOP — perfect | | iteration >= 3 | STOP — use best version | | No improvement > 0.05 from previous iteration | STOP — plateau reached | | Regression from previous iteration | Revert to best version, STOP |
When stopping, select the iteration with the highest pass_rate as the final version.
After the skill content is finalized, optimize the frontmatter description for triggering accuracy.
Create 20 eval queries as JSON — 10 should-trigger, 10 should-not-trigger:
json[ {"query": "the user prompt", "should_trigger": true}, {"query": "another prompt", "should_trigger": false} ]
Quality criteria for queries:
Should-trigger (10): Different phrasings of the same intent. Include cases where the user doesn't name the skill explicitly but clearly needs it. Cover uncommon use cases and competitive scenarios where this skill should win.
Should-not-trigger (10): Near-misses that share keywords but need something different. Adjacent domains, ambiguous phrasing where naive keyword matching would false-positive. Don't use obviously irrelevant queries — the negatives should be genuinely tricky.
Queries should be substantive enough that Claude would benefit from consulting a skill. Simple one-step queries won't trigger skills regardless of description quality.
Save the eval set to the workspace, then run:
bashpython -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: splits into 60% train / 40% test, evaluates the current description (3 runs per query), proposes improvements based on failures, and iterates up to 5 times. Best description is selected by test score to avoid overfitting.
Take best_description from the JSON output and update the skill's SKILL.md frontmatter automatically.
Run unconditionally after all optimization is complete:
bashpython -m scripts.package_skill <path/to/skill-folder>
This validates the skill structure and creates a distributable .skill file.
The agents/ directory contains instructions for specialized subagents. Read them when spawning the relevant subagent:
agents/grader.md — Evaluate assertions against outputsagents/comparator.md — Blind A/B comparison between two outputsagents/analyzer.md — Analyze benchmark results and why one version beat anotherThe references/ directory has schema documentation:
references/schemas.md — JSON structures for evals.json, grading.json, benchmark.json, etc.When you package a new skill, the SKILL.md frontmatter MUST include creator: set to your agent_id (read from .coral_agent_id). Example:
---
name: my-new-skill
description: ...
creator: 0-agent-2
---Skills without creator: are treated as bundled framework skills (the deep-research, librarian, organize-files, skill-creator set seeded into every island), and team-level processes that filter by author (migration, provenance UI) will silently exclude them. Always stamp creator: on agent-authored skills.
Other measured skills in the registry, with their headline benchmark lift.