diff --git a/lib/permissions/thread-permissions.js b/lib/permissions/thread-permissions.js
--- a/lib/permissions/thread-permissions.js
+++ b/lib/permissions/thread-permissions.js
@@ -13,6 +13,8 @@
   threadPermissionPropagationPrefixes,
   threadPermissions,
   userSurfacedPermissions,
+  threadPermissionsRequiringVoicedInAnnouncementChannels,
+  threadPermissionsRemovedForGenesisMembers,
 } from '../types/thread-permission-types.js';
 import type {
   ThreadPermission,
@@ -31,6 +33,7 @@
   threadTypeIsThick,
   assertThickThreadType,
   assertThinThreadType,
+  threadTypeIsCommunityRoot,
 } from '../types/thread-types-enum.js';
 
 function permissionLookup(
@@ -130,16 +133,21 @@
     (permissions: ThreadPermissionsBlob),
     threadPermissions.VOICED_IN_ANNOUNCEMENT_CHANNELS,
   );
-
   if (
     threadIsAnnouncementThread &&
-    hasVoicedInAnnouncementChannelsPermission &&
-    isMember
+    !hasVoicedInAnnouncementChannelsPermission
   ) {
-    permissions[threadPermissions.VOICED] = {
-      value: true,
-      source: threadID,
-    };
+    for (const permission of threadPermissionsRequiringVoicedInAnnouncementChannels) {
+      delete permissions[permission];
+    }
+  }
+  if (
+    threadType === threadTypes.GENESIS &&
+    !hasVoicedInAnnouncementChannelsPermission
+  ) {
+    for (const permission of threadPermissionsRemovedForGenesisMembers) {
+      delete permissions[permission];
+    }
   }
 
   if (Object.keys(permissions).length === 0) {
@@ -227,12 +235,10 @@
 const TOP_LEVEL_DESCENDANT = DESCENDANT + TOP_LEVEL;
 const OPEN_TOP_LEVEL_DESCENDANT = DESCENDANT + OPEN_TOP_LEVEL;
 
-const baseMemberUserSurfacedPermissions = [
+const defaultUserSurfacedPermissions = [
   userSurfacedPermissions.REACT_TO_MESSAGES,
   userSurfacedPermissions.EDIT_MESSAGES,
   userSurfacedPermissions.ADD_MEMBERS,
-];
-const baseVoicedUserSurfacedPermissions = [
   userSurfacedPermissions.EDIT_CALENDAR,
   userSurfacedPermissions.CREATE_AND_EDIT_CHANNELS,
 ];
@@ -240,20 +246,8 @@
 function getRolePermissionBlobsForCommunityRoot(
   threadType: ThinThreadType,
 ): RolePermissionBlobs {
-  let memberUserSurfacedPermissions;
-  if (threadType === threadTypes.GENESIS) {
-    memberUserSurfacedPermissions = [];
-  } else if (threadType === threadTypes.COMMUNITY_ANNOUNCEMENT_ROOT) {
-    memberUserSurfacedPermissions = baseMemberUserSurfacedPermissions;
-  } else {
-    memberUserSurfacedPermissions = [
-      ...baseMemberUserSurfacedPermissions,
-      ...baseVoicedUserSurfacedPermissions,
-    ];
-  }
-
   const memberPermissions = getThreadPermissionBlobFromUserSurfacedPermissions(
-    memberUserSurfacedPermissions,
+    defaultUserSurfacedPermissions,
     threadType,
   );
 
@@ -409,39 +403,23 @@
   const openTopLevelDescendantJoinThread =
     OPEN_TOP_LEVEL_DESCENDANT + threadPermissions.JOIN_THREAD;
 
-  const subthreadBasePermissions = {
-    [threadPermissions.KNOW_OF]: true,
-    [threadPermissions.VISIBLE]: true,
-    [threadPermissions.CREATE_SIDEBARS]: true,
-    [threadPermissions.LEAVE_THREAD]: true,
-    [openDescendantKnowOf]: true,
-    [openDescendantVisible]: true,
-    [openTopLevelDescendantJoinThread]: true,
-    [openChildJoinThread]: true,
-  };
-
-  if (
-    thinThreadType === threadTypes.COMMUNITY_OPEN_SUBTHREAD ||
-    thinThreadType === threadTypes.COMMUNITY_SECRET_SUBTHREAD
-  ) {
+  if (!threadTypeIsCommunityRoot(thinThreadType)) {
     const memberPermissions = {
-      ...subthreadBasePermissions,
       [threadPermissions.VOICED]: true,
+      [threadPermissions.KNOW_OF]: true,
+      [threadPermissions.VISIBLE]: true,
+      [threadPermissions.CREATE_SIDEBARS]: true,
+      [threadPermissions.LEAVE_THREAD]: true,
+      [openDescendantKnowOf]: true,
+      [openDescendantVisible]: true,
+      [openTopLevelDescendantJoinThread]: true,
+      [openChildJoinThread]: true,
     };
     return {
       Members: memberPermissions,
     };
   }
 
-  if (
-    thinThreadType === threadTypes.COMMUNITY_OPEN_ANNOUNCEMENT_SUBTHREAD ||
-    thinThreadType === threadTypes.COMMUNITY_SECRET_ANNOUNCEMENT_SUBTHREAD
-  ) {
-    return {
-      Members: subthreadBasePermissions,
-    };
-  }
-
   return getRolePermissionBlobsForCommunityRoot(thinThreadType);
 }
 
diff --git a/lib/types/thread-permission-types.js b/lib/types/thread-permission-types.js
--- a/lib/types/thread-permission-types.js
+++ b/lib/types/thread-permission-types.js
@@ -141,6 +141,28 @@
   return ourPrefix;
 }
 
+export const threadPermissionsRequiringVoicedInAnnouncementChannels: $ReadOnlyArray<ThreadPermission> =
+  [
+    threadPermissions.VOICED,
+    threadPermissions.EDIT_ENTRIES,
+    threadPermissions.EDIT_THREAD_NAME,
+    threadPermissions.EDIT_THREAD_DESCRIPTION,
+    threadPermissions.EDIT_THREAD_COLOR,
+    threadPermissions.EDIT_THREAD_AVATAR,
+    threadPermissions.CREATE_SUBCHANNELS,
+    threadPermissions.EDIT_PERMISSIONS,
+    threadPermissions.DELETE_THREAD,
+    threadPermissions.CHANGE_ROLE,
+    threadPermissions.MANAGE_PINS,
+  ];
+
+export const threadPermissionsRemovedForGenesisMembers: $ReadOnlyArray<ThreadPermission> =
+  [
+    threadPermissions.REACT_TO_MESSAGE,
+    threadPermissions.EDIT_MESSAGE,
+    threadPermissions.ADD_MEMBERS,
+  ];
+
 // These are the set of user-facing permissions that we display as configurable
 // to the user when they are creating a custom role for their given community.
 // They are per-community rather than per-thread, so when configured they are
@@ -218,6 +240,7 @@
 const descendantTopLevelVoicedInAnnouncementChannels =
   threadPermissionPropagationPrefixes.DESCENDANT +
   threadPermissionFilterPrefixes.TOP_LEVEL +
+  threadPermissionMembershipPrefixes.MEMBER +
   threadPermissions.VOICED_IN_ANNOUNCEMENT_CHANNELS;
 const voicedPermissions = new Set([
   voicedInAnnouncementChannels,
diff --git a/lib/types/thread-types-enum.js b/lib/types/thread-types-enum.js
--- a/lib/types/thread-types-enum.js
+++ b/lib/types/thread-types-enum.js
@@ -141,6 +141,7 @@
 ]);
 
 export const announcementThreadTypes: $ReadOnlyArray<number> = Object.freeze([
+  threadTypes.GENESIS,
   threadTypes.COMMUNITY_ANNOUNCEMENT_ROOT,
   threadTypes.COMMUNITY_OPEN_ANNOUNCEMENT_SUBTHREAD,
   threadTypes.COMMUNITY_SECRET_ANNOUNCEMENT_SUBTHREAD,