paperclipai/paperclip · error · Error

eval-session nativeResume requires a retained live-session c

Error message

eval-session nativeResume requires a retained live-session checkpoint

What it means

This validator rejects any eval-session request that carries a nativeResume field, because resuming natively requires a retained live-session checkpoint and the current CapabilityLiveSessionService does not retain/accept checkpoints through this path. The check is fail-closed: the presence of the field alone triggers the throw, regardless of its value.

Source

Thrown at packages/paperclip-runner/src/cli/eval-session-contract.ts:270

    ? undefined
    : input.managedProfile;
  const agentCoreProfileInput = input.agentCoreProfile === null
    ? undefined
    : input.agentCoreProfile;
  const managedProfile = provider === "claude_managed"
    ? parseManagedProfile(managedProfileInput)
    : undefined;
  const agentCoreProfile = provider === "aws_agentcore"
    ? parseAgentCoreProfile(agentCoreProfileInput)
    : undefined;
  if (provider !== "claude_managed" && managedProfileInput !== undefined) {
    throw new Error("eval-session managedProfile requires provider claude_managed");
  }
  if (provider !== "aws_agentcore" && agentCoreProfileInput !== undefined) {
    throw new Error("eval-session agentCoreProfile requires provider aws_agentcore");
  }
  if (input.nativeResume !== undefined) {
    throw new Error(
      "eval-session nativeResume requires a retained live-session checkpoint",
    );
  }
  if (input.includeCollaborationModeInstructions === false) {
    throw new Error(
      "current CapabilityLiveSessionService requires collaboration-mode instructions",
    );
  }

  const runnerd = object(input.runnerd, "request.runnerd");
  const digest = text(runnerd.sha256, "request.runnerd.sha256");
  if (!/^(?:sha256:)?[a-f0-9]{64}$/i.test(digest)) {
    throw new Error("request.runnerd.sha256 must be a SHA-256 digest");
  }
  const limits = object(input.limits, "request.limits");
  const sessionInput = object(input.session, "request.session");
  const session = sessionInput as unknown as CreateCapabilityLiveSessionInput;
  const model = text(input.model, "request.model");

View on GitHub (pinned to 01ad858492)

Solutions

  1. Remove the nativeResume field from the request and start a fresh eval session.
  2. If resume is required, ensure the session checkpoint is retained by the CapabilityLiveSessionService and use the resume entry point intended for retained checkpoints instead of the eval-session contract path.
  3. Upgrade/check for a runner version whose contract supports nativeResume before sending the field.

Example fix

// before
{ "provider": "codex", "nativeResume": { "checkpointId": "abc" }, ... }
// after
{ "provider": "codex", ... }
Defensive patterns

Strategy: validation

Validate before calling

function hasNoNativeResume(input) { return input.nativeResume === undefined; }
if (!hasNoNativeResume(req)) throw new Error("nativeResume is not accepted by this eval-session contract");

Type guard

function isResumableSessionRequest(input) { return input.nativeResume === undefined; }

Try / catch

try { return parseEvalSessionRequest(raw); } catch (e) { if (String(e.message).includes("nativeResume requires a retained live-session checkpoint")) { const { nativeResume, ...rest } = raw; return parseEvalSessionRequest(rest); } throw e; }

Prevention

When it happens

Trigger: Calling parseEvalSessionRequest with input.nativeResume defined (e.g. { nativeResume: true } or { nativeResume: { checkpointId: ... } }) on any provider.

Common situations: Replaying a previously captured request that used native resume; a client feature flag enabling resume before the backend supports it; attempting to reattach to an earlier live session whose checkpoint was not retained.

Related errors


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-02). Data as JSON: /api/errors/c892902847583d40. Report an issue: GitHub.