Skill Authoring
A skill competes for selection in a context window shared with every other
installed tool. There are two ways to win: describe your territory precisely,
or shout. Shouting works once — then every neighbor escalates, emphasis stops
carrying information, and selection quality degrades for the whole toolkit.
This doctrine is the first way, made enforceable.
This is a rigid skill: the description contract, register rules, and
shipping requirement are bright lines, each with a mechanical check.
The description contract
The frontmatter description is a trigger surface. It has one job: let a
model holding only descriptions rank this skill correctly against its
neighbors — high when the task is the skill's, low when it is not.
- Open with a verb-led capability sentence. What the skill does and
produces, before any trigger list.
- Quote the triggers users actually type. Concrete phrasings ("wrap up",
"which tool should handle this"), task shapes, and situations — not
abstract categories. Paraphrase variety beats repetition.
- Draw the boundary, then name the owner. Every description ends with
negative space: "Not for X — that is Y." Naming the sibling does two jobs:
it stops the skill from poaching, and it routes the reader to the right
place.
- No obedience language. Descriptions never instruct the model to use
them, never inflate stakes, never claim priority over neighbors. A
description that needs to demand attention is compensating for triggers
that fail to earn it.
A plain-scalar description must not contain : (colon + space): YAML reads
it as a nested mapping, the frontmatter silently breaks, and the skill never
loads — caught only by validate_plugins, not by anything as you write. Quote
the whole scalar, use a > folded block, or replace the : with an em-dash.
(evaluate-skill sees the same trap as an instant, total recall collapse.)
Selection and execution are different layers
The description decides when the skill loads. The body instructs how the
work proceeds once loaded. Keep the registers separate:
- A bright line in a body is content, stated plainly: "production code is
written only against a test you have watched fail." Firm, testable, neutral.
- Identity pressure is not content: "you are rationalizing", "you do not have
a choice", all-caps banners. These bully the reader's judgment instead of
informing it, and they read as noise to anyone auditing the skill.
- Catalogs of known failure modes and rationalizations are valuable — keep
them as descriptive tables ("common shortcuts and what they miss"), so a
reader recognizes the pattern without being accused of it.
- A step whose executor is not the reader says so. "Write each reviewer's
output to disk as it lands" reads as something the operator does by hand; a
reader building an automated panel implements the surrounding structure and
drops the step, and the persisted evidence it existed to keep is gone. Name
the executor where it is not obviously the reader.
Rigid or flexible — declare it
Every skill states which it is, near the top of the body:
- Rigid: bright-line constraints plus the verification step that proves
compliance. For disciplines whose dominant failure mode is self-granted
exceptions (TDD, verification before completion).
- Flexible: principles with judgment explicitly delegated — the skill says
what to optimize for and trusts the reader to adapt.
The choice is part of the design, not the prose: a rigid skill with soft
constraints fails differently from a flexible skill with hard constraints,
and both fail.
Register rules
The deny-list: imperative-obedience phrases, importance banners, and runs of
three or more consecutive all-caps words outside code — the patterns that buy
salience instead of fit. Emphasis budget inside a body: bold the one
load-bearing sentence of a section, sparingly. If a constraint feels like it
needs caps to hold, it needs a verification step or a gate instead — move the
enforcement to mechanism. Enforce what you can mechanically: craft-collection
wires a register linter (scripts/lint_register.py) into pre-commit, but it
catches only the detectable subset — importance banners, all-caps runs, and a
fixed list of obedience/priority phrases. Obedience framing that dodges those
literal patterns is not caught, so review holds the rest. A standalone install
applies the whole deny-list by review until it wires its own gate.
Shipping requirement
A skill ships when all of these exist, not before:
- Trigger dataset — balanced positives and negatives; the negatives
include near-misses that sit in named siblings' territory.
- Sealed holdout, with a birth baseline — authored at the same sitting as
the dev set, never consulted while tuning the description, and run once at
seal time with the result recorded next to the seal. A holdout that
informed tuning is dev data, not a holdout; a holdout that has never been
run is false confidence (one sat four days hiding a dev-0.95/holdout-0.33
overfit).
- Correct-usage rubric (rigid skills) — tasks plus checks that the output
actually followed the discipline, deterministic where possible.
- Gates pass — recall, specificity, and correct-usage thresholds, run by
a behavioral eval harness when one is available (craft-collection ships
one: datasets under
evals/trigger/, thresholds in evals/config.json,
run mechanics owned by session-workflow's evaluate-skill). Standalone
installs keep requirements 1–3 and 5 as authored artifacts and run them with
whatever harness they have — the discipline is the contract, the harness
is one implementation.
- A registered threshold states what the design can detect — the maximum
movement attainable at the planned repeat count, and its p, computed before
the run. Without it a failed edit and a design incapable of succeeding leave
the same record. Cannot reach the bar: raise repeats, or do not register it.
Two skill classes cannot be gated at trigger time at all, and one worked example
of a threshold that could not move:
references/shipping-gate.md, which also carries
the measured record behind the register rules.
References between tools
Skills reference other tools without depending on them. Four rules and a test:
- Same-plugin references are free — the plugin installs as a unit, so a
sibling skill in the same plugin is guaranteed present. A different plugin
is not, even one in the same marketplace: plugins install individually
(
/plugin install humblepowers@craft-collection), so a sibling plugin
under the same marketplace is a cross-tool reference and rule 2 applies —
role-generic, with a working fallback.
- Cross-tool references are role-generic with a named example and a
working fallback: "when a capacity-dispatch policy is installed
(e.g. humblepowers' choosing-models), its tier rule wins — otherwise
this heuristic." Name the role, give the example, work alone.
- Artifacts never carry tool dependencies. A plan or spec that embeds
"REQUIRED SUB-SKILL: " locks the artifact to a toolchain; state the
execution contract in the artifact itself instead.
- Bindings over assumptions — when integration genuinely needs wiring,
the user supplies it (a bindings table, a config entry); tools never hunt
the environment for each other.
The degradation test: uninstall every other tool — the skill still produces a
correct, if less optimized, result.
Authoring checklist
1---2name: skill-authoring3description: Author and revise Claude Code skills with calibrated trigger descriptions and eval-gated quality — the description is a trigger surface that competes on fit, not an advertisement that competes on volume. Use when creating a new skill, when an existing skill over- or under-triggers and the description needs rework, when adding negative space ("not for X — that is Y") or example trigger phrasings, when deciding whether a skill body is rigid (bright-line constraints) or flexible (judgment-delegating guidance), or when porting a skill from an imperative register to a neutral one. Covers the calibration doctrine — dense concrete triggers, explicit non-triggers naming the owning sibling, plain-declarative bright lines, descriptive failure-mode catalogs without identity pressure, and the shipping requirement of a trigger dataset with sealed holdout plus a correct-usage rubric for rigid skills. The register linter mechanically enforces the detectable subset of the register rules (banners, caps runs, a fixed phrase li4---56# Skill Authoring78A skill competes for selection in a context window shared with every other9installed tool. There are two ways to win: describe your territory precisely,10or shout. Shouting works once — then every neighbor escalates, emphasis stops11carrying information, and selection quality degrades for the whole toolkit.12This doctrine is the first way, made enforceable.1314This is a **rigid** skill: the description contract, register rules, and15shipping requirement are bright lines, each with a mechanical check.1617## The description contract1819The frontmatter `description` is a trigger surface. It has one job: let a20model holding only descriptions rank this skill correctly against its21neighbors — high when the task is the skill's, low when it is not.22231. **Open with a verb-led capability sentence.** What the skill does and24 produces, before any trigger list.252. **Quote the triggers users actually type.** Concrete phrasings ("wrap up",26 "which tool should handle this"), task shapes, and situations — not27 abstract categories. Paraphrase variety beats repetition.283. **Draw the boundary, then name the owner.** Every description ends with29 negative space: "Not for X — that is Y." Naming the sibling does two jobs:30 it stops the skill from poaching, and it routes the reader to the right31 place.324. **No obedience language.** Descriptions never instruct the model to use33 them, never inflate stakes, never claim priority over neighbors. A34 description that needs to demand attention is compensating for triggers35 that fail to earn it.3637A plain-scalar `description` must not contain `: ` (colon + space): YAML reads38it as a nested mapping, the frontmatter silently breaks, and the skill never39loads — caught only by `validate_plugins`, not by anything as you write. Quote40the whole scalar, use a `>` folded block, or replace the `: ` with an em-dash.41(`evaluate-skill` sees the same trap as an instant, total recall collapse.)4243## Selection and execution are different layers4445The description decides *when* the skill loads. The body instructs *how* the46work proceeds once loaded. Keep the registers separate:4748- A bright line in a body is content, stated plainly: "production code is49 written only against a test you have watched fail." Firm, testable, neutral.50- Identity pressure is not content: "you are rationalizing", "you do not have51 a choice", all-caps banners. These bully the reader's judgment instead of52 informing it, and they read as noise to anyone auditing the skill.53- Catalogs of known failure modes and rationalizations are valuable — keep54 them as *descriptive* tables ("common shortcuts and what they miss"), so a55 reader recognizes the pattern without being accused of it.56- A step whose executor is not the reader says so. "Write each reviewer's57 output to disk as it lands" reads as something the operator does by hand; a58 reader building an automated panel implements the surrounding structure and59 drops the step, and the persisted evidence it existed to keep is gone. Name60 the executor where it is not obviously the reader.6162## Rigid or flexible — declare it6364Every skill states which it is, near the top of the body:6566- **Rigid**: bright-line constraints plus the verification step that proves67 compliance. For disciplines whose dominant failure mode is self-granted68 exceptions (TDD, verification before completion).69- **Flexible**: principles with judgment explicitly delegated — the skill says70 what to optimize for and trusts the reader to adapt.7172The choice is part of the design, not the prose: a rigid skill with soft73constraints fails differently from a flexible skill with hard constraints,74and both fail.7576## Register rules7778The deny-list: imperative-obedience phrases, importance banners, and runs of79three or more consecutive all-caps words outside code — the patterns that buy80salience instead of fit. Emphasis budget inside a body: bold the one81load-bearing sentence of a section, sparingly. If a constraint feels like it82needs caps to hold, it needs a verification step or a gate instead — move the83enforcement to mechanism. Enforce what you can mechanically: craft-collection84wires a register linter (`scripts/lint_register.py`) into pre-commit, but it85catches only the detectable subset — importance banners, all-caps runs, and a86fixed list of obedience/priority phrases. Obedience framing that dodges those87literal patterns is not caught, so review holds the rest. A standalone install88applies the whole deny-list by review until it wires its own gate.8990## Shipping requirement9192A skill ships when all of these exist, not before:93941. **Trigger dataset** — balanced positives and negatives; the negatives95 include near-misses that sit in named siblings' territory.962. **Sealed holdout, with a birth baseline** — authored at the same sitting as97 the dev set, never consulted while tuning the description, and **run once at98 seal time with the result recorded next to the seal**. A holdout that99 informed tuning is dev data, not a holdout; a holdout that has never been100 run is false confidence (one sat four days hiding a dev-0.95/holdout-0.33101 overfit).1023. **Correct-usage rubric** (rigid skills) — tasks plus checks that the output103 actually followed the discipline, deterministic where possible.1044. **Gates pass** — recall, specificity, and correct-usage thresholds, run by105 a behavioral eval harness when one is available (craft-collection ships106 one: datasets under `evals/trigger/`, thresholds in `evals/config.json`,107 run mechanics owned by session-workflow's evaluate-skill). Standalone108 installs keep requirements 1–3 and 5 as authored artifacts and run them with109 whatever harness they have — the discipline is the contract, the harness110 is one implementation.1115. **A registered threshold states what the design can detect** — the maximum112 movement attainable at the planned repeat count, and its p, computed before113 the run. Without it a failed edit and a design incapable of succeeding leave114 the same record. Cannot reach the bar: raise repeats, or do not register it.115116Two skill classes cannot be gated at trigger time at all, and one worked example117of a threshold that could not move:118[`references/shipping-gate.md`](references/shipping-gate.md), which also carries119the measured record behind the register rules.120121## References between tools122123Skills reference other tools without depending on them. Four rules and a test:1241251. **Same-plugin references are free** — the plugin installs as a unit, so a126 sibling skill in the same plugin is guaranteed present. A different plugin127 is not, even one in the same marketplace: plugins install individually128 (`/plugin install humblepowers@craft-collection`), so a sibling plugin129 under the same marketplace is a cross-tool reference and rule 2 applies —130 role-generic, with a working fallback.1312. **Cross-tool references are role-generic with a named example and a132 working fallback**: "when a capacity-dispatch policy is installed133 (e.g. humblepowers' choosing-models), its tier rule wins — otherwise134 this heuristic." Name the role, give the example, work alone.1353. **Artifacts never carry tool dependencies.** A plan or spec that embeds136 "REQUIRED SUB-SKILL: <tool>" locks the artifact to a toolchain; state the137 execution contract in the artifact itself instead.1384. **Bindings over assumptions** — when integration genuinely needs wiring,139 the user supplies it (a bindings table, a config entry); tools never hunt140 the environment for each other.141142The degradation test: uninstall every other tool — the skill still produces a143correct, if less optimized, result.144145## Authoring checklist146147- [ ] Verb-led capability sentence opens the description148- [ ] Concrete trigger phrasings, with paraphrase variety149- [ ] Negative space names every adjacent owner150- [ ] No obedience language anywhere in the description151- [ ] Rigid or flexible declared; bright lines plain; catalogs descriptive152- [ ] Register deny-list clean (lint-enforced where a gate is wired)153- [ ] Cross-tool references are role-generic with fallback (degradation test)154- [ ] Dev dataset and sealed holdout authored together, before any tuning;155 holdout baseline run and recorded at seal time156- [ ] Correct-usage rubric for rigid skills