paperclipai/paperclip · error

runnerd exited before provider turn startup

Error message

runnerd exited before provider turn startup

What it means

Startup guard in the turn-start wait loop of the runnerd Codex transport: while polling for the provider's turnStart response (bounded by turnStartTimeoutMs or 30s), the runnerd child process exited before the provider confirmed turn startup. The failure is in the runner daemon process, not the turn request itself.

Source

Thrown at packages/paperclip-runner/src/live/runnerd-codex-transport.ts:5383

      // the new response fence. ACPX echoes the requested identity, while
      // Codex and OpenCode return their provider-assigned identity.
      const deadline =
        this.options.turnStartTimeoutMs === undefined
          ? Date.now() + 30_000
          : commandDeadline;
      const providerTurnStarted = () =>
        turnStartResponseReady({
          responseEpoch,
          observedEpoch: this.#observedTurnStartEpoch,
          expectedProviderTurnId,
          boundTurnId: this.#turnId,
        });
      while (!providerTurnStarted() && Date.now() < deadline) {
        this.#throwIfFailed();
        this.#pumpEvents();
        if (providerTurnStarted()) break;
        if (await this.#runnerHasExited())
          throw new Error("runnerd exited before provider turn startup");
        await new Promise((resolveWait) => setTimeout(resolveWait, 10));
      }
      if (!providerTurnStarted())
        throw new Error("runnerd did not report the provider turn identity");
      responseReady = true;
      return { turn: { id: this.#turnId, status: "inProgress" } };
    } finally {
      if (!responseReady) {
        resolveAdmission(false);
        if (this.#turnStartResponseEpoch === responseEpoch) {
          this.#turnStartResponsePending = false;
          this.#expectedProviderTurnId = null;
        }
      } else {
        // Resolving this async method schedules the strict driver's response
        // continuation as a microtask. Keep terminal frames held until the
        // following task so the driver can bind and emit turn.accepted first.
        // The epoch prevents a late release from clearing a newer turn fence.

View on GitHub (pinned to 01ad858492)

Solutions

  1. Check runnerd stderr/diagnostics for the crash reason during turn startup
  2. Restart the runner transport; a crashed runnerd is not recoverable in place
  3. Verify runnerd binary compatibility (arch/platform) if it exits immediately on every turn
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at packages/paperclip-runner/src/live/runnerd-codex-transport.ts:5383 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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