{"record":{"id":"66c56c0610b7d62d","repo":"mastra-ai/mastra","slug":"version-with-id-input-id-already-exists-66c56c","errorCode":null,"errorMessage":"Version with id ${input.id} already exists","messagePattern":"Version with id (.+?) already exists","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/core/src/storage/domains/skills/inmemory.ts","lineNumber":315,"sourceCode":"    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      skills: clonedConfigs.slice(offset, offset + perPage),\n      total: clonedConfigs.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedConfigs.length,\n    };\n  }\n\n  // ==========================================================================\n  // Skill Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n    // Check if version with this ID already exists\n    if (this.db.skillVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (skillId, versionNumber) pair\n    for (const version of this.db.skillVersions.values()) {\n      if (version.skillId === input.skillId && version.versionNumber === input.versionNumber) {\n        throw new Error(`Version number ${input.versionNumber} already exists for skill ${input.skillId}`);\n      }\n    }\n\n    const version: SkillVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing\n    this.db.skillVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }","sourceCodeStart":297,"sourceCodeEnd":333,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/storage/domains/skills/inmemory.ts#L297-L333","documentation":"`createVersion` enforces that skill version IDs are unique within the in-memory store. If `this.db.skillVersions` already contains a version with `input.id`, it throws before inserting. This prevents silently overwriting an existing immutable version record.","triggerScenarios":"Calling `createVersion({ id: '<already-used-id>', ... })`, or calling the public `create`/`update` methods that internally invoke `createVersion` with an ID that already exists in storage.","commonSituations":"Re-running seed/fixture scripts that generate deterministic IDs (e.g. `skill-v1`) without clearing the store, retrying a failed request after the first attempt actually succeeded, or concurrent writers racing to insert the same version ID.","solutions":["Generate a unique version ID (UUID/nanoid) instead of a deterministic reused one.","Before inserting, check existence with `getVersion(input.id)` and update or skip instead of creating.","Wrap the call in try/catch and treat the duplicate-ID error as idempotent success if the existing record matches.","For seed scripts, clear skillVersions or use upsert semantics before re-seeding."],"exampleFix":"// before\nawait storage.createVersion({ id: 'my-skill-1', skillId: 'my-skill', versionNumber: 1 });\n// after\nconst existing = await storage.getVersion('my-skill-1');\nif (!existing) await storage.createVersion({ id: crypto.randomUUID(), skillId: 'my-skill', versionNumber: 1 });","handlingStrategy":"fallback","validationCode":"async function createVersionIfAbsent(storage, input) {\n  const existing = await storage.getVersion(input.id);\n  if (existing) return existing;\n  return storage.createVersion(input);\n}","typeGuard":null,"tryCatchPattern":"try {\n  await storage.createVersion(input);\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith('Version with id')) {\n    return storage.getVersion(input.id); // idempotent: return existing\n  }\n  throw err;\n}","preventionTips":["Use random UUIDs for version IDs instead of deterministic names.","Make seed scripts idempotent: check-then-create or clear the store first.","Serialize version creation for the same skill (single writer/queue)."],"tags":["duplicate-key","idempotency","storage"],"backgroundTag":"duplicate-record-id","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T08:17:16.595Z"}