Data Model: Agent Skills Pack

Feature: 055-agent-skills-pack Date: 2026-03-21

Entities

CanonicalSkill

Represents a skill authored in the doctrine layer.

FieldTypeDescription
namestrSkill identifier (e.g., spec-kitty-setup-doctor)
skill_dirPathDirectory containing SKILL.md and siblings
skill_mdPathPath to SKILL.md
referenceslist[Path]Paths to files in references/ subdirectory
scriptslist[Path]Paths to files in scripts/ subdirectory
assetslist[Path]Paths to files in assets/ subdirectory
all_fileslist[Path]All installable files (SKILL.md + references + scripts + assets)

Source location: src/doctrine/skills/<name>/

Discovery: Registry scans src/doctrine/skills/ (local dev) or package doctrine/skills/ (installed) for directories containing SKILL.md.

ManagedFileEntry

One entry per installed file in the manifest.

FieldTypeDescription
skill_namestrOriginating skill name
source_filestrRelative path within skill directory (e.g., SKILL.md, references/matrix.md)
installed_pathstrRelative path from project root where file was installed
installation_classstrOne of: shared-root-capable, native-root-required, wrapper-only
agent_keystrAgent identifier (e.g., claude, codex)
content_hashstrsha256:<hex> hash of installed content
installed_atstrISO 8601 timestamp

ManagedSkillManifest

Top-level manifest persisted as .kittify/skills-manifest.json.

FieldTypeDescription
versionintSchema version (starts at 1)
created_atstrISO 8601 timestamp of first creation
updated_atstrISO 8601 timestamp of last modification
spec_kitty_versionstrVersion of spec-kitty that wrote the manifest
entrieslist[ManagedFileEntry]All tracked installed files

InstallationClass (enum)

ValueBehavior
shared-root-capableInstall to .agents/skills/ (shared root)
native-root-requiredInstall to vendor-specific skill root (e.g., .claude/skills/)
wrapper-onlyNo skill installation; wrappers only

VerifyResult

Result of checking installed skills against the manifest.

FieldTypeDescription
okboolTrue if all checks pass
missinglist[ManagedFileEntry]Files in manifest but not on disk
driftedlist[tuple[ManagedFileEntry, str]]Files with changed hash (entry, actual_hash)
unmanagedlist[str]Files in skill roots not tracked by manifest
errorslist[str]Error messages

Relationships

CanonicalSkill (1) ──installs──> (N) ManagedFileEntry
ManagedSkillManifest (1) ──contains──> (N) ManagedFileEntry
Agent (1) ──has──> (1) InstallationClass
Agent (1) ──receives──> (N) ManagedFileEntry

State Transitions

Manifest Lifecycle

[no manifest] ──init──> [populated manifest]
[populated manifest] ──verify──> [ok | drift detected]
[drift detected] ──sync/repair──> [populated manifest] (restored)
[populated manifest] ──upgrade──> [updated manifest] (new skills/versions)