Skill validation
Skill blakebauman/skillist-validator/skills/skill-validation
Validate agent skills against the Agent Skills specification (agentskills.io) — SKILL.md frontmatter, name and description rules, character limits, directory layout, bundled file references, and progressive disclosure. Use when the user asks to validate, lint, check, or verify a skill or a directory of skills; when they ask whether a SKILL.md is spec-compliant or why a skill fails to load; before publishing or packaging skills; or when they are debugging a skill that an agent will not pick up. Applies to skills for any client — Claude Code, Cursor, Codex CLI, Gemini CLI — not just Claude.From its SKILL.md
npx -y skills add blakebauman/skillist-validator --skill skill-validationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
6.5 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
Check skills against the Agent Skills specification and report what to fix.
Run the validator first, then interpret its findings. Do not review a
SKILL.md by eye when the script can answer the mechanical questions — reading
by eye misses character limits, silent YAML coercions, and broken bundled
paths, which are the failures that actually break skills at load time.
1. Locate the skills
A skill is any directory containing a SKILL.md. Common locations:
| Location | What lives there |
|---|---|
.claude/skills/<name>/ | Project-local skills |
~/.claude/skills/<name>/ | Personal skills |
skills/<name>/ | Skills shipped inside a plugin or repo |
<anywhere>/<name>/SKILL.md | A single skill under development |
If the user named a path, use it. Otherwise check the project's skills/ and
.claude/skills/ directories. Ask which to check only when several exist and
the request is ambiguous.
2. Run the validator
python3 scripts/validate_skill.py <path>
It accepts one skill directory or a tree containing many, and discovers every skill beneath the path.
| Flag | Use it when |
|---|---|
--format json | You need to filter or count findings, or feed them into a fix loop |
--strict | The user wants warnings to fail too (CI, pre-publish gates) |
--errors-only | The user only wants hard specification violations |
--list-rules | The user asks what is checked |
Exit codes: 0 clean, 1 violations found, 2 bad path or no skill there.
Exit 1 is the normal result for a skill with problems — report the findings,
do not treat it as a tool failure.
3. Interpret the findings
Every finding carries a rule ID, a level, a location and a fix hint. The three levels mean different things and must be reported differently:
- ERROR — a specification violation. The skill is non-conformant and may fail to load. Always report these and offer to fix them.
- WARN — a specification recommendation or an authoring guideline from agentskills.io. Real, but a judgment call. Report with the reasoning, and say when ignoring one is defensible.
- NOTE — portability information, not a defect. Mention only if relevant to where the skill will run.
The full rule catalog, with the specification clause behind each rule and what
a good fix looks like, is in references/rule-catalog.md. Read it when a
finding needs explaining, when the user asks why a rule exists, or when you are
deciding whether a warning is worth acting on.
The specification's own limits and field definitions are summarized in
references/spec-rules.md. Read it when you need the authoritative constraint
rather than the validator's phrasing — for example when a user disputes a
finding.
4. Report
Lead with the verdict, then the findings grouped by skill, errors first. Use
the format in references/report-format.md when the user asks for a written
report, a review of many skills at once, or output to paste elsewhere. For a
quick single-skill check, a short summary plus the findings is enough.
State counts honestly. "3 errors, 5 warnings across 4 skills" is the report; "mostly fine" is not.
5. Fix
Only after reporting. Fix errors first, then warnings the user accepts.
- Never rename a skill directory or
namefield without asking. Callers, documentation, and/skill-nameinvocations depend on it. AS106 has two valid fixes — rename the directory or the field — and only the user knows which is correct. - Never invent content to satisfy a warning. A thin description (AS203) is fixed by learning what the skill actually does, not by padding it. If you cannot tell, ask.
- Re-run the validator after fixing and report the new counts. A fix that introduces a different violation is not a fix.
For description findings (AS203, AS204, AS205, AS206), rewriting well enough to
change triggering behavior is its own task — hand off to the
skill-description-tuning skill rather than guessing at wording.
Gotchas
These are the failures that recur, and the reasons the validator exists:
metadata: version: 1.0is a number, not a string. YAML parses unquoted1.0as a float, and the specification requires metadata values to be strings. Quote it:version: "1.0".allowed-toolsis space-separated, not a YAML list and not comma-separated.allowed-tools: Read Bash(git:*)is correct. A list silently changes the value's type.namemust match the parent directory exactly. This is the single most common hard violation, and it usually appears after a directory rename.- Character limits are on the field, not the line. A folded
>description is measured after folding — 1024 characters of prose, not 1024 per line. - Frontmatter must be the very first thing in the file. A leading blank
line, a BOM, or a comment above
---means no frontmatter is found at all, and the skill will not load. - A missing bundled file is an error, not a warning. A
references/<file>.mdthat does not exist fails at runtime, in the middle of a task, after the agent has already committed to the approach. - Write illustrative paths as placeholders. A literal-looking bundled path
in prose reads as a real reference to the validator — and to an agent. Use
angle brackets (
references/<name>.md) for examples; the validator skips them. - Paths into the user's project are not bundled files. The validator
deliberately does not check
.workspace/INDEX.mdor~/Downloads/data.csvfor existence. Do not "fix" those by creating files.
Validating this plugin's own skills
python3 scripts/validate_skill.py --strict ../
The validator is covered by fixtures with known defects. If you change it, run
python3 tests/run_tests.py from the repository root before reporting success.
What ships with it: 4 files
57.4 KB alongside SKILL.md, 1 of them executable
references/
- report-format.md3.7 KB
- rule-catalog.md13.1 KB
- spec-rules.md4.3 KB
scripts/
- validate_skill.pyruns36.2 KB