{"record":{"id":"7257bccbac6ee57b","repo":"pnpm/pnpm","slug":"versioning-duplicate-release","errorCode":"VERSIONING_DUPLICATE_RELEASE","errorMessage":"Two projects both release ${identity}: ./${other} and ./${release.dir}. A package name and version identify one published artifact, so same-named projects must release on different version lines (e.g. different lanes or majors).","messagePattern":"Two projects both release (.+?): \\./(.+?) and \\./(.+?)\\. A package name and version identify one published artifact, so same-named projects must release on different version lines \\(e\\.g\\. different lanes or majors\\)\\.","errorType":"exception","errorClass":"PnpmError","httpStatus":null,"severity":"error","filePath":"pnpm11/releasing/versioning/src/assembleReleasePlan.ts","lineNumber":362,"sourceCode":"  }\n\n  return { releases }\n}\n\n/**\n * A published `package@version` identifies exactly one artifact, so two\n * projects that share a name cannot both release the same version — the\n * registry would reject the second publish, and the name-keyed ledger entry\n * would collide. Caught here, before any manifest is written, naming both\n * directories.\n */\nfunction assertNoDuplicateReleaseIdentity (releases: PlannedRelease[]): void {\n  const byIdentity = new Map<string, string>()\n  for (const release of releases) {\n    const identity = `${release.name}@${release.newVersion}`\n    const other = byIdentity.get(identity)\n    if (other != null) {\n      throw new PnpmError(\n        'VERSIONING_DUPLICATE_RELEASE',\n        `Two projects both release ${identity}: ./${other} and ./${release.dir}. ` +\n        'A package name and version identify one published artifact, so same-named projects must release on different version lines (e.g. different lanes or majors).'\n      )\n    }\n    byIdentity.set(identity, release.dir)\n  }\n}\n\nfunction collectParticipants (\n  projects: WorkspaceProject[],\n  refs: ProjectRefIndex,\n  opts: AssembleReleasePlanOptions\n): Map<string, Participant> {\n  const ignoredDirs = new Set<string>()\n  for (const ref of opts.versioning?.ignore ?? []) {\n    for (const dir of resolveConfigRef(refs, ref, 'versioning.ignore')) {\n      ignoredDirs.add(dir)","sourceCodeStart":344,"sourceCodeEnd":380,"githubUrl":"https://github.com/pnpm/pnpm/blob/6261b7f388016d57ca6b90340342411cd1d0d00f/pnpm11/releasing/versioning/src/assembleReleasePlan.ts#L344-L380","documentation":"Error \"Two projects both release ${identity}: ./${other} and ./${release.dir}. A package name and version identify one published artifact, so same-named projects must release on different version lines (e.g. different lanes or majors).\" thrown in pnpm/pnpm.","triggerScenarios":"Thrown at pnpm11/releasing/versioning/src/assembleReleasePlan.ts:362 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6261b7f388016d57ca6b90340342411cd1d0d00f","analyzedAt":"2026-08-17T18:30:54.750Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}