{"record":{"id":"8ce37750ab7b7bec","repo":"paperclipai/paperclip","slug":"attachment-is-empty","errorCode":null,"errorMessage":"Attachment is empty","messagePattern":"Attachment is empty","errorType":"http","errorClass":null,"httpStatus":422,"severity":"error","filePath":"server/src/routes/issues.ts","lineNumber":13685,"sourceCode":"        issue,\n        surface: \"issue.comment.create\",\n        requestedValue: readNonEmptyString(req.body.onBehalfOfUserId),\n      });\n      await denyIssueWrite(req, res, issue, \"issue_write_attribution_spoof_rejected\");\n      return;\n    }\n    const commentAccessDecision = await assertAgentIssueCommentAllowed(req, res, issue);\n    if (!commentAccessDecision) return;\n    const commentAuthorizationReason = issueWriteAuthorizationReason(req, commentAccessDecision);\n    if (!assertStructuredCommentFieldsAllowed(req, res, {\n      presentation: req.body.presentation,\n      metadata: req.body.metadata,\n    })) return;\n    const closedExecutionWorkspace = await getClosedIssueExecutionWorkspace(issue);\n\n    const actor = getActorInfo(req);\n    const commentPresentation = req.body.presentation ??\n      await deriveRecoveryCommentPresentation(req, issue.companyId, req.body.body);\n    const reopenRequested = req.body.reopen === true;\n    const resumeRequested = req.body.resume === true;\n    const interruptRequested = req.body.interrupt === true;\n    const isClosed = isClosedIssueStatus(issue.status);\n    const isBlocked = issue.status === \"blocked\";\n    const crossIssueCommentOnlyGrant =\n      isClosed &&\n      (isDirectParentReportDecision(commentAccessDecision) ||\n        (req.actor.type === \"agent\" &&\n          issue.assigneeAgentId !== null &&\n          issue.assigneeAgentId !== req.actor.agentId &&\n          !reopenRequested &&\n          !resumeRequested &&\n          (isIssueMentionGrantDecision(commentAccessDecision) ||\n            isDefaultOpenIssueWriteDecision(commentAccessDecision))));\n    const effectiveReopenRequested = crossIssueCommentOnlyGrant ? false : reopenRequested;\n    const effectiveResumeRequested = crossIssueCommentOnlyGrant ? false : resumeRequested;\n    if (","sourceCodeStart":13667,"sourceCodeEnd":13703,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/server/src/routes/issues.ts#L13667-L13703","documentation":"422 from issue attachment upload. Fires when the uploaded file's buffer is zero-length (empty body/file); empty attachments are rejected rather than stored as placeholder objects.","triggerScenarios":"Thrown at server/src/routes/issues.ts:12666 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Provide a non-empty value/file for the named field and retry the upload or request."],"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"}