paperclipai/paperclip · error

Board authentication required

Error message

Board authentication required

What it means

403 guard on POST /issues/:id/documents/:key/lock (document lock/unlock). Fires when the authenticated actor is an agent API key rather than a board user; document locking is a board-only operation.

Solutions

  1. Include the required field(s) in the request path, query, or body as named by the error message, then retry.
  2. Check the API contract in packages/shared validators for the exact required shape of this endpoint.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at server/src/routes/issues.ts:7317 when the library encounters an invalid state.

Common situations: See trigger scenarios.

Understand the failure class


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-08-18). Data as JSON: /api/errors/1295a824b4d677cb. Report an issue: GitHub.

Appendix: source

Thrown at server/src/routes/issues.ts:7801

        },
        tx,
      );
      if (!recoveryAction) throw notFound("Active recovery action not found");

      return { issue, recoveryAction };
    });
    if (result.replayed) {
      res.json({ issue: result.issue, recoveryAction: result.recoveryAction });
      return;
    }
    for (const publication of postCommitActivityPublications) publishActivity(publication);
    await flushIssuePostCommitActions(postCommitIssueActions);

    await routinesSvc.syncRunStatusForIssue(result.issue.id);

    if (sourceIssueStatus && existing.status !== result.issue.status) {
      await logActivity(db, {
        companyId: result.issue.companyId,
        actorType: actor.actorType,
        actorId: actor.actorId,
        agentId: actor.agentId,
        runId: actor.runId,
        agentApiKeyId: actor.agentApiKeyId,
        action: "issue.updated",
        entityType: "issue",
        entityId: result.issue.id,
        details: {
          identifier: result.issue.identifier,
          status: result.issue.status,
          source: "recovery_action_resolution",
          recoveryActionId: result.recoveryAction.id,
          _previous: {
            status: existing.status,
          },
        },
      });

View on GitHub (pinned to 01ad858492)