{"record":{"id":"378d94bf76cdc24e","repo":"paperclipai/paperclip","slug":"fallback-agent-home-cwd","errorCode":"fallback_agent_home_cwd","errorMessage":"Issue ${issue.identifier ?? issue.id} expected a project workspace, but ${input.adapterType} would launch from agent fallback cwd \"${effectiveCwd}\".","messagePattern":"Issue (.+?) expected a project workspace, but (.+?) would launch from agent fallback cwd \"(.+?)\"\\.","errorType":"validation","errorClass":"WorkspaceValidationFailure","httpStatus":null,"severity":"error","filePath":"server/src/services/heartbeat.ts","lineNumber":2549,"sourceCode":"    // Preserve the closed failure code without copying subprocess output or\n    // credentials into the durable run. Setup recovery needs the actual cause.\n    if (isWorkspaceGitScanError(error)) throw new WorkspaceGitScanError(error.code, message);\n    throw new Error(message);\n  }\n\n  try {\n    await fs.rename(cloneTmpDir, cwd);\n  } catch (renameError) {\n    await fs\n      .rm(cloneTmpDir, { recursive: true, force: true })\n      .catch(() => undefined);\n    // The target appearing between the emptiness check and the rename means another\n    // materialization won the race; adopt its checkout instead of failing the run.\n    if (await hasAdoptableGitDir()) {\n      return { cwd, warning: null };\n    }\n    const reason =\n      renameError instanceof Error ? renameError.message : String(renameError);\n    throw new Error(\n      `Failed to move managed checkout into place at \"${cwd}\": ${reason}`,\n    );\n  }\n  return { cwd, warning: null };\n}\n\n/** Keep every distinct project repository inside the task's writable/synced root. */\nexport async function prepareProjectRepositoryWorkspaces(input: {\n  cwd: string;\n  anchorRepoUrl: string | null;\n  workspaces: Array<Pick<typeof projectWorkspaces.$inferSelect, \"id\" | \"repoUrl\" | \"repoRef\"> & { cwd?: string | null }>;\n  resolveGitAuth?: GitRemoteAuthProvider | null;\n}): Promise<Array<{ workspaceId: string; cwd: string; repoUrl: string; repoRef: string | null }>> {\n  const identity = (url: string) => url.trim().replace(/\\.git\\/?$/, \"\").replace(/\\/$/, \"\");\n  const seen = new Set(input.anchorRepoUrl ? [identity(input.anchorRepoUrl)] : []);\n  const selected = input.workspaces.filter((workspace) => {\n    if (!workspace.repoUrl || seen.has(identity(workspace.repoUrl))) return false;","sourceCodeStart":2531,"sourceCodeEnd":2567,"githubUrl":"https://github.com/paperclipai/paperclip/blob/3f1d897a7c018d76563a21c6e39c3c9b03933622/server/src/services/heartbeat.ts#L2531-L2567","documentation":"The issue's execution policy expects a project workspace, but the resolved effective cwd is the agent's default fallback directory, meaning no project workspace was attached or restorable for this adapter launch. The guard catches this before the agent starts in the wrong location.","triggerScenarios":"Thrown at server/src/services/heartbeat.ts:2134 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Configure the project workspace so the adapter launches from it instead of the agent fallback cwd."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"3f1d897a7c018d76563a21c6e39c3c9b03933622","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}