# Skills

> A skill is a focused, reusable playbook (what it does, when to use it, and the method it follows) that the engine adds to a turn's instructions. Adopt skills from the public catalog on the Console's Skills page, select them into a config, and every turn on that config carries them. As of September 25, 2026, OpenEng AI isn't live yet.

A **skill** is a focused, reusable playbook. It says what it does, when to use it, and the method
to follow: "Add idempotency keys to mutating endpoints", "Define least-privilege RBAC for a
workload", "Instrument API endpoints for observability". The engine adds a skill's instructions to
a turn so the model works the way the skill describes. Skills come from the public catalog at
[skills.openeng.app](https://skills.openeng.app), and you adopt the ones you want on the Console's
**Skills** page (Building blocks → Skills).

> [!WARNING] Status on September 25, 2026: OpenEng AI isn't live yet
> The Console and Web Console interfaces load, but the OpenEng AI API routes and the Broker aren't
> deployed. Nothing can be saved or published, and no AI engine can register or connect. Pro,
> Enterprise and pay-as-you-go launch in Q4 2026 and can't be purchased yet. This page describes
> OpenEng AI as it works once those services are live ([status](ai.md)).

*Figure: Building blocks → Skills — the Mine and Catalog tabs. Catalog rows carry an Adopt button; rows you already adopted wear an Adopted badge.*

## Agents, templates and skills

All three shape what the model is told, at different sizes:

| Kind | What it is | How it's applied |
| --- | --- | --- |
| [Agent](agents.md) | A persona: a system prompt, optionally its own model | Replaces the base system prompt for the turn |
| [Template](templates.md) | A blueprint for a big, structured deliverable | Added as the turn's authoritative blueprint |
| **Skill** | A focused method for one kind of task | Added under the turn's "Active skills" |

They combine: a message can run as an agent, follow a template and carry several skills at once.

## The catalog

As of September 25, 2026, the catalog holds **885 skills** in 18 categories: APIs & Integration,
CI/CD & Release, Cloud & Kubernetes, Coding & Refactoring, Data & Analytics, Databases & SQL,
Debugging & Diagnostics, DevOps & Infrastructure, Documentation & Writing, Frontend & UI, Git &
Version Control, Memory & Knowledge, Observability & Monitoring, Performance & Profiling, Project &
Planning, Self-Improvement & Curation, Testing & QA, and Web Research & Scraping.

Every skill has an id `skill_def_<slug>`, a name, a one-line description, a version, a category and
tags. Its full text is a Markdown file at `https://skills.openeng.app/<slug>.md`, which is exactly
what the engine reads. The site's catalog file is
[skills.openeng.app/catalog.json](https://skills.openeng.app/catalog.json).

## The Skills page: Mine and Catalog

- **Catalog** lists the shipped skills with their category and version, and a filter box. **Adopt**
  creates your own copy: a new id (`skill_usr_…`) that remembers the catalog id it came from, under
  a unique name (adopting a second skill with a name you already use adds a number, such as
  "Docs writer 2"). Skills you've already adopted show an **Adopted** badge instead of the button.
- **Mine** lists the skills you've adopted, with their catalog reference and id. **Delete** removes
  your copy; config versions you already published keep the reference they froze.

The page is **adopt-only**: there is no **New skill** button, because the Console can't author a
skill from scratch yet. To write your own, use a local `SKILL.md` file (see
[Local skills](#local-skills)).

The [Library](library.md) adopts skills too: importing a bundle adopts each skill it names.

## Use skills in a config

1. Adopt the skills on the Skills page.
2. Open the config and go to its **Skills** step ("Adopted skills"), then pick the ones this config
   should carry. The step lists only skills you've adopted.
3. Publish the config. For each selected skill, the published config records the catalog id it
   came from.

On every turn served on that config, the engine adds the selected skills to the instructions, under
an "Active skills" heading. For a catalog skill it reads the text from skills.openeng.app, unless
the machine has a local skill with the same id (a local copy always wins). A skill that can't be
found is skipped with a notice, and the turn carries on without it.

## Scope one message

In the Web Console at [app.openeng.app](https://app.openeng.app), you can add a skill to a single
message: type `/skill <id>` before the message (the composer suggests the skills in the running
config), or tick it in the component selector beside the composer. Scopes combine, so one message
can carry `/agent`, `/template` and several `/skill` prefixes. You type it as one line; here it's
broken at each prefix so it fits:

```text
/template tpl_def_kubernetes-deployment-manifests
/skill skill_def_cloud-apply-rbac-least-privilege
write the manifests for the payments service
```

The skill's text is added to that message's instructions only.

## Local skills: `SKILL.md`

The engine also reads skills from files on the machine it runs on:

| Where | Scope |
| --- | --- |
| `~/.openeng/skills/<name>/SKILL.md` | Your skills on this machine |
| `<workdir>/.openeng/skills/<name>/SKILL.md` | One project; wins over a user skill with the same name |

The user directory moves if you set `OPENENG_SKILLS_DIR`, or if the config's **Global paths** step
sets a skills path. A `SKILL.md` starts with front matter (`name`, `description`, and an optional
`allowed-tools` list, which is advisory), followed by the instructions:

```markdown
---
name: rustfix
description: Fix Rust build errors
allowed-tools: read_file, edit, check
---
Run cargo, read the error, edit the file, re-run.
```

You use a local skill by scoping a message to it with `/skill <name>`. A local skill whose name
matches a skill id the config selects is used in place of the catalog text on that machine.

## Self-improving skills

**Self-improving skills** is a separate switch in the config's **Settings** step: "The agent learns
from runs to refine its skills, on-device." It's one of the engine's shipped on-device cores, so it
adds no role slot and downloads no model. A [Library](library.md) bundle can ask for it to be
turned on when you import it.

## Plan & tier notes

Adopting skills and selecting them into configs is open on every plan. Running a config needs the
`openeng` engine, which starts only on an active Pro plan ([Plans & billing](account.md)).

## Troubleshooting

**"skill '…' not found locally — skipped".** The engine couldn't find a local `SKILL.md` with that
id, and couldn't fetch a catalog skill's text from skills.openeng.app. Check the machine's network,
and that the id is right (Skills → Mine shows each skill's catalog reference).

**I can't create a new skill in the Console.** The Skills page is adopt-only for now. Write a local
`SKILL.md` instead.

**The config's Skills step is empty.** It lists only skills you've adopted. Adopt some on the Skills
page first.

**"Catalog may be stale."** The Console couldn't reach skills.openeng.app and is showing the last
copy it loaded.
