Un message direct qui n'avertit personne, et le texte d'un salon privé qui part à tous
Signalé à l'écran : la personne qui reçoit un message direct n'a aucune notification. La dépêche partait bien — aucun écran ne l'écoutait. Il fallait ouvrir « Messages directs » pour découvrir qu'on avait été appelé, ce qui pendant une crise revient à ne pas l'être. En cherchant à qui adresser la notification, j'ai trouvé plus grave. ── Le flux ne filtrait rien Il transmettait chaque dépêche à chaque abonné de la crise, sans aucun filtre. Or la charge d'un message de salon porte son **texte**. Le contenu d'un salon privé partait donc à tous les membres de la crise par WebSocket, alors que la liste des salons le masque, que la recherche s'y arrête, et que le produit promet le contraire. Rien ne se voyait à l'écran : le client ignorait simplement les dépêches d'un salon qu'il ne connaissait pas. Ignorer n'est pas ne pas recevoir. Même chose pour les messages directs : tout le monde apprenait que deux personnes se parlaient, avec l'identifiant de leur conversation — ce qu'un message direct est précisément censé ne pas dire. Les dépêches sont désormais adressées. Le tri se fait à la publication, où l'on sait qui a le droit de voir, et non à la réception : une règle appliquée au bord serait une règle que le prochain abonné oublierait. Six publications de salon, la frappe en cours, et les directs. Une dépêche sans destinataire reste diffusée à toute la crise, ce qui est juste pour ce que toute la crise peut lire. ── Les conversations flottantes En bas à droite, plusieurs à la fois : pendant une crise on parle à trois personnes en même temps. Elles vivent dans la coque, comme le panneau de visioconférence, et pour la même raison — changer d'écran ne doit pas fermer une conversation. Un message qui arrive ouvre sa fenêtre repliée : on est averti sans être interrompu. Quatre au plus, la plus ancienne cède la place ; au-delà elles se chevauchent et l'on n'en lit aucune. Réduire et fermer sont deux gestes distincts : confondre les deux fait perdre le fil qu'on voulait seulement mettre de côté. Et un défaut que j'ai introduit puis corrigé, signalé à l'écran comme « la croix ne fonctionne pas ». Elle fonctionnait, deux fois par seconde. Les rappels du dock étaient recréés à chaque rendu et reconstruisaient le tableau des fenêtres depuis la valeur capturée au rendu précédent : l'effet « dépliée, on est en train de lire » en dépendait, repartait à chaque rendu, posait un tableau neuf, provoquait un rendu — une boucle, qui défaisait la fermeture aussitôt. Le correctif tient en une règle : cet état ne se pose jamais depuis une valeur, toujours depuis une fonction du précédent, et la mise à jour rend le **même** tableau quand rien ne change, ce qui arrête React net. La référence que j'avais introduite pour contourner le problème disparaît avec lui. Un contrôle statique interdit désormais la forme de code fautive : si quelqu'un réintroduit une pose depuis une valeur, la suite rougit avant l'écran. ── Nommer quelqu'un Là aussi la moitié existait : la colonne « mentions », son index, le champ de l'événement, la projection et la route étaient là depuis l'origine. Seul le client ne les envoyait jamais, et la dépêche ne les portait pas — écrire « @Maëlle » ne nommait donc personne. Taper « @ » propose les mêmes personnes que pour porter une action, au clavier comme à la souris. Le texte garde le nom en clair et l'identifiant part à côté : « @[Maëlle](uuid) » rendrait illisible le journal qui fait foi. Effacer le nom après l'avoir choisi n'avertit plus personne. « @tous », « @all », « @ici », « @here », « @canal », « @channel » interpellent le salon — reconnus sur le texte, parce qu'un signal qui demande de cocher une case en plus d'écrire le mot est un signal qu'on oublie. « @allocation » n'interpelle personne. Être nommé se signale même dans le salon qu'on a sous les yeux : c'est justement le cas où l'on regarde ailleurs dans la page. La pastille est distincte du compteur de non-lus — « douze messages » ne dit pas « on t'a demandé quelque chose ». Huit garanties neuves. Ce qui manque encore, et que j'ai signalé à part : sans service worker ni Web Push, tout cela s'arrête à l'onglet ouvert. EX-18 demande « un canal dédié et non désactivable pour la mobilisation » ; le mobile a son heurtoir, le navigateur n'a rien. Ces fichiers portent aussi les styles de la main courante et la propriété que son écran attend, qui viennent avec le lot précédent. Co-Authored-By: Claude (RCA)