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

  1. Inspect runner stderr/logs for the crash reason (OOM, panic, auth failure)
  2. Fix the underlying runner crash, then retry the run/rotation
  3. Ensure the runner binary and protocol version match what the transport expects
  4. 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

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


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10). Data as JSON: /api/errors/ffdc2c5e5094e73e. Report an issue: GitHub.