Files
holocron/plugins/kyberforge/.apm/skills/factory-audit/references/skill-description-quality.md
Defame1297 1ec3e8a1ea docs(skills): stop routing content at the README this branch deleted
skill-author still told authors to move description overflow "to the
body or to README.md" while this branch deleted every per-skill
README.md, every references/README.md and the README scaffold template.
factory-audit's skill-file-structure.md bans non-spec files at the
skill root, and the line that used to carve README out of that rule
went with them. So skill-author created the file, factory-audit failed
it, and nothing read it. 8ce5392 fixed the two scripts and missed the
reference prose.

The two contract.md files now differ deliberately: a skill's overflow
goes to the body or a references/ file, an agent's to the body alone,
because an agent is a single file with no references/ directory to
disclose to. agent-description-quality.md's "the plugin's README.md" is
left alone, plugin READMEs being the ones that survive.

Deleting retrofit.md also dropped three instructions baa2f5d did not
restore with the cut list, two of which retrofit.md itself recorded as
having no validator behind them: re-cite sources.md's Contributing
files after content moves, since validate-provenance exits 0 on exactly
that drift, and re-check a relocated gate's reachability, since a
Gotcha moved into one flow's file is invisible to the others and the
word counts improve either way. The third is that boundary clauses are
plural — contract.md read as a cap where git-remotes carries four.

Also: contract.md named an unqualified scripts/validate.sh that does
not exist in skill-author, which skill-file-structure.md calls a hard
error; and agent-body-and-delegation.md's simile pointed at a stale
README row as the characteristic skill defect, a defect class that can
no longer occur, replaced with a SKILL.md naming a references/ file
that is not there.

skill-author 1.0.4, agent-author 1.0.3, factory-audit 1.0.2.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NwD8Egs5r4ndqeFLmhusX2
2026-09-20 12:34:42 +00:00

4.3 KiB

source_keys
source_keys
agentskills-spec
agentskills-optimizing-descriptions

Description Quality Reference

Upstream source: agentskills.io — optimizing-descriptions, specification. House contract: the context budget. The house contract is narrower than the spec rather than a reinterpretation of it: where both speak, both must be satisfied.

Why the description is the expensive part

At startup an agent loads only the name and description of every installed skill. The body is never seen until the skill triggers. The description therefore carries the entire triggering burden and is paid for in every session, whether the skill fires or not.

A second cost is less obvious and is a correctness hazard rather than a token cost: a description that summarises the workflow is a shortcut the agent takes instead of reading the body. A measured failure upstream — a description saying "code review between tasks" — produced one review where the body's flowchart specified two.

Step 0 — establish which contract applies

Read the frontmatter before judging a single word.

  • disable-model-invocation: true — the skill is hand-invoked. Its description is never matched against user intent, so it is not a routing string. It carries one plain human-facing sentence stating what the skill does. Audit it for that and nothing else. Reporting a missing trigger clause, a missing boundary clause or absent indirect triggers on a hand-invoked skill is a wrong finding, not a strict one.
  • No such flag — the skill is model-invoked and the rest of this file applies.

The three-part shape

A model-invoked description carries exactly three things:

  1. Trigger clause. When to invoke, phrased imperatively: Use when .... Not This skill ... — the agent is deciding whether to act, not reading a catalogue entry.
  2. At most one capability clause. What it does, in one clause. Never an enumeration.
  3. Boundary clause. Compressed form: Not <thing> -> <skill-name>. The target must resolve to a real skill directory or agent file in the authoring source. validate.sh checks that deterministically and grades it by notation: an unresolved /name or arrow target is an ERROR and reaches the report as a Structure FAIL, while an unresolved prose-form target ("use y instead") is only a SUGGESTION unless a second target in the same sentence resolves. Take the script's tier as given and report it once, under Structure.

Everything else belongs in the body or in a references/ file.

Indirect triggers — conditional, never blanket

Add "even if the user doesn't say X" only where the user's natural phrasing genuinely omits the domain word. True for the gitea-* family: people say "create an issue", not "create a Gitea issue". False for git-commits: nobody asks for a commit without saying commit. A blanket indirect-trigger clause on a skill whose domain word is unavoidable is padding charged to every session.

Near-miss exclusions

Add a boundary clause only where a sibling skill could plausibly steal the activation. Use strong near-misses — queries that share keywords but need something different — not weak ones ("write a fibonacci function"). One boundary clause per genuine near-miss; a list of four is enumeration wearing a boundary's clothes.

Before / after

# FAIL — enumeration first, mechanics as the opener, a blanket indirect trigger,
# and 300+ characters of it preloaded into every session forever.
description: >
  Analyze CSV and tabular data files — compute summary statistics, add derived
  columns, generate charts, and clean messy data. Use when the user has a CSV,
  TSV, or Excel file and wants to explore, transform, or visualize the data,
  even if they don't explicitly mention "CSV" or "analysis."

# PASS — trigger, one capability clause, boundary. The four verbs the FAIL
# version enumerates are the body's job; the router cannot act on them.
description: >
  Use when the user has a CSV, TSV, or Excel file and wants it explored,
  transformed, or charted. Not schema design -> data-model.

(data-model is illustrative. In a real description the target has to resolve.)

The FAIL and SUGGESTION criteria for this dimension live in references/skill-finding-criteria.md, which Step 3 loads on every run.