- discover-skills.ts: discoverSectionTemplates() scans <skill>/sections/*.md.tmpl
- gen-skill-docs.ts: extract resolvePlaceholders + applyHostRewrites + buildContext
as shared helpers (processTemplate and the new processSectionTemplate both call
them, so a sanitization/rewrite fix can't miss sections) [C1]
- processSectionTemplate: body-fragment generation (no frontmatter/catalog/voice),
parent-skill TemplateContext (skillName pinned to parent, not 'sections', so
appliesTo gating + tier behave identically), per-host output routing
- --host all now fails the build on ANY host failure, not just claude, so a stale
external-host output can't slip the freshness gate [Codex outside-voice #9]
Inert until a skill is carved (no sections/ dirs exist yet). Refactor is
output-neutral: gen:skill-docs --dry-run --host all reports 0 STALE.
5 discovery unit tests + 389 gen-skill-docs tests green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>