{"record":{"id":"4d5887c462d5cfe2","repo":"mastra-ai/mastra","slug":"version-number-input-versionnumber-already-exis-4d5887","errorCode":null,"errorMessage":"Version number ${input.versionNumber} already exists for scorer definition ${input.scorerDefinitionId}","messagePattern":"Version number (.+?) already exists for scorer definition (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/core/src/storage/domains/scorer-definitions/inmemory.ts","lineNumber":214,"sourceCode":"      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedScorers.length,\n    };\n  }\n\n  // ==========================================================================\n  // Scorer Definition Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n    // Check if version with this ID already exists\n    if (this.db.scorerDefinitionVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (scorerDefinitionId, versionNumber) pair\n    for (const version of this.db.scorerDefinitionVersions.values()) {\n      if (version.scorerDefinitionId === input.scorerDefinitionId && version.versionNumber === input.versionNumber) {\n        throw new Error(\n          `Version number ${input.versionNumber} already exists for scorer definition ${input.scorerDefinitionId}`,\n        );\n      }\n    }\n\n    const version: ScorerDefinitionVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing\n    this.db.scorerDefinitionVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }\n\n  async getVersion(id: string): Promise<ScorerDefinitionVersion | null> {\n    const version = this.db.scorerDefinitionVersions.get(id);\n    return version ? this.deepCopyVersion(version) : null;","sourceCodeStart":196,"sourceCodeEnd":232,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/storage/domains/scorer-definitions/inmemory.ts#L196-L232","documentation":"This error is thrown by the in-memory scorer-definitions storage when creating a new scorer definition version whose (scorerDefinitionId, versionNumber) pair already exists. The library enforces unique, monotonically meaningful version numbers per scorer definition, so re-inserting the same version number for the same definition is rejected to protect version history integrity.","triggerScenarios":"Calling createVersion (via create) with an input.versionNumber that a prior version of the same scorerDefinitionId already used; e.g. manually passing versionNumber: 2 when versions 1 and 2 already exist, or retrying a failed request without generating a fresh version number.","commonSituations":"Importing scorer definitions twice from a seed script; concurrent writers both computing 'next version' before either commits; migration scripts that copy versions without renumbering.","solutions":["Pass input.versionNumber explicitly as one more than the max existing versionNumber for that scorerDefinitionId (or omit it if the API computes the next number automatically).","Check existing versions with listVersions(scorerDefinitionId) before choosing a versionNumber.","Wrap createVersion in try-catch and retry with an incremented versionNumber on this error.","Serialize concurrent version creation for the same definition (single-writer or lock) to avoid races."],"exampleFix":"// before\nawait storage.createVersion({ id: v2, scorerDefinitionId: 'scorer-1', versionNumber: 2, ... });\nawait storage.createVersion({ id: v3, scorerDefinitionId: 'scorer-1', versionNumber: 2, ... }); // throws\n// after\nconst { versions } = await storage.listVersions('scorer-1', {}, 0, false);\nconst next = Math.max(...versions.map(v => v.versionNumber)) + 1;\nawait storage.createVersion({ id: v3, scorerDefinitionId: 'scorer-1', versionNumber: next, ... });","handlingStrategy":"validation","validationCode":"const { versions } = await storage.listVersions(scorerDefinitionId, {}, 0, false);\nif (versions.some(v => v.versionNumber === input.versionNumber)) {\n  throw new Error(`versionNumber ${input.versionNumber} already used`);\n}","typeGuard":"function isVersionAvailable(versions: { versionNumber: number }[], versionNumber: number): boolean {\n  return !versions.some(v => v.versionNumber === versionNumber);\n}","tryCatchPattern":"try {\n  await storage.createVersion(input);\n} catch (e) {\n  if (e instanceof Error && e.message.includes('already exists for scorer definition')) {\n    await storage.createVersion({ ...input, versionNumber: input.versionNumber + 1 });\n  } else throw e;\n}","preventionTips":["Always derive the next versionNumber from the stored max, never hardcode it.","Serialize writes for the same scorerDefinitionId to avoid version races.","Make seed/import scripts idempotent by checking existing versions first.","Catch and retry with an incremented versionNumber on this specific message."],"tags":["storage","duplicate-version","scorer-definitions","in-memory"],"backgroundTag":"duplicate-version-number","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}