Risemi

What are agent skills?

A skill is a folder with a SKILL.md file that your coding agent loads only when the task calls for it. Here is how that works and when to use one.

7 min read · Updated November 8, 2026 · Risemi team

An agent skill is a folder of instructions that an AI agent can pick up when it needs them. At minimum the folder holds one file, SKILL.md, with a short header (a name and a description) and a body of instructions in plain Markdown. The agent reads the header of every installed skill at the start of a session, and reads the full body only when your request matches what the description says the skill is for.

That is the whole idea. A skill is a reusable playbook that sits on disk, costs almost nothing until it is used, and gets pulled in automatically at the right moment.

What a skill looks like

Here is the smallest valid skill. It lives in a folder named after the skill, for example .claude/skills/release-notes/SKILL.md:

---
name: release-notes
description: Writes user-facing release notes from the git log since the last tag. Use when the user asks for release notes, a changelog entry or "what shipped".
---

1. Run `git describe --tags --abbrev=0` to find the last tag.
2. List commits since that tag.
3. Group them under Added, Changed and Fixed. Drop refactors and chores.
4. Write one plain sentence per item, from the user's point of view.

The frontmatter between the --- lines is YAML. The open specification at agentskills.io requires two fields: name (lowercase letters, numbers and hyphens, up to 64 characters, matching the folder name) and description (up to 1024 characters, saying what the skill does and when to use it). Everything below the frontmatter is free-form instructions.

A skill can also carry extra files next to SKILL.md. The convention is scripts/ for code the agent can run, references/ for longer documentation, and assets/ for templates or data. The body points to them by relative path, and the agent opens them only if it gets that far.

How agents load skills: progressive disclosure

The reason skills scale is that the agent does not read them all at once. The specification describes three layers:

  1. Metadata. The name and description of every installed skill, roughly 100 tokens each, are loaded when the session starts.
  2. Instructions. The full SKILL.md body is loaded when the agent decides the skill is relevant. The spec recommends keeping it under about 5,000 tokens and 500 lines.
  3. Resources. Files in scripts/, references/ or assets/ are read only when the instructions call for them.

So you can install twenty skills and pay for twenty short descriptions, not twenty full playbooks. This is also why the description matters so much: it is the only part the agent sees when deciding whether to use the skill. If you want to write your own, our guide on how to write a SKILL.md covers descriptions in detail.

Skills vs prompts

A prompt is text you paste into a chat for one task. A skill is text the agent finds and applies by itself, across sessions, whenever the task fits.

PromptSkill
Where it livesYour clipboard or a notes appA folder in your project or home directory
Who triggers itYou, by pastingThe agent, by matching the description (or you, by name)
Works inAny chat: ChatGPT, Claude, GeminiAgents that support the skills format
Can include files and scriptsNoYes
Best forOne-off writing, analysis, imagesRepeatable workflows in a codebase or project

Neither is better. A prompt for a cold email is fine as a prompt. A test-first workflow you want enforced on every change is better as a skill, because you will forget to paste it.

Project: fresh `npm init -y` + `npm i -D vitest typescript` (Vitest 5.1.0, TypeScript strict). Every runner output below is pasted from the actual run.

Behaviour list (simplest first): 1. returns empty for blank input · 2. returns the address trimmed and lowercased when valid · 3. returns malformed when there is no @ · 4. returns malformed when there is more than one @ · 5. returns malformed when the domain has no dot · 6. returns too_long when the address is over 254 characters

Cycle 1: returns empty for blank input

```
[TDD] cycle 1/6  step RED  behaviour: returns empty for blank input
test:    src/validateEmail.test.ts > validateEmail > returns empty for blank input
ran:     npx vitest run src/validateEmail.test.ts -t "returns empty for blank input"
result:  FAIL  Error: Cannot find module './validateEmail' imported from <project>/src/validateEmail.test.ts
reason:  right (the unit under test does not exist yet: missing function, not a typo in the test)
changed: src/validateEmail.test.ts (+8, new file)
next:    minimum code in src/validateEmail.ts
```

```
[TDD] cycle 1/6  step GREEN  behaviour: returns empty for blank input
ran:     npx vitest run src/validateEmail.test.ts -t "returns empty for blank input" --reporter=verbose; npx vitest run src/validateEmail.test.ts
result:  PASS  Tests 1 passed (1)
changed: src/validateEmail.ts (+9, new file: result types + hard-coded `{ ok: false, error: 'empty' }`)
next:    refactor
```

Refactor: no refactor (hard-coded return is forced into the general version by cycle 2).

[Cycles 2–6 follow the same shape: each RED shows a real assertion mismatch such as `Tests 1 failed | 1 skipped (2)`, each GREEN the passing count, with refactors in cycles 5 and 6.]

Done

```
[TDD] DONE  cycles 6  tests added 6  suite PASS
ran:     npm test   (vitest run)   and   npx tsc -p .
result:  Test Files  1 passed (1) | Tests  6 passed (6); tsc exit 0
pre-existing failures: none (no tests existed)
found, not fixed: the 254 boundary itself (exactly 254 chars accepted) has no test; it passes today, so a test would be green on first run. 'a@.com' and 'a@b.' are accepted because the spec only asks for a dot in the domain.
```

No-fake-green check before every GREEN: no `.skip`/`.todo`, no assertion weakened, no test-only branch, nothing mocked.
SkillCodeFree
  • Antigravity
  • Claude Code
  • Codex
  • +3
Coding

Red-Green TDD Loop

Use it to make your coding agent build every change test-first: one failing test, the minimum code, a refactor, and a status block after each step.

0 installs
Free

Skills vs MCP, rules and custom instructions

People often mix these up. They solve different problems.

MCP (Model Context Protocol) connects an agent to external tools and data: a database, GitHub, a browser, your company's API. An MCP server gives the agent new abilities. A skill gives the agent know-how about how to use the abilities it already has. They combine well: a skill can say "use the GitHub MCP tools to open the PR, then do X". If you want to build the connector side, see Build an MCP Server.

Rules and custom instructions (CLAUDE.md, AGENTS.md, Cursor rules, Copilot instructions) are usually always on. They are loaded into every session, so they are the right place for short facts that always apply: "we use pnpm", "tests live in __tests__". They are the wrong place for a 200-line debugging procedure you need twice a week, because you pay for it in every conversation. That procedure belongs in a skill.

A rough rule of thumb:

  • Always true for this project, and short: put it in rules or AGENTS.md.
  • A procedure for a specific kind of task: make it a skill.
  • Access to a system the agent cannot reach yet: add an MCP server.

Which agents support skills

The SKILL.md format started at Anthropic and is now an open spec that several agents read. As of November 2026 these are the folders each agent scans (project folder first, then your personal folder):

AgentProject folderPersonal folder
Claude Code.claude/skills/<name>~/.claude/skills/<name>
Cursor.agents/skills/<name>~/.cursor/skills/<name>
OpenAI Codex.agents/skills/<name>~/.agents/skills/<name>
GitHub Copilot.github/skills/<name>~/.copilot/skills/<name>
Gemini CLI.agents/skills/<name>~/.gemini/skills/<name>

Some agents read extra folders too. Cursor, for example, also loads .cursor/skills/ and, for compatibility, .claude/skills/. OpenCode and Windsurf (now Devin Desktop) read .agents/skills/ as well; check their docs for personal folders. Step-by-step setup is in our guides for Claude Code, Cursor and Codex, and Claude Code vs Cursor skills compares the two side by side.

Because the core format is shared, one SKILL.md usually works across agents unchanged. Agent-specific frontmatter keys (Claude Code has several, like disable-model-invocation or allowed-tools) are ignored by agents that do not know them.

What skills are good for

Skills earn their place when you keep explaining the same process to your agent. Common examples:

  • A working method the agent should follow, like test-first development or root-cause debugging.
  • A review checklist applied to every pull request.
  • A house style for writing, design or API conventions.
  • A multi-step workflow with scripts, like generating release notes from git.

The best skills change how the agent behaves, not just what it knows. "Write a failing test before any code, and stop if it passes" is a skill. "React is a UI library" is not.

Phase 1: Root cause investigation
Full suite: FAIL test_expired_coupon_rejected_twice (tests/test_checkout.py:16) AssertionError: Coupon(code='OLD50', …expires_at=2020-01-01…) is not None.
In isolation the same test fails at a different line (17): AssertionError: 50.0 != 100.0. So the first lookup in a process is rejected and every later lookup is accepted; in the full suite the first lookup was done by test_expired_coupon_rejected. Cross-test pollution through module-level state.
Cache probe at the boundary: cache before [] → 1st None → cache after ['OLD50'] → 2nd Coupon(OLD50). Docstring says the cache was added in 3f2a1c9 "to cut DB reads": that is the regression point.
Trace (root-cause-tracing.md): apply_coupon → get_coupon → `if code in _CACHE: return _CACHE[code]`. get_coupon writes the coupon to _CACHE before the expiry check, and the cache-hit branch has no expiry check at all.

Phase 2: Pattern analysis
Working path: cache miss → _load → expiry check. Broken path: cache hit. Expiry depends on `now`, passed per call, so it cannot be a cached property; "don't cache expired coupons" alone would still serve a coupon cached while valid after it expires.

Phase 3: Hypothesis
"get_coupon returns cached coupons without re-checking expires_at against the caller's now; the cache was added around the lookup but the validity check stayed only on the miss path." Confirmed by the probe above.

Phase 4: Implementation
Failing test first: test_cached_coupon_rechecked_for_expiry (look up while valid, then after expiry) plus a setUp that clears the module cache. Before the fix: 5 tests, 2 failures, both for the expected reason.
Fix at the source: the cache stores the raw record; the expiry check runs on every lookup, cached or not.

    c = _CACHE.get(code)
    if c is None:
        c = _load(code)
        if c is None:
            return None
        _CACHE[code] = c
    if c.expires_at < now:
        return None
    return c

Verification: python3 -m unittest -v → Ran 5 tests … OK. The originally failing test in isolation, 3 runs: OK, OK, OK. Fix attempts: 1.
SkillCodePro
  • Claude Code
  • Codex
  • Copilot
  • +2
Coding

Systematic Debugging Loop

Stops your coding agent from guessing: root cause first, one hypothesis at a time, failing test before the fix.

0 installs
$9.99

Where Risemi fits

Risemi sells skills and prompts that we write and test in-house. Each skill is a ready folder with a SKILL.md. To install one, you paste a single line into your agent:

Read https://risemi.io/p/<slug>/install.md and follow it to install the "<slug>" skill into this agent.

The agent reads the guide and puts the folder in the right place. A command-line installer (npx risemi add <slug>) is shipping this week; until it is on npm, every product page also offers a ZIP you unzip into your agent's skills folder. Free skills need a free account; paid ones are a one-time purchase or included in Risemi Pro. Browse the Claude Code skills or all coding skills.

FAQ

Are agent skills the same as Claude skills?

Mostly, yes. Anthropic introduced the `SKILL.md` format for Claude, then published it as an open specification at agentskills.io. Claude Code, Cursor, Codex, GitHub Copilot and Gemini CLI now read the same basic format, so "Claude skills" and "agent skills" usually mean the same folder structure. Some agents add their own optional fields on top.

Do skills use up my context window?

Only a little until they are used. The agent loads each skill's name and description at the start, roughly 100 tokens per skill. The full instructions load only when the skill is triggered, and extra files load only if the instructions ask for them.

Can a skill run code?

A skill can include scripts in a `scripts/` folder and tell the agent to run them. The agent still runs them through its normal tools and permissions, so you see and approve commands the same way as any other command. Read a skill's scripts before installing it from a source you do not trust.

Should I use a skill or a CLAUDE.md / AGENTS.md file?

Use `CLAUDE.md` or `AGENTS.md` for short facts that apply to every task in the project. Use a skill for a longer procedure that only applies to some tasks. If you find your rules file growing past a page with step-by-step workflows, move those workflows into skills.

Do I need to be a programmer to use skills?

You need an agent that supports them, and most of those are coding tools. Installing a skill is copying a folder or pasting one line into the agent, so it does not require writing code. Writing a good skill is closer to writing clear instructions for a new colleague than to programming.

Project: fresh `npm init -y` + `npm i -D vitest typescript` (Vitest 5.1.0, TypeScript strict). Every runner output below is pasted from the actual run.

Behaviour list (simplest first): 1. returns empty for blank input · 2. returns the address trimmed and lowercased when valid · 3. returns malformed when there is no @ · 4. returns malformed when there is more than one @ · 5. returns malformed when the domain has no dot · 6. returns too_long when the address is over 254 characters

Cycle 1: returns empty for blank input

```
[TDD] cycle 1/6  step RED  behaviour: returns empty for blank input
test:    src/validateEmail.test.ts > validateEmail > returns empty for blank input
ran:     npx vitest run src/validateEmail.test.ts -t "returns empty for blank input"
result:  FAIL  Error: Cannot find module './validateEmail' imported from <project>/src/validateEmail.test.ts
reason:  right (the unit under test does not exist yet: missing function, not a typo in the test)
changed: src/validateEmail.test.ts (+8, new file)
next:    minimum code in src/validateEmail.ts
```

```
[TDD] cycle 1/6  step GREEN  behaviour: returns empty for blank input
ran:     npx vitest run src/validateEmail.test.ts -t "returns empty for blank input" --reporter=verbose; npx vitest run src/validateEmail.test.ts
result:  PASS  Tests 1 passed (1)
changed: src/validateEmail.ts (+9, new file: result types + hard-coded `{ ok: false, error: 'empty' }`)
next:    refactor
```

Refactor: no refactor (hard-coded return is forced into the general version by cycle 2).

[Cycles 2–6 follow the same shape: each RED shows a real assertion mismatch such as `Tests 1 failed | 1 skipped (2)`, each GREEN the passing count, with refactors in cycles 5 and 6.]

Done

```
[TDD] DONE  cycles 6  tests added 6  suite PASS
ran:     npm test   (vitest run)   and   npx tsc -p .
result:  Test Files  1 passed (1) | Tests  6 passed (6); tsc exit 0
pre-existing failures: none (no tests existed)
found, not fixed: the 254 boundary itself (exactly 254 chars accepted) has no test; it passes today, so a test would be green on first run. 'a@.com' and 'a@b.' are accepted because the spec only asks for a dot in the domain.
```

No-fake-green check before every GREEN: no `.skip`/`.todo`, no assertion weakened, no test-only branch, nothing mocked.
SkillCodeFree
  • Antigravity
  • Claude Code
  • Codex
  • +3
Coding

Red-Green TDD Loop

Use it to make your coding agent build every change test-first: one failing test, the minimum code, a refactor, and a status block after each step.

0 installs
Free
Phase 1: Root cause investigation
Full suite: FAIL test_expired_coupon_rejected_twice (tests/test_checkout.py:16) AssertionError: Coupon(code='OLD50', …expires_at=2020-01-01…) is not None.
In isolation the same test fails at a different line (17): AssertionError: 50.0 != 100.0. So the first lookup in a process is rejected and every later lookup is accepted; in the full suite the first lookup was done by test_expired_coupon_rejected. Cross-test pollution through module-level state.
Cache probe at the boundary: cache before [] → 1st None → cache after ['OLD50'] → 2nd Coupon(OLD50). Docstring says the cache was added in 3f2a1c9 "to cut DB reads": that is the regression point.
Trace (root-cause-tracing.md): apply_coupon → get_coupon → `if code in _CACHE: return _CACHE[code]`. get_coupon writes the coupon to _CACHE before the expiry check, and the cache-hit branch has no expiry check at all.

Phase 2: Pattern analysis
Working path: cache miss → _load → expiry check. Broken path: cache hit. Expiry depends on `now`, passed per call, so it cannot be a cached property; "don't cache expired coupons" alone would still serve a coupon cached while valid after it expires.

Phase 3: Hypothesis
"get_coupon returns cached coupons without re-checking expires_at against the caller's now; the cache was added around the lookup but the validity check stayed only on the miss path." Confirmed by the probe above.

Phase 4: Implementation
Failing test first: test_cached_coupon_rechecked_for_expiry (look up while valid, then after expiry) plus a setUp that clears the module cache. Before the fix: 5 tests, 2 failures, both for the expected reason.
Fix at the source: the cache stores the raw record; the expiry check runs on every lookup, cached or not.

    c = _CACHE.get(code)
    if c is None:
        c = _load(code)
        if c is None:
            return None
        _CACHE[code] = c
    if c.expires_at < now:
        return None
    return c

Verification: python3 -m unittest -v → Ran 5 tests … OK. The originally failing test in isolation, 3 runs: OK, OK, OK. Fix attempts: 1.
SkillCodePro
  • Claude Code
  • Codex
  • Copilot
  • +2
Coding

Systematic Debugging Loop

Stops your coding agent from guessing: root cause first, one hypothesis at a time, failing test before the fix.

0 installs
$9.99

More guides