paperclipai/paperclip · error · Error
Provider pack deployment unexpectedly claimed the stable Nod
Error message
Provider pack deployment unexpectedly claimed the stable Node path
What it means
Guard in build-provider-pack.mjs after the Node version check: the deployed pack's Node interpreter path resolved to the stable/system Node path rather than the qualified build interpreter the script intended to bind. It means pnpm deploy redirected or shimmed the interpreter, so the pack would run an unqualified Node at runtime; the build aborts.
Source
Thrown at packages/paperclip-runner/scripts/build-provider-pack.mjs:158
// Reuse the already-qualified build interpreter instead of introducing a
// package-manager lifecycle hook or a second binary supply chain. The pack
// manifest binds the copied bytes, platform, architecture, and minimum
// version before any provider is launched.
const minimumNodeVersion = [24, 11, 0];
const actualNodeVersion = process.versions.node.split(".").map(Number);
if (
actualNodeVersion[0] < minimumNodeVersion[0] ||
(actualNodeVersion[0] === minimumNodeVersion[0] &&
(actualNodeVersion[1] < minimumNodeVersion[1] ||
(actualNodeVersion[1] === minimumNodeVersion[1] &&
actualNodeVersion[2] < minimumNodeVersion[2])))
) {
throw new Error("Provider pack build Node is older than 24.11.0");
}
const stableNodeRoot = join(temporaryRoot, "node_modules", "node");
if (existsSync(stableNodeRoot)) {
throw new Error(
"Provider pack deployment unexpectedly claimed the stable Node path",
);
}
const stableNodeCommand = join(stableNodeRoot, "bin", "node");
mkdirSync(dirname(stableNodeCommand), { recursive: true, mode: 0o755 });
copyFileSync(process.execPath, stableNodeCommand);
chmodSync(stableNodeCommand, 0o755);
// pnpm's generated .bin shims embed the temporary deployment directory in
// NODE_PATH. That makes an otherwise identical provider pack hash differ on
// every build and leaks a nonexistent host path after relocation. Replace
// every provider-facing shim with a pack-relative launcher that always uses
// the pinned Node executable owned by this pack.
// The image exposes these same installations to every adapter. Never add a
// separate global/runner-only CLI version; refresh these packages and their
// qualification digests together to the latest stable releases.
writePortableNodeShim("codex", "@openai/codex/bin/codex.js");
const claudeAcpRequire = createRequire(View on GitHub (pinned to 01ad858492)
Solutions
- Ensure the deploy step preserves the qualified interpreter path (no shim/symlink to stable Node)
- Pin the interpreter explicitly in the pack manifest and avoid pnpm rewriting the bin path
- Rebuild after correcting the toolchain so the qualified Node is the one resolved
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at packages/paperclip-runner/scripts/build-provider-pack.mjs:158 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/9fe56ba3dff5857b.
Report an issue: GitHub.