I think this val can be dropped and instead of !hasUnreachable and allMembersInSeenHasLatest, instead have:

    unreachable.forall(_.status == Down) && members.forall(m ⇒ seen.get(m.address).exists(_ == version))