paperclipai/paperclip · error · Error

runner_remote_provider_artifact_incompatible

runner_remote_provider_artifact_incompatible

Error message

runner_remote_provider_artifact_incompatible: ${label} path must be ${expectedPath}

What it means

Artifact verification guard over the remote provider pack: each artifact entry (provider Node command, production lockfile, OpenCode command/executable, etc.) must exist at the exact expected path in REMOTE_PROVIDER_PACK_ARTIFACT_PATHS; any deviation throws 'runner_remote_provider_artifact_incompatible: <label> path must be <expectedPath>'. This prevents launching from relocated or tampered pack artifacts.

Solutions

  1. Install the provider pack so each artifact sits at its expected canonical path.
  2. Fix the payload's artifacts paths to match REMOTE_PROVIDER_PACK_ARTIFACT_PATHS.
  3. Re-download/repackage the provider pack if artifacts were moved or partially extracted.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at server/src/services/native-runtime/native-session-executor.ts:4098 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of paperclipai/paperclip@3f1d897a7c (2026-09-02). Data as JSON: /api/errors/6516e8f788b7d844. Report an issue: GitHub.

Appendix: source

Thrown at server/src/services/native-runtime/native-session-executor.ts:8980

    ],
    [
      "OpenCode proxy",
      payload.artifacts?.opencodeProxy,
      REMOTE_PROVIDER_PACK_ARTIFACT_PATHS.opencodeProxy,
    ],
    [
      "ACPX sidecar",
      payload.artifacts?.acpxSidecar,
      REMOTE_PROVIDER_PACK_ARTIFACT_PATHS.acpxSidecar,
    ],
  ] as const;
  for (const [label, artifact, expectedPath] of artifactEntries) {
    const artifactPath = providerPackRelativePath(
      artifact?.path,
      `${label} path`,
    );
    if (artifactPath !== expectedPath) {
      throw new Error(
        `runner_remote_provider_artifact_incompatible: ${label} path must be ${expectedPath}`,
      );
    }
    if (
      typeof artifact?.sha256 !== "string" ||
      sha256File(resolve(packRoot, artifactPath)) !== artifact.sha256
    ) {
      throw new Error(
        `runner_remote_provider_artifact_incompatible: ${label} digest mismatch`,
      );
    }
  }
  if (sha256DirectoryTree(resolve(packRoot, "dist")) !== payload.distDigest) {
    throw new Error(
      "runner_remote_provider_artifact_incompatible: provider dist tree digest mismatch",
    );
  }
  const bridgeDigest = `sha256:${createHash("sha256")

View on GitHub (pinned to 3f1d897a7c)