@vetosers I had a quick look at the source code and noticed ($post->duscussion->is_closed) ?: false in PostPolicy. It looks like there are multiple issues there. First the relationship is not spelled right (should be discussion). Then the condition appears to be the inverse from DiscussionPolicy. A ! might be missing in front.
In its current form, with the relationship returning null, the policy will always return false.
Also just a note ?: false seems redundant. If ! is placed in front of is_closed, it will be cast to boolean already and achieve the same.
More generally, I think those policies are not written correctly. It appears that when a discussion is not closed, then everyone, including guests, gets admin access to the features. They should fallback to the original policy where necessary instead of returning a true. I believe this can be achieved by returning null, and this might have been the intent here, but that's not what ?: does.