diff --git a/lib/permissions/special-roles.js b/lib/permissions/special-roles.js
--- a/lib/permissions/special-roles.js
+++ b/lib/permissions/special-roles.js
@@ -28,18 +28,26 @@
 });
 
 function patchRoleInfoWithSpecialRole(role: RoleInfo): RoleInfo {
+  // We removed the `.isDefault` field from `RoleInfo`, but persisted
+  // `RoleInfo`s will still have the field until this migration.
+  // $FlowIgnore[prop-missing]
+  const { isDefault, ...roleSansIsDefault } = role;
   if (roleIsDefaultRole(role)) {
     return {
-      ...role,
+      ...roleSansIsDefault,
       specialRole: specialRoles.DEFAULT_ROLE,
     };
   } else if (roleIsAdminRole(role)) {
     return {
-      ...role,
+      ...roleSansIsDefault,
       specialRole: specialRoles.ADMIN_ROLE,
     };
+  } else {
+    return {
+      ...roleSansIsDefault,
+      specialRole: null,
+    };
   }
-  return role;
 }
 
 function patchRawThreadInfoWithSpecialRole(
diff --git a/lib/permissions/special-roles.test.js b/lib/permissions/special-roles.test.js
--- a/lib/permissions/special-roles.test.js
+++ b/lib/permissions/special-roles.test.js
@@ -41,7 +41,7 @@
       permissions: ['abc', 'def'],
     };
     const patchedRole = patchRoleInfoWithSpecialRole(role);
-    expect(patchedRole.specialRole).toBe(undefined);
+    expect(patchedRole.specialRole).toBe(null);
   });
 });
 
@@ -218,6 +218,6 @@
     );
     expect(
       patchedRawThreadInfos['256|83814'].roles['256|83815'].specialRole,
-    ).toBe(undefined);
+    ).toBe(null);
   });
 });