Audit skills
Check one or more SKILL.md files against this repo's Skill compliance bar — the
combined requirement set from docs/skill-writing-best-practices.md (externally-sourced
structure, naming, and description-design guidance) and CODING_STANDARDS.md (this
repo's own house rules: required structure, self-containment, no emojis, no marketing
language). Both documents are read live, in full, on every run — never an embedded or
duplicated checklist copy — so the check can never drift stale against either document
independently of the other. This skill only ever reports violations; it never edits
another skill's SKILL.md directly, mirroring skill-writing-standards' own
propose-only philosophy.
Self-containment exemption: CODING_STANDARDS.md's Self-containment rule — never
cite this repo's own paths from inside a skill's instructions — does not apply to this
skill for the paths it directly depends on (docs/skill-writing-best-practices.md,
CODING_STANDARDS.md, docs/agents/issue-tracker.md). That rule exists because a skill
"executes against whatever project the user is actually working in, not this repo"; this
skill is project-scoped (.claude/skills/audit-skills/, never shipped in the plugin) and
only ever runs against this repo, so the failure mode the rule guards against cannot
occur here. The exemption is narrow: it does not extend to docs/adr/*.md or
CONTEXT.md, which stay uncited from this skill's own instructions the same as from any
other skill's.
Dependencies
Requires an authenticated gh CLI, but only for the optional issue-filing step (gh issue create, see "Issue filing" below) — a report-only run needs no external CLI at
all.
When to use
- Right after a
SKILL.md under skills/**/SKILL.md or .claude/skills/**/SKILL.md is
created or substantively edited — the paths scoping above fires this automatically,
checking just that one file.
- The user types
/audit-skills (with or without a skill-name argument).
- The user asks to check, audit, or verify an existing skill's compliance with this
repo's structure or style bar.
When not to use
- While a skill is still a rough, in-progress draft — wait until it's substantively
written enough to check against the full bar; running this against an empty or
half-started skeleton produces mostly noise.
- Checking whether a skill actually performs its task correctly — that's a dry run
against a realistic sample task, per
CODING_STANDARDS.md's pre-merge checklist. This
skill checks the written SKILL.md against the compliance bar, not runtime behavior.
- Checking
.claude-plugin/plugin.json or README.md listing completeness — claude plugin validate --strict already covers that mechanically.
- Reconciling
docs/skill-writing-best-practices.md itself against external sources —
that's skill-writing-standards' job. This skill only checks existing skills against
whatever the two documents currently say; it never edits either of them.
- Auto-fixing a violation, or filing a per-violation issue — this skill only reports,
and only ever files one issue per skill that has violations, and only when asked.
Resolving what to check
- Auto-fired (via the
paths frontmatter above): the target is exactly the one file
that was created or edited.
/audit-skills with no argument: the target is every SKILL.md under
skills/**/SKILL.md and .claude/skills/**/SKILL.md — a full sweep of both trees.
/audit-skills <skill-name>: resolve the name against both trees by directory
name first; if that doesn't match anything, fall back to matching the name field in
each candidate SKILL.md's frontmatter. Check only the resolved skill.
Mechanism
This is three sub-agent-shaped steps, no more, regardless of how many skills are being
checked:
- Dispatch one sub-agent to read
docs/skill-writing-best-practices.md and
CODING_STANDARDS.md in full, fresh, and return a distilled, topic-tagged
checklist — bullets, not raw doc content, each tagged with which document it comes
from (e.g. "Description must state what and when, third person — best-practices.md"
or "No marketing/hype language — CODING_STANDARDS.md"). This mirrors
skill-writing-standards' own findings format for its research sub-agents.
- Once the checklist is back, dispatch one sub-agent per target skill, all in a single
message so they run concurrently. Give each sub-agent the checklist plus that
skill's full
SKILL.md content (and any bundled reference file it links, since
progressive-disclosure structure is itself part of what's being checked). Ask it to
return every violation found, each naming: the specific rule broken, which document
that rule comes from, and the checklist topic it falls under. A skill with no
violations should say so explicitly rather than returning nothing.
- Aggregate every sub-agent's violations into the final report in this parent context —
no dedicated aggregation sub-agent. This keeps the mechanism at exactly checklist +
per-skill checks + (optional) issue filing, never more hops regardless of sweep size.
Report shape
- Group the report per skill. A skill with zero violations gets named on a single line
under a "Compliant" heading — not its own subsection — so a full-sweep report stays
scannable as the skill count grows. A skill with violations gets its own subsection
listing each one, the specific rule it breaks, and which of the two documents that
rule comes from.
Issue filing
- Report-only by default. Only when the user explicitly asks, file one GitHub issue
per skill that has violations — never one batched issue for the whole run, never one
per violation — each listing every violation found for that skill, via this repo's own
issue-creation convention (
docs/agents/issue-tracker.md: "publish to the issue
tracker" means gh issue create --title "..." --body "..."). A skill with zero
violations gets no issue.
Worked example
A real dry run, executed against two synthetic, frozen fixtures built solely for this
example: invoice-line-splitter, deliberately constructed with violations spanning both
source documents, and spreadsheet-cell-merger, a fully compliant skill exercising the
"Compliant" report path. Both are entirely invented — neither names nor makes a pass/fail
claim about any real shipped or maintainer skill in this repo — and neither fixture file
was ever committed; they existed only in a scratch location outside the repository for
the duration of this run. That means the violation and clean pass illustrated below can
never drift, unlike a worked example that names a real skill and reports its current
compliance as fact.
Step 4's checklist sub-agent returned a topic-tagged checklist covering required
structure, naming, description design, self-containment, style, and sizing. Step 5's two
parallel per-fixture sub-agents then checked each fixture against it:
invoice-line-splitter
- Description written in first person ("I split multi-line invoice text into per-item
rows...") rather than third person —
docs/skill-writing-best-practices.md,
Description design.
- Description states only what the skill does, with no trigger phrase or
when-to-use clause —
docs/skill-writing-best-practices.md, Description design.
- No "When to use" or "When not to use" section anywhere in the body —
docs/skill-writing-best-practices.md, Required structure.
- Marketing/hype language in both the description ("our revolutionary,
industry-leading parsing engine") and the body ("best-in-class... with unmatched
accuracy") —
CODING_STANDARDS.md, Style and content rules.
- Cites a decision record (
docs/adr/0042-my-team-chose-a-layered-parser-fallback.md)
from inside its own instructions, assuming a file outside its bundle exists —
CODING_STANDARDS.md, Self-containment.
Compliant
spreadsheet-cell-merger — no violations found: explicit "When to use"/"When not to
use" sections, a third-person description naming concrete triggers ("merge cells,"
"collapse repeated row labels"), a worked example depicting evergreen designed
behavior, and no citation to anything outside its own bundle.
Step 6 aggregated these into the report shape above: one fixture came back with five
violations spanning both source documents, and the other — built clean on purpose —
exercised the "Compliant" single-line path. That's the mechanism doing its actual job:
finding a real cross-document mix of defects in one pass and correctly clearing the
other. Because both fixtures are synthetic and never committed, this passage stays
accurate no matter how this repo's own skills change later.
1---2name: audit-skills3description: Audit skills4---56# Audit skills78Check one or more `SKILL.md` files against this repo's Skill compliance bar — the9combined requirement set from `docs/skill-writing-best-practices.md` (externally-sourced10structure, naming, and description-design guidance) and `CODING_STANDARDS.md` (this11repo's own house rules: required structure, self-containment, no emojis, no marketing12language). Both documents are read live, in full, on every run — never an embedded or13duplicated checklist copy — so the check can never drift stale against either document14independently of the other. This skill only ever reports violations; it never edits15another skill's `SKILL.md` directly, mirroring `skill-writing-standards`' own16propose-only philosophy.1718**Self-containment exemption:** `CODING_STANDARDS.md`'s Self-containment rule — never19cite this repo's own paths from inside a skill's instructions — does not apply to this20skill for the paths it directly depends on (`docs/skill-writing-best-practices.md`,21`CODING_STANDARDS.md`, `docs/agents/issue-tracker.md`). That rule exists because a skill22"executes against whatever project the user is actually working in, not this repo"; this23skill is project-scoped (`.claude/skills/audit-skills/`, never shipped in the plugin) and24only ever runs against this repo, so the failure mode the rule guards against cannot25occur here. The exemption is narrow: it does not extend to `docs/adr/*.md` or26`CONTEXT.md`, which stay uncited from this skill's own instructions the same as from any27other skill's.2829## Dependencies3031Requires an authenticated `gh` CLI, but only for the optional issue-filing step (`gh32issue create`, see "Issue filing" below) — a report-only run needs no external CLI at33all.3435## When to use3637- Right after a `SKILL.md` under `skills/**/SKILL.md` or `.claude/skills/**/SKILL.md` is38 created or substantively edited — the `paths` scoping above fires this automatically,39 checking just that one file.40- The user types `/audit-skills` (with or without a skill-name argument).41- The user asks to check, audit, or verify an existing skill's compliance with this42 repo's structure or style bar.4344## When not to use4546- While a skill is still a rough, in-progress draft — wait until it's substantively47 written enough to check against the full bar; running this against an empty or48 half-started skeleton produces mostly noise.49- Checking whether a skill actually performs its task correctly — that's a dry run50 against a realistic sample task, per `CODING_STANDARDS.md`'s pre-merge checklist. This51 skill checks the written `SKILL.md` against the compliance bar, not runtime behavior.52- Checking `.claude-plugin/plugin.json` or `README.md` listing completeness — `claude53 plugin validate --strict` already covers that mechanically.54- Reconciling `docs/skill-writing-best-practices.md` itself against external sources —55 that's `skill-writing-standards`' job. This skill only checks existing skills against56 whatever the two documents currently say; it never edits either of them.57- Auto-fixing a violation, or filing a per-violation issue — this skill only reports,58 and only ever files one issue per skill that has violations, and only when asked.5960## Resolving what to check61621. **Auto-fired** (via the `paths` frontmatter above): the target is exactly the one file63 that was created or edited.642. **`/audit-skills` with no argument**: the target is every `SKILL.md` under65 `skills/**/SKILL.md` and `.claude/skills/**/SKILL.md` — a full sweep of both trees.663. **`/audit-skills <skill-name>`**: resolve the name against both trees by directory67 name first; if that doesn't match anything, fall back to matching the `name` field in68 each candidate `SKILL.md`'s frontmatter. Check only the resolved skill.6970## Mechanism7172This is three sub-agent-shaped steps, no more, regardless of how many skills are being73checked:74754. Dispatch one sub-agent to read `docs/skill-writing-best-practices.md` and76 `CODING_STANDARDS.md` in full, fresh, and return a distilled, **topic-tagged77 checklist** — bullets, not raw doc content, each tagged with which document it comes78 from (e.g. "Description must state what and when, third person — best-practices.md"79 or "No marketing/hype language — CODING_STANDARDS.md"). This mirrors80 `skill-writing-standards`' own findings format for its research sub-agents.815. Once the checklist is back, dispatch one sub-agent per target skill, **all in a single82 message** so they run concurrently. Give each sub-agent the checklist plus that83 skill's full `SKILL.md` content (and any bundled reference file it links, since84 progressive-disclosure structure is itself part of what's being checked). Ask it to85 return every violation found, each naming: the specific rule broken, which document86 that rule comes from, and the checklist topic it falls under. A skill with no87 violations should say so explicitly rather than returning nothing.886. Aggregate every sub-agent's violations into the final report in this parent context —89 no dedicated aggregation sub-agent. This keeps the mechanism at exactly checklist +90 per-skill checks + (optional) issue filing, never more hops regardless of sweep size.9192## Report shape93947. Group the report per skill. A skill with zero violations gets named on a single line95 under a "Compliant" heading — not its own subsection — so a full-sweep report stays96 scannable as the skill count grows. A skill with violations gets its own subsection97 listing each one, the specific rule it breaks, and which of the two documents that98 rule comes from.99100## Issue filing1011028. Report-only by default. Only when the user explicitly asks, file **one GitHub issue103 per skill that has violations** — never one batched issue for the whole run, never one104 per violation — each listing every violation found for that skill, via this repo's own105 issue-creation convention (`docs/agents/issue-tracker.md`: "publish to the issue106 tracker" means `gh issue create --title "..." --body "..."`). A skill with zero107 violations gets no issue.108109## Worked example110111A real dry run, executed against two synthetic, frozen fixtures built solely for this112example: `invoice-line-splitter`, deliberately constructed with violations spanning both113source documents, and `spreadsheet-cell-merger`, a fully compliant skill exercising the114"Compliant" report path. Both are entirely invented — neither names nor makes a pass/fail115claim about any real shipped or maintainer skill in this repo — and neither fixture file116was ever committed; they existed only in a scratch location outside the repository for117the duration of this run. That means the violation and clean pass illustrated below can118never drift, unlike a worked example that names a real skill and reports its current119compliance as fact.120121Step 4's checklist sub-agent returned a topic-tagged checklist covering required122structure, naming, description design, self-containment, style, and sizing. Step 5's two123parallel per-fixture sub-agents then checked each fixture against it:124125**`invoice-line-splitter`**1261271. Description written in first person ("I split multi-line invoice text into per-item128 rows...") rather than third person — `docs/skill-writing-best-practices.md`,129 Description design.1302. Description states only *what* the skill does, with no trigger phrase or131 when-to-use clause — `docs/skill-writing-best-practices.md`, Description design.1323. No "When to use" or "When not to use" section anywhere in the body —133 `docs/skill-writing-best-practices.md`, Required structure.1344. Marketing/hype language in both the description ("our revolutionary,135 industry-leading parsing engine") and the body ("best-in-class... with unmatched136 accuracy") — `CODING_STANDARDS.md`, Style and content rules.1375. Cites a decision record (`docs/adr/0042-my-team-chose-a-layered-parser-fallback.md`)138 from inside its own instructions, assuming a file outside its bundle exists —139 `CODING_STANDARDS.md`, Self-containment.140141**Compliant**142143- `spreadsheet-cell-merger` — no violations found: explicit "When to use"/"When not to144 use" sections, a third-person description naming concrete triggers ("merge cells,"145 "collapse repeated row labels"), a worked example depicting evergreen designed146 behavior, and no citation to anything outside its own bundle.147148Step 6 aggregated these into the report shape above: one fixture came back with five149violations spanning both source documents, and the other — built clean on purpose —150exercised the "Compliant" single-line path. That's the mechanism doing its actual job:151finding a real cross-document mix of defects in one pass and correctly clearing the152other. Because both fixtures are synthetic and never committed, this passage stays153accurate no matter how this repo's own skills change later.