{"record":{"id":"c892902847583d40","repo":"paperclipai/paperclip","slug":"eval-session-nativeresume-requires-a-retained-live","errorCode":null,"errorMessage":"eval-session nativeResume requires a retained live-session checkpoint","messagePattern":"eval-session nativeResume requires a retained live-session checkpoint","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/cli/eval-session-contract.ts","lineNumber":270,"sourceCode":"    ? undefined\n    : input.managedProfile;\n  const agentCoreProfileInput = input.agentCoreProfile === null\n    ? undefined\n    : input.agentCoreProfile;\n  const managedProfile = provider === \"claude_managed\"\n    ? parseManagedProfile(managedProfileInput)\n    : undefined;\n  const agentCoreProfile = provider === \"aws_agentcore\"\n    ? parseAgentCoreProfile(agentCoreProfileInput)\n    : undefined;\n  if (provider !== \"claude_managed\" && managedProfileInput !== undefined) {\n    throw new Error(\"eval-session managedProfile requires provider claude_managed\");\n  }\n  if (provider !== \"aws_agentcore\" && agentCoreProfileInput !== undefined) {\n    throw new Error(\"eval-session agentCoreProfile requires provider aws_agentcore\");\n  }\n  if (input.nativeResume !== undefined) {\n    throw new Error(\n      \"eval-session nativeResume requires a retained live-session checkpoint\",\n    );\n  }\n  if (input.includeCollaborationModeInstructions === false) {\n    throw new Error(\n      \"current CapabilityLiveSessionService requires collaboration-mode instructions\",\n    );\n  }\n\n  const runnerd = object(input.runnerd, \"request.runnerd\");\n  const digest = text(runnerd.sha256, \"request.runnerd.sha256\");\n  if (!/^(?:sha256:)?[a-f0-9]{64}$/i.test(digest)) {\n    throw new Error(\"request.runnerd.sha256 must be a SHA-256 digest\");\n  }\n  const limits = object(input.limits, \"request.limits\");\n  const sessionInput = object(input.session, \"request.session\");\n  const session = sessionInput as unknown as CreateCapabilityLiveSessionInput;\n  const model = text(input.model, \"request.model\");","sourceCodeStart":252,"sourceCodeEnd":288,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/cli/eval-session-contract.ts#L252-L288","documentation":"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.","triggerScenarios":"Calling parseEvalSessionRequest with input.nativeResume defined (e.g. { nativeResume: true } or { nativeResume: { checkpointId: ... } }) on any provider.","commonSituations":"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.","solutions":["Remove the nativeResume field from the request and start a fresh eval session.","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.","Upgrade/check for a runner version whose contract supports nativeResume before sending the field."],"exampleFix":"// before\n{ \"provider\": \"codex\", \"nativeResume\": { \"checkpointId\": \"abc\" }, ... }\n// after\n{ \"provider\": \"codex\", ... }","handlingStrategy":"validation","validationCode":"function hasNoNativeResume(input) { return input.nativeResume === undefined; }\nif (!hasNoNativeResume(req)) throw new Error(\"nativeResume is not accepted by this eval-session contract\");","typeGuard":"function isResumableSessionRequest(input) { return input.nativeResume === undefined; }","tryCatchPattern":"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; }","preventionTips":["Gate resume features behind a capability check against the runner version.","Strip unsupported fields before serializing requests.","Keep request schemas versioned and documented so clients know nativeResume is rejected."],"tags":["validation","unsupported-feature","resume"],"backgroundTag":"unsupported-capability-flag","analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-02T18:44:00.616Z","contentChangedAt":"2026-09-02T18:44:00.616Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}