paperclipai/paperclip · error

Cheap status-only recovery runs cannot create or modify…

Error message

Cheap status-only recovery runs cannot create or modify approvals

What it means

403 from assertApprovalMutationAllowedByRunContext: the actor's run is a cheap, status-only recovery run, and such runs are explicitly barred from creating or modifying approvals; resuming requires a normal-model run.

Solutions

  1. This is an authorization rule, not a bug: perform the action with an actor that satisfies the stated constraint (board user, the owning agent, or an in-scope resource).
  2. If access should be allowed, verify the actor's credentials/company scope and the resource's ownership before retrying.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at server/src/routes/issues.ts:4957 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/435ab698d3aaa133. Report an issue: GitHub.

Appendix: source

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

    const context = contextSnapshot as Record<string, unknown>;
    return (
      context.recoveryIntent === "status_only" &&
      context.allowDeliverableWork === false &&
      context.allowDocumentUpdates === false &&
      context.resumeRequiresNormalModel === true
    );
  }

  async function loadActorRunContext(req: Request, companyId: string) {
    if (req.actor.type !== "agent") return null;
    const runId = req.actor.runId?.trim();
    if (!runId) return null;
    const run = await db
      .select({
        id: heartbeatRuns.id,
        companyId: heartbeatRuns.companyId,
        agentId: heartbeatRuns.agentId,
        contextSnapshot: heartbeatRuns.contextSnapshot,
      })
      .from(heartbeatRuns)
      .where(eq(heartbeatRuns.id, runId))
      .then((rows) => rows[0] ?? null);
    if (
      !run ||
      run.companyId !== companyId ||
      run.agentId !== req.actor.agentId
    )
      return null;
    return run;
  }

  function readObject(value: unknown): Record<string, unknown> {
    return value && typeof value === "object" && !Array.isArray(value)
      ? (value as Record<string, unknown>)
      : {};
  }

View on GitHub (pinned to 3f1d897a7c)