Rule reference
Every rule the validator checks.
Grouped by class, in the order the checker runs them. Each traces to the specification, a runtime’s own documentation, or a verified GitHub issue — check a real skill against them instead of reading the list cold.
Frontmatter structure
The file must open with a line containing only `---`, followed by YAML, followed by a closing `---`.
An opening `---` was found with no matching closing `---` line after it.
The block between the `---` delimiters is not valid YAML.
The frontmatter must be a YAML mapping (`key: value` pairs) at the top level, not a list or a scalar.
- WarningSKM-F05: Duplicate top-level key in frontmatter
The same key appears twice at the top level — YAML keeps only the last value, silently.
- WarningSKM-F06: Non-standard whitespace or characters in frontmatter
Tabs, a byte-order mark, or smart-quote characters were found in the frontmatter block.
The name field
`name` is one of the two required fields.
The specification caps `name` at 64 characters.
`name` may contain only lowercase letters, digits, and hyphens.
The specification forbids leading, trailing, and consecutive hyphens in `name`.
The spec requires `name` to match the folder the SKILL.md lives in — a mismatch is a silent failure.
The description field
`description` is the other required field, and the sole basis an agent uses to decide whether to load the skill.
The specification caps `description` at 1024 characters.
An empty description can't do the job of triggering the skill in any runtime.
The body
The specification recommends keeping SKILL.md under 500 lines and moving detail into `references/`.
The specification recommends keeping the activated body under roughly 5,000 tokens.
The rest of the field set
- WarningSKM-K01: Unknown top-level frontmatter field
This field isn't in the documented portable field set (name, description, license, compatibility, metadata, allowed-tools) or a known runtime extension.
- WarningSKM-K02: `metadata` is not a map of strings to strings
The specification defines `metadata` as a map of string keys to string values.
The specification caps `compatibility` at 500 characters.
Portability across runtimes
- PortabilitySKM-P01: `paths` is a Cursor-only field
`paths` scopes a skill to files matching glob patterns — it works only in Cursor, and it doesn't just get ignored elsewhere.
- PortabilitySKM-P02: `allowed-tools` is experimental
The specification marks `allowed-tools` experimental, with support that 'may vary between agent implementations.' Don't treat it as a security control.
Runs the skill as a forked subagent — a Claude Code mechanism with no equivalent elsewhere.
- PortabilitySKM-P04: `metadata.openclaw.*` / `command-dispatch` / `user-invocable` are OpenClaw-only fields
Dependency gating, tool-dispatch, and invocation controls specific to OpenClaw.
Conditional activation against available toolsets — a Hermes Agent mechanism.
Turns off automatic selection in Cursor, OpenClaw, and Claude Code. Codex uses a different mechanism entirely (`policy.allow_implicit_invocation` in `agents/openai.yaml`); Hermes documents nothing.
1,024 characters is the spec ceiling, but OpenClaw's own authoring guidance asks for under 160 and practical Claude Code reports suggest under 200 — a description written for the tightest constraint is safe everywhere.
Filename and directory
`SKILL.md` is case-sensitive on the filesystems that enforce it — `skill.md` is a documented cause of a skill silently never appearing.