Read <skillDir>/SKILL.md and return its declaration as checks.
Two states are FINDINGS rather than empty contracts, and both return a
surface that FAILS instead of passing vacuously:
undeclared — no allowed-tools: line, so nothing was claimed and there
is no surface for a run to stay inside. Silently reporting "no violations"
would present the widest possible capability surface as the cleanest one.
malformed — a frontmatter block that is not valid YAML. A strict
loader rejects it, so the declared list is unknown, not empty; a regex
salvage of it would be a guess. A declaration that does not parse is not an
enforcement. (Observed live: a single unquoted : inside the description
silently voided a skill's whole tool contract.)
Read
<skillDir>/SKILL.mdand return its declaration as checks.Two states are FINDINGS rather than empty contracts, and both return a
surfacethat FAILS instead of passing vacuously:undeclared— noallowed-tools:line, so nothing was claimed and there is no surface for a run to stay inside. Silently reporting "no violations" would present the widest possible capability surface as the cleanest one.malformed— a frontmatter block that is not valid YAML. A strict loader rejects it, so the declared list is unknown, not empty; a regex salvage of it would be a guess. A declaration that does not parse is not an enforcement. (Observed live: a single unquoted:inside the description silently voided a skill's whole tool contract.)