paperclipai/paperclip · error

updatedSince must be a valid ISO 8601 timestamp when provide

Error message

updatedSince must be a valid ISO 8601 timestamp when provided

What it means

400 from the issue list route: the updatedSince query parameter was supplied but could not be parsed as a valid ISO 8601 timestamp for incremental filtering.

Source

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

      return { outcome: result.reopened ? "reopened" : "already-open", generation: result.generation };
    }
    if (result.code === "not_reopenable") {
      res.status(409).json({ error: "This issue is linked to a closed workspace that cannot be reopened." });
    } else {
      res.status(503).json({ error: "Could not reopen the workspace for this issue. Please try again." });
    }
    return null;
  }

  // The keepalive re-stamps the reopen-pending flag on this interval while a
  // consuming request is in flight. The interval is one fifth of the stale grace
  // period, so several re-stamps land before the reaper could treat the flag as
  // stranded. This keeps a live but slow request's fence against the reaper.
  const REOPEN_PENDING_REFRESH_INTERVAL_MS = Math.floor(
    STALE_REOPEN_PENDING_CONSUMPTION_GRACE_MS / 5,
  );

  // Guard a reopen against a caller that never consumes it.
  // `reopenClosedIssueExecutionWorkspaceOrRespond` publishes the rebuilt worktree
  // as active and sets the reopen-pending flag while the source issue is still
  // terminal. The route then moves the issue out of the terminal state, and the
  // terminal reaper clears the flag once it sees the non-terminal issue. If the
  // route mutation returns null, throws, or leaves the issue terminal, the flag
  // stays set and both the reaper and the archive route skip the row forever, so
  // the rebuilt worktree leaks and no path can reclaim it.
  //
  // This guard runs when the response ends, so it covers every exit: a success, a
  // rejected mutation, and a thrown error. It reads the final issue status through
  // a getter. When the issue is null or still terminal, it clears the flag so the
  // reaper can reclaim the worktree. When the issue left the terminal state, it
  // does nothing and the reaper clears the flag. The guard never touches the
  // response, and the underlying clear is idempotent.
  function guardReopenedWorkspaceConsumption(input: {
    req: Request;
    res: Response;
    issue: { id: string; companyId: string };

View on GitHub (pinned to 01ad858492)

Solutions

  1. Fix the offending parameter to satisfy the constraint stated in the error message (type, range, or allowed values), then retry.
  2. 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:5889 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/593a3c4703f0021e. Report an issue: GitHub.