{"record":{"id":"b2fe5ce64e61c47c","repo":"paperclipai/paperclip","slug":"provider-pack-build-node-is-older-than-24-11-0","errorCode":null,"errorMessage":"Provider pack build Node is older than 24.11.0","messagePattern":"Provider pack build Node is older than 24\\.11\\.0","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/scripts/build-provider-pack.mjs","lineNumber":154,"sourceCode":"  if (realpathSync(codexAcpRequire.resolve(\"@openai/codex/package.json\")) !==\n      realpathSync(packRequire.resolve(\"@openai/codex/package.json\"))) {\n    throw new Error(\"Codex ACP must share the image's Codex installation\");\n  }\n\n  // Reuse the already-qualified build interpreter instead of introducing a\n  // package-manager lifecycle hook or a second binary supply chain. The pack\n  // manifest binds the copied bytes, platform, architecture, and minimum\n  // version before any provider is launched.\n  const minimumNodeVersion = [24, 11, 0];\n  const actualNodeVersion = process.versions.node.split(\".\").map(Number);\n  if (\n    actualNodeVersion[0] < minimumNodeVersion[0] ||\n    (actualNodeVersion[0] === minimumNodeVersion[0] &&\n      (actualNodeVersion[1] < minimumNodeVersion[1] ||\n        (actualNodeVersion[1] === minimumNodeVersion[1] &&\n          actualNodeVersion[2] < minimumNodeVersion[2])))\n  ) {\n    throw new Error(\"Provider pack build Node is older than 24.11.0\");\n  }\n  const stableNodeRoot = join(temporaryRoot, \"node_modules\", \"node\");\n  if (existsSync(stableNodeRoot)) {\n    throw new Error(\n      \"Provider pack deployment unexpectedly claimed the stable Node path\",\n    );\n  }\n  const stableNodeCommand = join(stableNodeRoot, \"bin\", \"node\");\n  mkdirSync(dirname(stableNodeCommand), { recursive: true, mode: 0o755 });\n  copyFileSync(process.execPath, stableNodeCommand);\n  chmodSync(stableNodeCommand, 0o755);\n\n  // pnpm's generated .bin shims embed the temporary deployment directory in\n  // NODE_PATH. That makes an otherwise identical provider pack hash differ on\n  // every build and leaks a nonexistent host path after relocation. Replace\n  // every provider-facing shim with a pack-relative launcher that always uses\n  // the pinned Node executable owned by this pack.\n  // The image exposes these same installations to every adapter. Never add a","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/scripts/build-provider-pack.mjs#L136-L172","documentation":"Version guard in build-provider-pack.mjs: the Node interpreter running the pack build is older than the manifest's minimum (24.11.0). The pack manifest binds the interpreter version before any provider launches, so an under-qualified build Node aborts the build rather than shipping a pack that could behave differently at runtime.","triggerScenarios":"Thrown at packages/paperclip-runner/scripts/build-provider-pack.mjs:154 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Run the provider-pack build with Node >= 24.11.0","Update the pinned build interpreter in CI/tooling to a qualifying Node release","Lower minimumNodeVersion only if runtime compatibility with older Node is verified"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-10T03:14:50.855Z","contentChangedAt":"2026-09-10T03:14:50.855Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}