Rules

July 6, 2026 ยท View on GitHub

Rule codes are stable: never renumbered, never recycled. Codes and kebab-case aliases are interchangeable in config and CLI flags.

Severity tiers: error = skills-ref 0.1.0 strict parity, warning = beyond-parity + client-guide lenient tier, info = advisory, never gates CI.

CodeAliasSeverityLenientFixableSummary
SC001skill-md-missingerrorerror-Skill directory must contain SKILL.md
SC002frontmatter-missingerrorerror-SKILL.md must start with YAML frontmatter
SC003frontmatter-unclosederrorerror-Frontmatter must be closed with ---
SC004frontmatter-invalid-yamlerrorerror-Frontmatter must be valid strict YAML
SC005frontmatter-not-mappingerrorerror-Frontmatter must be a YAML mapping
SC006name-missingerrorerror-name is required
SC007description-missingerrorerror-description is required
SC008name-emptyerrorerror-name must be a non-empty string
SC009name-too-longerrorwarning-name must be at most 64 characters
SC010name-not-lowercaseerrorerrorsafename must be lowercase
SC011name-edge-hyphenerrorerrorsafename cannot start or end with a hyphen
SC012name-consecutive-hyphenserrorerrorsafename cannot contain consecutive hyphens
SC013name-invalid-charserrorerror-name may only contain letters, digits, and hyphens
SC014name-dir-mismatcherrorwarning-directory name must match skill name
SC015description-emptyerrorerror-description must be a non-empty string
SC016description-too-longerrorerror-description must be at most 1024 characters
SC017compatibility-invaliderrorerror-compatibility must be a string of at most 500 characters
SC018unknown-frontmatter-fielderrorwarning-frontmatter field is not in the spec or a known extension
SC019metadata-not-string-mapwarningwarning-metadata should be a string-to-string map
SC020skill-md-lowercase-filenamewarningwarningsafeskill.md found; canonical filename is SKILL.md
SC021unquoted-colon-descriptionwarningwarningsafeunquoted colon in name/description value breaks lenient parsers
SC101broken-relative-referencewarningwarning-referenced bundled file does not exist
SC102absolute-path-referencewarningwarning-body references an absolute path
SC103deep-reference-chaininfoinfo-bundled reference chains deeper than one level
SC104unreferenced-bundled-fileinfoinfo-bundled file never referenced from SKILL.md
SC105duplicate-skill-namewarningwarning-two skills resolve to the same name
SC106non-utf8-encodingwarningwarning-SKILL.md is not valid UTF-8
SC107hidden-unicodewarningwarningunsafezero-width or bidi control characters present
SC108legacy-basedir-placeholderwarningwarningsafedeprecated {baseDir} placeholder
SC201body-emptywarningwarning-SKILL.md body is empty
SC202body-too-many-lineswarningwarning-body exceeds 500 lines
SC203body-too-many-tokenswarningwarning-body exceeds ~5000 tokens
SC301extension-fieldwarningwarning-client extension field (fails strict skills-ref validation)
SC302extension-invalid-valuewarningwarning-extension field has an invalid value
SC401evals-invaliderrorerror-evals/evals.json fails schema or semantic validation
SC402evals-advisorywarningwarning-evals/evals.json advisory (coverage gaps)

Profiles

  • --profile strict (default): full skills-ref parity. SC009 (name-too-long), SC014 (name-dir-mismatch), and SC018 (unknown-frontmatter-field) are errors.
  • --profile lenient: client-implementation-guide behavior -- those three downgrade to warnings (clients warn and load anyway). Missing description and broken YAML stay fatal in both profiles.

Suppressions

Override any rule in skillcheck.config.json:

{
  "rules": {
    "SC104": "off",
    "extension-field": "error"
  }
}