paperclipai/paperclip · error
native_runner_warm_attachment_runner_exited: runner exited b
Error message
native_runner_warm_attachment_runner_exited: runner exited before authority rotation
What it means
While waiting for the warm runner to re-authenticate before authority rotation, the transport periodically checks whether the runner process has exited. If it has, waiting is pointless and this error is thrown, indicating the runner died mid-transition.
Source
Thrown at packages/paperclip-runner/src/live/runnerd-codex-transport.ts:3588
this.#diagnostic(
"warm runner re-authenticated before authority rotation",
);
}
return;
}
if (connectionCount > 1) {
throw new Error(
`native_runner_warm_attachment_ambiguous: expected one authenticated runner, found ${connectionCount}`,
);
}
if (!reportedReconnectWait) {
reportedReconnectWait = true;
this.#diagnostic(
"warm runner connection interrupted; waiting for re-authentication before authority rotation",
);
}
if (await this.#runnerHasExited()) {
throw new Error(
"native_runner_warm_attachment_runner_exited: runner exited before authority rotation",
);
}
await Promise.race([
new Promise<void>((resolveWait) => setTimeout(resolveWait, 25)),
this.#failureSignal,
]);
}
throw new Error(
`provider_transport_failed: warm runner did not re-authenticate within ${this.options.runnerReconnectGraceMs ?? 5_000}ms`,
);
}
async attachRun(input: {
runId: string;
turnId: string;
itemId: string;
}): Promise<void> {View on GitHub (pinned to 01ad858492)
Solutions
- Inspect runner stderr/logs for the crash reason (OOM, panic, auth failure)
- Fix the underlying runner crash, then retry the run/rotation
- Ensure the runner binary and protocol version match what the transport expects
- Increase runner resource limits or fix environment issues causing premature exit
Example fix
// before
await transport.rotateAuthority(); // throws if runner already dead
// after
if (await transport.runnerHasExited()) {
await transport.restartRunner();
}
await transport.rotateAuthority(); Defensive patterns
Strategy: retry
Validate before calling
if (await transport.runnerHasExited?.()) throw new Error('runner already exited; restart before rotation'); Try / catch
try {
await transport.rotateAuthority();
} catch (e) {
if (String(e.message).startsWith('native_runner_warm_attachment_runner_exited')) {
await collectRunnerCrashLogs();
await transport.restartRunner();
await transport.rotateAuthority();
} else throw e;
} Prevention
- Monitor the runner process (exit events, health checks) continuously
- Set adequate memory limits to avoid OOM kills
- Check runner liveness before every rotation attempt
When it happens
Trigger: #awaitWarmRunnerConnection detects #runnerHasExited() is true during the re-auth wait loop — the runner process crashed or was killed before completing re-authentication.
Common situations: Runner OOM-killed or crashing on startup; operator killing the runner process; runner failing authentication and exiting; container restart policies tearing it down.
Related errors
- native_runner_warm_attachment_not_quiescent
- native_runner_warm_attachment_ambiguous: expected one authen
- native_runner_authority_unavailable
- provider_transport_failed: warm runner did not re-authentica
- native_runner_prp_run_rotation_unavailable
AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10).
Data as JSON: /api/errors/ffdc2c5e5094e73e.
Report an issue: GitHub.