Skip to content

fix(symlink-lint): self-adoption relays drift from skills/ — two skills unreachable, no completeness rule #1137

Description

@dpol1

What

The self-adoption relay directories have drifted out of sync with skills/. The source tree has 71 skill directories; the relays don't:

dir count missing
skills/ 71
.agents/skills/ 70 magpie-dependency-license-audit
.claude/skills/ 70 magpie-dependency-license-audit
.github/skills/ 70 magpie-dependency-license-audit
.kiro/skills/ 69 magpie-dependency-license-audit, magpie-report-framework-issue

plugins/magpie-repo-health/ and plugins/magpie-utilities/ carry both skills correctly — only the relay surface drifted.

comm -23 <(ls skills | grep -v pyproject | sort) \
         <(ls .kiro/skills | sed 's/^magpie-//' | sort)
# dependency-license-audit
# report-framework-issue

Why it matters

A skill with no relay is invisible to every harness that discovers skills through its agent dir — which is exactly the surface self-adoption exists for. dependency-license-audit shipped in #814 with an eval suite and a plugin entry, and has been unreachable from the agent dirs ever since; nobody noticed.

Nothing catches this. symlink-lint validates the symlinks that exist (no cycles, relay-through-canonical) but has no completeness rule, so a skill that never got its links is never flagged. prek and CI are green on this tree. The same failure class already bit once on the plugin surface (#1109, a new skill missing from plugins/) and got a deterministic check there (check-family-plugins); the relay surface has no equivalent, so this will recur the next time a skill lands without its symlinks.

Suggested fix

Two pieces, in order:

  1. Wire the missing links — canonical .agents/skills/magpie-<skill> entries for the two skills, plus the relays in every wired agent dir.
  2. Add a completeness rule to symlink-lint — every directory under skills/ must have its canonical .agents/skills/magpie-<skill> entry, and every wired agent dir must relay the full canonical set — with a test. Scoped to the framework's own working tree, so an adopter's legitimately-dangling links stay exempt exactly as they are for rules 1–2 today.

Worth doing as one change so the lint lands together with the last drift it would have caught.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions