{"record":{"id":"590610b72c0342cb","repo":"paperclipai/paperclip","slug":"additional-source-projectid-is-not-a-simple-path-s","errorCode":null,"errorMessage":"additional source projectId is not a simple path segment: ${projectId}","messagePattern":"additional source projectId is not a simple path segment: (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/adapter-utils/src/sandbox-managed-runtime.ts","lineNumber":1266,"sourceCode":"    // `postUploadCommands`, confine the operation's source and target to their\n    // own roots (fail-closed), and delegate to `syncIn` (native transfer, or the\n    // base64-tar fallback). `finish` emits the terminal progress line.\n    const stageConfinedSyncIn = async (params: {\n      files: SandboxSyncFileMapping[];\n      postUploadCommands?: SandboxPostUploadCommand[];\n      sourceRoots: string[];\n      targetRoots: string[];\n      progressLabel: string;\n      statusPhase: RuntimeStatusPhase;\n      progressBytes: number;\n    }): Promise<void> => {\n      const operations: SandboxSyncOperation[] = [{\n        operationId: nextSyncOperationId(),\n        files: params.files,\n        ...(params.postUploadCommands\n          ? { postUploadCommands: withRunTimeout(params.postUploadCommands) }\n          : {}),\n      }];\n      assertSyncOperationsConfined(operations, {\n        sourceRoots: params.sourceRoots,\n        targetRoots: params.targetRoots,\n      });\n      const upload = makeTransferProgress(\n        input.onProgress,\n        \"Syncing\",\n        \"to\",\n        params.progressLabel,\n        { sink: input.onRuntimeProgress, phase: params.statusPhase },\n      );\n      const syncResult = await syncIn(operations);\n      // Prefer the transport's own byte total. It is the real count for a\n      // provider that has no host tarball to stat (a referenced project rides\n      // a `directory` mapping). Fall back to the caller-supplied count when\n      // the transport reports 0, so a provider that under-reports still\n      // shows the host-known workspace total.\n      const transferredBytes = sumSyncResultBytes(syncResult);","sourceCodeStart":1248,"sourceCodeEnd":1284,"githubUrl":"https://github.com/paperclipai/paperclip/blob/3f1d897a7c018d76563a21c6e39c3c9b03933622/packages/adapter-utils/src/sandbox-managed-runtime.ts#L1248-L1284","documentation":"An additional project source entry supplied a localPath that is not POSIX-absolute; the sandbox sync cannot stage a relative path into the managed runtime, so the entry is rejected (per-project failure isolation logs and skips it).","triggerScenarios":"Thrown at packages/adapter-utils/src/sandbox-managed-runtime.ts:1039 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use a simple path segment (no separators or traversal) for projectId."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"3f1d897a7c018d76563a21c6e39c3c9b03933622","analyzedAt":"2026-08-21T17:58:32.592Z","contentChangedAt":"2026-08-21T17:58:32.592Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}