paperclipai/paperclip · error
offset must be a non-negative integer
Error message
offset must be a non-negative integer
What it means
400 from the issue list route: the offset query parameter failed validation — it must parse as an integer greater than or equal to zero.
Solutions
- Fix the offending parameter to satisfy the constraint stated in the error message (type, range, or allowed values), then retry.
- Refer to the route's request validation in the named file and the shared validators for the accepted format.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at server/src/routes/issues.ts:5852 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@3f1d897a7c (2026-08-18).
Data as JSON: /api/errors/f8e3e6262cc5f9b6.
Report an issue: GitHub.
Appendix: source
Thrown at server/src/routes/issues.ts:7379
async function getClosedIssueExecutionWorkspace(issue: {
executionWorkspaceId?: string | null;
}) {
if (!issue.executionWorkspaceId) return null;
const workspace = await executionWorkspacesSvc.getById(
issue.executionWorkspaceId,
);
if (!workspace || !isClosedIsolatedExecutionWorkspace(workspace))
return null;
return workspace;
}
// Reopen the closed isolated workspace that a guard found, so the request can
// continue. The return value tells the caller what happened:
// "reopened" - this request rebuilt the workspace and set the
// reopen-pending flag. The caller must install the
// consumption guard so the flag cannot leak.
// "already-open" - a concurrent request already reopened the workspace, so
// this request did not set the flag. The caller continues but
// must not install the guard, or it can clear the flag that
// the other request still owns.
// null - this function sent an error response, so the caller stops.
// The reopen is scoped to the issue company and project inside the service, and
// it runs only after the route already authorized the request on the issue.
async function reopenClosedIssueExecutionWorkspaceOrRespond(
req: Request,
res: Response,
issue: { id: string; companyId: string; projectId?: string | null },
workspace: Pick<ExecutionWorkspace, "id">,
): Promise<{
outcome: "reopened" | "already-open";
generation: number;
} | null> {
const actor = getActorInfo(req);
const result =
await executionWorkspacesSvc.reopenClosedIsolatedExecutionWorkspaceForIssue(
{View on GitHub (pinned to 3f1d897a7c)