{"record":{"id":"f98943f1e424a1da","repo":"paperclipai/paperclip","slug":"runner-remote-provider-artifact-incompatible-la","errorCode":null,"errorMessage":"runner_remote_provider_artifact_incompatible: ${label} path belongs to the controller host","messagePattern":"runner_remote_provider_artifact_incompatible: (.+?) path belongs to the controller host","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/live/runnerd-codex-transport.ts","lineNumber":4247,"sourceCode":"            opencodeExecutable!,\n          )\n        : undefined;\n    if (\n      this.options.runnerFilesystemRoot &&\n      (provider === \"opencode\" || provider === \"acpx\")\n    ) {\n      const providerPaths = [\n        [\"provider Node\", providerNodeCommand],\n        [\"OpenCode proxy\", opencodeProxyPath],\n        [\"ACPX sidecar\", acpxSidecarPath],\n        [\"OpenCode executable\", opencodeExecutable ?? \"opencode\"],\n      ] as const;\n      for (const [label, candidate] of providerPaths) {\n        if (\n          candidate.startsWith(\"/Users/\") ||\n          /^[A-Za-z]:\\\\\\\\Users\\\\\\\\/.test(candidate)\n        ) {\n          throw new Error(\n            `runner_remote_provider_artifact_incompatible: ${label} path belongs to the controller host`,\n          );\n        }\n      }\n      if (!this.options.providerNodeCommand) {\n        throw new Error(\n          \"runner_remote_provider_artifact_incompatible: remote JS provider omitted its provider-pack Node executable\",\n        );\n      }\n      if (provider === \"opencode\" && !this.options.opencodeProxyPath) {\n        throw new Error(\n          \"runner_remote_provider_artifact_incompatible: remote OpenCode omitted its packaged proxy\",\n        );\n      }\n      if (provider === \"acpx\" && !this.options.acpxSidecarPath) {\n        throw new Error(\n          \"runner_remote_provider_artifact_incompatible: remote ACPX omitted its packaged sidecar\",\n        );","sourceCodeStart":4229,"sourceCodeEnd":4265,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/live/runnerd-codex-transport.ts#L4229-L4265","documentation":"Guard against accidentally shipping controller-host-specific provider artifact paths (macOS /Users/... or Windows C:\\Users\\...) to a remote runner. A provider path pointing at the controller host cannot work on the remote runner host, so the transport fails fast with a labeled, incompatible-path error.","triggerScenarios":"Configuring providerPaths (provider binary/state/session paths) with values that start with /Users/ or match ^[A-Za-z]:\\\\Users\\\\ while constructing a remote runner transport.","commonSituations":"Hardcoding the developer's macOS home directory path in provider config; copying local codex session/state paths from the controller into remote runner options; running the controller on a laptop and the runner on a container/CI host.","solutions":["Point provider paths at locations valid on the remote runner host, not the controller host","Resolve provider paths relative to the runner's root/workdir instead of absolute controller paths","Move provider artifacts into a shared/remotely-accessible location referenced by a runner-local path","Scrub /Users/... or C:\\Users\\... defaults from your provider configuration"],"exampleFix":"// before\nconst providerPaths = { codexHome: \"/Users/alice/.codex\" };\n// after\nconst providerPaths = { codexHome: resolve(this.#root, \"provider/codex-home\") };","handlingStrategy":"validation","validationCode":"const hostUserPath = /(^\\/Users\\/)|(^[A-Za-z]:\\\\\\\\Users\\\\\\\\)/;\nfor (const p of Object.values(providerPaths)) {\n  if (hostUserPath.test(String(p))) {\n    throw new Error(`provider path ${p} is controller-host-specific; use a runner-local path`);\n  }\n}","typeGuard":"null","tryCatchPattern":"try {\n  transport = new RunnerdCodexTransport(options);\n} catch (err) {\n  if (err instanceof Error && err.message.includes(\"runner_remote_provider_artifact_incompatible\")) {\n    options.providerPaths = remapPathsToRunnerLocal(options.providerPaths);\n    transport = new RunnerdCodexTransport(options);\n  } else throw err;\n}","preventionTips":["Never hardcode absolute home-directory paths in provider config","Resolve provider artifacts relative to the runner root","Validate all provider paths against host-specific patterns in CI config tests"],"tags":["configuration","paths","remote-runner"],"backgroundTag":"invalid-config-value","analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-10T03:14:50.855Z","contentChangedAt":"2026-09-10T03:14:50.855Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}