Claude Skills Not Working? Fixes for Every Failure Mode
Skill missing from the / menu, never auto-triggering, firing too often, or breaking mid-run — the symptom-by-symptom fix list for Claude skills.
Work the symptom, not the whole system: a skill missing from the / menu is a folder or naming problem; one that never auto-fires has a description problem; one that fires too often has a too-broad description; one that fires but misbehaves has a body problem. Each has a two-minute check — and most fixes are one line of frontmatter.
Key takeaways
- Not in the / menu → wrong folder, name/directory mismatch, or the skills directory didn't exist at session start (the one case that needs a restart).
- Never auto-triggers → the description doesn't match how you ask. Rewrite it trigger-first; also check disable-model-invocation and paths aren't quietly blocking it.
- Fires too often → the description claims too much. Narrow it, or set disable-model-invocation: true for manual-only skills.
- Fires but does the wrong thing → body problem: missing steps, no convention anchor, no boundary line. The description got it loaded; the body decides what happens.
- Permission prompts mid-skill → allowed-tools doesn't cover what the body actually runs; grants also clear on your next message, by design.
- On claude.ai, 'skill does nothing' is usually code execution disabled or a mis-structured ZIP.
Skill failures sort cleanly by symptom, and each symptom has a short check list. Find your symptom below and work it top to bottom. (For the deeper test-and-iterate methodology once things basically work, see Testing and Debugging Skills.)
Symptom 1: the skill doesn't appear in the / menu
The skill isn't loading at all. In order of likelihood:
- Wrong path. It must be
.claude/skills/<name>/SKILL.md(project) or~/.claude/skills/<name>/SKILL.md(personal) — the file isSKILL.md, uppercase, inside a folder named for the skill. A baremy-skill.mddirectly inskills/doesn't load. - Name mismatch. The frontmatter
namemust equal the folder name, and both must be lowercase letters, numbers, and hyphens only, max 64 characters.Deploy_Checklistfails on three counts. - Broken YAML. An unclosed quote, a tab, or a missing closing
---makes the frontmatter unparseable and the skill is silently skipped. Paste the frontmatter into a YAML linter if in doubt. - The skills directory was born mid-session. Skill files are watched live, but if the top-level skills folder itself didn't exist when the session started, restart once so it gets watched.
- It's namespaced. Plugin skills appear as
/plugin:name, and nested monorepo skills as/dir:name— check the full menu, not just the bare name. user-invocable: falseis set. Then it's hidden from the menu by design and only auto-invocation runs it.
Symptom 2: it never triggers on its own
The skill loads (you can run /name) but Claude never picks it up automatically. This is a description problem in nearly every case — the description is the only thing Claude sees before the skill fires:
- It's written in implementation language. "Handles VCS metadata normalization" matches nothing anyone types. Rewrite as the job plus the trigger: "Generate clear commit messages from staged changes. Use when committing code."
- It lacks a "Use when…" clause. Add one with the verbs users actually say; add
when_to_usewith example phrasings if the description alone isn't enough surface. - It's being truncated. The listing budgets ~1,536 characters for description plus
when_to_usecombined — if your trigger phrasing lives at the end of a long description, it may never be seen. Front-load it. - A frontmatter field is blocking it.
disable-model-invocation: trueforbids auto-triggering entirely, andpaths:globs restrict activation to matching files — check both before rewriting anything.
Test in a fresh session each time: the session where you wrote the skill has the whole conversation biasing the routing.
Symptom 3: it fires when it shouldn't
The opposite failure, same field. A description like "Helps with git" claims half of all sessions. Narrow it to the one job, name what it does not cover if a sibling skill owns the neighboring job, and for skills that should only ever run deliberately — deploys, anything destructive — set disable-model-invocation: true and invoke by /name. If you have many skills and can't tell which descriptions collide, run the skill-auditor skill over the folder — overlap detection is exactly its job.
Symptom 4: it fires, but does the wrong thing
Loading and triggering are fine; the body is the problem:
- Steps are vague. "Write good tests" isn't a procedure. Number the steps, name the commands.
- No convention anchor. Point at a canonical example in the repo ("match the format of the last five entries") so output lands in your house style.
- No boundary. Skills inherit the model's helpfulness; without a closing line like "creating the file is the whole job — do not run the migration," scope creep is the default.
- A bundled script fails. Check the script is referenced by a path relative to the skill folder, runs from an arbitrary working directory, and — if you copied the skill from elsewhere — kept its executable bit.
Symptom 5: permission prompts interrupt the skill
The body uses tools that allowed-tools doesn't pre-approve. Two subtleties: the grant is scoped to the turn that invoked the skill and clears on your next message — recurring prompts across turns are expected behavior, not a bug — and scoped forms matter: Bash(git diff:*) approves exactly that command family, while a body that also runs git push will still prompt. List what the procedure actually runs, no more. (See the reference for the field's exact semantics.)
Symptom 6: it works in Claude Code but not elsewhere
- claude.ai: code execution must be enabled (Settings → Capabilities), and the uploaded ZIP must contain the skill folder with SKILL.md inside. Surfaces don't sync — claude.ai never sees your filesystem skills.
- Claude API: the container has no network access and no runtime package installs — a skill that fetches URLs or pip-installs works locally and fails there. Also check both beta headers and the 8-skills-per-request cap. Details in Skills on claude.ai and the API.
- Agent SDK:
allowed-toolsfrontmatter is ignored; tool permissions come from the SDK's ownallowedToolsoption.
TIP
When nothing above fits, minimize: copy the skill, strip the body to one trivial step, confirm the stub loads and triggers, then add the real body back in halves. Loading, triggering, and behavior are three separate layers — the stub isolates which one is broken.
Frequently asked questions
- Why is my skill not showing up in the slash menu?
- Check three things: the file is at .claude/skills/<name>/SKILL.md (or ~/.claude/skills/), the folder name exactly matches the frontmatter name (lowercase, numbers, hyphens, max 64 chars), and the frontmatter YAML parses — a stray tab or unclosed quote silently drops the skill. If the skills directory itself was created mid-session, restart once.
- Why does my skill only work when I invoke it with /name?
- That's a triggering failure, not a loading failure — the skill is installed fine, but its description doesn't match your phrasing. Rewrite the description as what-it-does plus 'Use when…' in the words you actually type, and add when_to_use with example phrasings if it needs more surface.
- Why did my skill stop asking before running commands — or start asking?
- allowed-tools pre-approves listed tools only for the turn that invoked the skill; the grant clears on your next message. If prompts appear mid-skill, the body is using tools the frontmatter doesn't list — add them, scoped (Bash(git diff:*)) rather than blanket.
- Why doesn't my uploaded skill do anything on claude.ai?
- Two usual causes: code execution isn't enabled (Settings → Capabilities — skills run inside it), or the ZIP is structured wrong — it must contain the skill folder with SKILL.md inside it. Also remember claude.ai doesn't see Claude Code skills; each surface needs its own upload.
- Do I need to restart Claude Code after editing a skill?
- No — skill files are watched, and edits apply in the current session. The single restart case is when the top-level skills directory didn't exist at session start. If an edit seems ignored, verify you edited the copy that's actually loading (project vs personal vs plugin namespace).
Related
- What Are Claude Skills? The Complete GuideClaude Skills explained: what a SKILL.md is, how progressive disclosure keeps skills cheap, where they run, and how to install or write your own.
- Testing and Debugging Claude Code SkillsVerify a Claude Code skill triggers on the right prompts, check its output, and fix the five common failures — from vague triggers to broken paths.
- The SKILL.md Reference: Every Frontmatter Field ExplainedA complete reference for the SKILL.md format — all frontmatter fields, naming rules, argument substitution, limits, and where skill files live.
- How to Install Claude SkillsEvery way to install Claude skills: manual copy, the agentscamp CLI, GitHub repos, plugins, team distribution, and uploading to claude.ai.
- Skill AuditorAudit an installed set of Claude Code skills for the failure modes that make them misfire — overlapping descriptions that misroute tasks, trigger phrasing that never matches, bloated bodies, missing boundaries, and over-broad tool grants — and return a prioritized fix list with rewritten descriptions. Use when a skill fires on the wrong tasks, never fires at all, or a skills folder has grown past what anyone reviews.
- Claude Code Skills: Best PracticesThe patterns that make Claude Code skills reliable: trigger-first descriptions, one job per skill, lean bodies, bundled scripts, and scoped tools.