skills: a duplicate skill name silently shadows the other, and the winner depends on walk order
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 45/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- typescript
Research direction
Start by reading src/opencode/skill/skill.ts around line 109 and then trace the workspace skill sync path mentioned in the issue. Establish and document the precedence rule before changing behavior; done means duplicate names are resolved deterministically and the collision is visible to the affected user.
Written by the indexing model from the issue text.
Description
Gap
Skills are registered in a flat map keyed on the skill's declared name
(src/opencode/skill/skill.ts:109). When two skills share a name the second overwrites
the first, and the only signal is a log.warn("duplicate skill name", …) that no user
sees.
// Warn on duplicate skill names
if (skills[parsed.data.name]) {
log.warn("duplicate skill name", { name, existing, duplicate })
}
The warning names both locations, so the information exists — it just never reaches
anyone, and nothing decides which skill should win.
Why this is reachable, not theoretical
Skill name uniqueness in the workspace is scoped per creator, not per tenant. Two
people in the same organisation can each own a skill called deploy, by design. The
skills a client syncs are the caller's own plus every organisation-visible one — so both
land in the same local snapshot, and the loader picks one arbitrarily.
Nobody sees a conflict. The author of the losing skill sees their skill "not working";
the winner sees nothing at all. Which one wins depends on filesystem walk order, so it
can differ between machines and between runs on the same machine.
This gets worse the moment publishing from the CLI exists (#1271), because sharing
skills is exactly what makes same-named skills common.
Suggested direction
Needs a decision on precedence before a fix. Reasonable ordering: a project-local skill
should beat a synced one (you can always override what the workspace gave you), and
between two synced skills, something stable and explicit rather than walk order.
Whatever the rule, the collision should be visible — a duplicate name is a state the
user can fix, and today they are not told it exists.
Found while reviewing the workspace skill sync path.
- Dominant language
- TypeScript
- Stars
- 813
- Forks
- 134
- Avg merge
- 2d 5h
- Merged PRs (30d)
- 62
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from AltimateAI/altimate-code
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
AltimateAI/altimate-code#1323 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
AltimateAI/altimate-code#1288 ·
-
Difficulty 1/5 Under an hour Newbie friendliness 92/100
AltimateAI/altimate-code#1285 ·
-
privacy: Altimate Base consent dialog no longer discloses persistent per-installation identifier Open
Difficulty 1/5 Under an hour Newbie friendliness 88/100
AltimateAI/altimate-code#1284 ·
-
Difficulty 2/5 Under an hour Newbie friendliness 72/100
AltimateAI/altimate-code#1283 ·
All issues in AltimateAI/altimate-code
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
Eynzof/Hermes-CN-Desktop#610 ·
-
bug clawsweeper:linked-pr-open clawsweeper:needs-live-repro clawsweeper:no-new-fix-pr impact:message-loss issue-rating: 🐚 platinum hermit P2 regression
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
calcite-components needs triage refactor
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Esri/calcite-design-system#15203 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
danielmiessler/LifeOS#2218 ·