paperclipai/paperclip · error · Error

The import status can no longer be read — your session may…

Error message

The import status can no longer be read — your session may have expired. Reload and sign in to check on it.

What it means

Auth-failure branch in watchImportJob: job polling returned a 4xx (excluding 429) — typically an expired board session, lost board access, or a malformed request. These errors will repeat on every poll, so the watcher stops and tells the user to reload and sign in instead of retrying forever.

Solutions

  1. Reload the page and sign in again, then check the import status.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at ui/src/pages/CompanyImport.tsx:812 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at ui/src/pages/CompanyImport.tsx:812

        // rather than masking a possibly-incomplete import as a success; the
        // refreshed company list lets the user confirm what actually landed.
        clearStoredImportJob(storageKey);
        throw new Error(
          "The server no longer reports this import job — it may have restarted while the import ran.",
        );
      }
      if (
        err instanceof ApiError
        && err.status >= 400
        && err.status < 500
        && err.status !== 429
      ) {
        // A permanent client error (an expired board session, lost board
        // access, or a bad request) will never recover by polling again, so
        // stop instead of leaving the import locked in its running state.
        // 429 (rate limited) and 5xx stay transient and fall through below.
        clearStoredImportJob(storageKey);
        throw new Error(
          "The import status can no longer be read — your session may have expired. Reload and sign in to check on it.",
        );
      }
      // Any other poll failure is treated as transient (network blip,
      // dropped connection, rate limit, or a 5xx): the job keeps running
      // server-side, so keep watching rather than reporting a failure that
      // may not exist.
    }
    if (job?.status === "succeeded") {
      clearStoredImportJob(storageKey);
      if (!job.importResult) {
        // The server confirmed success but retained only the compact summary
        // (a cloud tenant job, or a board job whose full result aged out of
        // memory). Still a success — navigate by the summary's company id.
        return {
          status: "completed-expired",
          companyId: job.result?.companyId ?? null,
        };

View on GitHub (pinned to a7e689b3c3)