{"record":{"id":"2735159c3c33dddb","repo":"paperclipai/paperclip","slug":"provider-transport-failed-warm-runner-did-not-re","errorCode":null,"errorMessage":"provider_transport_failed: warm runner did not re-authenticate within ${this.options.runnerReconnectGraceMs ?? 5_000}ms","messagePattern":"provider_transport_failed: warm runner did not re-authenticate within (.+?)ms","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/live/runnerd-codex-transport.ts","lineNumber":3597,"sourceCode":"        );\n      }\n      if (!reportedReconnectWait) {\n        reportedReconnectWait = true;\n        this.#diagnostic(\n          \"warm runner connection interrupted; waiting for re-authentication before authority rotation\",\n        );\n      }\n      if (await this.#runnerHasExited()) {\n        throw new Error(\n          \"native_runner_warm_attachment_runner_exited: runner exited before authority rotation\",\n        );\n      }\n      await Promise.race([\n        new Promise<void>((resolveWait) => setTimeout(resolveWait, 25)),\n        this.#failureSignal,\n      ]);\n    }\n    throw new Error(\n      `provider_transport_failed: warm runner did not re-authenticate within ${this.options.runnerReconnectGraceMs ?? 5_000}ms`,\n    );\n  }\n\n  async attachRun(input: {\n    runId: string;\n    turnId: string;\n    itemId: string;\n  }): Promise<void> {\n    if (this.#pendingWarmRecoveryCompletion !== null) {\n      throw new Error(\"native_runner_warm_transition_completion_pending\");\n    }\n    const core = this.#core;\n    if (!core || !this.#startupComplete) {\n      throw new Error(\"native_runner_prp_run_rotation_unavailable\");\n    }\n    await this.#awaitWarmRunAttachmentReady();\n    const prior = core.store.state.identity;","sourceCodeStart":3579,"sourceCodeEnd":3615,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/live/runnerd-codex-transport.ts#L3579-L3615","documentation":"After a warm runner's connection is interrupted, the transport grants a grace period (options.runnerReconnectGraceMs, default 5000ms) for it to re-authenticate before rotating authority. If the deadline passes with no single authenticated connection, it throws this provider_transport_failed error with the elapsed grace window in the message.","triggerScenarios":"#awaitWarmRunnerConnection's while(Date.now() < deadline) loop exhausts because the runner never re-authenticates within runnerReconnectGraceMs after a connection drop.","commonSituations":"Network/IPC stall between transport and runner; slow runner restart exceeding the 5s default; overloaded host delaying re-authentication; grace period configured too low for the environment.","solutions":["Raise options.runnerReconnectGraceMs (e.g. to 15000-30000ms) on slow hosts","Check runner logs to see why re-authentication did not complete","Retry the operation once the runner is connected again","Investigate IPC/network stability between transport and runner process"],"exampleFix":"// before\nnew RunnerdCodexTransport({ options: { runnerReconnectGraceMs: 5000 } });\n// after\nnew RunnerdCodexTransport({ options: { runnerReconnectGraceMs: 20_000 } });","handlingStrategy":"retry","validationCode":"const graceMs = transport.options?.runnerReconnectGraceMs ?? 5000;\nif (graceMs < 10000 && slowEnvironment) console.warn('grace period likely too short');","typeGuard":null,"tryCatchPattern":"try {\n  await transport.rotateAuthority();\n} catch (e) {\n  if (String(e.message).startsWith('provider_transport_failed: warm runner did not re-authenticate')) {\n    await backoffRetry(() => transport.rotateAuthority(), { attempts: 3 });\n  } else throw e;\n}","preventionTips":["Size runnerReconnectGraceMs to your host's worst-case reconnect latency","Monitor runner re-auth latency and alert when it approaches the grace window","Avoid rotating authority during known IPC/network instability"],"tags":["codex","native-runner","timeout","reconnect-grace"],"backgroundTag":"request-timeout","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"}