Core identity model
SourceUuidis the stable source identity. Builtins use00000000-0000-4b11-8111-000000000001; conventional project-local.rkat/skillsuses00000000-0000-4b11-8111-000000000002.SkillNameis a lowercase dash-separated slug ([a-z0-9-], no leading/trailing dash, no--).SkillKey { source_uuid, skill_name }is the canonical skill identity across runtime, RPC, REST, SDK, CLI, and tool surfaces.SkillRefis the wire wrapper for per-turn refs. It currently has one tagged form:
preload_skills carries plain SkillKey objects; skill_refs carries tagged SkillRef objects. Legacy string refs are rejected.
Source Identity
Each source has aSourceIdentityRecord:
source_uuiddisplay_nametransport_kind:embedded,filesystem,git,http, orstdiofingerprintstatus:active,disabled, orretired
SkillKeyRemap entries where the event needs per-skill coverage.
Shadowing is keyed by the full SkillKey, not by skill_name alone. Two sources can both contain email-extractor; they are distinct skills unless their source_uuid is also the same.
Source Transports
Frontmatter parsing
SKILL.md frontmatter is one YAML 1.2 document between --- markers, parsed
by a pure-Rust parser since 0.9.4.
- Fields:
nameanddescription(required),requires_capabilities,metadata(text values) andversion(stored asmetadata.version). Any other key must be a namespaced extension key (vendor.key); a mapping or sequence value needs avendor.versionkey beside it. yes,onandoffstay strings;<<is an ordinary key, never a merge; a second document is refused.- Refused since 0.9.4, accepted by 0.9.3 and earlier: a key given twice at any
level, a null (
~or an empty value) asdescriptionor ametadatavalue, an unrecognized tag (!custom), a...document end marker line, nesting deeper than 64 levels, and 100 or more aliases that outnumber their anchors more than ten to one. An alias expansion bomb is refused as before. - A block scalar (
|,|+,>) that ends the frontmatter keeps its final line break. SkillDocument.extensionsvalues are text projected from the YAML data: a string as written, any other value as YAML rendered from its resolved value (1.10is1.1,1_000is1000,0x1Fis31,~isnull, a mapping or sequence is block YAML). Quote values whose text matters, such as a file mode: unquoted,0755is755.0.
Companion Skill Convention
Meerkat-owned nontrivial agent-facing tool families use embedded companion skills as their operating manuals. A companion skill is a normal skill:- source: embedded builtin source
- identity: normal
SkillKey { source_uuid, skill_name } - gating:
requires_capabilities - activation:
preload_skills,skill_refs, or an explicitly policy-enabledload_skilltool
Activation paths
- Preload at session creation:
preload_skills: SkillKey[]; content is resolved into the system prompt before the first turn. - First-turn or per-turn injection:
skill_refs: SkillRef[]; content is injected for that turn. - CLI preload convenience:
rkat run --skill <skill-name>materializes a builtin-source key from a bare slug. It does not currently address a local filesystem source discovered from a path.
Discovery tools
Agent-facing discovery tools use typed key fields:
These five tools are default-disabled in
SkillToolSet. A custom
BuiltinToolConfig must explicitly enable them. Current factory-built CLI,
REST, and JSON-RPC sessions do not do so, and a later ToolScope allow-list
cannot make an uncomposed tool callable.
Rendering
Flat inventory renders full key IDs:source_uuid and currently instructs the agent to
use browse_skills and load_skill. Those names are usable only when the
embedding explicitly enables the tool implementations; otherwise use public
introspection and typed activation. The default injection limit is 32 KiB and
is configurable. Injection blocks render the same two typed attributes:
Public Introspection
Current public introspection surfaces:
List responses include
key, source, is_active, and optional shadowed_by provenance.
Inspect responses include the same typed identity and provenance plus body.
