Derives the model-facing tool name for an operation from its DXN key — never from meta.name,
which is display copy and must stay freely editable without renaming the tool the model calls.
The key's namespace segment prefixes the name, which is what removes the cross-skill collisions
that a bare verb produced (three skills each claimed create).
The mapping is not injective: kebab-casing makes a camelCase segment and an already-hyphenated one
converge, so webSearch and web-search both yield web-search, and hyphenated segments are in
live keys (plugin-crm, web-search). Registry-key uniqueness therefore does not by itself
guarantee tool-name uniqueness. Two such keys are an authoring error, caught in the two places both
keys are visible at once: findToolNameCollisions over a whole set, and the tool resolver.
Derives the model-facing tool name for an operation from its DXN key — never from
meta.name, which is display copy and must stay freely editable without renaming the tool the model calls. The key's namespace segment prefixes the name, which is what removes the cross-skill collisions that a bare verb produced (three skills each claimedcreate).The mapping is not injective: kebab-casing makes a camelCase segment and an already-hyphenated one converge, so
webSearchandweb-searchboth yieldweb-search, and hyphenated segments are in live keys (plugin-crm,web-search). Registry-key uniqueness therefore does not by itself guarantee tool-name uniqueness. Two such keys are an authoring error, caught in the two places both keys are visible at once: findToolNameCollisions over a whole set, and the tool resolver.