Two related simplification-audit findings, bundled because they edit some of the same skill-audit files and splitting would fragment single-file diffs. Finding 10: delete 48 per-skill/reference README.md files (they restated SKILL.md in narrative form and no agent ever loads them) plus 2 scaffold templates. Drop the README criterion from skill-audit's file-structure.md and finding-criteria.md, and the README-generation step from skill-author's new-skill.sh; update new-skill.bats to match. Plugin-root READMEs are kept intentionally, out of scope. Finding 12: strip historical ADR-0020/ADR-0023 citations and changelog-style narration from model-facing skill content across kyberforge and git plugin skills. Delete skill-author's one-time retrofit.md migration guide and its references. Some ADR-0023 tags were not narration but check-rtk-prefix's required opt-out marker for intentionally-bare git commands -- those were restored, not stripped. Mirror re-synced and full pre-commit/pre-push suite verified green. Refs: SIMPLIFICATION-AUDIT.md findings 10, 12 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YR2CjVumUbEGWcMikcoXBD
88 lines
4.3 KiB
Markdown
88 lines
4.3 KiB
Markdown
---
|
|
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 `README.md`.
|
|
|
|
## 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
|
|
|
|
```yaml
|
|
# 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/finding-criteria.md`,
|
|
which Step 3 loads on every run.
|