needsReconnect() couvre désormais les chatSinks et le cycle de reconnexion renvoie un chat.attach par session active, un échec isolé n'empêchant pas les autres abonnements de reprendre. Tests ciblés ajoutés.