paperclipai/paperclip · error · Error
Writable sandbox path
Error message
Writable sandbox path "${normalizedExtraPath}" is outside synchronized workspace "${workspaceDir}" and has no outbound restore mapping. What it means
A writable (rw) extraPath lies outside the synchronized workspace and has no outboundRestorePaths mapping, so writes to it would be lost or escape the sandbox contract.
Solutions
- Keep writable sandbox paths inside the synchronized workspace, or configure an outbound restore mapping.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at packages/adapter-utils/src/local-process-sandbox.ts:373 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@120ae5428f (2026-08-18).
Data as JSON: /api/errors/2e3984508ee0bf44.
Report an issue: GitHub.
Appendix: source
Thrown at packages/adapter-utils/src/local-process-sandbox.ts:373
const cwd = normalizeAbsolutePath(input.cwd, "Sandbox cwd");
if (filesystemScope === "workspace") {
const relativeCwd = path.relative(workspaceDir, cwd);
if (relativeCwd.startsWith("..") || path.isAbsolute(relativeCwd)) {
throw new Error(`Sandbox cwd "${cwd}" must be inside workspaceDir "${workspaceDir}".`);
}
const outboundRestorePaths = (input.options.outboundRestorePaths ?? []).map((candidate, index) =>
normalizeAbsolutePath(candidate, `Sandbox outboundRestorePaths[${index}]`));
for (const [index, extraPath] of (input.options.extraPaths ?? []).entries()) {
if (extraPath.access !== "rw") continue;
const normalizedExtraPath = normalizeAbsolutePath(extraPath.path, `Sandbox extraPaths[${index}].path`);
const relativeToWorkspace = path.relative(workspaceDir, normalizedExtraPath);
const synchronized = !relativeToWorkspace.startsWith("..") && !path.isAbsolute(relativeToWorkspace);
const restored = outboundRestorePaths.some((restorePath) => {
const relative = path.relative(restorePath, normalizedExtraPath);
return !relative.startsWith("..") && !path.isAbsolute(relative);
});
if (!synchronized && !restored) {
throw new Error(
`Writable sandbox path "${normalizedExtraPath}" is outside synchronized workspace "${workspaceDir}" and has no outbound restore mapping.`,
);
}
}
}
const bwrapCommand = input.options.command?.trim() || "bwrap";
const args = ["--die-with-parent", "--new-session", "--unshare-pid", "--unshare-ipc", "--unshare-uts"];
const env: Record<string, string | undefined> = {};
let cleanup: (() => Promise<void>) | undefined;
let executable = input.executable;
let executableArgs = input.args;
if (filesystemScope === "workspace") {
args.push("--tmpfs", "/", "--proc", "/proc", "--dev", "/dev", "--tmpfs", "/tmp");
args.push(
"--symlink", "usr/bin", "/bin",
"--symlink", "usr/sbin", "/sbin",View on GitHub (pinned to 120ae5428f)