{"record":{"id":"3eb4a1e5fcc3fe36","repo":"paperclipai/paperclip","slug":"plugin-not-found-after-status-update-pluginid","errorCode":null,"errorMessage":"Plugin not found after status update: ${pluginId}","messagePattern":"Plugin not found after status update: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/src/services/plugin-loader.ts","lineNumber":2032,"sourceCode":"\n      log.info(\n        {\n          total: pluginsToLoad.length,\n          succeeded,\n          failed,\n        },\n        \"plugin-loader: loadAll complete\",\n      );\n\n      return {\n        total: pluginsToLoad.length,\n        succeeded,\n        failed,\n        results: loadResults,\n      };\n    },\n\n    // -----------------------------------------------------------------------\n    // loadSingle\n    // -----------------------------------------------------------------------\n\n    /**\n     * loadSingle — Loads and activates a single plugin by its ID.\n     *\n     * This method retrieves the plugin from the registry, ensures it's in a valid\n     * state, and then calls activatePlugin to start its worker and register its\n     * capabilities (tools, jobs, etc.).\n     *\n     * @param pluginId - The UUID of the plugin to load.\n     * @param options - Optional activation behavior overrides.\n     * @returns A promise that resolves with the result of the activation.\n     */\n    async loadSingle(pluginId: string, options: PluginLoadSingleOptions = {}): Promise<PluginLoadResult> {\n      if (!runtimeServices) {\n        throw new Error(\n          \"Cannot loadSingle: no PluginRuntimeServices provided. \" +","sourceCodeStart":2014,"sourceCodeEnd":2050,"githubUrl":"https://github.com/paperclipai/paperclip/blob/3f1d897a7c018d76563a21c6e39c3c9b03933622/server/src/services/plugin-loader.ts#L2014-L2050","documentation":"Post-update consistency guard in the plugin status transition path: after updating the plugin's status, registry.getById no longer finds the row. Defensive check against concurrent delete during enable/disable/load flows; the racing deletion is at fault.","triggerScenarios":"Thrown at server/src/services/plugin-loader.ts:2029 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["The plugin disappeared during the status update (concurrent uninstall). Re-check the plugin list and retry against an existing plugin."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"3f1d897a7c018d76563a21c6e39c3c9b03933622","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}