{"record":{"id":"ef93148675556658","repo":"paperclipai/paperclip","slug":"plugin-install-did-not-return-a-registry-row-ma","errorCode":null,"errorMessage":"Plugin install did not return a registry row: ${manifest.id}","messagePattern":"Plugin install did not return a registry row: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/src/services/plugin-loader.ts","lineNumber":1731,"sourceCode":"      const manifest = discovered.manifest!;\n\n      // Step 6: Persist install record and apply plugin-owned schema migrations\n      // in one database transaction. If migration validation fails, the plugin\n      // row, namespace record, migration ledger, and created schema all roll back.\n      const installDb = manifest.database ? migrationDb : db;\n      await installDb.transaction(async (tx) => {\n        const txDb = tx as unknown as Db;\n        const txRegistry = pluginRegistryService(txDb);\n        const installed = await txRegistry.install(\n          {\n            packageName: discovered.packageName,\n            packagePath: discovered.source === \"local-filesystem\" ? discovered.packagePath : undefined,\n          },\n          manifest,\n        );\n\n        if (!installed) {\n          throw new Error(`Plugin install did not return a registry row: ${manifest.id}`);\n        }\n\n        if (manifest.database) {\n          await pluginDatabaseService(txDb).applyMigrations(\n            installed.id,\n            manifest,\n            discovered.packagePath,\n            { persistFailure: false },\n          );\n        }\n      });\n\n      log.info(\n        {\n          pluginId: manifest.id,\n          packageName: discovered.packageName,\n          version: discovered.version,\n          capabilities: manifest.capabilities,","sourceCodeStart":1713,"sourceCodeEnd":1749,"githubUrl":"https://github.com/paperclipai/paperclip/blob/120ae5428fa29bee300bcf806491cd4d965fbb7c/server/src/services/plugin-loader.ts#L1713-L1749","documentation":"Transactional invariant check in plugin install: the registry install call inside the transaction did not return the expected row, so persistence silently failed. Rare defensive check ensuring the plugin record exists before migrations proceed; the registry install path is at fault.","triggerScenarios":"Thrown at server/src/services/plugin-loader.ts:1731 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Internal install inconsistency: the registry row was not created. Retry the install; if it persists, check DB constraints and server logs for the install transaction."],"exampleFix":null,"handlingStrategy":"try-catch","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"}