{"record":{"id":"7ef15225ffb0b4cc","repo":"paperclipai/paperclip","slug":"invalid-semver-comparison-left-vs-right","errorCode":null,"errorMessage":"Invalid semver comparison: '${left}' vs '${right}'","messagePattern":"Invalid semver comparison: '(.+?)' vs '(.+?)'","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/src/services/plugin-loader.ts","lineNumber":1015,"sourceCode":"function compareIdentifiers(left: string, right: string): number {\n  const leftIsNumeric = /^\\d+$/.test(left);\n  const rightIsNumeric = /^\\d+$/.test(right);\n\n  if (leftIsNumeric && rightIsNumeric) {\n    return Number(left) - Number(right);\n  }\n\n  if (leftIsNumeric) return -1;\n  if (rightIsNumeric) return 1;\n  return left.localeCompare(right);\n}\n\nfunction compareSemver(left: string, right: string): number {\n  const leftParsed = parseSemver(left);\n  const rightParsed = parseSemver(right);\n\n  if (!leftParsed || !rightParsed) {\n    throw new Error(`Invalid semver comparison: '${left}' vs '${right}'`);\n  }\n\n  const coreOrder = (\n    [\"major\", \"minor\", \"patch\"] as const\n  ).map((key) => leftParsed[key] - rightParsed[key]).find((delta) => delta !== 0);\n  if (coreOrder) {\n    return coreOrder;\n  }\n\n  if (leftParsed.prerelease.length === 0 && rightParsed.prerelease.length === 0) {\n    return 0;\n  }\n  if (leftParsed.prerelease.length === 0) return 1;\n  if (rightParsed.prerelease.length === 0) return -1;\n\n  const maxLength = Math.max(leftParsed.prerelease.length, rightParsed.prerelease.length);\n  for (let index = 0; index < maxLength; index += 1) {\n    const leftId = leftParsed.prerelease[index];","sourceCodeStart":997,"sourceCodeEnd":1033,"githubUrl":"https://github.com/paperclipai/paperclip/blob/120ae5428fa29bee300bcf806491cd4d965fbb7c/server/src/services/plugin-loader.ts#L997-L1033","documentation":"Internal guard in compareSemver: parseSemver failed on one of the two version strings, so they are not valid semver and cannot be ordered. Usually means a malformed version in a manifest or host version; the non-semver string is at fault.","triggerScenarios":"Thrown at server/src/services/plugin-loader.ts:1015 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Fix the malformed semver string(s) in the plugin manifest or host version pin; both sides of the comparison must be valid semver like '1.2.3'."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"120ae5428fa29bee300bcf806491cd4d965fbb7c","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}