# Best Practice: Skills

Skills are the primary mechanism for extending Codex CLI with reusable, composable instruction packages. They follow the `SKILL.md` standard and work best when they are narrow, trigger cleanly, and keep context small.

## Core Pattern

Codex uses skills in two ways:

1. Explicit invocation: mention the skill directly in the prompt. In the CLI or IDE, use `/skills` or type `$` to insert a skill mention.
2. Implicit invocation: Codex chooses the skill when the task matches the skill `description`.

That makes the `description` field the most important part of the skill metadata.

### `$` Menu (v0.121.0+)

Typing `$` in the TUI composer opens a unified mention menu that lists your
skills alongside apps and plugins. Skills show with their `name` field; the
`description` field is used to rank matches as you type.

Because the same menu mixes apps, skills, and plugins, skill names should be
concrete and distinguishable (e.g. `ts-migration-helper`, not `helper`).

## Minimal Frontmatter

Use only the required frontmatter unless you have a documented reason to add more:

```yaml
---
name: docs-helper
description: Verify framework API details before making code changes or writing migration guidance.
---
```

The rest of the skill should focus on inputs, workflow, and expected outputs.

## Structure for Progressive Disclosure

Organize skills so Codex can load extra detail only when needed:

```text
.agents/skills/
  docs-helper/
    SKILL.md
    references/
    scripts/
    assets/
    agents/
      openai.yaml
```

- Put core workflow instructions in `SKILL.md`.
- Put deep reference material in `references/`.
- Put deterministic helpers in `scripts/`.
- Use `agents/openai.yaml` for optional UI metadata, invocation policy, and tool dependencies.

## Write Better Descriptions

Good descriptions act like trigger conditions:

```yaml
# Good
description: Review TypeScript changes for type-safety regressions and missing runtime validation.

# Bad
description: Help with TypeScript.
```

Be specific about when the skill should trigger and, when useful, when it should not.

## Design for Current Codex Behavior

- Treat skills as reusable workflows, not as custom slash commands.
- Prefer `/skills` and `$skill-name` mentions for explicit invocation examples.
- Use plugins to distribute reusable skills beyond a single repo.
- Use `[[skills.config]]` in `~/.codex/config.toml` to disable a skill without deleting it.

Example:

```toml
[[skills.config]]
path = "/path/to/skill/SKILL.md"
enabled = false
```

## Optional Metadata

Use `agents/openai.yaml` when you need richer metadata:

```yaml
interface:
  display_name: "Docs Helper"
  short_description: "Checks APIs before code changes"

policy:
  allow_implicit_invocation: false
```

This is the right place for UI presentation and invocation policy. Do not rely on stale or undocumented frontmatter fields.

## Anti-Patterns

| Anti-Pattern | Fix |
|---|---|
| Treating skills as `/skill-name` slash commands | Document explicit invocation via `/skills` or `$skill-name` mentions |
| Using undocumented frontmatter like `user-invocable`, `allowed-tools`, or `context: fork` | Stick to current documented `SKILL.md` + `agents/openai.yaml` patterns |
| Treating `skills = [...]` as the main way to attach domain knowledge | Let skills trigger by description, or manage availability with `[[skills.config]]` |
| Putting all instructions in `AGENTS.md` | Extract focused workflows into skills |
| Writing broad descriptions that match everything | Make `description` a precise trigger condition |
