{"record":{"id":"94959356ece1db5e","repo":"paperclipai/paperclip","slug":"native-runner-warm-transition-recovery-pending","errorCode":null,"errorMessage":"native_runner_warm_transition_recovery_pending","messagePattern":"native_runner_warm_transition_recovery_pending","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/live/runnerd-codex-transport.ts","lineNumber":5173,"sourceCode":"    if (!adoptedRunner) await this.#awaitRegistrationReady(registration?.ready);\n    if (adoptedRunner) {\n      this.#evidence.runnerPid = adoptedRunner.pid;\n      this.#evidence.runnerProcessGroupId = adoptedRunner.processGroupId;\n      this.#watchAdoptedRunner(adoptedRunner);\n    } else {\n      this.#evidence.runnerPid = handle?.child.pid ?? null;\n      this.#evidence.runnerProcessGroupId = handle?.processGroupId ?? null;\n    }\n    this.#publish();\n    if (warmRecovery) {\n      const deadline =\n        Date.now() + (this.options.runnerReconnectGraceMs ?? 5_000);\n      while (\n        !recoveryIdentityMatches(core.store.state.identity, desiredIdentity) ||\n        core.store.state.warmTransition !== undefined\n      ) {\n        if (Date.now() >= deadline || (await this.#runnerHasExited())) {\n          throw new Error(\"native_runner_warm_transition_recovery_pending\");\n        }\n        await new Promise<void>((resolveWait) => setTimeout(resolveWait, 10));\n      }\n      if (core.getCommand(warmRecovery.commandId)?.status !== \"completed\") {\n        throw new Error(\"native_runner_warm_transition_result_unproven\");\n      }\n      this.#durableTurnId = desiredIdentity.turnId;\n      this.#eventIdentity = structuredClone(desiredIdentity);\n      this.#eventSourceSeq = 0;\n      this.#deferredTurnStartEvents = [];\n      if (oldTransitionRegistration && newTransitionRegistration) {\n        await oldTransitionRegistration.release();\n        this.#controlPlaneRelease = newTransitionRegistration.release;\n        this.#controlPlaneCheckpoint =\n          newTransitionRegistration.checkpoint ?? null;\n      }\n    }\n    this.#pump = setInterval(() => this.#pumpEventsSafely(), 5);","sourceCodeStart":5155,"sourceCodeEnd":5191,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/live/runnerd-codex-transport.ts#L5155-L5191","documentation":"Timeout guard in the warm-transition wait loop of the runnerd Codex transport: after a warm recovery reconnect, the runner's stored identity has not converged to the desired identity (or warmTransition state is still set) within runnerReconnectGraceMs (default 5s), or the runner process exited during the wait. The warm handover could not be proven complete in the grace window.","triggerScenarios":"Thrown at packages/paperclip-runner/src/live/runnerd-codex-transport.ts:5173 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Increase runnerReconnectGraceMs if the runner legitimately needs longer to adopt the new identity","Check runnerd logs for why the identity was not adopted (crash, restart loop)","Fall back to a cold start of the runner if warm recovery keeps timing out"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}