---
name: /plugin says "not installed" — triage order
description: Real causes of Claude Code reporting a marketplace plugin as not-installed; install-path separator was a red herring, YAML frontmatter validation is the usual culprit
type: project
originSessionId: d0c561c0-d1ff-4f8e-ba63-08e62c7ecc8a
---
If `/plugin` reports a plugin as not installed (or refuses update/uninstall) but `installed_plugins.json` clearly lists it, diagnose in this order:

**1. Run `claude plugin validate <cache-path>` first.** Claude Code silently marks plugins with broken skill frontmatter as orphaned — `.orphaned_at` gets re-stamped on every session start, and `/plugin` then treats the install as unusable. On 2026-04-18 spt had `argument-hint: [<id>] | --all` in two skills — YAML parsed `[<id>]` as a flow sequence then choked on the trailing `|`. Quoting the value (`"[<id>] | --all"`) fixed it and `/plugin` immediately recognized the install. Any skill-frontmatter issue can trigger the same symptom.

**2. Then check `claude plugin list --json`.** If it returns `[]` despite `installed_plugins.json` having entries, the state is corrupted; `claude plugin install <name>@<marketplace>` reinstalls from the marketplace clone and rewrites the manifest cleanly without needing manual JSON edits.

**3. Check for a rogue `~/.claude/plugins/<name>/` dir.** A legacy manual-install directory coexisting with the marketplace cache entry makes Claude Code see two plugins with the same name. Remove it (`rm -rf`). DEPLOY.ps1 step 7 now auto-cleans this on every marketplace deploy.

**4. `.orphaned_at` markers alone are not diagnostic.** Every cached version gets one; they're Claude Code's GC flag. What matters is whether the marker's mtime is *fresh* — if Claude Code re-stamps it on every session, the plugin is being actively rejected (usually validation, see step 1).

**5. installPath separator style is not the cause.** DEPLOY.ps1 briefly wrote forward slashes for spt while every other plugin used backslashes — this looked suspicious but Claude Code handles both. The fix in commit `819baf9` is still correct for consistency, but don't chase it as the primary cause.

**Why this matters:** The script's manual JSON-patching of `installed_plugins.json` (DEPLOY.ps1 step 9) is fragile — on 2026-04-18 it threw a PowerShell JavaScriptSerializer circular-reference error and left installed_plugins.json stale after a marketplace push. Prefer `claude plugin install <name>@<marketplace>` from the CLI as the canonical state-update path — it's what Claude Code uses internally.
