{"record":{"id":"eb99514636f95360","repo":"paperclipai/paperclip","slug":"prp-provider-resume-state-is-unavailable","errorCode":null,"errorMessage":"PRP provider resume state is unavailable","messagePattern":"PRP provider resume state is unavailable","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/live/runnerd-codex-transport.ts","lineNumber":4567,"sourceCode":"            : provider === \"claude_managed\"\n              ? \"anthropic\"\n              : provider === \"aws_agentcore\"\n                ? \"aws\"\n                : provider === \"acpx\"\n                  ? acpxAgent === \"pi\"\n                    ? \"openrouter\"\n                    : acpxAgent === \"claude\"\n                      ? \"anthropic\"\n                      : \"openai\"\n                  : \"openai\",\n      },\n    };\n  }\n\n  async #resume(): Promise<void> {\n    const desiredIdentity = this.options.prpIdentity;\n    if (desiredIdentity === undefined) {\n      throw new Error(\"PRP provider resume state is unavailable\");\n    }\n    const controlPlaneDirectory = resolve(this.#root, \"control-plane\");\n    const controlPlaneStatePath = resolve(\n      controlPlaneDirectory,\n      \"control-plane-state.json\",\n    );\n    const localProvider =\n      this.options.provider === undefined ||\n      this.options.provider === \"codex\" ||\n      this.options.provider === \"opencode\" ||\n      this.options.provider === \"acpx\";\n    const localStateOwner =\n      this.options.readRunnerState === undefined &&\n      this.options.runnerStateDirectory === undefined &&\n      this.options.runnerFilesystemRoot === undefined;\n    const localRunnerStatePath = resolve(\n      this.#root,\n      \"runner\",","sourceCodeStart":4549,"sourceCodeEnd":4585,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/live/runnerd-codex-transport.ts#L4549-L4585","documentation":"#resume() requires a PRP identity (session/turn/item identifiers) to resume the provider, and this error signals none was supplied. Without the desired identity the transport cannot locate control-plane state or archived state to resume from.","triggerScenarios":"Calling resume() on a transport constructed with options.prpIdentity === undefined — e.g. a transport created for a fresh turn or a non-PRP provider being asked to perform a PRP resume.","commonSituations":"Recovering a runner after crash without passing the original turn's prpIdentity; wiring a generic transport factory that omits prpIdentity for codex turns; resuming from a stale snapshot where identity was dropped during serialization.","solutions":["Pass options.prpIdentity when constructing the transport for resumable turns","Only invoke resume() on transports whose options include a PRP identity","Persist and reload the original prpIdentity (sessionId/turnId/itemId) through crash/recovery flows","Check your snapshot/serialization path is not dropping prpIdentity"],"exampleFix":"// before\nconst transport = new RunnerdCodexTransport({ runnerBinary, root });\nawait transport.resume();\n// after\nconst transport = new RunnerdCodexTransport({ runnerBinary, root, prpIdentity: savedIdentity });\nawait transport.resume();","handlingStrategy":"validation","validationCode":"if (!transport.options.prpIdentity) {\n  throw new Error(\"cannot resume: prpIdentity is required for PRP resume\");\n}","typeGuard":"function isResumable(t: RunnerdCodexTransportOptions): t is RunnerdCodexTransportOptions & { prpIdentity: PrpIdentity } {\n  return t.prpIdentity !== undefined;\n}","tryCatchPattern":"try {\n  await transport.resume();\n} catch (err) {\n  if (err instanceof Error && err.message === \"PRP provider resume state is unavailable\") {\n    startFreshTurn(); // fall back to a new turn instead of resuming\n  } else throw err;\n}","preventionTips":["Persist prpIdentity alongside durable turn state","Only call resume() on transports built for PRP turns","Include prpIdentity presence in pre-flight health checks for recovery flows"],"tags":["resume","missing-state","turn-lifecycle"],"backgroundTag":"missing-required-config-field","analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-10T03:14:50.855Z","contentChangedAt":"2026-09-10T03:14:50.855Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}