[BUG] User-scoped skill duplicated in slash-command autocomplete (survives full reboot)

Status Open
Reported on v2.1.220
Maintainer reply None cached
Activity 0 comments · opened Jul 29, 2026

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.md inside 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 of skills/tri-audit, workflows/tri-audit.js, agents/auditor-claude.md, or hooks/verify-handoff.sh
  • ~/.claude/settings.json / settings.local.json have no additionalDirectories or duplicate plugin/skill path config
  • ~/.claude/plugins/installed_plugins.json and known_marketplaces.json — no plugin named/providing tri-audit
  • ~/.claude.json — only two harmless occurrences of the string tri-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 stray claude alias
  • No lingering Claude Code daemon/process survives the reboot that could be caching a stale in-memory registry (~/.claude/daemon/roster.json refers to sessions that no longer have running PIDs after reboot; launchctl list shows 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

  1. Install a user-scoped skill under ~/.claude/skills/<name>/SKILL.md with frontmatter including disable-model-invocation: true and argument-hint: "...", paired with a same-named workflow file under ~/.claude/workflows/<name>.js.
  2. Open Claude Code CLI in any project.
  3. Type /tri-audit (or the equivalent skill name) in the prompt.
  4. 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 claude resolves to a single path)

Screenshot

Attached separately by the reporter — shows the slash-command autocomplete for /tri-audit with the duplicate rows described above.

View original on GitHub ↗