{"record":{"id":"b5f5b18737e873a4","repo":"paperclipai/paperclip","slug":"approval-request-superseded","errorCode":"approval_request_superseded","errorMessage":"The approval request was resolved before it could be signed","messagePattern":"The approval request was resolved before it could be signed","errorType":"http","errorClass":"ToolGatewayHttpError","httpStatus":409,"severity":"error","filePath":"server/src/services/tool-gateway.ts","lineNumber":1777,"sourceCode":"      await db\n        .update(toolActionRequests)\n        .set({\n          status: \"cancelled\",\n          resolvedAt: new Date(),\n          updatedAt: new Date(),\n        })\n        .where(and(eq(toolActionRequests.id, actionRequest.id), eq(toolActionRequests.status, \"pending\")));\n      if (error instanceof ToolActionSigningSecretMissingError) {\n        await db\n          .update(toolInvocations)\n          .set({\n            status: \"failed\",\n            errorCode: \"signing_secret_unconfigured\",\n            errorMessage: error.message,\n            completedAt: new Date(),\n            updatedAt: new Date(),\n          })\n          .where(eq(toolInvocations.id, input.invocation.id));\n        throw new ToolGatewayHttpError(500, error.message, \"signing_secret_unconfigured\", {\n          invocationId: input.invocation.id,\n          tool: input.tool.name,\n        });\n      }\n      throw error;\n    }\n    // Board-only technical detail for the formal-approval interaction (target=custom).\n    const detailsMarkdown = [\n      `Tool: \\`${input.tool.name}\\``,\n      `Risk: \\`${input.tool.risk}\\``,\n      \"\",\n      \"Arguments reviewed for execution:\",\n      \"\",\n      \"```json\",\n      input.argumentsSummary.summary,\n      \"```\",\n    ].join(\"\\n\");","sourceCodeStart":1759,"sourceCodeEnd":1795,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/server/src/services/tool-gateway.ts#L1759-L1795","documentation":"The conditional update that stamps the formal approval id and expiry onto the pending tool_action_request matched zero rows, meaning another actor (board decision, expiry sweep, or superseding approval) already resolved it. The invocation is marked failed with approvalState expired (approval_request_superseded) so the stale approval cannot be signed or executed.","triggerScenarios":"Thrown at server/src/services/tool-gateway.ts:1730 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["The approval was resolved concurrently before signing. Re-read the approval state and create a new approval request if still needed."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}