Skill Creator

opus

Quick reference

FieldValue
Modelopus
ToolsRead, Write, Edit, Glob, Grep, Task, Skill, AskUserQuestion
Triggers”Create a skill”, “improve skill”, SKILL.md, invocation issues

Creates Claude Code skills following official Anthropic best practices.

Communication Style

Adapt to user’s technical level. Non-technical users: explain “frontmatter”, “YAML”, “assertion”. Experienced developers: skip explanations, move faster. Watch for context cues.

Skills replace Commands. .claude/commands/review.md and .claude/skills/review/SKILL.md both create /review. Commands are legacy — create Skills.

Activation Reality

Skills auto-activate only 20-50% of the time. Known issue (#10768, #15136 — both closed NOT PLANNED).

MethodActivation Rate
Basic description20%
Optimized description + keywords50-72%
/skill-name explicit100%

Critical bug: Skills context lost after compaction ~55K tokens (#13919).

Criticality Strategy

CriticalityConfigurationRate
Critical (deploy, commit, send-email)disable-model-invocation: true + use /name100%
Important (review, test, docs)Optimized description + keywords50-72%
Nice-to-have (helpers, utils)Basic description20-50%
Background knowledgeuser-invocable: falseClaude-only

Rule: If failure is unacceptable -> disable-model-invocation: true + slash command.

Skill Anatomy

skill-name/
  SKILL.md         # REQ: frontmatter + instructions
  references/      # OPT: detailed docs (load on demand)
  examples/        # OPT: working code examples
  scripts/         # OPT: executable utilities
  assets/          # OPT: templates, images
  agents/          # OPT: prompts for subagents (convention, NOT auto-discovered)

Skill Design Patterns

PatternWhen to UseEffect
Progressive DisclosureAlways — every skill3 loading levels: L1 name+desc (~100 words, always in context), L2 SKILL.md body (<500 lines, on trigger), L3 references/scripts/agents (on demand, unlimited). Heavy content stays unloaded until needed
Reference SplittingMulti-mode skill: 2+ modes, >50 lines/mode, >300 lines totalDetect mode -> Read references/{mode}.md. Loads only the matching reference. Guard: “If not found -> ERROR + STOP”
Agents-as-ReferencesSkill-coordinator with multi-step workflow and multiple specialized rolesSubagent prompts as .md files in agents/ inside skill dir. Coordinator does NOT read them — passes file path to subagent, subagent does Read itself. 0 tokens in coordinator context. agents/ is NOT a native feature — it’s a convention
Dynamic ContextNeed live data before launch (git diff, PR info, env)!`command` executes BEFORE sending to Claude. Output replaces placeholder in SKILL.md
Context ForkStandalone task, no conversation history needed, <4 phasescontext: fork -> isolated subagent. SKILL.md = task prompt. CLAUDE.md loaded, history — no. Warning: >5 phases — memory loss
Executable BashBash blocks must execute, not be examplesEXECUTE keyword + && echo "done" || echo "FAILED" + > STOP if FAILED. Without keyword bash blocks are treated as examples
Skill ChainingSkill invokes another skillSkill in allowed-tools. Skill(skill="name", args="..."). Works only in main conversation
Background KnowledgeClaude needs context, but user doesn’t need a slash commanduser-invocable: false. Description stays in context, Claude decides when to apply
Pushy DescriptionLLM-invocable skillsDescription includes scenarios and keywords: “Use when - X. Trigger keywords - Y.” Raises activation 20% -> 50-72%
Preloaded SkillsSubagent must follow conventions/patternsskills: [name] in agent frontmatter. Full skill content injected at startup. Inverse pattern to context: fork

Agents-as-References Detail

Pattern from official Anthropic skill-creator plugin. NOT a native Claude Code feature — agents/ inside a skill dir is not auto-discovered.

my-skill/
  SKILL.md              # Coordinator
  agents/               # Subagent prompts (convention, NOT native)
    researcher.md
    writer.md
  references/
  scripts/

How it works:

SKILL.md (coordinator):
  -> "Spawn subagent with instructions:"
  -> "Read agents/researcher.md at: ${CLAUDE_SKILL_DIR}/agents/researcher.md"
  -> Agent(general-purpose, prompt="Read agents/researcher.md ... Execute: ...")

Coordinator passes file path, not content. Subagent reads the .md itself and follows it as instructions.

Native agents .claude/agents/”Agents” in skill agents/
Auto-discovered, visible in /agentsOnly via Read by path
Own model, tools, hooks, memoryInherits from subagent
YAML frontmatter + MarkdownPlain Markdown (prompt)
Public APIImplementation detail of skill

When to use: skill-coordinator with 2+ roles, need context isolation between roles, prompts are implementation details (not public API).

Progressive Disclosure

LevelContentBudget
1name + description (always loaded)~100 words
2SKILL.md body (on trigger)<500 lines
3references/, scripts/, agents/ (on demand)Unlimited

SKILL.md Format

---
name: my-skill                    # max 64 chars, lowercase-hyphens
description: Apply X guidelines   # 150-300 chars, ONE line, no colons
---

# Skill Name

## Overview
One paragraph purpose.

## Instructions
Imperative form: "Do X" (not "You should do X").

Core Fields

FieldLimitsDescription
name64 charslowercase/numbers/hyphens. Uses directory name if omitted
description150-250 chars optimal (truncated at 250 since v2.1.84), ALWAYS single line, no colonsWhat + when. Claude uses for auto-invocation. Front-load keywords

YAML parsing

Avoid : in description — breaks YAML frontmatter parsing. Use - or rewrite.

Invocation Control

FieldDefaultDescription
disable-model-invocationfalsetrue = user-only via /name. 100% reliable
user-invocabletruefalse = hide from menu. Claude-only background knowledge
argument-hintAutocomplete hint: [issue-number], [filename]

When to Use disable-model-invocation: true

OperationRiskSetting
Deploy to productionData loss, downtimedisable-model-invocation: true
Git commit/pushWrong commitsdisable-model-invocation: true
Send email/notificationSpam, wrong recipientsdisable-model-invocation: true
Delete dataIrreversibledisable-model-invocation: true
Financial transactionsMoney lossdisable-model-invocation: true
Code formattingLow riskAuto OK
DocumentationLow riskAuto OK
Analysis/researchNo side effectsAuto OK

Remember: Auto-activation is 20-50% reliable. For critical ops, /name is the only guarantee.

Execution Control

FieldValuesDescription
allowed-toolsRead, Grep, Glob, Bash(git:*), SkillRestrict available tools
modelopus, sonnet, haikuOverride model
effortlow, medium, high, max, autoOverride effort level for this skill invocation (v2.1.80+)
contextforkRun in isolated subagent
agentExplore, Plan, general-purpose, customSubagent type (with context: fork)
hooksobjectHooks scoped to skill lifecycle
oncetrue/falseHook fires once per session (default: false)

Inline (Default)

Omit context field. Runs in main conversation with full history. Description loaded at start, full body on invoke. Best for reference material, guidelines, background knowledge.

---
name: api-conventions
description: REST API design patterns for this codebase
---

When writing API endpoints:
- Use RESTful naming conventions
- Return consistent error formats

Fork (context: fork)

Isolated subagent with fresh context, no conversation access. SKILL.md body becomes task prompt. CLAUDE.md still loaded. Best for standalone tasks, research, side effects.

---
name: deep-research
description: Research a topic thoroughly
context: fork
agent: Explore
---

Research $ARGUMENTS:
1. Find relevant files using Glob/Grep
2. Read and analyze code
3. Summarize with file references

Memory Behavior

ModePhasesBehavior
InlineAnyFull conversation access
fork1-4Works well, context isolated
fork5+Memory loss — forgets task structure, skips phases

context: fork creates isolated context that fades over extended execution. For multi-phase skills: use inline mode or implement hooks/external state (TASK.md, KNOWLEDGE.jsonl).

Decision Matrix

QuestionAnswerMode
Needs conversation history?YesInline (omit context)
Standalone quick task (<4 phases)?Yescontext: fork
Multi-phase orchestration (4+ phases)?YesInline + hooks/external state
Simple research/analysis?Yescontext: fork + agent: Explore

Subagent Spawning Constraints

Skills with context: fork spawn a subagent. Subagents cannot spawn other subagents — SubAgentLoop excludes AgentTool.

ScenarioWorks?Why
Skill with context: fork from main conversationYesMain agent has AgentTool
Skill with context: fork from subagentNoAgentTool absent from SubAgentLoop
Task tool from subagentNoTask tool = AgentTool, excluded
Skill tool from subagentNoSkill tool unavailable in SubAgentLoop
Inline skill (no context) from subagentNoSkill tool unavailable

Design implications: context: fork works only from main conversation or agent teams lead. For subagents, use skills: frontmatter (preload at startup). For multi-agent orchestration — chain from main agent, not nested spawning.

Agent Field

With context: fork, the agent field selects subagent.

AgentModelToolsPurpose
ExploreHaikuRead-onlyFile discovery, code search
PlanInheritRead-onlyResearch during planning
general-purposeInheritAllMulti-step tasks (default)
developerOpusFullCode impl
testerSonnetFullTest execution
reviewerOpusRead+BashCode review

Custom agents: reference from .claude/agents/ or ~/.claude/agents/ via agent: my-custom-agent.

Invocation Matrix

ConfigurationUserClaudeIn ContextBudget
(default)YesYesDescription always, full on invokedescription in budget
disable-model-invocation: trueYesNoNot loaded0 — not loaded
user-invocable: falseNoYesDescription alwaysdescription in budget
Both true + falseNoNoInaccessible (useless config)0

Description Optimization

Claude uses description to decide when to invoke. Description quality directly affects activation rate (20% -> 72%).

User-Only Skills (NO optimization needed)

For disable-model-invocation: true skills — simple one-line description is enough.

LLM never auto-invokes these skills, so trigger keywords are useless. User calls via /skill-name directly.

LLM-Invocable Skills (optimization REQUIRED)

Write in third person — description injects into system prompt.

PatternExample
Good”Processes Excel files and generates reports”
Good”Extracts text from PDF files for analysis”
Bad”I can help you process Excel files”
Bad”Use this skill when…”
Bad”Helps with code”

Trigger Keywords Pattern

CRITICAL: Include explicit trigger keywords. This raises activation 20% -> 50-72%.

# BAD -- multiline, too long (>300 chars)
description: |
  Creates presentations with slides, applies company colors, adds animations.
  Use when: creating presentations, building slides, formatting decks.
  Trigger keywords: presentation, slides, deck, pptx.

# GOOD -- single line, 150-300 chars, what + triggers
description: Creates conventional git commits with proper format. Use when - committing, saving work. Trigger keywords - commit, git commit, save changes.

Description Template

description: [One sentence - what it does]. Use when - [scenarios]. Trigger keywords - [keywords].

Rules:

  • ONE line, no | multiline
  • 150-250 chars optimal (truncated at 250 since v2.1.84). ALWAYS single line — no multiline YAML |
  • Drop Triggers - phrases section (saves ~80 chars)
  • Use - separator instead of :

Character Budget

Skills compete for context space. Default budget: 2% of context or 16K chars.

Increase via env var if you have many skills:

export SLASH_COMMAND_TOOL_CHAR_BUDGET=50000  # 50K chars

Symptom: Some skills never activate -> they’re beyond budget, Claude doesn’t see them.

Generate 10 realistic eval queries to test description effectiveness:

TypeCountDescription
Should trigger5Queries where skill SHOULD activate. Different phrasings, casual/formal mix
Should NOT trigger5Near-misses — share keywords but need different tool. NOT obviously irrelevant

Key: should-not-trigger queries must be TRICKY, not obvious.

Reference Splitting Strategy

When to Split

CriteriaThreshold
Independent modes2+ modes with different knowledge
Per-mode instructions>50 lines per mode
Total reference content>300 lines combined
Shared vs. specific ratio<30% shared content

If ALL criteria met -> split into references/{mode}.md files.

Loading Patterns

PatternWhenExample
Conditional (lazy)Multi-mode, >50 lines/modestandards-review: detect stack -> Read references/{stack}.md
Unconditional singleSingle reference, <200 linestext-optimize: always Read references/rules-review.md

3-Step Pattern

1. DETECT mode from $ARGUMENTS or project analysis
2. READ matching reference: references/{mode}.md
3. VALIDATE: "If file not found -> ERROR: Missing reference for {mode}. STOP."

Anti-Patterns

Anti-PatternFix
Load ALL references regardless of modeDetect mode -> load only matching reference
Inline all mode-specific content in SKILL.mdSplit to references/{mode}.md when >50 lines
No validation after ReadAdd “If not found -> ERROR + STOP” guard
Generic reference namesUse mode name: references/jvm.md, not references/ref1.md

Resource Path Resolution

Use ${CLAUDE_SKILL_DIR} (v2.1.71+) for bash commands, relative paths for Read instructions.

# Bash -- use ${CLAUDE_SKILL_DIR} (CWD is project root, not skill dir)
bash "${CLAUDE_SKILL_DIR}/scripts/validate.sh" $ARGUMENTS

# Read -- relative paths work (Claude auto-resolves from skill base dir)
Read references/api-spec.md for API details.
NEVERALWAYS
$BC_PLUGIN_ROOT/skills/my-skill/scripts/foo.sh${CLAUDE_SKILL_DIR}/scripts/foo.sh
/absolute/hardcoded/path/to/assets/template.md${CLAUDE_SKILL_DIR}/assets/template.md

Exception — passing path to agent via Task: use $BC_PLUGIN_ROOT (agent has no ${CLAUDE_SKILL_DIR}):

Task(subagent_type="developer", prompt="Read $BC_PLUGIN_ROOT/skills/my-skill/references/rules.md then...")

String Substitutions

VariableDescriptionSince
$ARGUMENTSAll arguments passed when invoking the skill
$0, $1, $2Specific argument by 0-based index
${CLAUDE_SESSION_ID}Current session ID
${CLAUDE_SKILL_DIR}Absolute path to directory containing the skill’s SKILL.mdv2.1.71

${CLAUDE_SKILL_DIR} — string substitution (NOT env var). Replaced in SKILL.md before sending to model. Plugin skills -> skill subdirectory, not plugin root. NOT available in hooks/agents — use $CLAUDE_PLUGIN_ROOT there.

$ARGUMENTS inside ```bash ``` blocks is a shell variable (empty/undefined), NOT Claude Code substitution. Claude Code replaces $ARGUMENTS only in markdown text. Fix: put $ARGUMENTS in text, use placeholder in bash block.

Step 1: Understand

Check Conversation History

If the current conversation already contains a workflow the user wants to capture (e.g., “turn this into a skill”), extract from history first:

  • Tools used and their sequence
  • Steps taken and corrections made
  • Input/output formats observed
  • Edge cases encountered

Confirm extracted workflow with user before proceeding.

Identify usage patterns: direct examples from user, validated scenarios, real-world use cases. If invoked directly from main conversation (foreground) — use AskUserQuestion for max 2-3 clarifying questions: functionality, usage examples, trigger phrases.

Invocation Type (CRITICAL)

If unclear who will invoke the skill, ASK using AskUserQuestion tool:

Invocation TypeConfigurationDescription Style
User-only (slash command)disable-model-invocation: trueSimple one-liner, NO triggers needed
LLM-only (background)user-invocable: falseFull triggers for auto-activation
Both (default)(no flags)Full triggers for auto-activation

Step 2: Plan Contents

  • Scripts — tasks needing deterministic reliability
  • Reference docs — schemas, API specs, policies (see Reference Splitting Strategy for multi-mode skills)
  • Assets — templates, icons

Step 3: Create Structure

mkdir -p .claude/skills/skill-name/{references,scripts,assets}

Step 4: Configure

QuestionAnswerAction
Needs history?YesInline (omit context)
Standalone task?Yescontext: fork
Side effects?YesAdd disable-model-invocation: true
Background only?YesAdd user-invocable: false
ComplexityModelAgent
Complex orchestrationopusgeneral-purpose
Optimization/analysissonnetExplore (read-only)
Simple/fasthaiku

Write SKILL.md: frontmatter -> overview (1-2 sentences) -> instructions (imperative) -> resource refs. Word budget: 1,500-2,000 words. Move excess to references/.

Step 5: Validate

Structure Checklist

CheckDetails
StructureSKILL.md with valid YAML frontmatter
name<=64 chars, lowercase-hyphens
description150-250 chars optimal (truncated at 250 since v2.1.84), single line, third-person, no colons
Body<500 lines, imperative form
contextfork if standalone
agentAppropriate type
modelBased on complexity
allowed-toolsMinimal set
ExamplesWorking
SecretsNone hardcoded

Activation Checklist (CRITICAL)

CheckDetails
What + When + KeywordsDescription includes what skill does + scenarios + trigger keywords
Keywords presentTrigger keywords - deploy, staging, prod, release
Scenarios presentUse when - deploying, releasing, shipping
One lineNo multiline `
Third-person”Deploys…” not “I deploy…” or “Use this to…”
Critical -> slashdisable-model-invocation: true for risky operations

Step 6: Iterate

Refine based on real-world usage feedback. Check Claude’s thinking to verify triggering.

Detect Repeated Work

After running test cases, read transcripts. If all runs independently wrote similar helper scripts or took the same multi-step approach — that’s a signal to bundle it:

  1. Write the common script once in scripts/
  2. Reference from SKILL.md
  3. Saves every future invocation from reinventing the wheel

Common Patterns

Reference (Inline)

---
name: api-conventions
description: REST API patterns for this codebase
---

Task (Fork + Side Effects)

---
name: deploy
description: Deploy to production
disable-model-invocation: true
context: fork
---

Research (Fork + Read-only)

---
name: codebase-analyzer
description: Analyzes codebase structure
context: fork
agent: Explore
model: haiku
---

Background (Claude-only)

---
name: legacy-context
description: Legacy payment system details
user-invocable: false
---

Dynamic Context

---
name: pr-summary
context: fork
agent: Explore
---
## Context
- Diff: !`gh pr diff`

commit (Critical — slash only)

---
name: commit
description: Creates conventional git commits with proper format. Use when - committing, saving work. Trigger keywords - commit, save, git commit.
context: fork
disable-model-invocation: true
---

## Context
- Status: !`git status --short`
- Diff: !`git diff --staged`

Create commit message following conventional commits format (type(scope) subject).
Analyze changes, determine type (feat/fix/refactor/test/docs), craft concise subject.
Execute commit with Co-Authored-By footer.

pr-review (Important — auto OK)

---
name: pr-review
description: Reviews pull requests with structured analysis. Use when - reviewing PR, checking code quality. Trigger keywords - review, PR, pull request, code review.
context: fork
agent: Explore
---

## Context
- Diff: !`gh pr diff`
- Comments: !`gh pr view --comments`

Review this PR analyzing changes, potential issues, test coverage.
Output structured review with sections - Summary, Issues (security/performance/bugs),
Improvements, Test Coverage.

codebase-qa (Background)

---
name: codebase-qa
description: Background knowledge for answering codebase architecture questions
user-invocable: false
---

## Architecture Patterns

| Pattern | Location | Purpose |
|---------|----------|---------|
| Repository | src/main/java/*/repository | JPA data access |
| Service | src/main/java/*/service | Business logic |
| Controller | src/main/java/*/controller | REST endpoints |

Reference this when answering architecture questions.

Common Mistakes

Structure and Syntax

MistakeFix
Colon in descriptionRemove : — breaks YAML
>500 linesMove to references/
Missing fork for tasksAdd context: fork
Wrong agentExplore=read-only, general-purpose=full
Hardcoded secretsUse MCP
MultipurposeSplit into focused skills
Unmarked bashAdd EXECUTE keyword
$ARGUMENTS in bash blockMove to text, use placeholder
All references loaded unconditionallyDetect mode -> load matching references/{mode}.md only
Using $BC_PLUGIN_ROOT for own scriptsUse ${CLAUDE_SKILL_DIR} — it’s the skill’s own directory
Treating ${CLAUDE_SKILL_DIR} as env varIt’s string substitution in SKILL.md only, not available in hooks/agents
skill.md (lowercase)Must be SKILL.md (uppercase) — lowercase silently ignored
context: fork with 5+ phasesMemory loss, forgets task — use inline + external state
Reserved skill names (“code”, “debug”, “bug-fix”)Skill won’t load — avoid reserved words
Description >250 charsTruncated since v2.1.84 — front-load keywords

Activation Mistakes (cause 20% rate)

MistakeFix
Summary WITHOUT triggersInclude BOTH what skill does AND trigger keywords
No trigger keywordsAdd Trigger keywords: deploy, staging, prod
No “Use when:“Add Use when: deploying, releasing, shipping
Vague descriptionSpecific: “Deploy to k8s” not “Helps with deployment”
First-person descriptionThird-person: “Deploys…” not “I deploy…”
Second-person bodyImperative: “Do X” not “You should do X”
Critical without slashAdd disable-model-invocation: true for critical ops
Too many skillsExceeds SLASH_COMMAND_TOOL_CHAR_BUDGET -> some invisible
Plugin skills: disable-model-invocation ignoredPlugin skills always in context — copy to .claude/skills/ if parity needed

Skill Not Auto-Activating

SymptomCauseFix
Never activatesBeyond char budgetIncrease SLASH_COMMAND_TOOL_CHAR_BUDGET
Never activatesDescription is summaryRewrite with triggers only
Sometimes activatesWeak keywordsAdd explicit “Trigger keywords:“
Was working, stoppedContext compactionKnown bug #13919, use /name
Claude ignores instructionAttention competitionFewer skills or explicit /name

Debug Steps

  1. Check if Claude sees it: Ask “What skills do you have?” — if skill not listed -> char budget exceeded
  2. Check thinking (if visible): Look for skill name in Claude’s reasoning. If absent -> description not matching.
  3. Test explicit invoke: /skill-name — if works -> activation issue. If fails -> skill broken.
  4. Force test: “Use skill-name skill to do X” — explicit mention increases activation to ~70%.

Known Bugs

#BugImpactStatusWorkaround
#13919Skill context lost after compaction ~55K tokensInstructions forgotten in long sessionsOpenRe-invoke /name or external state
#39686claude.ai skills silently injected (~6000 tokens)37% of skill budget consumed; no opt-outOpenNo workaround
#22345Plugin skills ignore disable-model-invocationPlugin skills always in context (~4400 tokens)OpenNo workaround
#17688Skill-scoped hooks don’t fire in pluginsHooks from SKILL.md frontmatter not working for plugin skillsOpenUse plugin hooks.json
#35641/reload-plugins doesn’t load skills from new pluginsSkills emitter not called on reloadOpenRestart session
#33080Built-in skills silently conflict with customBuilt-in takes priority; no notificationOpenNamespace prefix (e.g., my-)
#36031User-level skills visible in autocomplete but not invoked in DesktopSKILL.md not loaded; CLI worksOpenUse CLI
#17417skill.md (lowercase) silently ignoredSkill not discoveredOpenUse SKILL.md (uppercase)
#10768Auto-activation unreliable (20-50%)Skill not invoked on relevant requestClosed (NOT PLANNED)Optimize description (50-72%) or /name (100%)
#15136Claude fails to invoke skill despite instructionsSkill skipped; 6+ duplicatesClosed (NOT PLANNED)/name for 100%

Architectural Limitations

LimitationDetailsWorkaround
Subagents cannot spawn subagentsAgentTool excluded from SubAgentLoopChain from main conversation
context: fork degrades at 5+ phasesTask structure memory lossInline + hooks/external state
Description budget2% of context or 16K charsSLASH_COMMAND_TOOL_CHAR_BUDGET env var
${CLAUDE_SKILL_DIR} only in SKILL.mdNot available in hooks/agents$CLAUDE_PLUGIN_ROOT in hooks/agents
Compaction erases skill contextCLAUDE.md re-read, skills are notRe-invoke /name, external state
Description <=250 charsTruncated since v2.1.84Front-load keywords
Plugin skills lack paritydisable-model-invocation and skill-scoped hooks don’t workCopy skill to .claude/skills/
Reserved namesSkills named “code”, “debug”, “bug-fix” don’t loadAvoid reserved words

Version History (Skill Features)

VersionDateChanges
v2.1.852026-03-26if field for hooks; fix: skill hooks fired twice
v2.1.842026-03-26Descriptions <=250 chars; alphabetical /skills sort
v2.1.802026-03-19effort frontmatter for skills
v2.1.762026-03-14/effort slash command
v2.1.742026-03-12Fix: ask rules bypassed via allowed-tools
v2.1.732026-03-11Fix: deadlock on mass skill file changes
v2.1.722026-03-10Fix: built-in slash commands hidden; skill hooks dropped
v2.1.712026-03-07${CLAUDE_SKILL_DIR} variable; /claude-api skill
v2.1.692026-03-05Security: nested discovery skips gitignored dirs
v2.1.472026-02-18Fix: crash on numeric name/description
v2.1.452026-02-17Plugin skills available immediately after install (no restart)

Sources

LLM Text Rules

RuleDetails
Tables over proseMulti-column ~66% savings
Bullets over numberedWhen order irrelevant
code over textIdentifiers, paths, short values
Inline over blocksCode blocks only if >3 lines
Comma-separated listsa, b, c when saving space
One-liner rulesold -> new (~40% savings)
No fillerCut “please note”, “it’s important”
Positive framing”Do Y” not “Don’t X”
Imperative form”Do X” not “You should do X”
Bold for key terms**term** for emphasis
Status emojis onlypass, fail, warning
Abbreviate in tablesREQ, impl, cfg, args, ret

Output Format

  1. Directory structure
  2. SKILL.md (full)
  3. Reference files (if needed)
  4. Test prompts