Agent Skills guide: the spec defines six SKILL.md fields, but invocation and permission settings differ by tool
From SKILL.md structure to vetting third-party skills, rechecked against the Claude Code, Codex and VS Code docs and three papers
On this page
Agent Skills package reusable instructions for an AI agent in a folder built around a SKILL.md file, with optional reference material and scripts. Anthropic introduced it on 2025-10-16 and published it as an open standard on 2025-12-18. [8] On 2026-10-06 we compared the specification with the official docs for Claude Code, OpenAI Codex and VS Code (GitHub Copilot). The three tools share the file format and the progressive disclosure model the spec defines, but they differ on where skills are stored, how to stop the agent from invoking a skill on its own, and how a skill can run tools without asking for confirmation each time. This report covers those differences, plus three papers on when skills actually help and what risks third-party skills carry.
Summary
2 required (name, description) + 4 optional [1]
87 tasks, 18 configurations, 33.9% → 50.5% [9]
5.2% with high-severity patterns, collected 2025-12 [10]
SKILL.md frontmatter limited to the spec's six fields, and configure invocation rules, such as blocking automatic invocation, in the separate place each tool expects them. Claude Code and VS Code use frontmatter fields outside the spec for this; Codex uses a separate file, agents/openai.yaml. A skill with fields outside the spec is rejected with an error when uploaded to claude.ai or the Skills API. The gains came from human-curated procedural skills; skills the agent wrote for itself scored below having no skill at all. Treat a third-party skill like software you are installing: read and review every file before you use it.Terms used here
- A skill is a folder containing
SKILL.mdand, optionally, scripts, reference documents and templates. The agent reads the folder when it needs it and follows the procedure. - Frontmatter is the YAML block between the
---markers at the top ofSKILL.md. It holds the skill's name, description and settings such as how it may be invoked. - Progressive disclosure means the agent first puts only names and descriptions into its context, reads a skill's body once it decides to use that skill, and reads other files only when the body points to them. The context is everything the model receives as input at once.
- Automatic invocation is the agent picking a skill on its own by matching your request against skill descriptions. Explicit invocation is you calling it directly, as in
/skill-nameor$skill-name. The Codex docs call these implicit and explicit invocation. - Pre-approval lets a skill use specified tools without asking you to confirm each call. The spec's
allowed-toolsfield does this.
What the spec defines: one folder and six fields
Under the agentskills.io specification, a skill is a directory containing at least a SKILL.md file. scripts/ (executable code), references/ (documentation) and assets/ (templates, images, data) are optional; the spec describes these three folders as recommended conventions and allows any other files and folders. [1]
my-skill/ ├── SKILL.md # required: frontmatter + instructions ├── scripts/ # optional: executable code ├── references/ # optional: documentation └── assets/ # optional: templates, images, data
The 2026-06-16 first version of this report also listed an agents/ folder. Because the spec allows extra folders, that layout is not wrong, but the spec does not define that folder, and the agents/openai.yaml file inside it is a settings file that Codex reads (see the tool comparison below). [6]
| Field | Required | Constraint in the spec |
|---|---|---|
name | Yes | 1–64 characters. Lowercase letters, digits and hyphens only; cannot start or end with a hyphen or contain consecutive hyphens. Must match the parent directory name |
description | Yes | 1–1,024 characters. Should say what the skill does and when to use it, with keywords that help the agent recognize relevant tasks |
license | No | License name or a bundled license file |
compatibility | No | 1–500 characters. Environment requirements such as the intended product, system packages or network access |
metadata | No | Arbitrary entries mapping string keys to string values |
allowed-tools | No | Space-separated list of tools to pre-approve. Experimental; the spec says support may vary between agents |
The body has no format restrictions. The spec recommends putting step-by-step instructions, input and output examples, and common edge cases in it, and gives three levels for progressive disclosure. At startup the agent reads the name and description of every skill, about 100 tokens per skill. It reads the whole body once it decides to use the skill, with under 5,000 tokens recommended, and reads other files only when needed. The spec therefore recommends keeping SKILL.md under 500 lines, moving long material into separate files, and keeping file references one level deep from SKILL.md. Format checks use the reference tool published with the spec, skills-ref validate ./my-skill. [1]
--- name: summarize-changes description: Summarizes uncommitted git changes and flags risky edits. Use when the user asks what changed or wants a commit message. --- ## Steps 1. Read the current git diff. 2. Summarize the changes in three bullets or fewer. 3. List risks: missing tests, error handling, hardcoded values. 4. Suggest one commit message.
An example using only the spec's two required fields. The directory must also be named summarize-changes.
What differs by tool: paths, blocking automatic invocation, pre-approval
All three tools' docs say they follow the Agent Skills spec. Their skill search paths and settings outside the spec still differ. The table below reflects each tool's official documentation as checked on 2026-10-06; we did not install the same skill in all three tools to confirm it. [2] [6] [7]
| Item | Claude Code | OpenAI Codex | VS Code (GitHub Copilot) |
|---|---|---|---|
| Repository path | .claude/skills/ (including parent directories from the start directory up to the repository root) | .agents/skills/ (from the current directory up to the repository root) | .github/skills/, .claude/skills/, .agents/skills/ |
| Personal path | ~/.claude/skills/ | ~/.agents/skills/ | ~/.copilot/skills/, ~/.claude/skills/, ~/.agents/skills/ |
name field | Optional; falls back to the directory name | Required | Required. The skill does not load if it differs from the directory name or contains disallowed characters |
| Block automatic invocation | Frontmatter disable-model-invocation: true | policy.allow_implicit_invocation: false in agents/openai.yaml | Frontmatter disable-model-invocation: true |
| Explicit invocation | /skill-name | $skill-name or /skills | /skill-name |
| Context budget for the skill list | 1% of the context window; each skill's description is cut at 1,536 characters | 2% of the context window, or 8,000 characters if unknown; shortens descriptions first, then may omit skills | No figure in the docs |
| Run as a subagent | context: fork | No such setting in the docs | context: fork (experimental) |
allowed-tools | Supported; approval lasts only for the turn that invokes the skill | Not mentioned in the docs | Not in the frontmatter table |
Three differences matter in practice right away.
- Claude Code and Codex share no repository path. Claude Code reads
.claude/skills/; Codex reads.agents/skills/. Both docs say they follow symlinked skill folders, so you can keep the source in one location and link it from the other. VS Code reads all three paths. - The setting that blocks automatic invocation lives in different places. For skills with side effects, such as deploying or sending messages, Claude Code and VS Code use
disable-model-invocationinSKILL.md, while Codex uses a separate file,agents/openai.yaml. If you set only one, the agent in another tool can still choose that skill on its own. - Only Claude Code reliably loads a skill that omits
nameor uses anamethat differs from its directory. Claude Code falls back to the directory name, but the Codex and VS Code docs makenamerequired, and the VS Code docs say a skill whose name differs from its directory does not load.
Even within Anthropic's products, behavior differs
According to the Claude Code docs, claude.ai and the Skills API reject with an error, rather than ignore, any uploaded skill whose frontmatter includes fields outside the spec, such as disable-model-invocation, context or argument-hint. The VS Code docs list these three fields too, but those upload paths accept only the spec's six. Claude Code's !`command` feature, which inserts a shell command's output into the body, also does not work in claude.ai chat or through the API. [2] The runtime environments differ too. [4]
| Product | Where skills run | Sharing scope |
|---|---|---|
| Claude API | Sandboxed container. No network access; no package installation at runtime | Whole workspace |
| claude.ai | Full, partial or no network access, depending on user and admin settings | Individual user; each member uploads separately |
| Claude Code | Same network access as any other program on the user's computer | Personal and project folders, plugins, managed settings |
The same skill can call an external API in Claude Code but not through the Claude API. If a script needs network access or package installation, record that requirement in compatibility, the field the spec provides for environment requirements. [1]
The gains came from human-curated procedural skills
Among the sources we checked, SkillsBench is the broadest measurement of whether skills improve task results. It pairs each of 87 tasks across 8 domains with human-curated skills and a verifier that grades results automatically, runs each task with and without skills, and compares pass rates across 18 model and harness configurations. The harnesses include Claude Code, Codex CLI, Gemini CLI and OpenHands. [9]
| Condition | Pass-rate change vs. no skills (pp = percentage points) | Where in the paper |
|---|---|---|
| Human-curated skills, average of 18 configurations | +16.6 pp (33.9% → 50.5%) | Abstract, main table |
| Range across configurations | +4.1 to +25.7 pp | Abstract |
| One skill attached to the task | +18.0 pp | Finding 6 |
| 2–3 skills | +19.0 pp | Finding 6 |
| 4 or more skills | +10.1 pp | Finding 6 |
| Compact · standard-length skills | +19.0 · +21.5 pp | Finding 6 |
| Detailed skills · comprehensive documentation-style skills | +14.5 · +0.7 pp | Finding 6 |
| Skills the agent wrote itself with skill-creator | −8.1 to −11.5 pp | Appendix, 3 configurations |
The last row matters most for adoption. In three configurations (Claude Code + Opus 4.7, Codex + GPT-5.5, Gemini CLI + Gemini 3.1 Pro), the agent first wrote skills with skill-creator, Anthropic's skill-authoring tool, then solved the tasks with only those skills. Pass rates fell 8.1 to 11.5 percentage points below the no-skill baseline. In the same configurations, human-curated skills added 18.2 to 24.8 percentage points. The authors attribute the shortfall to generated skills the solving agent never found, skill-writing work that consumed solving time, and confidently wrong instructions. [9] So this result does not support the idea that you can simply generate skills automatically. By length, compact and standard-length skills performed similarly, while comprehensive documentation-style skills had almost no effect.
Skills made results worse on 13 of the 87 tasks. Comparing paired runs, the authors found a common pattern: the skill prescribed a single "correct" pipeline with no stated scope or lightweight fallback. It either imposed an overly heavy procedure, displaced a strategy the model already handled well, or pointed the agent at a tool it could not debug. [9]
The official authoring guidance points the same way. Anthropic's guidance says to run representative tasks without a skill first and record the failures, build three evaluation scenarios that test those failures, then write only enough instructions to pass them. [5] The Claude Code docs say to check separately whether a skill gets invoked and whether its output is what you expect, and describe comparing the same prompts in fresh sessions with the skill on and off. [2] When running a skill as a subagent with context: fork pays off is covered in Subagents vs agent skills.
How to write descriptions and bodies
- Put the main use case and the trigger conditions at the start of the description. The Claude Code and Codex docs both say this. With many skills, the list exceeds its budget and descriptions get cut, and a cut description no longer lets the agent match requests to skills. [2] [6]
- Say both what the skill does and when to use it. The spec and Anthropic's docs both require this, and Anthropic's authoring guidance says to write it in the third person because the description is injected into the system prompt. [1] [5]
- Put task-wide instructions near the top of the body, and word them so the agent applies them throughout the task. Claude Code adds an invoked skill's body to the conversation once and does not re-read it. When the conversation is summarized, it re-attaches only the first 5,000 tokens of each skill, within a combined 25,000 tokens, starting from the most recently invoked skill. [2]
- Put rules that must hold every time into a hook, a command that runs at a fixed point, not into a skill. The Claude Code docs say hooks run whether or not the model is following the skill. [2]
Review third-party skills like software you install
Anthropic's Agent Skills docs recommend using only skills you wrote yourself or got from Anthropic, and say that for a skill from an unknown source you should read and review every bundled file, including SKILL.md, scripts and images, before using it. They also note that a skill fetching content from external URLs may pull in malicious instructions, and that even a trustworthy skill can be compromised if its external dependencies change. [4]
Two ways a skill gains execution rights in Claude Code
| Feature | Documented behavior | Controls |
|---|---|---|
allowed-tools | Lets Claude use the listed tools without asking during the turn that invokes the skill; the grant clears when you send your next message. Workspace trust does not gate it: a project skill's field applies even in a -p run in a folder you have never trusted | With the managed setting allowManagedPermissionRulesOnly, Claude Code ignores allowed-tools in project and personal skills (2.1.282 or later). /status lists ignored skills |
!`command` injection | When the skill is invoked, shell commands run before Claude sees the content, and their output is inserted into the body. Each command is checked against permission rules first; outside auto mode, a command that is not allowed aborts the whole invocation. allowed-tools can pre-approve it | The setting disableSkillShellExecution: true turns off command execution for user, project and plugin skills. Bundled skills and skills deployed through managed settings are not affected |
Source: Claude Code skills docs and settings reference, checked 2026-10-06. [2] [3]
That is why the Claude Code docs advise reading the allowed-tools of skills checked into a repository before you run Claude Code there. [2] Permission rules can also block skills outright: adding Skill to the deny rules blocks all skills, and a rule like Skill(deploy *) blocks a specific one. How this behavior changed in recent versions is covered in our Korean report on Claude Code plugin security changes, and how many official-marketplace plugins pre-approve Bash through allowed-tools in our Korean audit of 315 official marketplace plugins.
A study of more than 30,000 public-marketplace skills
Liu et al. collected 42,447 skills from two public marketplaces (skills.rest and skillsmp.com) in December 2025, removed duplicates and skills with almost no content, and scanned the remaining 31,132 with static analysis and a large language model (LLM) classifier. [10]
| Item | Value | What it means |
|---|---|---|
| Skills with at least one risk pattern detected | 26.1% (8,126) | 23–30% once classifier error and sampling uncertainty are accounted for |
| High-severity patterns (obfuscated code, hidden instructions, credential harvesting, fetching external scripts) | 5.2% | The tier the authors consider strongly suggestive of malicious intent |
| Only low-severity patterns (unpinned dependencies, excessive permissions) | 12.8% | Mostly careless development practice |
| Skills with scripts · instruction-only skills | 40.6% · 24.2% | Odds ratio 2.12. Instruction-only skills are not free of risk patterns either |
| Relationship between an update in the last 90 days and risk patterns | Odds ratio 0.91 (p=0.47) | No statistically significant relationship. A recent update is not a safety signal |
The authors say directly that 26.1% should be read as "patterns warranting review", not as "confirmed malicious skills". The detector's precision is 86.7% and its recall 82.5%. The 17.3% of skills whose repositories had already been deleted at collection time were excluded; the authors note these may have included more malicious skills, so the true rate could be higher. [10] The difference by script inclusion is a correlation observed in this sample; the authors did not establish a cause.
One sentence in the description changed which skill was chosen
Saha et al. tested attacks that modify only SKILL.md. For each of 100 skills from the public registry ClawHub, they made a variant with identical functionality and one sentence appended to the description, and presented it side by side with the original. Across four models (GPT-4.1-mini, GPT-5, Gemma-4-31B, Qwen3-235B), the variant was chosen in 77.6% of trials on average, against a 50% random baseline. The appended sentences were of four kinds: false advertising, assertive cues, security or trust claims, and claims of active maintenance. [11] The experiment used a two-way choice and did not measure how Claude Code or Codex actually select skills, but as the authors conclude, a SKILL.md description is input that changes agent behavior, so it belongs in review alongside the scripts.
Checklist
- Start with the instructions you keep pasting into chat. The Claude Code docs say to create a skill when you keep pasting the same instructions, checklist or multi-step procedure, or when a section of
CLAUDE.mdhas grown into a procedure rather than a fact. - Run representative tasks without a skill first and record the failures. Write only enough instructions to fix those failures, then compare results in fresh sessions with the skill on and off.
- Start the frontmatter with the spec's six fields and make
namematch the directory name. That keeps the skill loadable in VS Code and accepted by claude.ai and Skills API uploads. Assume a field outside the spec works only in tools that read it, and remove such fields from copies you upload to claude.ai or the Skills API. - Put the main use case and the trigger conditions at the start of the description. Descriptions get cut when the list exceeds its budget.
- Block automatic invocation of skills with side effects in every tool you use. In Claude Code and VS Code, that is
disable-model-invocation: true; in Codex,allow_implicit_invocation: falseinagents/openai.yaml. - Before running Claude Code in someone else's repository, read the
allowed-toolsand!`command`lines in.claude/skills/. Organizations should reviewallowManagedPermissionRulesOnlyanddisableSkillShellExecutionin managed settings. - Read and review every file of a third-party skill before adopting it. Check scripts for network calls and file access, any content fetched from external URLs, and inflated trust claims in the description. A recent update is not evidence of safety.
- Move rules that must hold every time into hooks. Skill instructions can lose force as a conversation grows or is summarized.
What this is not yet
- This is a rewrite, on 2026-10-06, of an initial note first published in Korean on 2026-06-16. We did not keep the earlier text and tables as they were; every claim was checked again against its source. We removed the earlier top-10 table of marketplace installs and its chart: the source was a marketplace's own article promoting its skills, a secondary source, and when we reopened it on 2026-10-06 the install counts the first version cited were no longer on the page. We also removed the category priorities, staged adoption timeline, industry scenarios and recommended-skill list, which the first version had set without evidence. Cursor, which the first version listed as a supporting tool, was not checked this time and is not covered.
- We did no measurement of our own. The tool comparison reflects what the official docs say; we did not install the same skill in all three tools to confirm behavior. That the Codex and VS Code docs do not mention
allowed-toolsmeans it is absent from the docs, not that it has been confirmed not to work. - Anthropic's own docs disagree in one place. The Agent Skills overview says Claude Code skills are separate from claude.ai and the API, while the Claude Code docs say terminal sessions signed in with a claude.ai account download and use that account's skills. We report both statements as written and did not check which reflects current behavior.
- SkillsBench results come from terminal-based, containerized tasks. The authors say the results may not carry over directly to GUI agents or very long workflows, and that some of the gain could come simply from skills adding context. They also say the self-generated result mixes in cases where the solver did not find the skills and interference between the authoring and solving stages.
- The 26.1% is the share the detector flagged. It counts carelessness and malice together, is a December 2025 snapshot of two marketplaces, and, as the authors note, does not represent enterprise deployments or the ecosystem as it later evolved.
- The description-manipulation experiment used a two-way choice. It was measured with 100 ClawHub skills and four models, and the authors note results may differ with real agents' selection policies or other models.
- All three papers are arXiv preprints. We did not check whether they have passed peer review.
- Product docs and version numbers change quickly. All paths, fields, budgets and versions are as checked on 2026-10-06.
Sources
All checked on 2026-10-06. Product docs were fetched as Markdown source (append .md to the URL) and compared; for the three papers, values and limitations sections were checked in the arXiv LaTeX source. Product docs describe the vendor's own product behavior and are not independent verification.
| Source | What this report takes from it | Type |
|---|---|---|
| [1] Agent Skills · Specification | Directory structure, the six frontmatter fields and their constraints, experimental status of allowed-tools, three levels of progressive disclosure, 500-line and 5,000-token recommendations, skills-ref validate | Primary · spec |
| [2] Claude Code docs · Extend Claude with skills | Skill locations, frontmatter table, upload errors for fields outside the spec, blocking automatic invocation, 1,536-character description cap and 1% list budget, 5,000/25,000 tokens after summarization, allowed-tools and workspace trust, permission checks on !`command`, Skill permission rules, evaluation approach | Primary · vendor docs |
| [3] Claude Code docs · Settings reference | Scope and exceptions of disableSkillShellExecution | Primary · vendor docs |
| [4] Anthropic · Agent Skills overview | Runtime environment and sharing scope by product, security guidance, statement that skills do not sync across surfaces | Primary · vendor docs |
| [5] Anthropic · Skill authoring best practices | Building evaluations first, why descriptions are written in the third person | Vendor guidance |
| [6] OpenAI · Build skills (moved from developers.openai.com/codex/skills) | Codex paths, agents/openai.yaml and allow_implicit_invocation, 2% / 8,000-character list budget, explicit and automatic invocation, symlink support | Primary · vendor docs |
| [7] VS Code docs · Agent Skills | Three project paths and three personal paths, requirement that name match the directory, disable-model-invocation, experimental context: fork | Primary · vendor docs |
| [8] Anthropic Engineering · Equipping agents for the real world with Agent Skills | Introduced 2025-10-16; published as an open standard 2025-12-18 | Primary · vendor announcement |
| [9] Li et al. · SkillsBench: Benchmarking How Well Agent Skills Work Across Diverse Tasks | Average +16.6 percentage points across 87 tasks and 18 configurations, changes by skill count and length, results for self-generated skills, 13 tasks where skills hurt, limitations section | Primary · paper (preprint) v4, 2026-06-14 |
| [10] Liu et al. · Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale | 26.1% of 31,132 and rates by severity, rates by script inclusion, odds ratio for recent updates, detector performance, limitations section | Primary · paper (preprint) 2026-01-15 |
| [11] Saha et al. · Under the Hood of SKILL.md: Semantic Supply-chain Attacks on AI Agent Skill Registry | 77.6% selection rate for one-sentence description variants, models and setup, limitations section | Primary · paper (preprint) 2026-05-12 |
The 2026-06-16 initial note was rewritten on 2026-10-06 to the current standard. We changed the title and structure, removed the marketplace install ranking that could no longer be checked against its source and the priority and timeline tables the first version set without evidence, and added the tool-by-tool differences and the results of three papers. Of the material moved in from our coding agents comparison (then titled “2026 AI coding agent landscape”) in the 2026-09-07 revision, the release and open-standard dates were checked against the source and kept; the two-role classification of skills and the install distribution were removed for lack of evidence meeting this standard.