Audits skills in this repo for consistency, API drift, and structural gaps. Produces a prioritized report grouped by severity (Critical/High/Medium/Low). Use when asked to "audit skills", "check the skill repo for drift", or when planning bulk skill cleanup. Read-only — does not apply fixes.
npx skills add https://github.com/rshankras/claude-code-apple-skills --skill skill-auditor
Audits every SKILL.md in skills/ for frontmatter correctness, structural completeness, API/version drift, and cross-file reference integrity. Produces a prioritized markdown report. Read-only — never applies fixes.
Use this skill when the user:
Does NOT activate for: creating new skills (use skill-creator), applying fixes (follow-up flow after this auditor reports), or auditing Swift code inside skills (use ios/coding-best-practices or macos/coding-best-practices).
Resolve the invocation argument in this order:
skills/**/SKILL.mdgenerators/, ios/) → audit skills/<arg>/**/SKILL.mdskills/liquid-glass/SKILL.md) → audit one fileskills/<arg>/SKILL.md; fall back to asking the userUse Glob with pattern skills/**/SKILL.md from the repo root. Filter by scope if an argument was passed. Record the canonical file list — every subsequent step operates on this list.
Read the first 20 lines of each SKILL.md. Parse:
--- frontmatter block existsname:, description:, allowed-tools: field valueslast_verified:, review_by: (dates, required — enforcedby scripts/check-frontmatter.sh), optional os_version:. Overdue
review_by dates are the stale-skills workflow's job, not a finding here.
Cache this result. Checks C-01, H-01, H-03, L-02 all read from this cache — do not re-read.
Execute bulk Grep passes in parallel (single tool-call batch) wherever possible. Per-file operations come after. The 11 checks are in the table below; the order is as-listed.
For each file, mark it as aggregator or leaf using the rules in the "Aggregator Detection" section below. Some checks relax for aggregators.
Group findings by severity (🔴 → 🟢), sort within each group by file path, print the report inline using the template in "Output Format".
C-01 · Missing frontmatter. The file has no leading --- YAML block.
Grep for \A---\n[\s\S]*?\n--- across all SKILL.md. Files with no match → C-01.name, description, allowed-tools.H-01 · Missing allowed-tools field. Frontmatter exists but allowed-tools: key is absent.
allowed-tools: [Read, Glob, Grep] (adjust based on what the skill actually does).H-02 · Broken supporting-file reference. The SKILL.md references a *.md file that does not exist on disk in the same directory.
Grep each SKILL.md for [a-z0-9][a-z0-9-]*\.md matches; resolve each relative to the SKILL.md's directory; ls to confirm. Missing files → H-02. Ignore matches inside fenced code blocks. Also resolve rules/swiftlint.yml references the same way (fragment fixtures themselves are CI's job — scripts/check-lint-fragments.sh).H-03 · H1 title does not match name:. The first # heading after the frontmatter, slugified (lowercase, spaces → -), differs from the name: field.
name: to match.M-01 · Missing "When This Skill Activates" section. No ## When This Skill Activates heading anywhere in the file.
Grep -L for ^## When This Skill Activates across all SKILL.md.shared/skill-creator/SKILL.md for the canonical format.M-02 · Outdated version reference (drift). Mentions iOS 17–25, macOS 13–25, or Swift 5.x with drift context (treated as current/latest/target).
Grep for \biOS (1[7-9]|2[0-5])\b|\bSwift 5\.\d+\b|\bmacOS (1[3-9]|2[0-5])\b, capturing line numbers.latest, newest, current, target, deployment target, requires, minimum, as of, new in, now supports, todaylegacy, pre-, prior to, before, deprecated, old, migrate from, backport, fallback, if available, #available, or the version mention has a trailing + (e.g., iOS 17+)scripts/versions.env. Mentions of these with drift context are always clean.scripts/versions.env), or annotate as legacy context with one of the suppression keywords.M-03 · Pre-@Observable pattern without deprecation callout. Uses @StateObject or ObservableObject without acknowledging that @Observable is the current pattern.
Grep for @StateObject|ObservableObject with line numbers; for each hit, secondary Grep of the same file for @Observable|deprecated|legacy|pre-@Observable|migration|old pattern within ±10 lines. No secondary match → M-03.@Observable + @State, or add a migration note explaining why the older pattern is shown.M-04 · Oversized single-file skill. SKILL.md exceeds 400 lines and its directory contains no sibling .md files.
wc -l via Bash on each SKILL.md; if >400, check sibling file list via ls for any other .md. None → M-04.patterns.md, templates.md, checklist.md, or examples.md per skill-creator conventions.L-01 · No ✅/❌ examples in prose. The file has no ✅ or ❌ markers anywhere.
Grep -L for ✅|❌.L-02 · Description length out of range. description: is <20 or >300 characters.
L-03 · Ambiguous version mention. A version keyword matched stage 1 of the drift check but surrounding lines contained neither drift nor legacy context. User reviews manually.
A SKILL.md is an aggregator if any of the following hold:
skills/<category>/SKILL.md## Available Modules or ## Available Skills./<subdir>/SKILL.md or contains two or more references of the form skills/<category>/<subskill>/Otherwise it is a leaf.
| Check | Behaviour |
|---|---|
| M-01 (activation section) | Still enforced — aggregators must describe activation |
| M-03 (pre-@Observable) | Suppressed — aggregators are prose, not code |
| M-04 (>400 lines) | Suppressed — aggregators are allowed to be long when enumerating modules |
| L-01 (no ✅/❌ examples) | Suppressed — aggregators don't carry patterns |
Tag every finding in the report with (aggregator) or (leaf) so severity can be read at a glance.
Print the report inline to the conversation using this template. Use exact headings — downstream tooling may grep them.
# Skill Audit Report — <YYYY-MM-DD> — <N> files scanned
## Summary
- 🔴 Critical: <count>
- 🟠 High: <count>
- 🟡 Medium: <count>
- 🟢 Low: <count>
- ✅ Files clean: <clean-count> / <N>
Scope: <all | category | single file>
## 🔴 Critical Findings
### C-01 · Missing frontmatter
- `skills/<path>/SKILL.md` (leaf) — **Fix:** Add YAML frontmatter with `name`, `description`, `allowed-tools`.
## 🟠 High Findings
### H-01 · Missing `allowed-tools` field
- `skills/liquid-glass/SKILL.md:1-4` (leaf) — **Fix:** Add `allowed-tools: [Read, Glob, Grep]`.
- `skills/macos/macos-tahoe-apis/SKILL.md:1-4` (leaf) — **Fix:** Same.
### H-02 · Broken supporting-file reference
- `skills/<path>/SKILL.md:<line>` — references `patterns.md`, not found. **Fix:** Create the file or remove the reference.
### H-03 · H1 title does not match `name:`
- `skills/<path>/SKILL.md` — `name: foo-bar`, H1 is `# Foo Bars`. **Fix:** Rename one to match.
## 🟡 Medium Findings
### M-01 · Missing "When This Skill Activates" section (<count>)
- `skills/design/liquid-glass/SKILL.md` (leaf)
- `skills/macos/coding-best-practices/SKILL.md` (leaf)
- [collapsed list of remaining offenders]
- **Fix:** Add section with 3–5 user trigger phrases.
### M-02 · Outdated version reference (<count>)
- `skills/<path>/SKILL.md:87` (leaf) — "latest iOS 17" in drift context. **Fix:** Update to iOS 26.
### M-03 · Pre-`@Observable` pattern without callout (<count>)
- `skills/<path>/SKILL.md:142` (leaf) — `@StateObject` without migration note. **Fix:** Replace with `@Observable` or add callout.
### M-04 · Oversized single-file skill (<count>)
- `skills/<path>/SKILL.md` — <NNN> lines, no sibling .md files. **Fix:** Modularize into `patterns.md` / `templates.md`.
## 🟢 Low Findings
### L-01 · No ✅/❌ examples
- `skills/<path>/SKILL.md` (leaf) — **Fix:** Add at least one good/bad example pair.
### L-02 · Description length out of range
- `skills/<path>/SKILL.md` — description is <N> chars. **Fix:** Expand/shorten to 20–300 chars.
### L-03 · Ambiguous version mention
- `skills/<path>/SKILL.md:<line>` — "iOS 18" with no drift/legacy context. **Fix:** Review manually.
## ✅ Clean Files
<collapsed list of files that passed all checks>
## Next Steps
- Review 🔴/🟠 findings first — they block skills from working as intended.
- Batch-fix 🟡 M-01 and M-02 mechanically — suggested find/replace scripts shown per-file.
- 🟢 findings are polish; address opportunistically.
@StateObject, and drift-stage-1 can all run at once.*.md references inside fenced code blocks carefully — they're examples, not references. Strip fenced blocks before running H-02's regex.## Summary) should be deterministic for a given repo state. Only the date in the H1 varies across runs.allowed-tools lists Bash, but only for read-only ops (wc, ls). If you find yourself needing to write, stop and ask the user to invoke a fix flow separately.wwdc-to-skill-workflow skill owns that.CI (scripts/check-freshness.sh) owns the deterministic subset of M-02: a recency keyword AND a stale version (major ≤ current−2) on the same line is a blocking build failure. This auditor's M-02 remains the broader net — ±2-line context, current/target/requires keywords, human-reviewed. Findings unique to M-02 are review candidates, not CI failures; anything CI already blocks will never appear here because it can't merge. C-01 is likewise fully delegated: scripts/check-frontmatter.sh blocks missing frontmatter at PR time.
The drift heuristic hardcodes "known-current" version constants:
Update these constants when Apple ships a new major platform version (usually post-WWDC each June), together with scripts/versions.env — CI's check-freshness.sh cross-checks that this file mentions the manifest's current iOS generation and fails if they drift apart. The stage-1 regex ranges (iOS 1[7-9]|2[0-5], macOS 1[3-9]|2[0-5]) must also be widened each cycle so their upper bound stays at CURRENT−2 (the previous generation sits inside a one-generation grace and is not stale; the ranges are unchanged for the iOS 27 cycle since 17–25 already ends at 27−2).
After running the auditor on the full repo, counts should fall within this tolerance band (baseline re-taken 2026-07-16 after the blind-test audit deletions, 178 total SKILL.md files scanned — 155 leaf skills + 23 category indexes; the README's "159 skills" counts leaf dirs plus the 4 single-skill categories):
| Finding | Expected |
|---|---|
| C-01 missing frontmatter | 0 — the 2026-04 legacy batch was fixed, and scripts/check-frontmatter.sh now blocks regressions in CI |
| H-01 missing allowed-tools | 0 |
| H-02 broken supporting refs | 0 |
| H-03 H1 mismatch | flag outliers manually |
| M-01 missing activation section | 6 — ui-prototyping, iap-finalizer, originality-check, store-signals, flow-walkthrough, privacy-publish |
| M-02 version drift | stage-1 Grep returns ~369 raw hit lines across ~147 files (2026-07-11); the stage-2 narrowed band must be re-derived on the next full run — the pre-hardening band (~50±10) was measured against ~228 raw hits, and CI's check-freshness.sh has since removed the same-line recency subset |
| M-03 pre-@Observable no callout | ~29 (±5) — re-verify on the next full run |
| M-04 oversized single-file | TBD — flag outliers |
## When to Use (resolved)The 2026-04 batch of files using ## When to Use as their activation heading has been fully normalized — as of 2026-07-11 no SKILL.md uses it in place of the canonical heading. The rule stands for future contributions: do not widen the M-01 regex to accept ## When to Use — the whole point is to normalize onto the canonical heading. (A ## When to Use … heading deeper in a file as *content* — e.g. swift/memory's "When to Use / When NOT to Use" section about the technique itself — is fine and not an M-01 signal.)
generators/. Only skills/generators/** paths appear.skills/liquid-glass/SKILL.md. Report has exactly one H-01 finding.../../../CLAUDE.md (repo root, resolved relative to this SKILL.md — not the project cwd) — normative source for frontmatter schema, naming, emoji convention. If absent (skills-only copies), use https://github.com/rshankras/claude-code-apple-skills/blob/main/CLAUDE.mdskills/shared/skill-creator/SKILL.md — companion meta-skill for creating new skills (this auditor only audits; it does not create)skills/ios/SKILL.md — canonical aggregator exampleComplete development kit for Microsoft 365 Copilot declarative agents with three comprehensive workflows (basic, advanced, validation), TypeSpec support, and Microsoft 365 Agents Toolkit integration
Format and structurally validate local treatment-plan documentation after clinical decisions have already been supplied and verified by authorized licensed professionals. Use for source traceability, clinician-authored intervention records, goals and checkpoints, shared-decision records, reconciliation handoffs, and release gates—not for clinical decision-making.
> provider/change budget/修改卖家/修改预算/draft/草稿/我的任务/my tasks/what am I working on/关闭/取消任务/决策列表/decision list/指定服务商/browse (sender.role = COUNTERPARTY, not you); (3) literal "Read the okx-ai skill" (or legacy "Read the okx-agent-task skill") in the envelope.
Automate payer review of prior authorization (PA) requests. This skill should be used when users say "Review this PA request", "Process prior authorization for [procedure]", "Assess medical necessity", "Generate PA decision", or when processing clinical documentation for coverage policy validation and authorization decisions.
Expert in designing and building autonomous AI agents. Masters tool use, memory systems, planning strategies, and multi-agent orchestration.
Autonomous agents are AI systems that can independently decompose goals, plan actions, execute tools, and self-correct without constant human guidance. The challenge isn't making them capable - it's making them reliable. Every extra decision multiplies failure probability.
Orchestrates design workflows by routing work through brainstorming, multi-agent review, and execution readiness in the correct order.
Structured persuasion for tech leads, PMs, and founders—not activity logs. Five scenarios (kickoff, status update, wrap-up, investor pitch, solution selling) on one 5-part framework (Hook→Context→Proposal→Evidence→Ask). AI prompts for missing materials and audience context; pre-submit checklist. Claude Code plugin; Cursor, Codex, and chat via prompts.
Take rshankras/skill-auditor from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.