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
- 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.