paperclipai/paperclip · error

native_runner_warm_transition_result_unproven

Error message

native_runner_warm_transition_result_unproven

What it means

Correlation guard in the PRP semantic tool-call path of the runnerd Codex transport: an incoming semantic tool call was dropped because its binding no longer matches the admitted turn — admission was not accepted, the transport closed, the turn/thread/epoch changed, or the call's runId/normalizedSessionId no longer match the live core identity. It protects against executing a tool call that belongs to a stale or superseded turn.

Source

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

    } else {
      this.#evidence.runnerPid = handle?.child.pid ?? null;
      this.#evidence.runnerProcessGroupId = handle?.processGroupId ?? null;
    }
    this.#publish();
    if (warmRecovery) {
      const deadline =
        Date.now() + (this.options.runnerReconnectGraceMs ?? 5_000);
      while (
        !recoveryIdentityMatches(core.store.state.identity, desiredIdentity) ||
        core.store.state.warmTransition !== undefined
      ) {
        if (Date.now() >= deadline || (await this.#runnerHasExited())) {
          throw new Error("native_runner_warm_transition_recovery_pending");
        }
        await new Promise<void>((resolveWait) => setTimeout(resolveWait, 10));
      }
      if (core.getCommand(warmRecovery.commandId)?.status !== "completed") {
        throw new Error("native_runner_warm_transition_result_unproven");
      }
      this.#durableTurnId = desiredIdentity.turnId;
      this.#eventIdentity = structuredClone(desiredIdentity);
      this.#eventSourceSeq = 0;
      this.#deferredTurnStartEvents = [];
      if (oldTransitionRegistration && newTransitionRegistration) {
        await oldTransitionRegistration.release();
        this.#controlPlaneRelease = newTransitionRegistration.release;
        this.#controlPlaneCheckpoint =
          newTransitionRegistration.checkpoint ?? null;
      }
    }
    this.#pump = setInterval(() => this.#pumpEventsSafely(), 5);
    if (adoptedRunner) {
      await this.#awaitAdoptedRunnerConnection(
        adoptedRunner,
        registration?.ready,
      );

View on GitHub (pinned to 01ad858492)

Solutions

  1. Inspect runner logs for the epoch/thread/turn mismatch that invalidated the call binding
  2. Ensure only one live transport core per run (duplicate runners cause identity races)
  3. Re-issue the turn that produced the tool call so it is admitted under the current identity
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at packages/paperclip-runner/src/live/runnerd-codex-transport.ts:5178 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/4c71739c7ee466a9. Report an issue: GitHub.