Harpalsinh Jadeja

Agent Skills: Proximity Isn't Precedence

Skills let a coding agent follow a repeatable procedure without being told it again every session. A skill is a folder, its instructions load when a task matches, and the rest of the time it costs almost nothing. That much is well documented. What is less obvious is that a skill's location is part of its meaning. The same SKILL.md file behaves differently depending on which directory it sits in, and the difference is not only a question of who can see it.

Make this website mobile responsive
Searching available skillsFound the mobile-responsiveness skillUsing the mobile-responsiveness skill
Making the site responsive: fluid grid, breakpoints, 44px tap targets.
my-app
.claude
skills
mobile-responsiveness
SKILL.md
app
package.json
A skill is a folder the agent goes looking for. It walks a known path, opens the folder whose name matches the task, and reads the instructions inside. Everything that follows is about where you put that folder.

This article is about that difference: where a skill can live, what each placement actually changes, how two skills with the same name resolve against each other, and how to decide which content belongs where.

What a skill actually is

my-app
.claude
skills
mobile-responsiveness
SKILL.md
breakpoints.md
audit-widths.py
templates
SKILL.md
---
name: mobile-responsiveness
description: Make an existing page
work on small screens. Use when a
layout breaks on phones, or a task
asks for mobile breakpoints.
---
## Checklist
1. Replace fixed widths with fluid ones.
2. Use the project's own breakpoints.
3. Stack multi-column grids under 768px.
4. Give controls a 44px tap target.
5. Check overflow: tables and code.
6. Verify at a 375px viewport.
## Notes
Prefer the scale the project already
defines. Do not restyle components that
already respond.
The folder is the skill, and the folder's name is the skill's name. SKILL.md carries the procedure; anything else it needs sits beside it in the same directory.

A skill is a directory containing a SKILL.md file, plus whatever else the procedure needs: scripts, reference documents, templates, assets. The frontmatter carries the metadata, the body carries the instructions.

SKILL.md
---
name: mobile-responsiveness
description: Make an existing page
work on small screens. Use when a
layout breaks on phones, or a task
asks for mobile breakpoints.
---
## Checklist
1. Replace fixed widths with fluid ones.
2. Use the project's own breakpoints.
3. Stack multi-column grids under 768px.
4. Give controls a 44px tap target.
5. Check overflow: tables and code.
6. Verify at a 375px viewport.
## Notes
Prefer the scale the project already
defines. Do not restyle components that
already respond.
context window
commit-styleWrite commit messages in the house format
pr-reviewReview a diff against this project's rules
release-notesDraft release notes from the merged PRs
mobile-responsivenessMake an existing page work on small screens
The description is always in context; the body is not. That is why a skill can carry a long procedure and still cost almost nothing until the task calls for it.

The structural fact worth holding onto is the split between those two. A skill's description is always in context, because that is how the agent decides whether the skill is relevant to the task in front of it. The body is not. It loads only when the skill is actually used, which is why a skill can carry a long reference document at almost no standing cost. Claude Code truncates the combined description and when_to_use text at 1,536 characters in the skill listing for precisely that reason, and recommends putting the key use case first.1

That split is what separates a skill from an always-on instruction file. CLAUDE.md is injected on every turn, so everything in it competes for attention on every turn, whether the current task needs it or not. A skill is a playbook the agent goes and fetches. It is not a tool or an MCP server either: those add capabilities the agent did not have, while a skill adds procedure over the capabilities it already has.

context window
commit-styleWrite commit messages in the house format
pr-reviewReview a diff against this project's rules
mobile-responsivenessMake an existing page work on small screens
CLAUDE.md
# my-app
Next.js app router with Tailwind.
## Commands
npm run dev, npm test, npm run lint
## Conventions
Server components by default.
Three skills contribute a name and a line each. CLAUDE.md contributes all of itself, on every turn, whether the task in front of the agent needs it or not.

Where skills can live

The same SKILL.md folder, in four places. In your home directory it reaches every project on the machine; in a repository it stays inside that repo and travels with it; in a plugin it goes wherever the plugin is enabled, namespaced so it never collides. Enterprise skills are the exception: they live in a managed settings location an administrator controls, not a folder you browse to.

There are four locations.1

Availability is not the same thing as presence on disk, and the discovery rules are where monorepos get interesting. Project skills load from .claude/skills/ in the directory the session starts in and in every parent directory up to the repository root, so starting in a subdirectory still picks up the skills defined at the top. Skills in nested directories below the starting point are not loaded at startup at all. They become available the first time the agent reads or edits a file inside that subdirectory, and then stay available for the rest of the session. That is the mechanism that lets a package ship its own skills: touch a file under apps/web/, and apps/web/.claude/skills/ comes into scope behind it.

A session loads skills from its own directory and every parent up to the repository root, so starting in my-app brings the root skill in at once. Reading a file under apps/web then pulls its SKILL.md into scope behind it, kept for the rest of the session. apps/api is never read, so its skill sits on disk, unloaded. Only the skill files change; the folders are on disk throughout.

Added directories load skills too, and this is a deliberate exception. --add-dir grants file access rather than configuration discovery, but .claude/skills/ inside an added directory is loaded alongside the project skills anyway.

Edits are picked up live. Adding, changing or removing a skill under a watched directory takes effect inside the current session. Creating a top-level skills directory that did not exist when the session started needs a restart, since there was nothing there to watch.

Skills have a cascade

index.html
<style>
.note { color: #615d59; }
#lead { color: #e89d01; }
</style>
<p class="note" id="lead"
style="color: #0075de">
Skills have a cascade
</p>
rendered

Skills have a cascade

color fromstyle=""
One property, declared three times in the same file. The pips in the margin are what each declaration weighs: a class counts for least, an id for more, an inline style for most. The two that lost are still sitting there, and still not consulted.

Those four locations are the origins of a cascade, and skills resolve the way CSS does. The comparison is worth taking literally rather than loosely, because it is precise about the part people get right and about the part they get backwards.

Two separate mechanisms are at work.

Getting this inverted is the usual mistake. It is tempting to assume the skill nearest the working directory is the strongest one, the way a nested rule in a stylesheet usually is. For availability that intuition is right. For a name collision it is exactly wrong.

What happens when two skills share a name

The broader placement wins, every time: enterprise over personal, personal over project, and any of the three over a bundled skill. Give skills unique names and a collision like this never has to be resolved at all.

Enterprise overrides personal, personal overrides project, and a skill at any of those three levels overrides a bundled skill of the same name. A code-review skill in your project's .claude/skills/ replaces the bundled /code-review. If a skill and a command share a name, the skill takes precedence.

Two parts of that are commonly stated wrong.

Plugin skills do not participate in it. They carry a plugin-name:skill-name namespace, so they cannot collide with the other levels at all. Plugins are not the bottom rung of the ladder, they are off the ladder.

The same folder name in a project and a plugin resolves to two different names: code-review, and pr-tools:code-review with the plugin's name prepended. Different names, so plugin skills never collide with the levels above them. They are off the ladder, not the bottom of it.

Nested skills do not override either, they coexist. Given a deploy skill at the repository root and another at apps/web/.claude/skills/deploy, both stay available. The nested one appears under a directory-qualified name, apps/web:deploy, and its description says which directory it applies to. Typing /deploy runs the root skill and typing the qualified name runs the nested one. When the unqualified name is invoked, the root skill loads with a list of the qualified variants appended to it, plus an instruction to also invoke any variant whose directory holds the files being worked on. The nested skill therefore still applies to work in its own directory even when nobody typed its qualified name.

A review skill at the repository root and another nested in apps/web. The root's name is review; the nested one is directory-qualified as apps/web:review. Two different names, so nested skills do not override each other, they coexist. The qualifier is the directory the skill sits in.

That is the cascade behaving like a cascade rather than like a switch, and it is the one place where narrower really does mean more applicable. Everywhere else, collisions are resolved by origin, which is a reason to make them impossible: give skills clear, unique names. frontend-pr-review rather than review.

What placement actually changes

Personal

Every project on your machine, private, and never in git.

Project

One repository, and it travels to everyone who clones it.

Plugin

Many repositories at once, versioned and namespaced.

Enterprise

The whole organization, and it wins every collision.

Where you put a skill fixes two things at once: how far it reaches, and how much it is allowed to do. From a private habit on your machine to policy across the organization, that is the whole of what placement decides.

Personal. Available in every project and every session on your machine, so a change affects all future work immediately. It stays private and never travels through git. The sharp edge is that a personal skill does not exist outside your machine: Cowork sessions, cloud sessions and routines do not read ~/.claude/skills/. A routine that invokes a personal-only skill reports it as not found, because every run starts as a fresh remote session.

Project. Available only while you are working inside that repository, and completely isolated from your other projects. It travels with the repo, so teammates get the same behavior when they clone it, and cloud sessions load it from the cloned repository. It also carries a trust consequence. A project skill's allowed-tools takes effect after you accept the workspace trust dialog for the folder, the same as the permission rules in .claude/settings.json, and a skill can grant itself broad tool access. A checked-in skill is something to read before trusting a repository rather than after.

Plugin. Versioned distribution across repositories and people, namespaced so it never fights with anything.

Enterprise. Policy. It wins every collision, and it can set things users are not able to override, such as turning off shell execution inside skills.

Home placement creates a persistent personal baseline. Project placement creates context-bound, shareable behavior. Plugin placement creates distributable behavior. Enterprise placement creates policy. The choice controls whether a skill follows you everywhere or stays locked to one codebase, and whether it exists at all when the session is not running on your laptop.

Deciding what goes where

What a skill is for decides where it goes. Keep it to yourself when it is your own habit, commit it to the repository when the codebase depends on it, and widen to a plugin or to policy as more of it is needed beyond one project.

Ask one question: is this my reusable habit, or this codebase's required workflow?

Habits go in the home directory:

Requirements go in the repository:

Anything on the second list that more than one repository needs belongs in a plugin instead. And if a personal habit turns out to be something you also need in cloud sessions or routines, that is a reason to move it into a repository or a plugin, not a reason to keep a second copy at home.

A few things about shape rather than location:

References

  1. 1.Claude Code docs: Extend Claude with skills
  2. 2.Claude Code docs: Settings files