Skip to content

Integrate and verify the skill-catalog candidate filter on GitHub main #65

Open

Description

@ligon

Observed (2026-10-23)

A live Claude session on ln002 (the SuCoder mirror) reported that the last entry in its injected SKILL CATALOG is

- SKILLS (load with Read tool: /global/home/users/ligon/.sucoder/skills/SKILLS.md)

This entry has no description. It points at the catalog's own index, not at a skill. The other entries, including nested ones like orgmode/semantic-line-breaks, are fine. This was found while verifying sucoder-skills issue 3.

Cause (reproduced locally against current main)

MirrorManager._parse_skill_catalog treats the first word of every - bullet as a candidate path. The catalog's prose section has two such bullets about project-local skills:

- LSMS_Library: `add-wave`, `add-feature` (and its sub-skills) live in `LSMS_Library/.claude/skills/`.
- ligon.github.io: `add-paper` lives in `ligon.github.io/.claude/skills/`.

LSMS_Library: and ligon.github.io: don't exist. _normalize_skill_file_path returns None for both. _normalize_catalog_path then resolves each one to the catalog file itself (…/sucoder-skills/SKILLS.md), so both produce a single deduplicated reference to SKILLS.md, which is rendered as a skill.

refs = m._parse_skill_catalog(cat, cat.read_text())
# non-skill ref: /home/ligon/Projects/sucoder-skills/SKILLS.md
# "LSMS_Library:"    -> _normalize_catalog_path -> .../SKILLS.md
# "ligon.github.io:" -> _normalize_catalog_path -> .../SKILLS.md

Suggested fix

  • Drop bad candidates. When a bullet candidate doesn't resolve to an existing path, skip it instead of falling back to a catalog path. At minimum, skip any reference equal to the catalog being parsed.
  • Possibly: only take bullet candidates that look like paths (contain / or end in .md), keeping file: links as the explicit form.
  • Test: add one using the two prose bullets above.

Related: issue 57, which covers the catalog listing paths without checking they exist on the consuming host.

Remaining scope — 2026-10-30

Local commit c9dafdb contains the candidate/self-catalog filter and targeted prose-bullet regressions. It is absent from GitHub main 52cc04f, whose parser still falls back through the catalog normalizer for bare bullet candidates. No open PR was found for this delivery.

Next: review and integrate that existing correction through a focused PR, then run the catalog tests against the integrated source and verify the original prose-bullet reproduction. Preserve explicit file links and nested skill entries. This issue stays open for delivery and verification; the broader consuming-host existence checks remain issue 57.

Delivery update — 2026-10-30

PR 86 delivers the existing c9dafdb correction on current main, plus an independently identified extension-fallback compatibility correction. The original bogus-catalog regression fails on unchanged main and passes with the patch. Both cross-extension cases fail on the original correction and pass after its candidate check is aligned with the shared normalizer; the extensionless control remains valid. All 266 mirror tests pass against the intended worktree. Independent source re-review confirms the compatibility gap resolved. Shared normalizers, explicit links and issue 57's consuming-host policy remain separate.

Keep open pending PR integration. After merge, verify the integrated catalog reproduction/test on main before closure. The ledger and PR retain verification commands and evidence locations; no installed CLI deployment was performed.

Activity

  1. changed the title [-]Skill catalog lists SKILLS.md itself as a skill (bullet prose resolves to the catalog file)[/-] [+]Integrate and verify the skill-catalog candidate filter on GitHub main[/+] on Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions