> ## Documentation Index
> Fetch the complete documentation index at: https://docs.open4rena.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Skills

> Package reusable instructions that you or the model can load when they apply.

A skill is a Markdown file of instructions for one kind of task, such as
cutting a release, writing a migration, or reviewing an API change. The model
can list and search your skills by their short descriptions and load the full
instructions only when a task calls for them. You can also run a skill
yourself as a slash command.

Write a skill when you find yourself giving o4 the same multi-step
instructions again and again. For rules that should apply to every session in
a project, use [project instructions](/configuration/project-instructions)
instead.

## Create a skill

Each skill is a folder with a `SKILL.md` file in it. The folder name is the
skill's name. To make a skill for this project, create
`.o4/skills/release-notes/SKILL.md`:

```markdown theme={null}
---
description: Draft release notes from the commits since the last tag.
---

# Release notes

1. Find the latest tag with `git describe --tags --abbrev=0`.
2. List the commits since that tag.
3. Group the changes under Added, Changed, and Fixed.
4. Write the notes to `RELEASE_NOTES.md`. Don't commit.

Focus on: $ARGUMENTS
```

Start a new o4 session, then run it with:

```text theme={null}
/release-notes user-facing changes only
```

o4 builds its list of skill slash commands when a session starts, so a skill
you add by hand gets its slash command in the next session. The model can find
it right away, because its `skill` tool reads the folders each time.

You can also create one from `/skills`: choose **Create new skill**, enter a
name, pick the location (project or user), and o4 writes a `SKILL.md`
template and opens it in your editor. A skill created this way works as a
slash command right away.

## Where skills live

| Location | Folder | Available |
| - | - | - |
| Project | `.o4/skills/<name>/SKILL.md` | In this workspace, once you trust it |
| User | `~/.o4/skills/<name>/SKILL.md` | In every workspace |
| Plugin | The plugin's `skills` folder, or the folders its Codex, Claude Code or Cursor manifest lists under `skills` | Wherever the plugin is installed |
| Built-in | Inside o4 | Always, through the model's `skill` tool |

When two skills have the same name, a project skill wins over a user skill,
a user skill wins over a plugin skill, and a plugin skill wins over a
built-in one.

o4 ignores a project's `.o4/skills` folder until you trust the workspace, so
a repository you just cloned can't add instructions to your sessions. See
[Workspace trust](/safety/workspace-trust).

To install skills that others have written, install a plugin that contains
them. o4 calls these plugins skill packs. See
[Plugins and marketplaces](/extend/plugins).

### Built-in skills

o4 ships with five skills that the model can load:

| Name | What it covers |
| - | - |
| `commit` | Safely inspect, stage, commit, and verify requested git changes |
| `pull-request` | Inspect a branch and create a GitHub pull request with an accurate summary and test plan |
| `verification` | Choose proportionate tests and checks, then report verification evidence accurately |
| `security-review` | Review changed code for concrete authorization, injection, secret, supply-chain, and boundary risks |
| `delegation` | Delegate bounded work to subagents with explicit contracts and independently verify the results |

Built-in skills don't appear in `/skills` and don't have slash commands. To
change how one works, create a project or user skill with the same name.

## The SKILL.md format

A `SKILL.md` file is Markdown with optional YAML front matter between `---`
lines. A skill must be a regular file, not a symlink, and at most 1 MiB.

```markdown theme={null}
---
description: One line that tells the model when this skill applies.
context: fork
disable-model-invocation: false
---

The instructions go here.
```

<ParamField path="description" type="string">
  What the model sees when it lists or searches skills. Write it so the model
  can tell when the skill applies. Without it, o4 uses the first non-empty
  line of the body, without any leading `#`. The model sees at most 200
  characters. For project and user skills, `/skills` and the slash command
  menu always show the body's first line instead.
</ParamField>

<ParamField path="context" type="string">
  Set to `fork` to hand the skill to a subagent when you invoke it as a slash
  command. o4 shows "Running `<name>` in background..." and sends the model
  the skill's text with a request to run it as a subagent; the model then
  starts one with its `agent` tool. See [Subagents](/guides/subagents).
</ParamField>

<ParamField path="allowed-tools" type="string[]">
  Shown in the skill's details in `/skills`. For project and user skills it
  doesn't limit which tools the model can use. In a plugin's skill, a tool
  that isn't in the plugin's `permissions.tools` keeps the skill from
  loading. See [Plugins and marketplaces](/extend/plugins).
</ParamField>

<ParamField path="model" type="string">
  Shown in the skill's details in `/skills`. o4 doesn't switch models for
  the skill.
</ParamField>

<ParamField path="hooks" type="list">
  Hooks that run only while the skill runs. Each has an `event`, an optional
  `matcher` and a `command`. See
  [Hooks in skills](/extend/hooks#hooks-in-skills).
</ParamField>

<ParamField path="disable-model-invocation" type="boolean" default="false">
  When `true`, running the skill as a slash command shows its text in o4
  without sending it to the model. Use it for checklists and reference notes
  you want to read yourself.
</ParamField>

A project or user skill's name always comes from its folder name; a `name`
field in the front matter doesn't change it. In a plugin's skill, a `name`
field sets the slash command name and the name in `/skills`, but the model's
`skill` tool still uses the folder name. Keep the two the same.

### Arguments

When you run a skill as a slash command, o4 replaces every `$ARGUMENTS` in
the body with the text you typed after the command. If you type nothing,
`$ARGUMENTS` becomes an empty string. In a plugin's skill, o4 also replaces
`$CWD` with the working directory and `$O4_PLUGIN_ROOT` with the plugin's
folder. When the model loads a skill with its `skill` tool, it gets the body
without any replacements.

### Shell commands in skills

o4 never runs a line in the body that starts with `!`. When you run a
project or user skill as a slash command, o4 replaces each such line with a
note like this before the model sees it:

```text theme={null}
[Embedded skill command disabled; run through Bash approval: git status]
```

When the model loads a skill with its `skill` tool, or you run a plugin's
skill, the line reaches the model as written, and still isn't run.

If a skill needs a command's output, tell the model to run the command. It
then goes through the normal approval, sandbox, and hook checks.

## How the model uses skills

The model has a `skill` tool with three uses:

* With no arguments, it lists the available skills with their names, where
  each comes from, and their descriptions. It shows up to 50.
* With `query`, it searches skill names and descriptions.
* With `name`, it loads that skill's full instructions.

Skill text isn't added to the model's context until the model loads a skill,
so having many skills costs little. The `skill` tool never asks for approval,
because it only reads instructions. A clear `description` is what lets the
model find the right skill.

## Run a skill yourself

Type `/` and the skill's name, followed by any arguments:

```text theme={null}
/release-notes since v2.3.0
```

o4 loads the skill, fills in `$ARGUMENTS`, and sends it to the model as your
next message. Built-in slash commands take precedence, so a skill named
`help` can't replace `/help`. Skills from plugins run the same way.

## Manage skills with /skills

`/skills` opens the skill browser. Its tabs are **All**, **Project**,
**User**, **Plugin**, and **Errors**. The **Errors** tab lists skills that
failed to load, such as a `SKILL.md` with invalid front matter, and notes when
project skills were skipped because the workspace isn't trusted.

Select a skill to see its details and act on it:

* **Select skill** puts `/<name>` in the prompt so you can add arguments.
* **Edit skill** opens the `SKILL.md` in your editor.
* **Delete skill** removes it.
* **View definition** shows the skill's description and where it comes from.
  In o4 0.2.74, selecting it does nothing more.

A skill that [Project Scout](/guides/code-intelligence) turned off has
**Enable skill** instead of **Select skill**. It removes the skill from
`disabled_skills` in the project's `.o4/config.toml`. While a skill is turned
off, it's left out of the slash command menu, and running it only shows
"Skill '`<name>`' is disabled by Project Scout." The model can still load it
with its `skill` tool.

You can't edit or delete plugin skills from the browser. Change or remove
the plugin instead.

While the model is working, you can still open the browser, select a skill,
and use **Enable skill**, but creating, editing or deleting a skill is
refused: o4 closes the browser and shows
`Wait for the current turn to finish before making this change.`

You can also jump straight to an action:

| Command | What it does |
| - | - |
| `/skills create [name]` | Start creating a skill, with this name filled in if you give one |
| `/skills select <name>` | Open the skill's details |
| `/skills edit <name>` | Open the skill's details with **Edit skill** selected |
| `/skills delete <name>` | Open the skill's details with **Delete skill** selected |

The **Skills** tab in `/config` (run `/config skills` to go straight to it)
has two rows:

* **Open skill browser** opens the same skill browser as `/skills`.
* **Install skill packs** opens the plugin browser, the same as `/plugins`,
  where you can find and install plugins that bundle skills. See
  [Plugins and marketplaces](/extend/plugins).
