[BUG] Mid-line `...` in skill frontmatter `description` silently breaks parsing (valid YAML; falls back to body text)
Summary
A mid-line ... (three dots) inside a skill's frontmatter description silently breaks frontmatter parsing. The skill still loads and is invokable, but its description is treated as omitted: the skill listing / slash-menu tooltip falls back to the first paragraph of the markdown body (or shows nothing when the body is empty). No warning or error is emitted anywhere.
Per the YAML spec, ... is the document-end marker only at the start of a line; mid-line it is legal plain-scalar content. PyYAML parses the exact same frontmatter without error, so external YAML lint passes while Claude Code's parser rejects it — which makes this footgun effectively undiagnosable without trial-and-error bisection (we got there by stripping the file down to frontmatter-only and toggling single tokens).
Reproduction
~/.claude/skills/repro-dots/SKILL.md:
---
name: repro-dots
description: Saves stage versions V0 manually, V1/V2/... automatically at the end of every round.
---
First body paragraph that should NOT be the description.
- Start Claude Code (observed on the desktop app; CLI
claude --version= 2.1.169) or run/reload-skills. - Type
/repro-dotsand hover the entry in the slash menu, or ask the model "what skills are available".
Actual: the tooltip/listing shows "First body paragraph that should NOT be the description." — the documented fallback for an omitted description. With an empty body, no description is shown at all. No parse warning anywhere.
Expected: the description string parses (it is valid YAML — ... is mid-line, not a document-end marker) and is shown; or, if Claude Code's parser intentionally rejects it, a visible warning naming the file and the offending token.
Change V1/V2/... to V1/V2/etc. — everything works, byte-for-byte otherwise identical.
Evidence that the description line itself is what fails
- Body stripped to nothing (frontmatter-only file): no description shown at all.
- Same file, short ASCII description: shown correctly.
- Full original description with only
...→etc.changed: shown correctly. allowed-tools(space-separated / quoted string / YAML list) and a dynamic-context `!cmd` injection in the body were all independently toggled and are unrelated.python3 -c "import yaml; yaml.safe_load(open('SKILL.md').read().split('---',2)[1])"parses the failing frontmatter cleanly.
Spec reference
YAML 1.2 c-document-end is a line-start production (---/... rules in §9.1); a plain scalar may contain ... mid-line. The parser appears to treat ... as document-end regardless of position.
Impact
- Model-side skill discovery degrades silently (the description is the activation surface; the fallback body text is usually a poor trigger signal).
- The failure mode masquerades as the documented "description omitted" fallback, so authors look for missing fields rather than a parse error.
Related (adjacent but distinct)
- #9817 (frontmatter formatting sensitivity, general footgun)
- #11322 (multi-line wrapped descriptions — different trigger, same silent-failure class)
- #10589 / #12971 (block-scalar handling — different trigger)
Environment
- Claude Code 2.1.169 (observed via the macOS desktop app; reproduced across full app restarts and
/reload-skills) - macOS (Darwin 25.5.0)
- Personal skills at
~/.claude/skills/
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗