Skip to content

Folder-name slug collisions yield mangled '-ill-md' slugs and indistinguishable duplicate search rows (29 of 159 sampled) #25

Description

@Seitbekovvaa

Searching for ui ux design returns two rows that render identically, with nothing to tell them apart:

SKILL                                    CATEGORY        RATING
YPYT1/ui-ux-pro-max                      testing         ⭐ 6.0
YPYT1/ui-ux-pro-max                      testing         ⭐ 6.0

Reproducible on every run (3/3), via both skillx search "ui ux design" and GET /api/search?q=ui%20ux%20design.

They are not duplicates — they are two different skills that collided

The API returns 20 distinct slugs; the collision is in what gets displayed:

slug source_url created
ypyt1-ui-ux-pro-max …/All-skills/tree/main/skills/_local/clawd-skills/ui-ux-pro-max 2026-02-12T13:12:21Z
ypyt1-ui-ux-pro-max-ill-md …/All-skills/tree/main/skills/ui-ux-pro-max 2026-02-12T13:14:56Z

Both live in YPYT1/All-skills under folders named ui-ux-pro-max, at different depths. Registration two and a half minutes apart, i.e. one scan pass over the repo.

Root cause: the slug carries no path information

apps/web/app/lib/github/fetch-github-skill.ts:159

const slug = `${owner}-${skillName}`.toLowerCase();

where skillName is only the last path segment (fetch-github-skill.ts:149, and identically scan-github-repo.ts for the scan path, which takes the parent folder name). Two skills in one repo whose folders share a name therefore produce the same slug, and name + author — the two fields the table renders — are identical as well.

The second registration was given the suffix -ill-md, which looks like SKILL.md with its first two characters lost. I could not locate the code that produces that suffix, so I am reporting the string as observed rather than guessing at the mechanism — but whatever writes it, -ill-md is not a meaningful disambiguator, and it becomes part of the skill's permanent public identity.

Not an isolated record

Sampling the marketplace through /api/search across 8 queries (ui ux design, testing, react, database, security, documentation, agent, python) surfaced 159 distinct skills, of which 29 carry an -ill-md slug — roughly one in five. Examples:

hookvibe-ui-ux-pro-max-ill-md
jeremylongshore-cloud-security-posture-ill-md
jeremylongshore-database-schema-designer-ill-md
leenbaksh-database-skill-ill-md
practical-stack-meta-agent-ill-md

Creation timestamps for the mangled and the normal records span the same window (2026-02-12 – 2026-02-13), so this does not look like a single bad batch.

Impact

  • Search results contain rows a user cannot distinguish or choose between.
  • skillx use author/skill resolves two-part identifiers to the slug author-skill, so it silently reaches only whichever record won the clean slug; the other is addressable only by its mangled slug.
  • The mangled string is the skill's public identity — in URLs, in skillx use, and in anything that has already linked to it — so fixing it later is a rename with breakage attached.

Suggested direction

Derive the slug from the full skill path rather than the leaf segment (e.g. owner-skills-local-clawd-skills-ui-ux-pro-max vs owner-skills-ui-ux-pro-max), or keep the leaf and append the distinguishing path segment on collision. Either way the disambiguator should come from the path that actually differs, not from the filename. Rendering the distinguishing part of source_url in the results table would also let a user pick between two same-named skills.

Found while exercising the CLI against the live marketplace; slug construction verified against the repo at main.

Activity

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions