Skip to main content
Skills are markdown files that teach spaceduck new behaviors. Each skill is a SKILL.md file with YAML frontmatter (metadata) and a markdown body (instructions for the LLM). Skills are loaded at runtime without restarting the gateway.

How it works

When the gateway starts, it reads all SKILL.md files from configured paths, parses each one, runs the security scanner, and registers those that pass. Skills that fail the scan are rejected with a log entry explaining why.

SKILL.md format

A skill file has two parts: YAML frontmatter and a markdown body.
SKILL.md
---
name: daily-summary
description: Summarize the day's conversations and store key takeaways.
toolAllow: [web_search]
maxTokens: 10000
maxCostUsd: 0.05
---

# Daily Summary

You are reviewing today's conversations to extract durable insights.

1. Identify facts, preferences, and decisions.
2. Ignore small talk and transient questions.
3. Write a concise one-sentence summary for each takeaway.

Required fields

FieldTypeDescription
namestringUnique identifier for the skill (lowercase, hyphenated)
descriptionstringWhat the skill does and when to use it

Optional fields (spaceduck extensions)

FieldTypeDescription
versionstringSemantic version
authorstringSkill author
toolAllowstring[]Only these tools are available to the skill
toolDenystring[]These tools are blocked for the skill
maxTokensnumberToken budget per run
maxCostUsdnumberDollar ceiling per run
maxWallClockMsnumberWall-clock timeout
maxToolCallsnumberMax tool invocations
maxMemoryWritesnumberMax memory writes per run

OpenClaw compatibility

spaceduck parses OpenClaw’s SKILL.md format natively. Unknown frontmatter fields (like tools, model, or provider) are silently preserved, never rejected. This means existing OpenClaw skills work out of the box.

Security scanner

Every skill is scanned before it enters the registry. The scanner checks four categories:
CategorySeverityExamples
Injection patternsCritical[INST], <system>, role injection
Prompt overridesCritical”ignore your system prompt”, “you are no longer…”
Dangerous tool refsCritical / Warningexec(), rm -rf, `curlbash`
Budget evasionWarning”retry indefinitely”, “ignore the budget limit”
Skills with critical findings are rejected. Skills with only warning findings are loaded but flagged in logs.
Dangerous tool references are downgraded from critical to warning when the skill declares an explicit toolAllow list, because tool scoping prevents the referenced tools from being available at runtime.
The scanner is static pattern matching only. It catches obvious attacks but not semantic ones (e.g. “read the file at ~/.ssh/id_rsa”). Tool scoping is the real enforcement layer. See Security for the full defense-in-depth model.

Tool scoping

Skills declare which tools they need via toolAllow. When a task runs with a skill, the agent loop only sees the tools that both the skill and the task permit. The merge logic is:
  • Allow lists: intersection (skill declares what it needs, task can further restrict)
  • Deny lists: union (both contribute)
A skill that declares toolAllow: [web_search] can never access the browser, file system, or shell, regardless of what its instructions say.

Memory attribution

When a skill writes to memory (via the memory_update result route), the memory record includes both taskId and skillId in its provenance. This enables:
  • Filtering memories by skill during recall
  • Cascading purge on skill uninstall (all memories written by the skill are deleted)
  • Auditing which skill produced which memories

First-party skills

spaceduck ships with three built-in skills in the skills/ directory:
SkillTypeWhat it does
daily-summaryScheduledSummarizes the day’s conversations, stores key takeaways
inbox-triageEvent-drivenCategorizes incoming messages by urgency
memory-hygieneScheduledFinds contradictory, stale, or duplicate memories
Each has a conservative budget and an empty toolAllow (no tool access).

Configuration

Skill settings live in spaceduck.config.json5 under the skills key. All settings hot-apply.
SettingDefaultDescription
paths["./skills"]Directories to scan for SKILL.md files
enabled[]Skill IDs to enable (empty = all loaded skills enabled)
autoScantrueRun the security scanner on load
Setting autoScan: false disables the security scanner entirely. Only do this in development.