From d7e90c16c4086aee3906a823c7ffd2563a7b7371 Mon Sep 17 00:00:00 2001 From: Kazeia Team Date: Thu, 11 Jun 2026 16:22:27 +0200 Subject: [PATCH] =?UTF-8?q?fix(safety):=20rappel=20=C2=AB=20mieux=20mort?= =?UTF-8?q?=20=C2=BB=20+=20regex=20normalize=20compil=C3=A9es=20une=20fois?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Code-review (2e passe) : - Faux négatif CrisisGuard : « je serais/suis mieux mort », « mieux mort que vivant » ne déclenchaient aucun motif. Ajout du motif « mieux mort » + 3 cas de test. (Sécurité vitale — sensibilité d'abord.) - normalize() recompilait 3 Regex à chaque appel (1×/message patient) : hoistées en constantes (MARKS/APOS/SPACES). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/main/java/com/kazeia/safety/CrisisGuard.kt | 13 ++++++++++--- .../test/java/com/kazeia/safety/CrisisGuardTest.kt | 3 +++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/kazeia-android/app/src/main/java/com/kazeia/safety/CrisisGuard.kt b/kazeia-android/app/src/main/java/com/kazeia/safety/CrisisGuard.kt index 1af997a..2c03b18 100644 --- a/kazeia-android/app/src/main/java/com/kazeia/safety/CrisisGuard.kt +++ b/kazeia-android/app/src/main/java/com/kazeia/safety/CrisisGuard.kt @@ -40,19 +40,26 @@ object CrisisGuard { "(vaudrait|vaut) mieux (en finir|tout arreter|que je (parte|disparaisse|meure)|d ?arreter|arreter)", "me faire du mal", "m ?automutiler", "me mutiler", "me scarifier", "plus la force de vivre", "mieux sans moi", "tous mieux sans moi", + "mieux mort", // « je serais/suis mieux mort », « mieux mort que vivant » "me pendre", // aucun usage bénin → autonome "(veux|voudrais|envie de) (disparaitre|en finir|me noyer)", "me jeter (par|sous|dans|du)", "passer a l acte" ).map { Regex(it) } + // Regex de normalisation compilées une fois (detect() est appelé à chaque + // message patient — inutile de les recompiler à chaque appel). + private val MARKS = Regex("\\p{Mn}+") + private val APOS = Regex("['’‘]") + private val SPACES = Regex("\\s+") + /** minuscules + suppression des accents (NFD → retrait des diacritiques) + * apostrophes (droites/typographiques) → espace + espaces compactés. Permet * d'écrire les motifs sans accents ni apostrophes (robuste au STT et à la frappe). */ private fun normalize(s: String): String = java.text.Normalizer.normalize(s.lowercase(), java.text.Normalizer.Form.NFD) - .replace(Regex("\\p{Mn}+"), "") - .replace(Regex("['’‘]"), " ") - .replace(Regex("\\s+"), " ") + .replace(MARKS, "") + .replace(APOS, " ") + .replace(SPACES, " ") /** true si le message évoque une idéation suicidaire / auto-agression. */ fun detect(message: String): Boolean { diff --git a/kazeia-android/app/src/test/java/com/kazeia/safety/CrisisGuardTest.kt b/kazeia-android/app/src/test/java/com/kazeia/safety/CrisisGuardTest.kt index 394e83e..0fc11f8 100644 --- a/kazeia-android/app/src/test/java/com/kazeia/safety/CrisisGuardTest.kt +++ b/kazeia-android/app/src/test/java/com/kazeia/safety/CrisisGuardTest.kt @@ -60,6 +60,9 @@ class CrisisGuardTest { "je veux disparaître", "je pense à me pendre", "je vais passer à l'acte", + "je serais mieux mort", // forme conditionnelle « mieux mort » + "tout le monde serait mieux sans moi", + "je suis mieux mort que vivant", // accents supprimés (sortie STT fréquente) — DOIVENT matcher quand même "je veux mettre fin a mes jours", "ca sert a rien de vivre",