45d9c33d85
hermes skills install impeccable (and the docs-page install button) now installs the impeccable frontend-design skill as an official optional-skills entry. The local optional-skills/creative/impeccable/ dir is a catalog STUB: its frontmatter declares metadata.hermes.upstream (repo + path), and OptionalSkillSource.fetch() pulls the real 163-file bundle live from pbakaus/impeccable:.hermes/skills/impeccable — the Hermes-native bundle upstream maintains and verifies. Nothing vendored, never stale. New mechanism (generic, not impeccable-specific): - OptionalSkillSource._upstream_pointer(): parses/validates the upstream pointer (owner/name repo, clean relative path, traversal rejected). - _fetch_from_upstream(): delegates to GitHubSource.fetch(), relabels the bundle official/<rel> at trust 'trusted' (curated endorsement, but third-party content — dangerous scan verdicts still block). - The live-repo fallback path redirects stubs the same way, so stale local checkouts behave identically. Three real gaps this surfaced, all fixed: - GitHubSource.fetch() only downloaded SKILL.md plus paths linked from a canonical support dir (references/, scripts/, ...). Impeccable keeps its playbooks under reference/ (singular) and links scripts only from reference files, so fetch shipped 1 of 163 files. fetch() now downloads the full skill directory via the git tree (same approach as the optional-skills live fetch), still rejecting symlinks/hidden/unsafe paths and still failing on a missing SKILL.md-linked references/ path. - The five env_exfil_* scanner patterns flagged loopback requests as critical exfiltration: impeccable's live mode polls http://localhost:PORT/status?token=TOKEN and scored two CRITICALs. Scheme-anchored loopback exemption added; evil.com/?u=localhost decoys still fire (10-case regex matrix in tests). - unified_search() truncated to limit before ranking, so official catalog entries got crowded out by skills.sh mirrors and bare-name installs stalled on an ambiguity table. Results now stable-sort by trust rank before the cut, and _resolve_short_name prefers a sole official exact match over community mirrors. Also fixes pre-existing test pollution: TestInstallPathSafety's fixture monkeypatched the PEP 562 dynamic SKILLS_DIR, permanently shadowing dynamic resolution and breaking the served_repo E2E tests in any combined run (reproducible on main). Validation: live E2E do_install("impeccable") against real GitHub — resolves to official/creative/impeccable, verdict SAFE, 163 files on disk, skill loads, /impeccable slash command registers. 128/128 targeted tests; full-dir fetch test sabotage-verified. Docs: optional-skills catalog row, generated skill page, sidebar.