SKILL.md format used across the agent ecosystem, so a
skill written once works across all of them.
Where skills live
A skill is a directory under~/.monad/atoms/skills/ containing a SKILL.md:
name must equal the directory name.
Skills are discovered from two scopes, in precedence order:
- Personal —
~/.monad/atoms/skills/(applies everywhere) - Workspace —
~/.monad/agents/default/skills/(travels with the workspace)
SKILL.md format
Frontmatter fields
Eligibility gates (requires)
A skill can declare host prerequisites; when they aren’t met it’s hidden from the agent
entirely (not listed, not loadable, not /name-invocable) but still shown by monad skill
with the unmet reasons, so you know why:
Activation globs (paths)
requires gates on the host; paths gates on workspace content. A skill that declares
activation globs only auto-loads into the model’s context when the agent’s workspace currently
contains a matching file — so a niche skill stays out of the way until it’s relevant:
~/.monad/agents/default (Monad’s working area), evaluated at load and on every hot
reload. paths gates L1 auto-load only — the skill is still /name-invocable by the user
regardless of workspace contents.
Compatibility (compatibility)
Advisory, never blocks. When compatibility reads as a semver range it’s checked against the
running Monad version and a warning is logged if unmet; when it’s free-form prose it’s just
surfaced. Either way the skill loads — the operator decides whether to override:
skills.list items so clients can display it.
How the model uses a skill (progressive disclosure)
- L1 — metadata (always): every skill’s
name+descriptionis listed in the system prompt (~100 tokens each). - L2 — body (on demand): when a task matches, the model calls the
skilltool —{"tool":"skill","input":{"name":"summarize-changes"}}— to pull the full instructions. - L3 — resources (as needed): the model loads a bundled file by passing a relative path —
{"tool":"skill","input":{"name":"pdf-tips","file":"references/DETAIL.md"}}. Paths are confined to the skill directory.
Invoking a skill explicitly
Type/<name> [args] in any client (web / menu, or the message text). The skill body
becomes the turn, with $ARGUMENTS, $0, $1, … substituted from what follows the name.
disable-model-invocation skills are still explicitly invocable; user-invocable: false
skills are not.
Referencing bundled files (${SKILL_DIR})
A skill body can point at its own bundled resources by absolute path with ${SKILL_DIR} (the
legacy alias ${CLAUDE_SKILL_DIR} also works). This is resolved wherever the body is
surfaced — both when the model loads the skill and on /name invocation — so L3 scripts are
actually runnable:
Controlling which skills auto-load (skills config)
Every model-invocable skill’s description is injected into the agent’s context (L1) so the
model knows it exists. To keep that footprint under control, the operator decides which skills
auto-load, globally and per agent, in agents.json:
skill tool —
it stays /name-invocable by the user. The per-agent autoload overrides the global master;
the denylists union. Changes hot-apply on save (no restart).
Managing skills
monad skill is the primary surface:
install copies validated skills into ~/.monad/atoms/skills/; a running daemon picks
them up through hot reload. disable <name> removes a skill from the agent entirely,
while disable <name> --autoload-only keeps it /name-invocable but drops its
description from the model’s context — that is the knob controlling what every turn pays
for.
In the browser, Studio → Capabilities → Skills lists the same skills with their
source and auto-load state, and typing / in any composer filters and invokes them.
Programmatic access is GET /v1/skills or the skills.list JSON-RPC method.
Edits under ~/.monad/atoms/skills/ apply within the running session through a debounced
file watch. Adding the first skill to a daemon that booted with none needs a restart.
A fresh ~/.monad is seeded with a starter summarize-changes skill on first init;
deleting it keeps it gone.
Self-authoring (procedural memory)
The agent can write its own skills via theskill_manage tool — when it works out a reusable,
non-trivial workflow, it can save it as a skill for next time (create / edit / patch / delete,
plus bundled files). This is high-risk: it writes executable instruction files the agent
will later follow, so every write routes through the oversight gate (a human approves) and
is validated before landing. Approved skills go live immediately via hot reload. With no client
available to approve, writes fail closed.
Examples
A fresh~/.monad is seeded with a summarize-changes skill — read it as the reference
shape for a model-invocable skill, then copy it into a new directory to start your own:
Dynamic context (opt-in)
A skill body may embed!`command` placeholders (at a line start or after whitespace).
When the daemon is started with --skills-shell-exec, each is replaced at load time with the
command’s output — e.g. Current diff: !`git diff HEAD`. This is off by default:
running shell from a SKILL.md is an escalation, so it requires explicit opt-in. Each command
has a 5-second render budget and failures become a visible marker. Rendering re-runs on hot
reload.
Pre-approving tools (allowed-tools)
A skill can declare tools that should be auto-approved at the oversight gate while it’s
active this turn — a skill becomes active when the model loads it (via the skill tool) or
you invoke it with /name:
file_read), prefix glob (file_*), or a
argument-constrained Bash(git:*) form (the argument constraint is ignored — Monad gates per tool, not
per argument). A granted high-risk tool skips the human approval prompt; everything else still
goes through the gate. Grants are turn-scoped and only apply to tools a skill explicitly
lists, so the trust boundary is which skills you install — see Security.
Forked execution (context: fork)
A skill with context: fork runs as an isolated subagent: a fresh agent with empty history
and the same tools/model/gate executes the skill body as its task, and only its final result
comes back — the multi-step work stays out of the main conversation. Useful for focused research
or long procedures.
skill tool) or you invoke /deep-research <topic>. The subagent runs under your session (so high-risk approvals still surface) but cannot
recurse into more skills, fork again, or self-author (skill, skill_manage, and
agent_delegate are withheld from it). Reuses the same engine as the agent_delegate tool.
Capability tier (modelTier)
A fork skill can declare which class of model its subagent should run on, without naming a
vendor model — so the skill stays portable across deployments:
fast = cheapest, power = priciest, smart = the middle (and the
default for anything unpriced). Ranking is within your own configured set, so it stays
vendor- and time-neutral; an operator overrides map wins when set. If no configured profile
matches the tier, the fork falls back to the agent’s default model — it never fails to run.
modelTier is ignored without context: fork.
Not yet supported
These imported frontmatter features are parsed-or-ignored but not yet enforced, pending Monad infrastructure: per-skillmodel/effort overrides (Monad uses modelTier instead) and
hooks — which needs a hook subsystem Monad doesn’t have yet.
Security
Treat skills like installed software — a skill is executable instruction text from disk, the same trust boundary as a provider atom (see the runtime security model). Only install skills from sources you trust; auditSKILL.md and any bundled scripts. Note that
allowed-tools lets an active skill bypass the human approval gate for the tools it lists,
so a malicious skill that declares high-risk tools is dangerous — this is exactly why skill
provenance matters (operator-placed in ~/.monad/atoms/skills, installed via monad skill install,
or self-authored through the gated skill_manage tool). Skill bodies are otherwise inert text
(the skill tool only returns content; it never executes bundled scripts on its own).