diff --git a/lib/permissions/prefixes.js b/lib/permissions/prefixes.js
--- a/lib/permissions/prefixes.js
+++ b/lib/permissions/prefixes.js
@@ -65,6 +65,17 @@
   return { permission, propagationPrefix, filterPrefix, membershipPrefix };
 }
 
+function constructThreadPermissionString(
+  parsed: ParsedThreadPermissionString,
+): string {
+  const propagationPrefix = parsed.propagationPrefix ?? '';
+  const filterPrefix = parsed.filterPrefix ?? '';
+  const membershipPrefix = parsed.membershipPrefix ?? '';
+  return (
+    propagationPrefix + filterPrefix + membershipPrefix + parsed.permission
+  );
+}
+
 function includeThreadPermissionForThreadType(
   parsed: ParsedThreadPermissionString,
   threadType: ThreadType,
@@ -93,4 +104,8 @@
   return true;
 }
 
-export { parseThreadPermissionString, includeThreadPermissionForThreadType };
+export {
+  parseThreadPermissionString,
+  constructThreadPermissionString,
+  includeThreadPermissionForThreadType,
+};
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
@@ -4,6 +4,7 @@
 
 import {
   parseThreadPermissionString,
+  constructThreadPermissionString,
   includeThreadPermissionForThreadType,
 } from './prefixes.js';
 import {
@@ -168,10 +169,11 @@
     ) {
       permissionsForChildren[permissionKey] = permissionValue;
     }
-    const permissionWithFilterPrefix = parsed.filterPrefix
-      ? `${parsed.filterPrefix}${parsed.permission}`
-      : parsed.permission;
-    permissionsForChildren[permissionWithFilterPrefix] = permissionValue;
+    const withoutPropagationPrefix = constructThreadPermissionString({
+      ...parsed,
+      propagationPrefix: null,
+    });
+    permissionsForChildren[withoutPropagationPrefix] = permissionValue;
   }
   if (Object.keys(permissionsForChildren).length === 0) {
     return null;