{"record":{"id":"6878c425e8ad42ac","repo":"paperclipai/paperclip","slug":"missing-permission-to-link-approvals","errorCode":null,"errorMessage":"Missing permission to link approvals","messagePattern":"Missing permission to link approvals","errorType":"http","errorClass":null,"httpStatus":403,"severity":"error","filePath":"server/src/routes/issues.ts","lineNumber":3886,"sourceCode":"        companyId: input.issue.companyId,\n        actorType: input.actor.actorType,\n        actorId: input.actor.actorId,\n        agentId: input.actor.agentId,\n        runId: input.actor.runId,\n        agentApiKeyId: input.actor.agentApiKeyId,\n        action: \"issue.thread_interaction_expired\",\n        entityType: \"issue\",\n        entityId: input.issue.id,\n        details: {\n          identifier: input.issue.identifier ?? null,\n          interactionId: interaction.id,\n          interactionKind: interaction.kind,\n          interactionStatus: interaction.status,\n          source: input.source,\n          result: interaction.result ?? null,\n        },\n      });\n    }\n  }\n\n  async function queueExpiredInteractionReviewPathRecovery(input: {\n    issue: IssueRouteSnapshot;\n    interactions: Array<{ id: string }>;\n    actor: ReturnType<typeof getActorInfo>;\n    source: string;\n  }) {\n    if (\n      input.interactions.length === 0\n      || input.issue.status !== \"in_review\"\n      || !input.issue.assigneeAgentId\n    ) {\n      return null;\n    }\n\n    const reviewAttention = await svc\n      .listReviewAttention(input.issue.companyId, [input.issue])","sourceCodeStart":3868,"sourceCodeEnd":3904,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/server/src/routes/issues.ts#L3868-L3904","documentation":"403 guard in assertCanManageIssueApprovalLinks: the authenticated agent exists in the company but its role (not CEO) lacks the permission required to attach or manage approval links.","triggerScenarios":"Thrown at server/src/routes/issues.ts:3722 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Include the required field(s) in the request path, query, or body as named by the error message, then retry.","Check the API contract in packages/shared validators for the exact required shape of this endpoint."],"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-14T05:17:10.506Z"}