skill: fix unloadable SKILL.md frontmatter, and test it in CI

The description was an unquoted YAML scalar containing "trust layer:
equivalence" — a colon-space inside a plain scalar makes YAML parse it as a
nested mapping, so the frontmatter raised "mapping values are not allowed in
this context" and the skill would not load at all.

Quoted the scalar and replaced the colon with an em dash.

The real defect is that CI asserted the preflight script's behavior but never
checked that the skill it ships is loadable. Added a step that parses the
frontmatter, requires name/description to be non-empty strings, and requires
name to match the directory — so an unloadable skill fails the build instead
of failing the user.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 13:59:59 -04:00
co-authored by Claude Opus 4.8
parent 85eaf43dfe
commit db5caf0b5d
2 changed files with 18 additions and 1 deletions
+17
View File
@@ -105,6 +105,23 @@ jobs:
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: SKILL.md frontmatter is loadable
run: |
python3 - <<'PY'
import sys, yaml, pathlib
p = pathlib.Path(".claude/skills/peltier/SKILL.md")
text = p.read_text(encoding="utf-8")
if not text.startswith("---\n"):
sys.exit("SKILL.md must open with a --- frontmatter block")
fm = yaml.safe_load(text.split("---", 2)[1]) # raises on malformed YAML
for key in ("name", "description"):
if not isinstance(fm.get(key), str) or not fm[key].strip():
sys.exit(f"frontmatter '{key}' must be a non-empty string")
if fm["name"] != p.parent.name:
sys.exit(f"frontmatter name '{fm['name']}' != directory '{p.parent.name}'")
print(f"frontmatter OK: name={fm['name']}, description={len(fm['description'])} chars")
PY
- name: Preflight resolves inside a peltier checkout
run: |
sh .claude/skills/peltier/scripts/preflight.sh | tee /tmp/pf.txt