Problem
exposeNativeSkillAliases throws when a desired skill name collides with an existing non-symlink entry in the alias root (src/runtimes/skill-materialization.ts:166-168); it likewise throws if .agents exists as a non-directory (:76-87).
The alias root (<sharedRootPath>/.agents/skills/) lives in the shared, persistent org root and is agent-facing: provider CLIs discover and can create skills there. Nothing stops an agent — or a user, via the provider CLI's own skill-creation flow — from creating a real directory at .agents/skills/<name>. When the org later distributes a catalog skill with the same name (the driver's name pattern ^[a-z0-9-]+$ matches typical agent-created skill names), every session in that org fails at bootstrap.
Reproduction
- In an org's shared root:
mkdir -p .agents/skills/foo (what a provider CLI's skill scaffolding would do).
- Distribute a catalog skill named
foo to that org.
- Start any session in the org → bootstrap throws
collides with an existing path; every subsequent session fails the same way. No recovery short of manual filesystem intervention.
Impact
Persistent, org-wide denial of service triggered by a plausible, non-malicious action.
Proposed direction
Degrade per-skill instead of failing the boot: skip the colliding skill's native alias, surface a warning in diagnostics, and keep prompt-injected exposure working. Optionally quarantine/rename the conflicting path when ownership is clear.
Acceptance criteria
- A colliding path disables only that skill's native alias; the session starts.
- The conflict is visible in diagnostics.
Problem
exposeNativeSkillAliasesthrows when a desired skill name collides with an existing non-symlink entry in the alias root (src/runtimes/skill-materialization.ts:166-168); it likewise throws if.agentsexists as a non-directory (:76-87).The alias root (
<sharedRootPath>/.agents/skills/) lives in the shared, persistent org root and is agent-facing: provider CLIs discover and can create skills there. Nothing stops an agent — or a user, via the provider CLI's own skill-creation flow — from creating a real directory at.agents/skills/<name>. When the org later distributes a catalog skill with the same name (the driver's name pattern^[a-z0-9-]+$matches typical agent-created skill names), every session in that org fails at bootstrap.Reproduction
mkdir -p .agents/skills/foo(what a provider CLI's skill scaffolding would do).footo that org.collides with an existing path; every subsequent session fails the same way. No recovery short of manual filesystem intervention.Impact
Persistent, org-wide denial of service triggered by a plausible, non-malicious action.
Proposed direction
Degrade per-skill instead of failing the boot: skip the colliding skill's native alias, surface a warning in diagnostics, and keep prompt-injected exposure working. Optionally quarantine/rename the conflicting path when ownership is clear.
Acceptance criteria