{"record":{"id":"3dbe025ed0ac0c6f","repo":"paperclipai/paperclip","slug":"agent-actors-cannot-cancel-issue-thread-interactio","errorCode":null,"errorMessage":"Agent actors cannot cancel issue-thread interactions through this board-only route","messagePattern":"Agent actors cannot cancel issue-thread interactions through this board-only route","errorType":"http","errorClass":null,"httpStatus":403,"severity":"error","filePath":"server/src/routes/issues.ts","lineNumber":12280,"sourceCode":"      assertBoard(req);\n      if (!req.actor.userId) throw forbidden(\"Board user context required\");\n      const id = req.params.id as string;\n      const issue = await getAccessibleResource(req, res, svc.getById(id), \"Issue not found\");\n      if (!issue) return;\n      const actor = getActorInfo(req);\n      const queue = await db.transaction(async (tx) => {\n        const locked = await lockQueuedCommentState({\n          tx,\n          issue,\n          actor,\n          queueId: req.body.queueId,\n        });\n        assertQueueMutationTarget({\n          queue: locked.queue,\n          queueId: req.body.queueId,\n          revision: req.body.revision,\n        });\n        const currentIds = locked.queue.entries.map((entry) => entry.comment.id);\n        const orderedIds = req.body.orderedCommentIds as string[];\n        const orderedSet = new Set(orderedIds);\n        if (\n          orderedSet.size !== orderedIds.length\n          || orderedIds.length !== currentIds.length\n          || currentIds.some((commentId) => !orderedSet.has(commentId))\n        ) {\n          throw conflict(\"The queued message order does not match the current queue\", {\n            code: \"queued_comment_order_mismatch\",\n          });\n        }\n        const now = new Date();\n        const updatedWake = await tx\n          .update(agentWakeupRequests)\n          .set({\n            payload: withQueuedCommentIdsInWakePayload(locked.wake.payload, orderedIds),\n            updatedAt: now,\n          })","sourceCodeStart":12262,"sourceCodeEnd":12298,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/server/src/routes/issues.ts#L12262-L12298","documentation":"403 guard on POST /issues/:id/interactions/:interactionId/cancel. Fires when the actor is an agent; cancelling issue-thread interactions (confirmations, questions) is restricted to the board route and agents must use their own run-scoped paths.","triggerScenarios":"Thrown at server/src/routes/issues.ts:11491 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["This is an authorization rule, not a bug: perform the action with an actor that satisfies the stated constraint (board user, the owning agent, or an in-scope resource).","If access should be allowed, verify the actor's credentials/company scope and the resource's ownership before retrying."],"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"}