{"record":{"id":"f6f9d4ebd1e3ab5b","repo":"Significant-Gravitas/AutoGPT","slug":"cannot-leave-the-default-workspace","errorCode":null,"errorMessage":"Cannot leave the default workspace","messagePattern":"Cannot leave the default workspace","errorType":"http","errorClass":"ValueError","httpStatus":400,"severity":"error","filePath":"autogpt_platform/backend/backend/api/features/orgs/team_db.py","lineNumber":137,"sourceCode":"        return TeamResponse.from_db(ws)\n\n    await prisma.teammember.create(\n        data={\n            \"teamId\": ws_id,\n            \"userId\": user_id,\n            \"status\": \"ACTIVE\",\n        }\n    )\n    return TeamResponse.from_db(ws)\n\n\nasync def leave_team(ws_id: str, user_id: str) -> None:\n    \"\"\"Leave a workspace. Cannot leave the default workspace.\"\"\"\n    ws = await prisma.team.find_unique(where={\"id\": ws_id})\n    if ws is None:\n        raise NotFoundError(f\"Workspace {ws_id} not found\")\n    if ws.isDefault:\n        raise ValueError(\"Cannot leave the default workspace\")\n\n    await prisma.teammember.delete_many(where={\"teamId\": ws_id, \"userId\": user_id})\n\n\nasync def list_team_members(ws_id: str) -> list[TeamMemberResponse]:\n    \"\"\"List all active members of a workspace.\"\"\"\n    members = await prisma.teammember.find_many(\n        where={\"teamId\": ws_id, \"status\": \"ACTIVE\"},\n        include={\"User\": True},\n    )\n    return [TeamMemberResponse.from_db(m) for m in members]\n\n\nasync def add_team_member(\n    ws_id: str,\n    user_id: str,\n    org_id: str,\n    is_admin: bool = False,","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/Significant-Gravitas/AutoGPT/blob/9c8bb5550f446ba5d3046b78896578742495b3cf/autogpt_platform/backend/backend/api/features/orgs/team_db.py#L119-L155","documentation":"Raised by team_db.leave_team when the target workspace has isDefault=true. Users cannot leave their org's default workspace — org membership is expressed through it, so leaving would break the org-membership invariant. Plain ValueError from the DB layer.","triggerScenarios":"POST /api/orgs/{org_id}/workspaces/{ws_id}/leave where ws_id is the default workspace. Typically a UI that renders a 'Leave' action for every workspace membership row including the default one.","commonSituations":"Workspace list UI without special-casing isDefault; users trying to declutter by leaving the auto-created workspace; bulk 'leave all workspaces' scripts.","solutions":["Hide/disable the 'Leave' control for workspaces where isDefault is true","If the user wants out of the org entirely, use the org leave/remove-member endpoints instead","Filter default workspaces out of 'leaveable' lists in client state selectors","In scripts, skip rows where isDefault before calling leave"],"exampleFix":"// before\nmemberships.map(m => <LeaveButton onClick={() => leave(m.teamId)} />);\n// after\nmemberships.map(m =>\n  m.workspace.isDefault\n    ? <span>Default workspace — leave the organization instead</span>\n    : <LeaveButton onClick={() => leave(m.teamId)} />\n);","handlingStrategy":"validation","validationCode":"const ws = await getWorkspace(orgId, wsId);\nif (ws.isDefault) throw new Error('Leave the organization instead of the default workspace');","typeGuard":"function isLeavableWorkspace(ws: TeamResponse): boolean {\n  return ws.isDefault !== true;\n}","tryCatchPattern":"try {\n  await leaveTeam(orgId, wsId);\n} catch (e) {\n  if (e.message.includes('default workspace')) {\n    confirmLeaveOrganization(); // offer org-level leave instead\n  } else throw e;\n}","preventionTips":["Hide leave actions for default workspaces","Map 'leave default' intent to org leave flow"],"tags":["workspaces","orgs","leave","guard","valueerror"],"backgroundTag":null,"analyzedSha":"9c8bb5550f446ba5d3046b78896578742495b3cf","analyzedAt":"2026-08-14T17:17:21.957Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}