Skills
Hot-reloaded capability directories — anatomy, override rules, and what belongs in core vs your overlay.
A skill is a directory containing a SKILL.md plus any scripts it needs. Skills
are injected into Iris's system prompt and hot-reload without a restart — edit
a SKILL.md and the next message uses it.
Anatomy
skills/
└── send-email/
├── SKILL.md # YAML frontmatter (name, description) + usage instructions
└── send-email # executable the skill instructs Iris to run---
name: send-email
description: Send an email via the configured provider.
secrets: [RESEND-API-KEY]
---
# Skill: send-email
Usage: send-email --to <addr> --subject <s> --body <b>
...secrets: is optional frontmatter — a list of secret names (get-secret
names, e.g. PERPLEXITY-API-KEY) this skill's script actually resolves at
runtime. It's how spawn-agent decides which credentials a new sub-agent
needs: when a skill with a secrets: list is attached to an agent
(--with-skill=<name>), those names get carried into the agent's
agents.json allow-list and, on env-mode installs, into its systemd unit —
see Sub-agents. A skill with no secrets: field is assumed
to need none.
Load order and overrides
- Workspace skills —
<workspace>/skills/(symlinked to the repo'sskills/directory for hot reload). Available in every channel. - Channel skills —
<channel>/skills/. Override workspace skills on name collision, so a channel can specialize behavior without touching the global set.
What belongs in core
Core ships platform skills only — things Iris needs to operate, extend, and
heal herself: spawn-agent, self-heal, self-extend, get-secret, github,
send-email, search-web, serve-public, store-file, transcribe-audio,
schedule, status, upgrade-iris, plus the opt-in azure, terraform, and
firecracker-agent profile skills.
Domain and business skills — cost dashboards, finance trackers, CRM integrations — belong in your install's overlay. The test: does this skill help Iris run the platform, or is it a task capability an operator happens to want?
Bare-command usage
If a SKILL.md documents its executable as a bare command (send-email ...
rather than /iris/data/skills/send-email/send-email ...), that executable
must be symlinked onto PATH in bootstrap.sh (/usr/local/bin, alongside
get-secret/set-secret/iris-secret) — the sandbox executor spawns
sh -c "<cmd>" with the plain inherited PATH, which does not include a
skill's own directory. Without the symlink, the bare form still "works" in
that the model recovers by falling back to the absolute path on a command not found error, but that's a wasted call on every single invocation. Name the
symlink after the documented command, not the source filename, if they differ.
Writing a skill
Ask Iris. The self-extend skill lets her scaffold, test, and commit new skills
herself — every skill she writes is committed to GitHub before use (constitution
rule 2). To write one by hand: create the directory, write SKILL.md with
frontmatter, drop in your script, done — no registration step.