+12
−1
+55
−0
+49
−0
+124
−0
Loading
Quatre manques du comparatif avec le cahier des charges dérivé de F24, et ils tiennent tous à la même chose : Kastell savait notifier, pas mobiliser. ── L'objectif chiffré On relançait et on escaladait, sans jamais s'arrêter sur un succès : la notion « j'ai besoin de cinq personnes sur douze » n'existait pas. On mobilisait douze personnes, huit répondaient, et les quatre autres continuaient de recevoir des rappels pendant que leurs suppléants étaient escaladés pour rien. Ce qui compte comme atteint est l'accusé de présence, non la réponse « j'arrive ». Les deux se ressemblent et ne se recouvrent pas : répondre depuis l'application pose l'accusé, mais cliquer depuis le lien du SMS le pose *sans* poser de réponse. Compter les réponses aurait rendu l'objectif inatteignable pour qui n'a pas l'application — c'est-à-dire sur le chemin principal. Je m'en suis aperçu avant de livrer, pas après. Un objectif supérieur au nombre de sollicités est refusé à la source : un seuil inatteignable ferait relancer indéfiniment, ce qu'on corrige précisément. ── Les mobilisations préparées Lancer demandait cinq décisions à chaud : le texte, la cible, le seuil, la relance, l'escalade. Cinq décisions prises à la minute où l'on en a le moins le temps, et où l'on rédige le plus mal — c'est celle où l'on écrit « mobilisation » tout seul. Ces cinq décisions ne dépendent pas de l'heure. Le scénario « cellule cyber, nuit » ne change pas parce qu'il est trois heures du matin ; seul le fait qu'il faille l'appliquer change. Elles se prennent donc à froid, versionnées et gelées au déclenchement comme le reste du dossier. Le modèle appliqué reste modifiable avant l'envoi, et c'est délibéré : une mobilisation préparée est une avance de rédaction, pas un automatisme. ── Les réponses personnalisées et typées Cinq réponses étaient écrites dans le schéma. Elles couvrent bien les deux campagnes que Kastell savait faire, et mal tout le reste : un exercice d'évacuation veut « sorti du bâtiment », une astreinte veut « je prends ». Ce qui compte n'est pourtant pas le libellé, c'est le type. Positive compte pour l'objectif et arrête la recherche ; négative cesse les rappels et sollicite le suppléant tout de suite ; neutre cesse les rappels sans rien compter ni escalader. Le moteur ne lit que le type, et un libellé peut donc dire n'importe quoi sans rien casser. Les cinq réponses existantes reçoivent le type qui reproduit *exactement* leur comportement d'avant : une migration qui améliore le comportement pendant qu'elle change le modèle rend les deux impossibles à déboguer séparément. Un cas a demandé une décision. « J'ai besoin d'aide » est classé neutre, non parce que la situation le serait, mais parce qu'elle n'appelle ni décompte d'objectif ni remplaçant : elle ouvre un secours, qui est un autre geste sur un autre écran. La classer négative aurait fait solliciter son suppléant pour venir en cellule de crise, ce qu'elle ne demandait précisément pas. Le lien reçu par SMS rend désormais les choix au lieu de supposer « oui ». Sans cela la fonction n'aurait servi qu'aux porteurs de l'application, alors que le lien est le chemin de tous les autres. Avec le jeu intégré, un clic vaut toujours « j'arrive » : ce geste a été conçu pour être le plus court possible. Le texte vocal qui associe chaque touche à sa réponse est produit. Le recueil de la touche frappée suppose un sous-système de téléphonie — collecte DTMF, rappel du fournisseur — écarté avec la voie SIP au lot L12. Je livre le script, pas un canal que je n'ai pas. Les trois actions rapides de la notification système restent les intégrées : elles sont enregistrées auprès du système d'exploitation au démarrage, et ne se déclinent pas par campagne. Les réponses personnalisées s'affichent dans l'écran de l'application et sur le lien. ── Les alertes multilingues Une entreprise qui a des sites en Allemagne et en Pologne n'alerte pas en français. Elle le fait pourtant, faute de mieux, et le retard se mesure : on relit trois fois, on demande à un collègue, et on répond quatre minutes plus tard — ou pas. Cinq versions au plus. La règle qui compte est la seconde : sans langue déclarée, ou dans une langue qu'on n'a pas rédigée, on reçoit la version par défaut — jamais rien. Un message qu'on lit mal vaut infiniment mieux qu'un silence. Les rappels et les escalades suivent la langue de la personne, celle du suppléant comprise : un rappel dans une autre langue que le premier message se lit comme un message différent. La colonne « message » reste le texte de la langue par défaut et les traductions s'ajoutent à côté. Tout ce qui lit une mobilisation continue de lire ce qu'il lisait, sans migration de données. Déplacer le texte dans une table de traductions aurait été plus élégant et moins juste : cela rendait possible l'état « mobilisation sans aucun texte », qui ne doit pas exister. La langue voyage jusqu'à la passerelle, dont le gabarit demande la voix à son fournisseur. Kastell ne synthétise pas : prétendre choisir la voix serait prétendre connaître un catalogue qu'il ne connaît pas. ── Deux choses trouvées en chemin L'étoile d'une vue est développée à sa création, pas à sa lecture : ajouter une colonne à « personne » ne l'ajoutait pas à « personne_courante ». Le défaut ne se voyait pas à la migration — il se voyait à la première escalade, quand le suppléant est lu par la vue et que la colonne manque. Et une régression de ma migration précédente : j'avais rétréci « excuses » au seul « indisponible », perdant « appelez mon suppléant » — qui est littéralement quelqu'un qui ne vient pas. Le passage au décompte par type la répare. Ce fichier de fournisseurs porte aussi le cas « generique_voix » qui manquait à la fabrique : la passerelle d'appel vocal figurait au catalogue et ne pouvait pas être construite, donc jamais enregistrée. Trente-huit garanties neuves. Co-Authored-By: Claude (RCA)