{"record":{"id":"023e103e89f2901b","repo":"conductor-oss/conductor","slug":"invalid-skill-version-version-use-1-128-chara","errorCode":null,"errorMessage":"Invalid skill version '{version}'. Use 1-128 characters: letters, numbers, '.', '_', '+', or '-'.","messagePattern":"Invalid skill version '(.+?)'\\. 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":941,"sourceCode":"            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\");\n            return hex(digest.digest(bytes));\n        } catch (Exception e) {\n            throw new IllegalStateException(\"SHA-256 digest is unavailable\", e);\n        }\n    }\n\n    private static String hex(byte[] bytes) {\n        StringBuilder sb = new StringBuilder(bytes.length * 2);\n        for (byte b : bytes) {","sourceCodeStart":923,"sourceCodeEnd":959,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/service/SkillRegistryService.java#L923-L959","documentation":"validateVersion throws when the version string does not fully match `[A-Za-z0-9._+-]{1,128}`. SemVer-style versions (`1.0.0`, `2.5.0-beta+build.7`) are accepted because dots, plus, and hyphen are allowed; rejected versions contain spaces, slashes, colons, or other punctuation.","triggerScenarios":"Publishing a skill whose `version` is `1.0.0 (latest)`, `v1/2`, `1.0.0^`, or longer than 128 chars. The VERSION_PATTERN.matcher().matches() returns false.","commonSituations":"Author added a friendly suffix in parens; included a caret from npm-style ranges; pasted a build URL into the version field.","solutions":["Use a SemVer string: `1.0.0`, `2.0.0-rc1`, `1.5.2+build.42`.","Move descriptive labels into a separate `label`/`description` field.","Trim leading `v` only if your tooling rejects it (the pattern allows `v`, so usually unnecessary)."],"exampleFix":"// before\nversion: \"1.0.0 (stable)\"\n// after\nversion: \"1.0.0\"\nlabel: \"stable\"","handlingStrategy":"validation","validationCode":"private static final Pattern SKILL_VER = Pattern.compile(\"[A-Za-z0-9._+-]{1,128}\");\nboolean isValidVersion(String v) {\n    return v != null && SKILL_VER.matcher(v).matches();\n}","typeGuard":"boolean isSkillVersion(String s) {\n    return s != null && Pattern.compile(\"[A-Za-z0-9._+-]{1,128}\").matcher(s).matches();\n}","tryCatchPattern":"try { skillRegistry.validateVersion(version); }\ncatch (IllegalArgumentException e) { return badRequest(e.getMessage()); }","preventionTips":["Use SemVer (`1.0.0`, `2.0.0-rc1`).","Keep friendly labels out of the version string.","Validate versions client-side before submit."],"tags":["skill-registry","versioning","validation","metadata"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}