{"record":{"id":"f86360b88d9c90e9","repo":"paperclipai/paperclip","slug":"native-runner-warm-transition-completion-unproven","errorCode":null,"errorMessage":"native_runner_warm_transition_completion_unproven","messagePattern":"native_runner_warm_transition_completion_unproven","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/live/runnerd-codex-transport.ts","lineNumber":5483,"sourceCode":"      const expectation = this.#checkpointProviderIdentityExpectation;\n      const providerIdentity = resolveRunnerdSessionIdentity(result);\n      if (\n        command.type !== \"session.snapshot\" ||\n        core.store.state.warmTransition !== undefined ||\n        !recoveryIdentityMatches(\n          core.store.state.identity,\n          completion.identity,\n        ) ||\n        core.store.state.completedWarmTransition?.receipt.transitionId !==\n          completion.transitionId ||\n        expectation === null ||\n        providerIdentity.threadId !== expectation.driverSessionId ||\n        providerIdentity.sessionId !== expectation.providerSessionId ||\n        ![\"prepared\", \"session_open\", \"turn_active\"].includes(\n          String(result.status),\n        )\n      ) {\n        throw new Error(\"native_runner_warm_transition_completion_unproven\");\n      }\n      this.#confirmCheckpointProviderIdentity(\n        result,\n        \"fresh post-activation session.snapshot\",\n      );\n      // This newly queued command completed only after runner consumed the\n      // final activation ACK. Callback failure retains the completion gate;\n      // retry observes a fresh snapshot, never repeats a provider turn.\n      const completing = (this.#warmRecoveryCompletionInFlight ??=\n        Promise.resolve().then(() =>\n          this.options.onWarmTransitionRecoveryCompleted?.({\n            transitionId: completion.transitionId,\n          }),\n        ));\n      try {\n        await completing;\n        if (this.#pendingWarmRecoveryCompletion === completion) {\n          this.#pendingWarmRecoveryCompletion = null;","sourceCodeStart":5465,"sourceCodeEnd":5501,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/live/runnerd-codex-transport.ts#L5465-L5501","documentation":"Thrown after a `session.snapshot` PRP command completes during warm recovery, when the snapshot fails to prove the native runner's warm transition completed. The transport checks that the resolved provider identity matches the expected driver session id and provider session id, and that `result.status` is one of `prepared`, `session_open`, or `turn_active`. Any mismatch means the warm transition cannot be confirmed.","triggerScenarios":"Warm recovery path queues a `session.snapshot` command with a pending warm-recovery completion, then `resolveRunnerdSessionIdentity(result)` yields a threadId/sessionId that differs from `expectation.driverSessionId`/`expectation.providerSessionId`, or the snapshot `status` is outside the accepted set.","commonSituations":"Stale checkpoint expectations after the provider session was recreated; runnerd restarted into a fresh session so the old session IDs no longer match; snapshot taken too early (status like `idle`/`initializing`); session identity resolution parsing a differently shaped snapshot.","solutions":["Re-run warm recovery from a fresh checkpoint so expectations match the current provider session identity.","Verify runnerd was not restarted between checkpoint capture and recovery; if it was, cold-start instead of warm-starting.","Inspect the snapshot `status` — if it is still initializing, retry after the session reaches `prepared`/`session_open`/`turn_active`.","Check that `resolveRunnerdSessionIdentity` matches the snapshot shape emitted by your runnerd version."],"exampleFix":"// before\nif (providerIdentity.threadId !== expectation.driverSessionId ||\n    providerIdentity.sessionId !== expectation.providerSessionId) {\n  throw new Error(\"native_runner_warm_transition_completion_unproven\");\n}\n// after\nif (providerIdentity.threadId !== expectation.driverSessionId ||\n    providerIdentity.sessionId !== expectation.providerSessionId) {\n  logger.warn({ expected: expectation, got: providerIdentity }, \"warm transition identity mismatch; invalidating checkpoint\");\n  await this.#invalidateCheckpoint();\n  throw new Error(\"native_runner_warm_transition_completion_unproven\");\n}","handlingStrategy":"validation","validationCode":"const identity = resolveRunnerdSessionIdentity(snapshot);\nif (identity.threadId !== expectation.driverSessionId || identity.sessionId !== expectation.providerSessionId) {\n  invalidateCheckpoint();\n}","typeGuard":"function isWarmTransitionSnapshot(result) {\n  return [\"prepared\", \"session_open\", \"turn_active\"].includes(result?.status);\n}","tryCatchPattern":"try {\n  await warmRecover(checkpoint);\n} catch (err) {\n  if (err.message === \"native_runner_warm_transition_completion_unproven\") {\n    await coldStart(); // fall back to a fresh session\n  } else throw err;\n}","preventionTips":["Invalidate checkpoints whenever runnerd restarts.","Verify snapshot status before asserting warm completion.","Keep session identity expectations in sync with the live provider session."],"tags":["runnerd","warm-recovery","session-identity","checkpoint"],"backgroundTag":"internal-invariant-violation","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"}