{"record":{"id":"6c7dd48b5a4414cb","repo":"paperclipai/paperclip","slug":"plugin-manifest-id-declares-duplicate-page-rout","errorCode":null,"errorMessage":"Plugin ${manifest.id} declares duplicate page routePath values","messagePattern":"Plugin (.+?) declares duplicate page routePath values","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/src/services/plugin-loader.ts","lineNumber":1158,"sourceCode":"    localPluginDir = DEFAULT_LOCAL_PLUGIN_DIR,\n    migrationDb = db,\n    enableLocalFilesystem = true,\n    enableNpmDiscovery = true,\n  } = options;\n\n  const registry = pluginRegistryService(db);\n  const manifestValidator = pluginManifestValidator();\n  const capabilityValidator = pluginCapabilityValidator();\n  const log = logger.child({ service: \"plugin-loader\" });\n  const hostVersion = runtimeServices?.instanceInfo.hostVersion;\n\n  async function assertPageRoutePathsAvailable(manifest: PaperclipPluginManifestV1): Promise<void> {\n    const requestedRoutePaths = getDeclaredPageRoutePaths(manifest);\n    if (requestedRoutePaths.length === 0) return;\n\n    const uniqueRequested = new Set(requestedRoutePaths);\n    if (uniqueRequested.size !== requestedRoutePaths.length) {\n      throw new Error(`Plugin ${manifest.id} declares duplicate page routePath values`);\n    }\n\n    const installedPlugins = await registry.listInstalled();\n    for (const plugin of installedPlugins) {\n      if (plugin.pluginKey === manifest.id) continue;\n      const installedManifest = plugin.manifestJson as PaperclipPluginManifestV1 | null;\n      if (!installedManifest) continue;\n      const installedRoutePaths = new Set(getDeclaredPageRoutePaths(installedManifest));\n      const conflictingRoute = requestedRoutePaths.find((routePath) => installedRoutePaths.has(routePath));\n      if (conflictingRoute) {\n        throw new Error(\n          `Plugin ${manifest.id} routePath \"${conflictingRoute}\" conflicts with installed plugin ${plugin.pluginKey}`,\n        );\n      }\n    }\n  }\n\n  // -------------------------------------------------------------------------","sourceCodeStart":1140,"sourceCodeEnd":1176,"githubUrl":"https://github.com/paperclipai/paperclip/blob/120ae5428fa29bee300bcf806491cd4d965fbb7c/server/src/services/plugin-loader.ts#L1140-L1176","documentation":"Route-uniqueness guard in assertPageRoutePathsAvailable: the manifest itself declares the same page routePath more than once, which would collide even before checking other plugins; the manifest's page declarations are at fault.","triggerScenarios":"Thrown at server/src/services/plugin-loader.ts:1158 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Give each page in the plugin manifest a unique routePath; remove or rename the duplicated entries."],"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-14T00:17:10.932Z"}