A regra mora no banco
Registro privado tem dono; registro compartilhado tem casa. A leitura da casa passa por uma função que confere se você é membro ativo agora. Sair da casa corta o acesso na hora. Os testes assumem a identidade de duas pessoas em sequência e plantam "canários" pessoais para conferir que continuam privados depois de elas entrarem na mesma casa.
create function public.is_own_active_house_member(p_house_id uuid)
returns boolean language sql stable security definer set search_path = '' as $$
select exists (
select 1 from public.house_members as member
where member.house_id = p_house_id
and member.user_id = auth.uid()
and member.left_at is null);
$$;
create policy house_tasks_select_active_member on public.house_tasks
for select to authenticated
using (public.is_own_active_house_member(house_id));
