It seems we still need to check whether a variable-free qual comes from somewhere that is below the nullable side of an outer join before we decide that it can be evaluated at join domain level, just like we did before. So I wonder if we can add a 'below_outer_join' flag in JoinTreeItem, fill its value during deconstruct_recurse, and check it in distribute_qual_to_rels() like
/* eval at join domain level if not below outer join */ - relids = bms_copy(jtitem->jdomain->jd_relids); + relids = jtitem->below_outer_join ? + bms_copy(qualscope) : bms_copy(jtitem->jdomain->jd_relids);