Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Author SKILL.md: frontmatter, structure, writing principles.
.claude/skills/hezaohezao-skill-authoring/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 120% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 152% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 98% | 0% |
A SKILL.md can live in two places:
poirot/backend/agents/skill/builtin_skills/<category>/<name>/SKILL.md— committed, shipped with the package. Use write_file + git add.
skills/<name>/SKILL.md — personal, gitignored. Created via/skill install <path> or by writing directly.
This skill covers authoring for both, with emphasis on builtin skills.
builtin_skills/Source of truth: poirot/backend/agents/skill/parser.py::parse_skill_file. Hard requirements:
--- as the first bytes (no leading blank line).\n---\n before the body.name field present (lowercase, hyphens).description field present.Peer-matched shape:
yaml--- name: my-skill-name # lowercase, hyphens description: Use when <trigger>. <one-line behavior>. allowed-tools: # Poirot tools this skill may invoke - bash - read_file - write_file - list_dir - str_replace - web_search - browse_page - present_files - read_snapshot enabled: true related-skills: [other-skill] # optional cross-references license: MIT # recommended for contributed skills author: <human contributor or source attribution> ---
allowed-tools / enabled / related-skills / license / author are NOT enforced by the parser (it reads name/description/allowed-tools/enabled), but every peer has them — omit and your skill sticks out.
description ≤ 60 characters, one sentence, ends with a period. State the capability, not the implementation. No marketing words ("powerful", "comprehensive", "seamless"). Don't repeat the skill name.
Verify:
pythonimport re, pathlib m = re.search(r'^description: (.*)$', pathlib.Path('builtin_skills/<cat>/<name>/SKILL.md').read_text(), re.MULTILINE) assert len(m.group(1)) <= 60, len(m.group(1))
references/*.md and reference them fromSKILL.md.
A skill exists to make the agent's process more predictable. Predictability does not mean identical output every run; it means the agent reliably follows the same useful discipline.
when this skill loads? If a line does not change behavior, cut it.
description every turn. Keep descriptions focused on trigger classes and the skill's distinctive behavior. Put details in the body or linked references.
SKILL.md; putbranch-specific or bulky reference material in references/, templates/, or scripts/ and point to it only when needed.
agent knows it is done. Good criteria are checkable: "every modified file accounted for" beats "summarize changes."
across the file.
knows — "tight loop," "tracer bullet," "root cause," "regression test" — over long repeated explanations.
If a sentence doesn't change agent behavior vs the default, delete it.
that step's completion criterion.
Common quality failures:
Tools referenced in SKILL.md prose must be native Poirot tools (listed in allowed-tools) or MCP servers the skill explicitly expects. Do NOT name shell utilities the agent already has wrapped:
grep → bash (run grep via bash)cat/head/tail → read_filesed/awk → str_replacefind/ls → list_dir# <Title>
## Overview
One or two paragraphs: what and why.
## When to Use
- Bulleted triggers
- "Don't use for:" counter-triggers
## <Topic sections specific to the skill>
- Quick-reference tables are common
- Code blocks with exact commands
## Common Pitfalls
Numbered list of mistakes and their fixes.
## Verification Checklist
- [ ] Checkbox list of post-action verificationsNot every section is mandatory, but Overview + When to Use + actionable body + pitfalls are the minimum.
builtin_skills/<category>/<skill-name>/SKILL.md # builtin
skills/<skill-name>/SKILL.md # user-localBuiltin categories: core, research, software-development, creative, productivity. Pick the closest existing category. Don't invent new top-level categories casually.
list_dir("poirot/backend/agents/skill/builtin_skills/<category>/") Read 2-3 peer SKILL.md files to match tone and structure.
write_file to builtin_skills/<category>/<name>/SKILL.md.python import yaml, re, pathlib content = pathlib.Path("builtin_skills/<category>/<name>/SKILL.md").read_text() assert content.startswith("---") m = re.search(r'\n---\s*\n', content[3:]) fm = yaml.safe_load(content[3:m.start()+3]) assert "name" in fm and "description" in fm assert len(fm["description"]) <= 60
/skill list willnot see the new skill until restart. This is expected.
related-skills is documentation-only (parser ignores it). You can reference any skill, but prefer referencing only builtin skills from builtin skills — user-local skills won't resolve for other users.
str_replace on the SKILL.md.write_file the whole SKILL.md.write_file tobuiltin_skills/<category>/<name>/references/<file>.md, templates/<file>, or scripts/<file>.
---. Parser requires content.startswith("---");any leading blank line or BOM fails.
not the one task. "Use when debugging X" > "Debug X".
attention. Trim ruthlessly.
grep/cat/sed/find → use Poirot toolnames (bash/read_file/str_replace/list_dir). Otherwise the model hallucinates calls to non-existent tools.
list_dir thecategory and open 2-3 peers. Prefer extending an existing skill to creating a narrow sibling.
loader initializes at startup. Verify in a fresh session.
over time. When adding a rule, remove the old wording it replaces.
rarely change model behavior. Replace with a checkable completion criterion.
builtin_skills/<category>/<name>/SKILL.md (or skills/<name>/)---, closes with \n---\nname, description, allowed-tools, enabled presentlicense, author present (attribution)# Title → ## Overview → ## When to Use → body → ## Pitfalls → ## Verificationgit add && git commit completed| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 19,924 | 14,515 | -27% | 1 | 1 | 0% | 3,151 | 4,663 | +48% | 0 | 0 | — |
case-02 | fail→fail | 62,907 | 25,381 | -60% | 1 | 1 | 0% | 2,914 | 5,976 | +105% | 0 | 0 | — |
case-03 | fail→fail | 18,255 | 40,018 | +119% | 1 | 1 | 0% | 3,008 | 2,806 | -7% | 0 | 0 | — |
case-04 | fail→pass | 17,236 | 5,205 | -70% | 1 | 1 | 0% | 1,495 | 3,291 | +120% | 0 | 0 | — |
case-05 | fail→pass | 13,794 | 5,310 | -62% | 1 | 1 | 0% | 2,102 | 3,105 | +48% | 0 | 0 | — |
case-06 | fail→pass | 9,858 | 7,958 | -19% | 1 | 1 | 0% | 1,546 | 3,893 | +152% | 0 | 0 | — |
case-07 | fail→pass | 15,944 | 6,374 | -60% | 1 | 1 | 0% | 1,690 | 3,351 | +98% | 0 | 0 | — |
case-08 | pass→pass | 10,478 | 7,154 | -32% | 1 | 1 | 0% | 1,406 | 2,931 | +108% | 0 | 0 | — |
case-09 | fail→pass | 14,730 | 16,190 | +10% | 1 | 1 | 0% | 1,286 | 2,994 | +133% | 0 | 0 | — |
case-10 | pass→pass | 9,087 | 3,563 | -61% | 1 | 1 | 0% | 1,363 | 2,893 | +112% | 0 | 0 | — |
case-11 | fail→pass | 12,870 | 3,949 | -69% | 1 | 1 | 0% | 1,895 | 3,083 | +63% | 0 | 0 | — |
case-12 | fail→pass | 15,726 | 15,972 | +2% | 1 | 1 | 0% | 2,444 | 4,057 | +66% | 0 | 0 | — |
case-13 | fail→pass | 7,239 | 5,279 | -27% | 1 | 1 | 0% | 1,314 | 3,507 | +167% | 0 | 0 | — |
case-14 | fail→pass | 12,818 | 10,635 | -17% | 1 | 1 | 0% | 2,273 | 4,526 | +99% | 0 | 0 | — |
case-15 | pass→pass | 9,422 | 12,320 | +31% | 1 | 1 | 0% | 1,595 | 3,418 | +114% | 0 | 0 | — |
case-16 | fail→pass | 12,607 | 4,598 | -64% | 1 | 1 | 0% | 1,973 | 3,011 | +53% | 0 | 0 | — |
case-17 | fail→pass | 13,608 | 3,449 | -75% | 1 | 1 | 0% | 2,346 | 2,807 | +20% | 0 | 0 | — |
case-18 | pass→pass | 5,109 | 3,140 | -39% | 1 | 1 | 0% | 717 | 2,730 | +281% | 0 | 0 | — |
case-19 | fail→pass | 9,983 | 3,934 | -61% | 1 | 1 | 0% | 1,221 | 2,929 | +140% | 0 | 0 | — |
case-20 | pass→fail | 6,903 | 37,740 | +447% | 1 | 1 | 0% | 1,213 | 3,487 | +187% | 0 | 0 | — |
case-21 | pass→pass | 13,653 | 2,860 | -79% | 1 | 1 | 0% | 1,062 | 2,714 | +156% | 0 | 0 | — |
case-22 | pass→pass | 11,257 | 11,539 | +3% | 1 | 1 | 0% | 1,734 | 4,195 | +142% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +55 percentage points is the difference between those two pass rates over the 20 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.