{"record":{"id":"61c327161ac32885","repo":"zed-industries/zed","slug":"user-has-not-signed-the-zed-cla","errorCode":null,"errorMessage":"user has not signed the Zed CLA","messagePattern":"user has not signed the Zed CLA","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/collab/src/db/queries/rooms.rs","lineNumber":1203,"sourceCode":"        if let Some(channel) = channel {\n            let requires_zed_cla = channel.requires_zed_cla\n                || channel::Entity::find()\n                    .filter(\n                        channel::Column::Id\n                            .is_in(channel.ancestors())\n                            .and(channel::Column::RequiresZedCla.eq(true)),\n                    )\n                    .count(tx)\n                    .await?\n                    > 0;\n            if requires_zed_cla\n                && contributor::Entity::find()\n                    .filter(contributor::Column::UserId.eq(user_id))\n                    .one(tx)\n                    .await?\n                    .is_none()\n            {\n                Err(anyhow!(\"user has not signed the Zed CLA\"))?;\n            }\n        }\n        Ok(())\n    }\n\n    pub async fn connection_lost(&self, connection: ConnectionId) -> Result<()> {\n        self.transaction(|tx| async move {\n            self.room_connection_lost(connection, &tx).await?;\n            self.channel_buffer_connection_lost(connection, &tx).await?;\n            Ok(())\n        })\n        .await\n    }\n\n    pub async fn room_connection_lost(\n        &self,\n        connection: ConnectionId,\n        tx: &DatabaseTransaction,","sourceCodeStart":1185,"sourceCodeEnd":1221,"githubUrl":"https://github.com/zed-industries/zed/blob/bc538def4545534201bbfcac4e95ac34ea6501b6/crates/collab/src/db/queries/rooms.rs#L1185-L1221","documentation":"Thrown by check_user_has_signed_cla when the room's channel has requires_zed_cla = true and the user has no row in the contributor table. Zed gates certain rooms (e.g. the Zed contributors channel) behind signing the Contributor License Agreement; the count query over channels joined from the room determines whether the gate applies.","triggerScenarios":"Joining or being invited into a CLA-required room without having signed the Zed CLA; calling into a CLA-gated channel room; rejoining such a room after the contributor record was never created for this user account.","commonSituations":"New contributor accounts joining the contributors channel for the first time; users signed into a different GitHub account than the one that signed the CLA; automated invites into gated rooms.","solutions":["Sign the Zed CLA (zed.dev/contribute/cla, authenticated with the same GitHub account used in the client) and retry joining the room","Verify the client is signed in with the GitHub identity that signed the CLA","If you believe you already signed it, confirm the contributor record exists for that user id (support/dev-tools) before retrying"],"exampleFix":"// before\nclient.join_room(cla_required_room_id).await?;\n\n// after (surface an actionable message)\nif let Err(err) = client.join_room(cla_required_room_id).await {\n    if err.to_string().contains(\"has not signed the Zed CLA\") {\n        self.ui.open_url(\"https://zed.dev/contribute/cla\");\n        self.ui.show_toast(\"Sign the Zed CLA to join this room\");\n        return Ok(());\n    }\n    return Err(err);\n}","handlingStrategy":"validation","validationCode":"// Gate joining CLA-required rooms behind a known-signed-CLA state.\nif room.requires_zed_cla && !self.user_signed_cla {\n    self.ui.open_url(\"https://zed.dev/contribute/cla\");\n    self.ui.show_toast(\"Sign the Zed CLA to join this room\");\n    return Ok(());\n}\nclient.join_room(room_id).await?;","typeGuard":null,"tryCatchPattern":"if let Err(err) = client.join_room(room_id).await {\n    if err.to_string().contains(\"has not signed the Zed CLA\") {\n        self.ui.open_url(\"https://zed.dev/contribute/cla\");\n        return Ok(());\n    }\n    return Err(err);\n}","preventionTips":["Mark CLA-gated rooms in the UI and check the flag before joining","Sign the CLA with the same GitHub account used to sign in to Zed","After signing, verify the contributor record exists (re-auth) before retrying the join"],"tags":["cla","rooms","authorization","contributor","server"],"backgroundTag":null,"analyzedSha":"bc538def4545534201bbfcac4e95ac34ea6501b6","analyzedAt":"2026-08-16T07:30:46.435Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}