paperclipai/paperclip · error

runnerd did not report its provider identity

Error message

runnerd did not report its provider identity

What it means

Fallback error of the provider-identity wait loop: thrown when the loop exhausts its deadline without runnerd either reporting the expected provider identity or exiting. It is the timeout counterpart to "runnerd exited before provider startup" — the process is alive but never publishes the identity evidence the transport requires.

Source

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

  ): Promise<void> {
    const deadline = Date.now() + 30_000;
    while (Date.now() < deadline) {
      this.#throwIfFailed();
      this.#pumpEvents();
      if (
        this.#threadId.length > 0 &&
        (this.#checkpointProviderIdentityExpectation !== null ||
          this.#evidence.providerExecutionKind === "remote_service" ||
          this.#evidence.providerPid !== null) &&
        (expectedEventType === undefined ||
          this.#providerIdentityEventType === expectedEventType)
      )
        return;
      if (await this.#runnerHasExited())
        throw new Error("runnerd exited before provider startup");
      await new Promise((resolveWait) => setTimeout(resolveWait, 10));
    }
    throw new Error("runnerd did not report its provider identity");
  }

  async #waitCommand(
    type: string,
    commandId?: string,
    deadline = Date.now() + 30_000,
  ): Promise<void> {
    while (Date.now() < deadline) {
      this.#throwIfFailed();
      const command =
        commandId === undefined
          ? this.#core?.store.state.commands.find(
              (candidate) => candidate.type === type,
            )
          : this.#core?.getCommand(commandId);
      if (command?.status === "completed") return;
      if (command !== undefined && command.status !== "pending") {
        throw new Error(

View on GitHub (pinned to 01ad858492)

Solutions

  1. Confirm the runnerd version emits the provider identity event type the transport expects (version-match runnerd and paperclip-runner).
  2. Increase the wait deadline if the host is legitimately slow, or speed up runnerd startup.
  3. Capture runnerd logs to determine whether startup is hung; restart runnerd.
  4. If the expected event type changed in a recent upgrade, update the transport's expected event constant.

Example fix

// before
throw new Error("runnerd did not report its provider identity");
// after
throw new Error(
  `runnerd did not report its provider identity within ${deadlineMs}ms (expected event: ${expectedEventType ?? "any"})`,
);
Defensive patterns

Strategy: retry

Validate before calling

if (!identityEventSeenWithin(startupDeadlineMs)) logger.warn("runnerd provider identity not seen; startup may be hung");

Try / catch

try {
  await transport.waitForProviderStartup(expectedEventType);
} catch (err) {
  if (err.message.includes("did not report its provider identity")) {
    await restartRunnerdAndRetry(expectedEventType);
  } else throw err;
}

Prevention

When it happens

Trigger: Polling for provider identity (with optional `expectedEventType`) until the loop's iteration budget/deadline expires while `#runnerHasExited()` stays false and the identity evidence (providerPid + expected event type) never arrives.

Common situations: runnerd hung during startup; a runnerd version that emits a different identity event name than `expectedEventType`; extremely slow host where startup exceeds the wait window; identity event consumed/hidden by a protocol mismatch.

Understand the failure class

Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.

Related errors


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