paperclipai/paperclip · error · ToolGatewayHttpError

signing_secret_unconfigured

signing_secret_unconfigured

Error message

PAPERCLIP_TOOL_ACTION_SIGNING_SECRET is not configured; signed tool action approvals cannot be issued. Set PAPERCLIP_TOOL_ACTION_SIGNING_SECRET in this instance's environment (worktrees inherit it from .paperclip/.env).

What it means

Error "PAPERCLIP_TOOL_ACTION_SIGNING_SECRET is not configured; signed tool action approvals cannot be issued. Set PAPERCLIP_TOOL_ACTION_SIGNING_SECRET in this instance's environment (worktrees inherit it from .paperclip/.env)." thrown in paperclipai/paperclip.

Source

Thrown at server/src/services/tool-gateway.ts:1635

    if (!outcome) return;

    const now = new Date();
    await tx
      .update(issueThreadInteractions)
      .set({
        ...(["expired", "cancelled"].includes(input.status) && interaction.status === "pending"
          ? { status: input.status, resolvedAt: now }
          : {}),
        result: {
          ...(currentResult ?? { version: 1, outcome }),
          toolAction: {
            ...asRecord(currentResult?.toolAction),
            version: 1,
            status: input.status === "cancelled" ? "expired" : input.status,
            errorCode: input.errorCode ?? null,
            errorMessage: input.errorMessage ?? null,
            resultSummary: input.resultSummary ?? null,
            updatedAt: now.toISOString(),
          },
        } as unknown as NonNullable<typeof issueThreadInteractions.$inferInsert.result>,
        updatedAt: now,
      })
      .where(eq(issueThreadInteractions.id, interactionId));
    return true;
    });
    if (!changed) return;
    await logActivity(db, { companyId: linked.companyId, actorType: "system", actorId: "tool-gateway", action: "issue.thread_interaction_updated", entityType: "issue", entityId: linked.issueId!, details: { interactionId: linked.interactionId, actionRequestId: input.actionRequestId, executionStatus: input.status } });
    if (["executed", "failed", "expired", "cancelled"].includes(input.status)) await options.onToolActionSettled?.(input.actionRequestId).catch(error => logger.warn({ err: error, actionRequestId: input.actionRequestId }, "Tool review continuation will be retried"));
  }

  async function approvalRequiredInstructions(issueId: string): Promise<string> {
    const [issue] = await db
      .select({ identifier: issues.identifier })
      .from(issues)
      .where(eq(issues.id, issueId))
      .limit(1);

View on GitHub (pinned to 01ad858492)

Solutions

  1. Set PAPERCLIP_TOOL_ACTION_SIGNING_SECRET in the server environment (worktrees inherit from .paperclip/.env) and restart the instance.
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at server/src/services/tool-gateway.ts:1594 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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