SKILL.md document with YAML frontmatter, addressed at runtime by SkillKey { source_uuid, skill_name }, and included in the system prompt or per-turn context when its required capabilities are available.
This page is the task-first guide. For the low-level runtime vocabulary and identity model, see Skills reference.
What this guide is for
Use this guide when you want to:- create or configure skill sources
- preload or inject skills into sessions
- understand
SkillKeyidentity and source provenance - understand when to use
preload_skillsvsskill_refs
Skill sources
Skills are discovered from multiple source transports:- Embedded builtin skills from component crates
- Project context root (
<context-root>/.rkat/skills/) when a context root is active - Configured filesystem sources
- Git repositories cloned to local cache and refreshed on TTL
- HTTP endpoints fetched from remote skill servers
- Stdio sources
The canonical identity is the pair of
source_uuid and skill_name. Two sources can both provide task-workflow without colliding because their source UUIDs differ. First-source-wins shadowing applies only when the same full SkillKey appears more than once.Git sources
Configured in skills settings (typically in realmconfig.toml). Uses the system git executable:
${ENV_VAR} references or ~ in these fields. Keep
realm configuration access restricted, or materialize secrets and absolute
paths before starting Meerkat.
HTTP sources
Filesystem and stdio sources
SKILL.md format
Each skill is a markdown file with YAML frontmatter:Frontmatter fields
The frontmatter is delimited by
--- markers. The body (everything after the closing ---) is stored as the skill’s body field.
Capability gating
Skills are filtered by theirrequires_capabilities field before being shown or injected:
- A skill is included only if all its required capabilities are available in the current build/config.
- A skill with an empty
requires_capabilitieslist is always available.
Capability companion skills
Companion skills are the standard agent instruction-manual pattern for nontrivial Meerkat-owned tool families. They are:- embedded in the crate or tool family that owns the capability
- gated with
requires_capabilities - discoverable through the normal skills inventory
- loadable through typed activation, and with
load_skillwhen that default-disabled tool is explicitly policy-enabled - not automatically preloaded
Skill identity and resolution
Every runtime skill reference resolves to:skill_refs.
rkat run --skill still accepts a bare embedded-builtin skill slug as a
convenience, but API and tool surfaces should use structured keys.
Rendering
The renderer produces two output formats:- Inventory section
- Injection block
Generates an Identity is emitted as the two typed attributes that map 1:1 to the This section is injected into the system prompt via the
<available_skills> XML block listing all available skills for the system prompt:load_skill tool contract — never a single re-parseable slash id.When there are more than 12 skills, collection mode is used instead:extra_sections parameter of assemble_system_prompt() in meerkat/src/prompt_assembly.rs.Size limits
The default injection limit is 32 KiB (32 * 1024 bytes), configurable throughskills.max_injection_bytes. If an injection block exceeds the active limit,
it is truncated with a warning log.
Built-in skills
The following skills are embedded in component crates:Configuration reference
Custom skills
- Project-level
Create a subdirectory under Example
.rkat/skills/ with a SKILL.md file:.rkat/skills/my-deployment/SKILL.md:Discovery tools
When skills are active and general builtins are enabled, the runtime registers these implementations withCompositeDispatcher:
All five implementations have
default_enabled: false. A custom embedding must
explicitly enable the desired names through BuiltinToolConfig. Current
factory-built CLI, REST, and JSON-RPC sessions do not add that policy enable, so
they do not advertise these tools even though skill inventory, preload, and
typed skill_refs remain available. An allow-list applied later through
ToolScope cannot compose a policy-disabled implementation.
Collection-mode prompt rendering (more than 12 skills) still mentions
browse_skills and load_skill; on a normal factory-built session, use public
skill introspection plus typed preload or skill_refs instead.
Invoking skills
Skills can be activated in three ways:1. CLI preload convenience
The CLI--skill option accepts bare embedded-builtin skill slugs and
materializes builtin-source SkillKey values for preload:
2. Programmatic typed skill_refs (per-turn, recommended)
Pass tagged skill_refs in API requests to resolve and inject skills for a specific turn:
skill_references strings are retired and rejected; use structured skill_refs.
3. Preloading at session creation
Passpreload_skills to inject skills into the system prompt at session creation:
--skill is a builtin-slug preload convenience; it is not the same surface as typed per-turn skill_refs.
Skill introspection
Skill introspection lets you see all skills — including shadowed ones — with their provenance information. This is useful for debugging skill resolution, understanding which source provides which skills, and inspecting shadowed skills before overriding them.Surfaces
Shadowing
When multiple sources provide the same fullSkillKey, the first source in the runtime composite wins. Introspection shows both the active skill and the shadowed entries. The common case is that matching skill_name values from different sources remain separate active skills because their source_uuid values differ:
SkillKey (skill_name plus source_uuid) when inspecting or loading a specific source.
Rust SDK
Configuration
Skills are configured through the realm’sSkillsConfig. Realm configuration
composition is the single authority; the skills resolver consumes the resulting
repository list with the realm’s explicit convention roots.
