[BUG] User-scoped skill duplicated in slash-command autocomplete (survives full reboot)
Description
A single user-scoped skill (~/.claude/skills/tri-audit/SKILL.md, name: tri-audit) shows up twice as identical entries in the /tri-audit slash-command autocomplete, both labeled (user), plus a third correct entry for the associated [dynamic workflow]. Expected: one skill entry + one workflow entry (2 total). Actual: 3 entries (2 duplicate skill rows + 1 workflow row).
The duplication persists across:
- Closing all terminals/sessions
- A full OS reboot (macOS)
Investigation done (ruling out a real duplicate installation)
I did an exhaustive filesystem/config audit and found no duplicate files or registrations anywhere:
grep -rl "^name: tri-audit" ~/.claude/skills→ exactly one match:~/.claude/skills/tri-audit/SKILL.md- No nested/second
SKILL.mdinside that skill folder - No case-duplicate or trailing-space folder under
~/.claude/skills/ - No project under
~/Documents/**(checked ~30 project.claude/dirs) has a local copy ofskills/tri-audit,workflows/tri-audit.js,agents/auditor-claude.md, orhooks/verify-handoff.sh ~/.claude/settings.json/settings.local.jsonhave noadditionalDirectoriesor duplicate plugin/skill path config~/.claude/plugins/installed_plugins.jsonandknown_marketplaces.json— no plugin named/providingtri-audit~/.claude.json— only two harmless occurrences of the stringtri-audit(a project path key and a usage-count stat), no duplicated skill-registry entry- Only one CLI binary version is active (
2.1.220), no parallel npm/brew install, no strayclaudealias - No lingering Claude Code daemon/process survives the reboot that could be caching a stale in-memory registry (
~/.claude/daemon/roster.jsonrefers to sessions that no longer have running PIDs after reboot;launchctl listshows no Claude Code CLI agent, only the unrelated Claude desktop app)
Given a genuinely single skill file on disk, with no other config path capable of registering it a second time, this looks like a client-side bug in how the slash-command picker renders/dedupes skill entries — not a duplicate-installation problem on the user's machine.
Skill frontmatter (for repro)
---
name: tri-audit
description: Orquestador de la metodología de 3 IAs (Claude Code + Codex + Gemini vía API key) por fases. Invocar con /tri-audit [objetivo] — detecta sola la siguiente fase pendiente leyendo .audit/estado.md. También acepta /tri-audit <numero 0-10> para forzar una fase. Ejecuta UNA fase, deja handoff en .audit/ y se detiene.
disable-model-invocation: true
argument-hint: "[objetivo] ó <fase 0-10> [objetivo]"
---
The skill is paired with a native workflow at ~/.claude/workflows/tri-audit.js (registered separately and correctly shown once, as [dynamic workflow]).
Steps to reproduce
- Install a user-scoped skill under
~/.claude/skills/<name>/SKILL.mdwith frontmatter includingdisable-model-invocation: trueandargument-hint: "...", paired with a same-named workflow file under~/.claude/workflows/<name>.js. - Open Claude Code CLI in any project.
- Type
/tri-audit(or the equivalent skill name) in the prompt. - Observe the autocomplete list.
Expected behavior
One row for the skill ((user) scope) + one row for the workflow ([dynamic workflow]) = 2 entries total.
Actual behavior
The skill row is duplicated verbatim (identical description text, same (user) scope label) = 3 entries total.
Environment
- Claude Code version: 2.1.220
- OS: macOS (Darwin 25.6.0)
- Install method: native binary under
~/.local/share/claude/versions/ - Only one binary on PATH (
which -a clauderesolves to a single path)
Screenshot
Attached separately by the reporter — shows the slash-command autocomplete for /tri-audit with the duplicate rows described above.