Skills
How skills add guidance and unlock tools for an agent.
A skill is a reusable capability you assign to an agent. Each skill has two effects that fire together at job time:
- Prompt injection — the skill's Markdown body is appended to the agent's system prompt, giving it instructions, discipline rules, or domain knowledge.
- Tool gating — a skill's
requiredBuiltinslist unlocks specific built-in tools for any agent that holds it. An agent without the skill never sees those tools, regardless of what's registered in the runner.
These two effects are always coupled: you can't get the tools without the guidance, and you can't get the guidance without the assignment.
Kinds of skills
| Kind | Created by | Notes |
|---|---|---|
| System | Ships with the product | 27 skills seeded at boot from the catalog (e.g. office-editing, command-execution, code-task). |
| Custom | You, in the dashboard | Freeform Markdown; you control the content and requiredBuiltins. |
| Community | Installed at runtime | Fetched from any open SKILL.md on GitHub, skills.sh, or ClawHub. Stored under this workspace's file tree. |
| Learned | An agent, after a substantial job | Created by the opt-in reflection loop; created_by = 'agent' in the DB. |
System skills
The system skills ship in @nodal-agents/catalog and are upserted into every
install at boot: 27 skills (packages/catalog/src/index.ts). Each carries a
kind field that decides where it's injected and whether you manage it:
| Kind | Count | In your library? | Skills |
|---|---|---|---|
| capability | 15 | Yes, you assign it | citation-discipline, claude-html-design, code-review, code-task, command-execution, dev, document-editing, obsidian, office-editing, presentation-editing, request-review, research-scope-discipline, results-delivery, spreadsheet-editing, task-planning |
| baseline | 4 | No, auto-injected | language-mirror, safe-tool-use, verify-before-done, workspace-hygiene. Part of every agent's base prompt by default. |
| agent-internal | 8 | No, hidden | markdown-output, telegram-responder, tool-attach-connector, tool-attach-mcp, tool-create-agent, tool-create-mcp, tool-schedules, tool-update-agent. Guides loaded on demand via skill_view. |
Only capability skills show up in the dashboard's Skills library for you to assign. The other two kinds are managed by the runner: they're either always on, or loaded silently on demand.
A messaging channel injects no skill. What an agent needs to know about the channel it replies on is one line of its job context, built from the channel's adapter: the tool that reaches the user, which formatting marks render there, and that a long text is split automatically.
See the Skills reference for the full content of each system skill.
Community skills
Install any project that publishes a SKILL.md (the open Agent Skills format)
from the Skills → Community tab in the dashboard. You paste a GitHub URL,
an owner/repo shorthand, or a skills.sh path. The runner fetches and extracts
the repository, locates the SKILL.md, validates its frontmatter, and writes
the skill into the database with is_community = true and the source URL
recorded. The bundle itself lands under this workspace's own file tree
(~/.nodalai/workspaces/<workspace-id>/skills/<slug>/), so two workspaces
installing the same slug never collide on disk.
If the skill bundle includes script files (.py, .sh, .js, .mjs, or
.cjs), the install flow flags them, but a bundled script does not run on its
own. The workspace owner must first turn on Allow scripts for that agent
and skill pair in Skills settings. Once enabled, the agent can run the script
with the run_skill_script tool
(packages/tools/src/builtin/run-skill-script.ts), which still requires
per-run approval unless an auto-approve rule exists for the agent.
Community skills automatically receive skill_file_read and skill_file_list
so the agent can inspect the skill's own bundled files.
The learning loop
When the reflection loop is enabled (opt-in per entity in the dashboard), the
runner runs a Tier-1 reflection pass after any qualifying completed job — one
that used at least 10 tool calls and did not come from a chat or reflection
channel. The reflection agent reads the transcript and either creates a new
skill or patches an existing one. These learned skills carry created_by = 'agent' and are visible on the dashboard's Learned Skills page, which is
also where you switch reflection on or off.
A weekly curator pass (Tier-2) consolidates and prunes learned skills across the entity.
Assigning skills
Assign a skill to an agent from the agent's Skills tab in the dashboard. The change takes effect on the next job — no restart required.