The other references cover the mechanics of each surface (hook contracts, skill frontmatter, headless flags, debugging). This one covers the layer above: which surface to reach for, where to put it, and how to author it well. Reach here when you're designing a new agent / skill / command / hook / MCP server rather than fixing an existing one.
Each extension surface has a job it does best. Match the need, don't default.
| Need | Surface | Why |
|---|---|---|
| Repeatable workflow the user kicks off | Skill (user-invocable, slash-style) |
Consistent steps, on-demand body |
| Reference material / patterns loaded by keyword | Skill | Description always in context, body forks in on match |
| Deep multi-step reasoning in isolated context | Subagent | Own context window, system prompt, tool/model/permission set |
| Must-never-happen guarantee | Hook (or a permission deny rule) | Deterministic; runs regardless of model judgment |
| Always-on, file/path-scoped guidance | Rule (path-scoped) | Injected per matching file |
| Context every session needs | CLAUDE.md | Loaded automatically at session start |
| External capability (DB, API, service) | MCP server | Tools/resources the model calls |
Decision tree:
Skill vs subagent (the common fork): a skill injects prompt content into the
current context; a subagent runs in a fresh, isolated context and reports back.
Reach for a subagent when the work would pollute or blow the main context (large
multi-file analysis, long research), needs a cheaper/stronger model, or wants a
narrowed tool set. Reach for a skill when the guidance belongs inline. They compose:
a subagent can skills: preload full skill bodies, so "agent for the decision, skill
for the patterns" is a valid pairing rather than a duplication.
| Scope | Location | When |
|---|---|---|
| Personal, all projects | ~/.claude/ |
Your own preferences, global tooling |
| Personal, this project | .claude/ (gitignored) |
Experiments, local overrides |
| Team, this project | .claude/ (committed) |
Shared workflow, project standard |
| Enterprise | managed policy dir | Org-wide policy |
Precedence when the same thing is defined twice: managed always wins, then local > project > user; flags/env override files. (Full resolution table in debugging-reference.md.) Design corollary: put a thing at the widest scope where it's still correct, and never rely on a narrow-scope file to override a managed one — it can't.
A model-invocable skill or subagent only fires if its description matches. Write what it does + when to use + concrete trigger scenarios, key phrases first (the listing is budget-capped — see skills-reference.md).
# Good — explicit scenarios, trigger phrases up front
description: "ECS Fargate deployment guidance. Use for: task definitions, services,
ALB integration, awsvpc networking, FARGATE_SPOT, Service Auto Scaling."
# Poor — no trigger signal
description: "Helps with AWS"
Patterns that pull their weight: Use for: X, Y, Z (explicit scenarios),
Use proactively when… (encourages auto-delegation), Triggers on: kw1, kw2
(discovery). Start narrow and widen as real usage reveals missed cases — a broad
description that overlaps three other skills helps no one.
Subagent prompt — focus areas (3–5), actionable approach principles ("always X before Y", "prefer A over B when C"), a measurable quality checklist, named anti-patterns. Agents generate code; don't hard-code solutions into the prompt.
Skill body — quick-reference table, minimal usage, "when to use", links to
references/ for depth. Keep SKILL.md lean (well under 500 lines); push detail into
supporting files that fork in on demand.
Before shipping any extension:
name is kebab-case and matches the file/dir; frontmatter opens with ---.references/, not the always-loaded surface.claude plugin validate --strict for plugins; project test runner).| Pitfall | Fix |
|---|---|
| Skill scope too broad / overlaps others | One technology or workflow per skill; start narrow |
| Description has no trigger keywords | Add Use for: / Triggers on: with real phrases |
| Detail crammed into the always-loaded body | Move to references/, link from the body |
| Code baked into a subagent prompt | Describe the pattern; let the agent generate code |
| "Be helpful" / vague principles | Concrete, testable ("always validate input") |
| Using a skill to enforce an invariant | Invariants belong in hooks/permissions — skills are guidance |
| Hook script with unquoted vars / hardcoded paths | Quote "$VAR"; root paths with ${CLAUDE_PROJECT_DIR} (see hooks-reference.md) |