{"record":{"id":"f89612fe41967aaf","repo":"conductor-oss/conductor","slug":"invalid-skill-name-name-use-1-128-characters","errorCode":null,"errorMessage":"Invalid skill name '{name}'. Use 1-128 characters: letters, numbers, '.', '_' or '-'.","messagePattern":"Invalid skill name '(.+?)'\\. Use 1-128 characters: letters, numbers, '\\.', '_' or '-'\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/service/SkillRegistryService.java","lineNumber":932,"sourceCode":"    private String normalizeEntryName(String name) {\n        String normalized = name.replace('\\\\', '/');\n        while (normalized.startsWith(\"./\")) {\n            normalized = normalized.substring(2);\n        }\n        if (normalized.isBlank() || normalized.startsWith(\"/\") || normalized.contains(\"\\0\")) {\n            throw new IllegalArgumentException(\"Invalid skill package path: \" + name);\n        }\n        for (String part : normalized.split(\"/\")) {\n            if (part.isBlank() || \".\".equals(part) || \"..\".equals(part)) {\n                throw new IllegalArgumentException(\"Invalid skill package path: \" + name);\n            }\n        }\n        return normalized;\n    }\n\n    private void validateSkillName(String name) {\n        if (!SKILL_NAME_PATTERN.matcher(name).matches()) {\n            throw new IllegalArgumentException(\n                    \"Invalid skill name '\"\n                            + name\n                            + \"'. Use 1-128 characters: letters, numbers, '.', '_' or '-'.\");\n        }\n    }\n\n    private void validateVersion(String version) {\n        if (!VERSION_PATTERN.matcher(version).matches()) {\n            throw new IllegalArgumentException(\n                    \"Invalid skill version '\"\n                            + version\n                            + \"'. Use 1-128 characters: letters, numbers, '.', '_', '+', or '-'.\");\n        }\n    }\n\n    private String sha256Hex(byte[] bytes) {\n        try {\n            MessageDigest digest = MessageDigest.getInstance(\"SHA-256\");","sourceCodeStart":914,"sourceCodeEnd":950,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/service/SkillRegistryService.java#L914-L950","documentation":"validateSkillName throws when the skill name does not fully match `[A-Za-z0-9._-]{1,128}` — i.e. it contains characters outside the allowed set (spaces, slashes, colons, Unicode) or is longer than 128 characters. Names are used as opaque identifiers and in `name@version` keys, so the charset is locked down.","triggerScenarios":"Publishing or updating a skill whose `name` field is, for example, `my skill` (space), `My/Skill` (slash), `café` (non-ASCII), or longer than 128 chars. The pattern.matches() call returns false.","commonSituations":"Author used a human-friendly display name with spaces as the identifier; copy-pasted a title with special punctuation; name accidentally includes a trailing newline or whitespace.","solutions":["Use a lowercase kebab-case identifier: `my-skill`, `image-resizer-v2`.","Trim whitespace and remove disallowed characters.","Keep the human-readable title in the `description`/`title` field, not the name."],"exampleFix":"// before\nname: \"My Cool Skill!\"\n// after\nname: \"my-cool-skill\"\ntitle: \"My Cool Skill\"","handlingStrategy":"validation","validationCode":"private static final Pattern SKILL_NAME = Pattern.compile(\"[A-Za-z0-9._-]{1,128}\");\nboolean isValidSkillName(String name) {\n    return name != null && SKILL_NAME.matcher(name).matches();\n}","typeGuard":"boolean isSkillName(String s) {\n    return s != null && Pattern.compile(\"[A-Za-z0-9._-]{1,128}\").matcher(s).matches();\n}","tryCatchPattern":"try { skillRegistry.validateName(name); }\ncatch (IllegalArgumentException e) { return badRequest(e.getMessage()); }","preventionTips":["Use lowercase-kebab-case identifiers (`my-skill`).","Keep the human title in a separate field, not the name.","Validate names client-side before submit."],"tags":["skill-registry","naming","validation","metadata"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}