paperclipai/paperclip · error

Execution workspace not found

Error message

Execution workspace not found

What it means

404 sentinel passed to getAccessibleResource: the execution workspace lookup by id found no row, so the referenced workspace does not exist or is out of the actor's reach.

Solutions

  1. Verify the id in the request path or body refers to an existing record in this company; re-list the parent collection to get a valid id.
  2. Check that the record was not deleted or archived, and that the request is scoped to the correct companyId.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at server/src/routes/execution-workspaces.ts:136 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/abb4bbafa53ee250. Report an issue: GitHub.

Appendix: source

Thrown at server/src/routes/execution-workspaces.ts:171

    res.json(overview);
  });

  router.get("/execution-workspaces/:id", async (req, res) => {
    const id = req.params.id as string;
    const workspace = await getAccessibleResource(req, res, svc.getById(id), "Execution workspace not found");
    if (!workspace) return;
    if (!(await assertExecutionWorkspaceReadAllowed(req, res, workspace.companyId))) return;
    res.json(workspace);
  });

  router.get("/execution-workspaces/:id/close-readiness", async (req, res) => {
    const id = req.params.id as string;
    const workspace = await getAccessibleResource(req, res, svc.getById(id), "Execution workspace not found");
    if (!workspace) return;
    if (!(await assertExecutionWorkspaceReadAllowed(req, res, workspace.companyId))) return;
    const readiness = await svc.getCloseReadiness(id);
    if (!readiness) {
      res.status(404).json({ error: "Execution workspace not found" });
      return;
    }
    res.json(readiness);
  });

  /**
   * Mint a single-use workspace login handoff for the calling board user.
   *
   * Board-only: the ticket carries a user identity, so an agent key — which has
   * no user to sign in — must never be able to mint one. Nothing in the request
   * body influences what the ticket is bound to; only the landing path is taken
   * from the caller, and it is reduced to a same-origin path before signing.
   */
  router.post("/execution-workspaces/:id/login-handoff", async (req, res) => {
    const id = req.params.id as string;
    assertBoard(req);
    const workspace = await getAccessibleResource(req, res, svc.getById(id), "Execution workspace not found");
    if (!workspace) return;

View on GitHub (pinned to a7e689b3c3)