writing-skills — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited writing-skills (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The reader of every skill is an agent. A line earns its place only if it changes the agent's behaviour versus what it would do anyway — text the agent already knows, filler, and repetition are bloat. Apply that test to every line you write.
The same test scales up. Prefer the simplest thing that fixes an observed failure — often that is nothing at all: if the model already handles the task well, don't write the skill; if a line answers an imagined problem, don't write the line. Simple beats clever, and YAGNI applies to skills as much as to code.
If the skill's intent, triggers, or location (personal ~/.claude/skills/, project .claude/skills/, or a plugin's skills/) are unclear, ask before writing.
Three tiers drive every design decision:
name and description (plus when_to_use if set), ~100 tokens each. The listing caps description + when_to_use at 1,536 chars combined; when the total listing budget overflows, least-used skills' descriptions are truncated first (/doctor shows this). At library scale, every description word is a recurring cost.Decide before writing anything else; it shapes the description and the body:
disable-model-invocation: true): for task skills with side effects (deploy, commit) or skills the user deliberately runs as /name. The description becomes a short human-facing summary — the user, not the matcher, is the audience.user-invocable: false): background knowledge; hidden from the / menu.Lowercase letters, numbers, hyphens; ≤64 chars; must match the folder name; no "claude" or "anthropic" (reserved). Prefer gerund form (reviewing-code). Avoid generic terms (helper, utils, tools).
The description carries discovery — it deserves harder pruning than the body.
: inside the text (breaks YAML parsing — use em-dashes or rephrase). No XML angle brackets anywhere in frontmatter.ServerName:tool_name).evals/, Step 6); piled-up MUST/ALWAYS/CRITICAL (state the expectation once, plainly).Inline what every usage path needs; push behind a pointer what only some paths reach. Splitting is also the pressure valve as the body approaches the ~500-line ceiling.
references/ — docs the agent consults while working (schemas, standards). Loaded on demand. Give any file over ~100 lines a table of contents; add grep hints for very large files. Keep references one level deep from SKILL.md — nested chains get partially read.assets/ — templates and files used in output. Never loaded into context.scripts/ — deterministic work the agent would otherwise rewrite each time. Only output consumes tokens. Scripts must handle their own errors (solve, don't punt to the agent) and document any non-obvious constants. Say whether to execute or read each script.Information lives in exactly one place — never in SKILL.md and a reference both. Do not create README, CHANGELOG, or other extraneous files in the skill folder.
Always run the baseline: try the task without the skill and record where the model actually fails. If it doesn't fail, stop — the skill isn't needed.
Full evals earn their cost when a skill enforces discipline, runs unattended, or risks over-triggering: 3+ scenarios drawn from the observed failures, including at least one should-NOT-trigger case (a nearby request the skill must leave alone). Store them in evals/ inside the skill folder — not in the body. Grade outcomes, not paths (agents find valid unexpected routes), and test each model tier the skill serves.
For a simple user-invoked task skill, one dry run of the happy path is enough.
Required: name, description. Optional (one line each — check current Claude Code docs when in doubt; this surface grows quickly):
| Field | Use for |
|---|---|
disable-model-invocation: true | User-only task skills (side effects; /name invocation) |
user-invocable: false | Model-only background knowledge; hides from / menu |
when_to_use | Extra trigger context, appended to description in the listing |
allowed-tools / disallowed-tools | Restrict tool access when the workflow warrants it |
context: fork + agent | Run the skill in a forked subagent |
argument-hint, arguments | Named/positional args via $ARGUMENTS, $name, $N |
paths | Glob-scoped auto-activation |
model, effort | Pin only when necessary — pinned model IDs go stale |
hooks, shell, compatibility, metadata, license | Niche; quote metadata values (version: "1.0") |
Dynamic values can be injected with ` !command ` syntax.
Make the smallest change that fixes an observed failure — tighten the description or add a missing trigger before adding content. After deployment, watch real usage: files never read are unnecessary; sections the agent re-reads belong in the body; reference chains it fails to follow are too deep. When a fix applies broadly, update the shared skill rather than cloning near-duplicates. Periodically re-run the baseline test (Step 6.1) — if the model now passes without the skill, retire it.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.