Skill Format
Purpose
Section titled “Purpose”Skills are reusable procedural capabilities that a runtime adapter loads or that a human can read directly. Ultimate Harness owns the format of a skill so that adapters, mission packets, and reviewers can rely on a common shape regardless of which runtime executes the work.
This document defines the on-disk layout of a single skill, the YAML frontmatter
that identifies it, the supporting references/, templates/, and scripts/
conventions, and the selection model the harness uses to decide which skills are
applied to a mission.
Skill directory layout
Section titled “Skill directory layout”A skill is a directory that contains, at minimum, a SKILL.md file. Optional
sibling directories carry supporting material:
<skill-dir>/ SKILL.md # required: frontmatter + body references/ # optional: docs, links, snippets the skill body cites templates/ # optional: parameterized files the skill produces or seeds scripts/ # optional: executable helpers invoked by the skill bodyRules:
SKILL.mdmust be a regular file (no symlinks). The harness refuses to register a skill whoseSKILL.mdis a symlink or whose containing directory is a symlink.references/,templates/, andscripts/are reserved names. When present they must be regular directories.- The skill directory must live inside the project root. The harness refuses out-of-root paths.
- Scripts under
scripts/should be self-contained and runnable from the skill directory; they should not assume a checkout layout outside the skill. - Templates under
templates/should be inert by default; the skill body describes how to materialize them. - References under
references/are read-only and link-friendly: prefer relative links to other repo files over absolute URLs that may rot.
SKILL.md frontmatter
Section titled “SKILL.md frontmatter”SKILL.md begins with a YAML frontmatter block delimited by ---, followed by a
Markdown body. The frontmatter is the contract; the body is the human-readable
procedure.
---id: code-reviewname: Code Reviewdescription: Review a diff for correctness, regression risk, and style alignment.triggers: - "review my code" - "look at this diff"prerequisites: - lintingrelated: - test-authoring---
# Code Review
1. Skim the diff for unrelated changes.2. ...Field rules
Section titled “Field rules”| Field | Type | Required | Notes |
|---|---|---|---|
id |
string | yes | Stable slug. Matches ^[a-zA-Z0-9][a-zA-Z0-9._-]*$. Used as the index key. |
name |
string | yes | Human-readable name shown in CLI listings. |
description |
string | yes | One-sentence summary of what the skill does and when to use it. |
triggers |
string[] | no | Verbatim phrases or short patterns that suggest the skill is relevant. |
prerequisites |
string[] | no | Skill ids or capabilities required before this skill can be applied. |
related |
string[] | no | Skill ids that pair with this one or are reasonable substitutes. |
Additional rules:
- No unknown frontmatter keys are allowed. The frontmatter schema is strict so that
drift or typos surface at
uh skill addrather than silently disappearing. idis the only field used to look up a skill from the index. Two skills with the sameidmay not coexist.triggers,prerequisites, andrelatedare optional arrays of strings. Empty arrays are equivalent to omitting the field; the index normalizes both to an empty list.- The frontmatter delimiter must be
---on its own line at the very start of the file; the closing---must also be on its own line.
.harness/skills/index.yaml
Section titled “.harness/skills/index.yaml”The skills index is the durable list of skills the harness knows about for a
project. It uses schema_version: uh.skills-index.v0 and is created empty by
uh init. Each entry records the indexed projection of the SKILL.md frontmatter
plus the relative path to the skill directory:
schema_version: uh.skills-index.v0skills: - id: code-review name: Code Review description: Review a diff for correctness, regression risk, and style alignment. path: skills/code-review triggers: - "review my code" - "look at this diff" prerequisites: - linting related: - test-authoringNotes:
pathis relative to the project root and points at the directory containingSKILL.md. It is not a path toSKILL.mditself.- The index is rewritten as a whole on every
uh skill add. The schema is validated before and after the write. - Older entries that predate UH-6 (with only
nameand friends) remain valid for backward compatibility; new entries always carry the full UH-6 shape.
Lifecycle commands
Section titled “Lifecycle commands”uh skill add <dir> registers a skill:
- Validates that the project is initialized.
- Resolves
<dir>against the project root and refuses out-of-root paths. - Refuses symlinked skill directories,
SKILL.mdfiles, and index files. - Parses the SKILL.md frontmatter and validates it strictly.
- Refuses duplicates by
id. - Appends the new entry to
.harness/skills/index.yamland revalidates.
uh skill list reads .harness/skills/index.yaml and prints registered skills.
uh skill check <id> re-validates an indexed skill against its on-disk SKILL.md:
- Re-reads the SKILL.md at the indexed
path. - Re-parses and re-validates the frontmatter.
- Compares every recorded field (
name,description,triggers,prerequisites,related) against the index entry. - Returns
okonly when every field matches and theidstill equals the queried id. Any drift, missing file, or symlinked path produces a structured error rather than a silent pass.
Selection model
Section titled “Selection model”The harness does not auto-apply skills at runtime. Selection happens explicitly at mission compile time, with three roles:
- Required skills — listed under
skills.requiredin a mission packet. The runtime adapter must load and apply them. A mission packet with required skills that are not in.harness/skills/index.yamlis a mission authoring bug;uh proposeanduh mission createsurface this so that the runtime never silently drops requirements. - Suggested skills — listed under
skills.suggested. The runtime adapter should make them available; whether they are activated is up to the runtime’s selection policy. - Triggered skills — the
triggersfield exists so a runtime that supports natural-language activation can offer the skill when the user’s request matches a trigger phrase. The harness itself does not perform trigger matching; it only persists the phrases so adapters and humans can use them.
Prerequisites (prerequisites) and relationships (related) are advisory
metadata for humans and review-time tooling. The MVP harness does not enforce
prerequisite ordering at execution time; verification gates and mission packets
remain the source of truth for what must run before what.
Non-goals (MVP)
Section titled “Non-goals (MVP)”- No runtime-specific skill packaging (Codex prompt patches, Claude Code toolsets, etc.). Adapters translate the canonical skill into their native shape when they consume a mission packet.
- No automated dependency resolution. The harness records
prerequisitesandrelatedbut does not topologically apply them. - No skill versioning beyond
id. If a skill’s contract changes, the change is recorded by editing the SKILL.md and re-runninguh skill checkto confirm the index is back in sync. - No live trigger matching inside the harness CLI; that is a runtime adapter concern.