Skip to content
NIKI
Esc
navigateopen⌘Jpreview
On this page

skills

Distill Approved runs into versioned project skills with explicit promotion and retirement.

niki skills

Project skills are versioned workflows distilled from successful runs — plan shapes, test commands, and review notes that worked. Distillation is always two-step: an Approved run with a green executed suite stages a candidate, and a human promotes it. Nothing auto-activates.

# Staged candidates awaiting review
niki skills candidates --project /path/to/repo

# Promote a candidate into a versioned skill
niki skills promote <candidate-id> --project /path/to/repo

# List promoted skills (active only)
niki skills list --project /path/to/repo

# Show a skill's SKILL.md body
niki skills show <name> --project /path/to/repo

# Diff a candidate against the promoted skill of the same shape
niki skills diff <candidate-id> --project /path/to/repo

# Retire a skill (reason is preserved in the lock)
niki skills retire <name> --reason "superseded by better evidence" --project /path/to/repo

Layout

Skills live under the configured output_dir (default .niki/), which stays git-ignored:

<output_dir>/skills/<name>/SKILL.md        the workflow (format v1 below)
<output_dir>/skills/<name>/metadata.json   name, version, source runs, snapshot
<output_dir>/skills-staging/<id>/          candidates awaiting promotion
<output_dir>/skills-lock.json              name → version → content hash → runs

Re-promoting the same task shape supersedes: the version bumps and the previous metadata is kept in metadata.json:history. Retiring removes the skill directory but keeps the reason in the lock. A skill whose source snapshot no longer matches HEAD is listed with a [stale] flag — it is never silently served as fresh.

Promoted skills are served by the skill_list / skill_load tools alongside the shared ~/.agents/skills/ layer (project wins on name collision).

SKILL.md format (v1)

Every promoted skill body has three sections plus a provenance quote:

# Skill: <name>

> Distilled from niki run `<task>` (verdict: Approved, model: <model>).
> Promoted skills are versioned workflows, not facts: verify paths and
> commands against the current tree before following them.

## When to use

Tasks shaped like: <task description>

## What worked

- Plan shape: <spec summary + file count>
- Test command: `<command>` (was green at distillation time)
- Review notes: <reviewer excerpt>

## Freshness

- Source snapshot: `<commit-sha>` (flag stale when HEAD differs).

Was this page helpful?