ADR-0020 shipped its gates hot with no baseline file, so 26 of 39 descriptions and 9 of 39 bodies are over their FAIL tier and editing any of them for any reason requires bringing the skill into contract first. `references/improve.md` said exactly that and stopped there — it mandated a retrofit and supplied no procedure for one. Four dry-run retrofits confirmed what that costs. Asked the same questions — what to cut first, when a body is two flows rather than one, what else has to change alongside — they invented six to ten different answers, so the same skill retrofitted twice produced two different skills and neither run could be reviewed against anything. `references/retrofit.md` fixes the answers: an ordered cut list ranked by tokens removed against behaviour lost (inverting that order is how a retrofit deletes the instruction the skill existed to carry), the test for whether a body holds two mutually exclusive flows, the reference-file conventions, the collateral checklist for `README.md` and `references/sources.md`, and a worked description retrofit. It also states the trap the dry runs kept hitting: retrofit the skill in place, inside its package. The boundary-target universe is built by walking up from the file being checked, so a scratch copy has no authoring root above it, the check prints `INFO ... DID NOT RUN`, and the run still exits 0 — a line that reads as a pass and is not one. A retrofit signed off on a copy carries an unverified boundary target into the corpus. Loaded from the improve flow only when a budget is actually exceeded, so a routine improvement pays nothing for it. Refs: ADR-0020, #99
75 lines
5.6 KiB
Markdown
75 lines
5.6 KiB
Markdown
# skill-author
|
|
|
|
Author and refine skills conforming to the [agentskills.io](https://agentskills.io) specification — create new skills from scratch or apply improvement signals to existing ones.
|
|
|
|
## What it does
|
|
|
|
Routes to one of two flows based on context: if no skill directory exists at the target path, it scaffolds the directory from annotated templates, fills in `SKILL.md` and supporting files, and validates the result. If an existing skill directory and improvement signals are both present, it groups those signals by root cause and applies targeted edits, then re-validates. In both flows, bumps the skill's `metadata.version` when present (minor for create, patch for improve).
|
|
|
|
`SKILL.md` itself carries only the dispatch table, the invocation-axis decision, the contract gates and the shared close; each flow lives in its own self-contained reference file, per ADR-0020.
|
|
|
|
## The contract it teaches
|
|
|
|
Authored skills are held to the ADR-0020 context budget. A description carries a trigger clause, at most one capability clause, and a boundary clause of the form `Not <thing> -> <skill-name>` whose target must resolve to a real skill or agent — 250 characters target, 400 hard ceiling. A body carries the decision procedure only — 600 words target, 900 hard ceiling, counting the body alone, which is a separate measurement from the 2,770-word / 500-line whole-file spec backstop. Skills with two or more mutually exclusive flows must dispatch. `references/contract.md` holds the full rules; `assets/templates/SKILL.md` encodes them as a fill-in skeleton.
|
|
|
|
Before a description is written, the skill asks whether the target is model-invoked or hand-invoked. A hand-invoked skill sets `disable-model-invocation: true` and carries one plain human-facing sentence with no trigger list.
|
|
|
|
## Before you start
|
|
|
|
- Run `/grill-me` to resolve design decisions before creating a new skill
|
|
- Collect domain research, examples, and constraints
|
|
- Know the skill name (kebab-case) and destination path
|
|
|
|
## Placement
|
|
|
|
`scripts/new-skill.sh` resolves the mode automatically by walking up from the given path — see `references/create.md` Step 1 for the full algorithm.
|
|
|
|
| Mode | Path | Chosen when |
|
|
|------|------|-------------|
|
|
| Standalone | `<path>/<name>/` | No `apm.yml` with a top-level `type:` field is found walking up from `<path>`, before hitting `.git` or the filesystem root |
|
|
| Package (APM) | `<package-root>/.apm/skills/<name>/` | A type-bearing `apm.yml` is found at or above `<path>` — `<path>` just needs to be somewhere inside the package |
|
|
|
|
If the destination resolves inside an APM package, read `references/deployment-modes.md` — self-containment rules apply to `apm compile` output the same way they applied to plugin cache isolation.
|
|
|
|
## Usage
|
|
|
|
```
|
|
/skill-author
|
|
```
|
|
|
|
## Files
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `README.md` | Human-readable overview of the skill and its files |
|
|
| `SKILL.md` | Skill instructions for agents |
|
|
| `scripts/new-skill.sh` | Walks up from the given path to resolve package vs standalone mode, then copies annotated templates to the resolved destination |
|
|
| `references/create.md` | The create flow end to end — prerequisites, package-intent gate, scaffold, frontmatter, scripts, references, sources (loaded on demand) |
|
|
| `references/improve.md` | The improve flow end to end — signal verification, root-cause grouping, announcement, edits (loaded on demand) |
|
|
| `references/contract.md` | The ADR-0020 description and body contract, the Gotchas constraint, the two size gates, body patterns, and org-policy embedding (loaded on demand) |
|
|
| `references/retrofit.md` | Bringing a pre-ADR-0020 skill into contract — ordered cut procedure, the mutually-exclusive-flows test, reference-file conventions, the collateral checklist, and a worked description retrofit (loaded from the improve flow when a budget is exceeded) |
|
|
| `references/deployment-modes.md` | APM package vs standalone differences and self-containment/cache-isolation rules (loaded on demand) |
|
|
| `references/scripts.md` | Package runners, inline dependency patterns, and full script contract (loaded on demand) |
|
|
| `references/sources.md` | Upstream research sources and which skill files each contributed to |
|
|
| `assets/templates/SKILL.md` | Annotated SKILL.md template — emits an ADR-0020-compliant description and body skeleton |
|
|
| `assets/templates/README.md` | Annotated README template for the new skill |
|
|
| `assets/templates/scripts/README.md` | Placeholder for bundled scripts |
|
|
| `assets/templates/references/README.md` | Placeholder for reference docs |
|
|
| `assets/templates/references/sources.md` | Sources provenance template for new skills |
|
|
| `assets/templates/assets/README.md` | Placeholder for static assets |
|
|
| `assets/templates/tests/README.md` | Placeholder for test files |
|
|
| `tests/new-skill.bats` | (source-only) Bats test suite for `scripts/new-skill.sh` |
|
|
| `tests/README.md` | (source-only) Setup instructions for bats-support and bats-assert test dependencies |
|
|
|
|
Rows marked **(source-only)** exist in the authoring source (`.apm/skills/skill-author/`) but are
|
|
not present in an installed plugin: `scripts/sync-plugin-content.sh` strips
|
|
`<category>/<name>/tests` when it generates the flat mirror, because these are dev-time fixtures no
|
|
plugin host needs to discover (ADR-0017). Run them from a repo checkout, not from an install. The
|
|
`assets/templates/tests/README.md` row above is **not** source-only — the exclusion is depth-scoped
|
|
to `<category>/<name>/tests`, so the scaffolding template tree ships intact, which
|
|
`scripts/new-skill.sh` depends on at runtime.
|
|
|
|
## Spec reference
|
|
|
|
[agentskills.io specification](https://agentskills.io/specification.md)
|