Triage
Confirmed on current main (c52b8d96e4b34201f19b5e5bb12c6b2a77bfaa9a). Distinct skills that share a name but come from different sources are not independently selectable, and the selected source/path is not preserved through dispatch.
This is not a hardcoded preference for official plugins. First matching name wins, so [plugin, personal] keeps the plugin and [personal, plugin] keeps the personal skill — matching the reporter’s Node check.
What the code does today
Picker collapses by name.
dedupeProviderSkillsByNameinpackages/client-runtime/src/providerSkills.tskeeps the first trimmed, case-insensitive name and ignorespath/scope. The same helper feeds the web$search (apps/web/src/providerSkillSearch.ts), the slash-menu skill list, and the mobile composer menu.Selection is name-only. Web (
ChatComposer.tsx) and mobile insert$${item.skill.name}. Menu row IDs areskill:${provider}:${skill.name}, which is why #8043 collapsed duplicates to restore unique highlight/scroll targets.Send does not bind a path. Codex
buildTurnStartParams(CodexSessionRuntime.ts) sends the prompt as{ type: "text" }only. There is no structured{ type: "skill", name, path }input. Claude dispatch (ClaudeSkillDispatch.ts) is also name-set based.
Source badges already exist via resolveProviderSkillSourceKind, and Codex skills/list already returns path + scope (kept on ServerProviderSkill). The identity is dropped in the picker and never rebound on send.
Related, not duplicates
- #8043 (merged) fixed duplicate menu IDs by assuming same-name definitions are interchangeable. That holds for the same skill mirrored in
.codexand.agents; it does not hold for unrelated personal vs plugin skills that happen to share a name. - #6095 is the broader “explicit
$skillis not bound as a Codex skill input” gap. Closed PRs #7196 / #9290 tried send-timeSkillUserInput. Even if Codex now loads$namefrom text (as discussed on #6095), two sources with the same name still cannot be chosen independently.
Suggested fix
- Deduplicate by path (or name + source), not name alone. Keep true same-path duplicates collapsed so #8043’s highlight/scroll fix stays intact.
- Give menu rows a stable unique id that includes path.
- Preserve the selected path through send (Codex structured skill input with
name+path; Claude needs an equivalent if same-name collisions exist there). - Keep source badges so the two rows are distinguishable.
Workaround until then: rename one skill (as the reporter did: standards-and-spec-review).
Type: bug (medium). Action: keep open; accepted for a path-aware identity + dispatch fix.