Traitements et questionnaires
La régularité des traitements, les scores des questionnaires et les rappels fondés sur des règles.
Chaque algorithme est décrit avec ce qu’il lit, ses étapes, les valeurs qu’il utilise (avec leur emplacement dans le code), ce qu’il affiche et ses limites.
Associations personnelles (« Mes associations »)
Trévor cherche, dans tes propres données, des liens prudents entre ce que tu fais ou ce qui t'entoure (sommeil, météo, traitements, gestes) et ta douleur, ton humeur, ta forme, ta fatigue ou tes crises. Un lien affiché n'est pas une cause.
Où tu le vois : Tableau de bord du navigateur personnel, section des associations.
Ce que l’algorithme lit
- Séries quotidiennes alignées : douleur, humeur, forme, fatigue, crise, corps, environnement, prises, gestes (déclaration, montre, import, météo)
- Scores hebdomadaires de questionnaires (PROMs, PREMs) (questionnaires)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
LAGS | (0, 1, 2, 3) | Décalages testés en jours | src/trevor/navigator/findings.py:20 |
MIN_PAIRS | 24 | Jours appariés minimaux | src/trevor/navigator/findings.py:21 |
MIN_ABS_RHO | 0.25 | |rho| minimal (jour) | src/trevor/navigator/findings.py:22 |
MAX_Q | 0.10 | Taux de fausses découvertes maximal | src/trevor/navigator/findings.py:23 |
MAX_FINDINGS | 5 | Associations au total | src/trevor/navigator/findings.py:24 |
MAX_PER_OUTCOME | 2 | Associations par résultat | src/trevor/navigator/findings.py:25 |
MIN_WEEKS | 8 | Semaines minimales (échelle hebdomadaire) | src/trevor/navigator/findings.py:26 |
MIN_ABS_RHO_WEEKLY | 0.5 | |rho| minimal (semaine) | src/trevor/navigator/findings.py:27 |
Ce qui est affiché
Au plus 5 associations quotidiennes puis hebdomadaires (calculées seulement à partir de 21 jours de données, navigator/api.py:11), chacune avec décalage, rho, n, valeurs p et q, intervalle de confiance.
Un exemple chiffré
Aucun exemple chiffré exécuté (le calcul demande des séries réelles).
Ce que cet algorithme ne sait pas faire
- Une association n'est pas une cause, et les jours manquants ne sont pas des zéros.
- Les valeurs déclarées par exception ne servent pas de preuve.
- Des séries courtes d'une seule personne gardent un risque de découverte due au hasard, même avec les contrôles.
- Le décalage choisi est le plus favorable, ce qui est corrigé seulement par le facteur 4.
Code : src/trevor/navigator/findings.py (daily_findings, weekly_findings, compute), src/trevor/navigator/stats.py, src/trevor/navigator/series.py (build)
Calendrier personnalisé de dépistages
Trévor lit une table de règles (âge, génotype, traitement) pour te dire quels examens de surveillance reviennent à quel rythme, et quand le prochain est dû d'après la dernière date que tu notes. Il organise ton suivi, n'interprète aucun résultat et ne remplace pas ton équipe de soins.
Où tu le vois : Écran « Calendrier de dépistages » (derrière le suivi de prévention), pour les maladies de type drépanocytose ; un enfant suivi par un proche a son propre calendrier.
Ce que l’algorithme lit
- Génotype (SS, SC, Sβ0, Sβ+, autre, inconnu) (dossier (historique médical), profil de l'enfant)
- Date de naissance ou année de naissance (carte de soins, profil, foyer)
- Traitement : hydroxyurée, transfusion (déclaration)
- Date et résultat (normal, à surveiller, anormal) de chaque examen fait, ou « mon équipe m'a dit autre chose » (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
SOON_DAYS | 60 | Préavis : « bientôt » quand il reste 60 jours ou moins | src/trevor/lifecourse/screening.py:26 |
doppler cérébral | 12 mois, SS et Sβ0, 2 à 16 ans | Seul rythme chiffré pour ces génotypes | data/screening_rules.json (exam doppler) |
IRM cérébrale | une fois, SS et Sβ0, dès 5 ans | Rythme « une fois » | data/screening_rules.json (exam irm_cerebrale) |
fond d'œil, albuminurie | 12 mois, dès 10 ans | Tous génotypes | data/screening_rules.json |
échographie cardiaque | 36 mois, dès 18 ans | Rythme selon les HUG ; divergence avec l'ASH 2019 signalée dans la note du fichier | data/screening_rules.json |
ferritine | 3 mois si transfusion, sinon 12 mois | Deux règles dans l'ordre | data/screening_rules.json |
ONCE_MONTHS | 1200 | Un examen « une fois » compte un siècle dans le plan de prévention | src/trevor/lifecourse/screening.py:25 |
Ce qui est affiché
Une ligne par examen avec son rythme, son état (à jour, bientôt, en retard, jamais, fait, non recommandé, pas encore, équipe décide…), la date due et le dernier résultat noté. Le plan de prévention reçoit des consignes : exclure, resserrer le rythme ou suspendre les rappels.
Un exemple chiffré
Profil SS, 20 ans, hydroxyurée, fond d'œil noté le 20.12.2025 : échéance 20.12.2026, il reste 44 jours le 06.11.2026, donc « bientôt » (calendrier exécuté). Le doppler n'est pas applicable à 20 ans, l'échographie cardiaque et l'albuminurie sont « jamais ».
Ce que cet algorithme ne sait pas faire
- Avec l'année de naissance seule, l'âge est une fourchette : une règle d'âge minimal est rattachée à l'âge le plus élevé.
- Un génotype inconnu fait dire « génotype à connaître » pour les examens cérébraux.
- La table est « à valider par le service d'hématologie des HUG » avant publication.
- Trévor n'interprète pas le résultat : tu notes « normal », « à surveiller » ou « anormal » toi-même.
Code : src/trevor/lifecourse/screening.py (rule_for, calendar, remindable, prevention_directives, age_range), src/trevor/lifecourse/screening_store.py (profile_for, calendar_for, directives), src/trevor/conversation/screening_reminders.py, data/screening_rules.json
Charge de stress et ressources (« balance »)
Trévor additionne des points de charge (stress, moral, PHQ-9, GAD-7, événements de vie) et des points de ressources (bonnes choses notées, appuis, humeur, calme) sur 30 jours, et les met en regard sous forme de deux pourcentages. C'est un indice du projet, sans validation clinique.
Où tu le vois : « Ma santé mentale » > Aller plus loin > Tendances.
Ce que l’algorithme lit
- Moyenne de ton stress (0 à 10) et de ton humeur (0 à 10) sur 30 jours (déclaration)
- Ton dernier score PHQ-9 et GAD-7 (déclaration)
- Notes de bonnes choses des 30 jours, nombre d'appuis, événements de vie (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
maximum de charge | 8 | Dénominateur du pourcentage de charge | src/trevor/conversation/mental_health.py:755 |
maximum de ressources | 6 | Dénominateur du pourcentage de ressources | src/trevor/conversation/mental_health.py:756 |
seuils de niveau | 60 et 30 | Limites des niveaux de charge et de ressources | src/trevor/conversation/mental_health.py:757-758 |
fenêtre | 30 jours | Période des moyennes et des notes | src/trevor/conversation/mental_health.py:702 |
Ce qui est affiché
Deux niveaux et deux pourcentages, la liste des facteurs qui pèsent et de ceux qui protègent, et un conseil. Sans aucune donnée, un message dit qu'il n'y a pas assez de données.
Un exemple chiffré
Stress moyen 5 (+1), humeur moyenne 4 (+2), PHQ-9 de 12 (+2), GAD-7 de 3 (0), pas d'événement : charge 5 points sur 8, soit 62 % (62,5 arrondi à 62), niveau élevé (vérifié par le calcul).
Ce que cet algorithme ne sait pas faire
- Les points et les seuils sont posés sans calibrage : une seule donnée suffit à faire apparaître un pourcentage.
- Le PHQ-9 et le GAD-7 retenus sont les derniers, quel que soit leur âge.
- Un niveau « faible » de charge peut venir d'un manque de données, pas d'un bon état.
- Ce n'est pas un dispositif médical validé et ça ne remplace pas un avis professionnel.
Code : src/trevor/conversation/mental_health.py (allostatic_balance, _balance_block, finish_mh_mood)
Dépistages courts : stress post-traumatique, TDAH, autisme
Trévor compte tes réponses à trois questionnaires courts (PC-PTSD-5, ASRS v1.1 partie A, AQ-10) et dit si le dépistage est « positif », ce qui veut dire qu'un avis professionnel est suggéré. Ce n'est pas un diagnostic ni un dispositif médical validé : le résultat t'oriente vers un professionnel.
Où tu le vois : « Ma santé mentale » > Faire le point.
Ce que l’algorithme lit
- PC-PTSD-5 : 1 question d'exposition puis 5 « Oui/Non » (déclaration)
- ASRS : 6 réponses (Jamais, Rarement, Parfois, Souvent, Très souvent) (déclaration)
- AQ-10 : 10 réponses d'accord / pas d'accord (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
ASRS_THRESHOLD | {0: 2, 1: 2, 2: 2, 3: 3, 4: 3, 5: 3} | Position minimale de la réponse pour que l'item compte | src/trevor/conversation/mental_health.py:58 |
seuil ASRS | 4 sur 6 | Dépistage positif à partir de 4 items | src/trevor/conversation/mental_health.py:191-195 |
AQ_AGREE_ITEMS / AQ_DISAGREE_ITEMS | {0,6,7,9} / {1,2,3,4,5,8} | Items cotés quand tu es d'accord, ou en désaccord (clé Allison 2012 selon le code) | src/trevor/conversation/mental_health.py:60-61 |
seuil AQ-10 | 6 | Dépistage positif à partir de 6 points | src/trevor/conversation/mental_health.py:688 |
seuil PC-PTSD-5 | 3 | Dépistage positif à partir de 3 « Oui » | src/trevor/conversation/mental_health.py:662 |
Ce qui est affiché
Un score (PC-PTSD-5 sur 5, ASRS sur 6, AQ-10 sur 10) et un message « positif » ou « négatif » avec une explication. Ce n'est pas un diagnostic ni un dispositif médical validé : le résultat t'oriente vers un professionnel.
Un exemple chiffré
Aucun exemple chiffré exécuté pour cette fiche.
Ce que cet algorithme ne sait pas faire
- Ces questionnaires sont des dépistages courts : un résultat positif ne dit pas que tu as le trouble, un négatif ne l'exclut pas.
- La question d'exposition du PC-PTSD-5 est lue sur la première réponse « Oui » exacte.
- L'ASRS n'utilise que la partie A (6 questions).
Code : src/trevor/conversation/mental_health.py (pcptsd_count, asrs_positive, aq10_score, _finish_pcptsd, _finish_asrs, _finish_aq10)
Dépression et anxiété : PHQ-9, GAD-7 et échelle d'Édimbourg
Trévor additionne tes réponses aux questionnaires PHQ-9 (moral), GAD-7 (anxiété) et, pendant le post-partum, à l'échelle d'Édimbourg (EPDS). Il donne un score, un niveau et un conseil, et traite toujours en premier une réponse qui évoque des idées de se faire du mal. Ce n'est pas un diagnostic ni un dispositif médical validé : le résultat t'oriente vers un professionnel.
Où tu le vois : « Ma santé mentale » > Faire le point (auto-évaluations). L'EPDS vient en tête si tu es en post-partum.
Ce que l’algorithme lit
- Tes réponses aux 9 questions du PHQ-9 ou aux 7 du GAD-7 (Jamais, Plusieurs jours, Plus de la moitié des jours, Presque tous les jours) (déclaration)
- Tes réponses aux 10 questions de l'EPDS (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
FREQ_SCALE | [Jamais, Plusieurs jours, Plus de la moitié des jours, Presque tous les jours] | Échelle de réponses du PHQ-9 et du GAD-7 (0 à 3) | src/trevor/conversation/mental_health.py:53 |
EPDS_REVERSED_ITEMS | {2, 4, 5, 6, 7, 8, 9} | Items EPDS inversés (indices à partir de 0) | src/trevor/conversation/mental_health.py:64 |
EPDS_POSSIBLE, EPDS_PROBABLE | 10, 13 | Seuils de l'EPDS | src/trevor/conversation/mental_health.py:65 |
seuils PHQ-9 | 4 / 9 / 14 / 19 | Limites hautes des niveaux minimal, léger, modéré, modérément sévère | src/trevor/conversation/mental_health.py:169-178 |
seuils GAD-7 | 4 / 9 / 14 | Limites hautes des niveaux minimal, léger, modéré | src/trevor/conversation/mental_health.py:181-188 |
seuils de conseil | 15 et 10 | Conseil « voir un professionnel » à partir de 15, conseil intermédiaire à partir de 10 | src/trevor/conversation/mental_health.py:605-609 |
Ce qui est affiché
Un score (PHQ-9 sur 27, GAD-7 sur 21, EPDS sur 30), son niveau en mots et un conseil. Les réponses d'idées suicidaires déclenchent un message de soutien avec les lignes d'écoute du pays avant tout autre contenu. Ce n'est pas un diagnostic ni un dispositif médical validé : le résultat t'oriente vers un professionnel.
Un exemple chiffré
PHQ-9 avec « Plusieurs jours » à chacune des 9 questions : 9, niveau léger ; avec 5 réponses « Plus de la moitié des jours » et 4 « Plusieurs jours » : 14, niveau modéré (vérifié en exécutant phq9_score). GAD-7 avec « Plusieurs jours » partout : 7, niveau léger. EPDS : score 11 → « dépression possible ».
Ce que cet algorithme ne sait pas faire
- Le GAD-7 n'a pas de test d'idées suicidaires : seul le PHQ-9 (question 9) et l'EPDS (question 10) en ont un.
- Une réponse hors des libellés attendus (autre langue ou texte modifié) rend le score impossible.
- Le score est calculé sur les libellés français affichés ; je n'ai pas vérifié ici la façon dont les autres langues sont ramenées à ces libellés.
- Trévor ne pose aucun diagnostic et ne remplace pas une évaluation clinique.
Code : src/trevor/conversation/mental_health.py (phq9_score, gad7_score, phq9_band, gad7_band, epds_item_scores, epds_band, _finish_phq9, _finish_gad7, _finish_epds)
Rappel de l'analyse de suivi de l'hydroxyurée
Trévor calcule la date de ta prochaine analyse de suivi en ajoutant le rythme que ton médecin t'a indiqué à la date de la dernière analyse connue. Il ne propose jamais de rythme lui-même et n'envoie aucun rappel tant que tu n'en as pas indiqué un.
Où tu le vois : Écran « Régularité et analyses de suivi » (ligne sur l'analyse), et message de rappel joint au rappel doux de prévention.
Ce que l’algorithme lit
- Le rythme des analyses : 1, 2, 3, 4 ou 6 mois, ou « pas encore connu » (déclaration (tu le choisis))
- La date de la dernière analyse notée à la main (déclaration)
- Les résultats d'HbF et d'hémoglobine du dossier (date de mesure) (dossier / import)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
rhythm_months | [1, 2, 3, 4, 6] | Rythmes acceptés ; tout autre nombre est refusé | data/hydroxyurea.json:12 |
soon_days | 30 | Préavis : « bientôt » quand il reste 30 jours ou moins | data/hydroxyurea.json:13 |
kinds | ["hbf", "hb"] | Types de mesures du dossier qui comptent comme analyse | data/hydroxyurea.json:14 |
limite de date | 5 ans | Une analyse notée ne peut pas être dans le futur ni dater de plus de 5 ans | src/trevor/hydroxyurea.py:135 |
Ce qui est affiché
Cinq états : non réglé, aucune date, à jour, bientôt (30 jours ou moins), en retard. Chacun a sa phrase. Les trois derniers sauf « à jour » déclenchent un rappel unique par échéance.
Un exemple chiffré
Rythme 3 mois, dernière analyse le 15.08.2026 : échéance le 15.11.2026 ; le 06.11.2026 il reste 9 jours, donc « bientôt » (calculé à la main à partir de add_months et du seuil de 30 jours).
Ce que cet algorithme ne sait pas faire
- Le rythme est ce que tu saisis : Trévor ne le vérifie pas.
- Une mesure d'hémoglobine ou d'HbF importée compte comme analyse de suivi, même si elle venait d'un autre contexte.
- Le rappel ne dit rien sur les valeurs.
- Les rythmes proposés (1, 2, 3, 4, 6 mois) n'ont pas été relus par les HUG.
Code : src/trevor/hydroxyurea.py (labs_status, last_lab_date, add_months, reminder_text, reminder_pending, mark_labs_done, set_rhythm), src/trevor/conversation/reminders.py (prevention_due_reminders), data/hydroxyurea.json
L'hydroxyurée dans le risque de crise
Quand tu prends l'hydroxyurée, ta régularité des 84 derniers jours devient deux traits du modèle de risque : un trait protecteur et un trait « prise irrégulière ». Cette fiche décrit seulement cette entrée, pas le calcul complet du risque, qui a sa propre fiche.
Où tu le vois : Indirectement : dans les raisons affichées avec le risque de crise (par exemple « Hydroxyurée suivie de façon irrégulière »).
Ce que l’algorithme lit
- Ta régularité sur 84 jours (pourcentage entier) (déclaration, prises supposées comprises)
- Le fait d'avoir l'hydroxyurée parmi tes traitements (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
seuil bon | 80 | À partir de 80 % : protection pleine | src/trevor/wearables/crisis.py:297 |
seuil moyen | 60 | De 60 à 79 % : protection de 0,6 et écart de 0,4 | src/trevor/wearables/crisis.py:299 |
RISK_GAIN | 1.6 | Gain appliqué aux autres facteurs de risque | src/trevor/wearables/crisis.py:493 |
GAIN_EXEMPT | hu_protect, dmt_other, tx_recent, tx_protect | Traits protecteurs qui ne sont pas amplifiés | src/trevor/wearables/crisis.py:495 |
Les poids
Un poids positif augmente le résultat, un poids négatif le diminue.
| Signal | Poids | Où |
|---|---|---|
| Hydroxyurée suivie régulièrement (≥ 80 % ou inconnue) | −0,55 | src/trevor/wearables/crisis.py:78 |
| Hydroxyurée suivie de façon irrégulière | +0,45 | src/trevor/wearables/crisis.py:78 |
Ce qui est affiché
Deux nombres entre 0 et 1 (hu_protect et hu_gap) qui entrent dans la somme du modèle. Un trait « hydroxyurée » apparaît dans les raisons du risque s'il pèse assez.
Un exemple chiffré
Régularité 79 % : hu_protect 0,6, hu_gap 0,4 ; 59 % : 0 et 1 ; 80 % : 1 et 0 (vérifié en exécutant treatment_features).
Ce que cet algorithme ne sait pas faire
- Les seuils 80 % et 60 % sont écrits en dur dans crisis.py, alors que la fiche Régularité lit 80 % dans data/hydroxyurea.json : deux endroits à garder identiques à la main.
- Le calcul en direct (treatment_context) donne hu_protect = 1 quand tu as l'hydroxyurée sans régularité calculable, alors que l'entraînement (training_rows) met les deux traits à 0 ces jours-là : l'a priori protecteur ne vaut donc que pour l'affichage en direct.
- La régularité inclut les prises supposées : une personne qui ne signale jamais de dose manquée reste dans la tranche protectrice.
- Le passage de 79 % à 80 % fait sauter le trait de 0,6 à 1 : la courbe est en marches, pas continue.
Code : src/trevor/wearables/crisis.py (treatment_features, PRIOR_WEIGHTS, GAIN_EXEMPT), src/trevor/wearables/service.py (treatment_context, training_rows), src/trevor/hydroxyurea.py (pdc, pdc_from_days)
Régularité de l'hydroxyurée (jours couverts)
Trévor compte, sur les 12 dernières semaines, la part des jours notés où tu as pris ton hydroxyurée. Ce pourcentage t'aide à voir ta régularité et alimente d'autres repères (signal de crises, risque de crise). Ce n'est pas un dispositif médical validé et il ne juge pas ta façon de prendre ton traitement.
Où tu le vois : Écran « 💊 Régularité et analyses de suivi » du bot et route /api/phone/hydroxyurea de l'application, pour les personnes qui ont l'hydroxyurée dans leurs traitements.
Ce que l’algorithme lit
- Les jours notés « pris » ou « manqué » pour l'hydroxyurée, sur 84 jours (déclaration (gestes « pris » et « dose manquée ») et prises supposées écrites la nuit)
- La liste de tes traitements suivis, ou ta pharmacie (déclaration / dossier)
- La date du jour (horloge)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
window_days | 84 | Fenêtre de calcul : 12 semaines, jour courant compris | data/hydroxyurea.json:7 |
min_logged_days | 14 | Nombre minimal de jours notés pour afficher un pourcentage | data/hydroxyurea.json:8 |
good_from_percent | 80 | Seuil à partir duquel la régularité est dite « bonne » | data/hydroxyurea.json:9 |
a_valider | true | Le fichier de paramètres se déclare lui-même « à valider par les HUG » | data/hydroxyurea.json:4 |
Ce qui est affiché
Un pourcentage entier de 0 à 100 (ou rien sous 14 jours notés), le nombre de jours couverts, notés et déclarés, et un drapeau « bonne » à partir de 80 %. Le seuil de 60 % n'existe pas ici : il apparaît seulement dans le calcul du risque de crise (fiche « L'hydroxyurée dans le risque de crise »).
Un exemple chiffré
Sur 30 jours notés dont 22 pris (un jour sur quatre manqué), régularité = 22 ÷ 30 = 73 % (vérifié en exécutant pdc_from_days). Avec seulement 10 jours notés, tous pris, le résultat est « aucun pourcentage » car 10 < 14.
Ce que cet algorithme ne sait pas faire
- Le calcul divise par les jours notés et non par les 84 jours : un jour non noté disparaît du calcul sans compter comme manqué.
- Par défaut (mode « exception »), une ligne « pris » est écrite la nuit pour les jours sans geste : le pourcentage est alors presque toujours élevé tant que tu ne signales pas de dose manquée. L'affichage le précise seulement quand déclarés < notés.
- Seuls les deux derniers jours écoulés sont complétés chaque nuit, et jamais avant le premier passage : l'historique plus ancien reste vide.
- Le calcul ne connaît ni la dose ni l'horaire : « pris » veut dire noté comme pris.
- Le seuil de 80 % et la fenêtre de 84 jours n'ont pas été relus par un clinicien.
Code : src/trevor/hydroxyurea.py (pdc_from_days, pdc, hu_key, missed_reasons, lines), data/hydroxyurea.json, src/trevor/navigator/doses.py (fill_defaults), src/trevor/storage/database.py (adherence_days)
Signal « à discuter avec ton équipe » (HbF ou crises)
Trévor repère deux situations qui méritent d'en parler à ton équipe de soins : une HbF qui reste sous ton meilleur taux sur trois mesures, ou au moins trois crises en six mois malgré une prise régulière. Il ne conclut jamais que le traitement ne marche pas et ne propose aucun changement.
Où tu le vois : Écran « Régularité et analyses de suivi » et questions pour la consultation. Le signal ne part jamais en notification.
Ce que l’algorithme lit
- Tes mesures d'HbF (valeur en % et date) (dossier / import)
- Tes épisodes de crise déclarés (jour de début) (journal des crises (déclaration))
- Ta régularité sur 84 jours, avec au moins 28 jours notés (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
min_hbf_measures | 3 | Mesures d'HbF minimales | data/hydroxyurea.json:17 |
min_logged_days_for_adherence | 28 | Jours notés minimaux pour juger la régularité dans ce signal | data/hydroxyurea.json:18 |
crises_min | 3 | Nombre de crises qui déclenche le signal | data/hydroxyurea.json:19 |
crises_window_days | 180 | Fenêtre de comptage des crises (affichée « 6 mois ») | data/hydroxyurea.json:20 |
good_from_percent | 80 | Même seuil de régularité que la fiche « Régularité » | data/hydroxyurea.json:9 |
Ce qui est affiché
Une liste de signaux (« hbf », « crises », les deux ou aucun). Chaque signal affiche sa raison (le nombre de crises est cité) puis la phrase de pied « à discuter avec ton équipe de soins ». Une question de consultation est ajoutée si un signal existe.
Un exemple chiffré
HbF notée 8, 12, 10, 9,5 : dernière 9,5 < meilleure 12 et 12 → 10 → 9,5 ne remonte pas, donc signal (vérifié avec hbf_vs_best). Avec seulement 8 et 12, count = 2, aucun signal.
Ce que cet algorithme ne sait pas faire
- La comparaison est faite avec ta propre valeur la plus haute, sans norme de population : une première mesure exceptionnellement haute rend le signal facile à déclencher.
- Aucun écart minimal entre les mesures n'est exigé : trois mesures prises le même mois comptent.
- Les crises comptées sont celles de ton journal ; une crise non déclarée n'existe pas pour ce calcul.
- Le signal « crises » ne regarde que la régularité, pas la dose ni la durée du traitement.
Code : src/trevor/hydroxyurea.py (non_response, signal_lines, consult_questions), src/trevor/royal/labs.py (hbf_series, hbf_vs_best), data/hydroxyurea.json
Comment un jour est classé « crise »
Trévor décide si un jour compte comme jour de crise à partir de ce que tu as noté : douleur forte, hospitalisation, épisode de crise déclaré. Cette étiquette sert ensuite à entraîner le modèle de risque, à repérer des tendances et à tester des associations. Les règles ne sont pas identiques dans tous les modules.
Où tu le vois : Pas affiché tel quel : l'étiquette alimente le risque de crise, les tendances (« Mes repères »), les graphiques et les associations. Le journal des crises te montre les épisodes que tu déclares.
Ce que l’algorithme lit
- Douleur du jour de 0 à 10 (suivi du jour) (déclaration)
- Réponse « hospitalisé(e) » du suivi du jour (déclaration)
- Douleur notée hors questionnaire (conversation, montre liée), avec son texte (déclaration / montre)
- Épisodes du journal des crises : début, fin, douleur maximale, niveau de soins (déclaration)
- Séjours à l'hôpital (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
seuil de douleur | 7 | Douleur de 0 à 10 qui fait classer le jour comme crise | src/trevor/wearables/service.py:553 |
CRISIS_OBS_WORDS | ("crise", "urgence", "hospital", "cvo", "vaso") | Mots qui, avec une douleur ≥ 7 notée hors questionnaire, font classer le jour en crise | src/trevor/wearables/service.py:513 |
HORIZON_DAYS | 2 | L'étiquette d'entraînement vaut 1 si une crise a lieu aujourd'hui ou dans les 2 jours suivants | src/trevor/wearables/crisis.py:123 |
seuil de douleur (graphiques) | 7 | Même seuil dans les séries des graphiques et associations | src/trevor/navigator/series.py:157 |
seuil d'alerte du cercle | 7 | Douleur maximale à partir de laquelle l'alerte du cercle est proposée | src/trevor/conversation/crisis_diary.py:178 |
Ce qui est affiché
Pour chaque jour : crise oui/non, avec la douleur maximale du jour. L'étiquette d'entraînement du risque regarde aussi les 2 jours suivants.
Un exemple chiffré
Un jour où tu notes une douleur de 7/10 : jour de crise (7 ≥ 7). Le jour d'avant et celui d'avant encore reçoivent l'étiquette d'entraînement 1 si les signaux de ces jours-là sont appris. Une douleur de 6/10 sans hospitalisation ni épisode n'est pas un jour de crise.
Ce que cet algorithme ne sait pas faire
- Les modules n'appliquent pas la même règle : le modèle de risque compte la réponse « hospitalisé(e) », les graphiques ne la comptent pas (les séjours à l'hôpital servent seulement à exclure des jours supposés), et les tendances ne regardent que les épisodes du journal.
- Le seuil de 7 est le même partout mais écrit en dur à plusieurs endroits.
- En mode « exception », un jour sans signalement vaut douleur 0 à l'affichage, sans rien écrire : il n'est jamais classé crise.
- Une crise soignée à la maison est considérée comme terminée le jour même de l'enregistrement.
- Les mots-clés du texte libre sont cherchés tels quels, sans analyse de sens.
Code : src/trevor/wearables/service.py (day_records), src/trevor/wearables/crisis.py (training label), src/trevor/navigator/series.py (build), src/trevor/conversation/insights.py (_crisis_days), src/trevor/conversation/crisis_diary.py, src/trevor/dashboard/data.py (daily_series)
Rappel la veille de ton jour à crises
Si au moins 5 de tes crises des 120 derniers jours se concentrent un même jour de la semaine, Trévor repère ce jour pour t'envoyer un rappel d'auto-soin la veille. Il s'appuie seulement sur ton propre journal.
Où tu le vois : Message de rappel d'auto-soin la veille du jour dominant. Réservé aux patients dont la maladie a la prédiction de crise et qui ont activé les alertes de crise ; au plus un message tous les 7 jours (reminders.py:1416-1450).
Ce que l’algorithme lit
- Dates de début de tes crises (journal des crises (déclaration))
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
MIN_CRISES | 5 | Crises minimales | src/trevor/conversation/prevention.py:16 |
WINDOW_DAYS | 120 | Fenêtre | src/trevor/conversation/prevention.py:17 |
DOMINANCE | 1.5 | Part du jour dominant en multiples de l'attendu uniforme (1/7) | src/trevor/conversation/prevention.py:18 |
Ce qui est affiché
Un jour de la semaine, ou aucun.
Un exemple chiffré
Avec 7 crises, le jour dominant doit en avoir au moins max(3 ; 1,5 × 7 ÷ 7) = 3. Avec 14 crises, au moins max(3 ; 3) = 3 ; avec 21 crises, au moins 4,5 donc 5 (calculé à la main).
Ce que cet algorithme ne sait pas faire
- Avec 5 à 8 crises, trois sur le même jour suffisent : un hasard est possible.
- Le calcul ne tient pas compte des jours où tu as été plus exposé (travail, déplacements).
Code : src/trevor/conversation/prevention.py (dominant_crisis_weekday), src/trevor/conversation/insights.py
Point douleur après un antalgique de secours
45 minutes après que tu notes une prise d'antalgique de secours, Trévor te demande comment va la douleur et applique un protocole d'escalade en trois niveaux : appeler le numéro d'urgence (144 en Suisse), aller aux urgences, ou avis médical dans les 24 heures. Les seuils restent à valider par l'hématologie. Ce n'est pas un dispositif médical validé.
Où tu le vois : Notification neutre sans mention de douleur (écran verrouillé), puis question avec quatre réponses : mieux, pareil, pire, signe de gravité.
Ce que l’algorithme lit
- La prise d'antalgique de secours notée (heure) (déclaration (bot, montre, téléphone))
- Ta réponse : mieux, pareil, pire, signe de gravité, plus de douleur, ne plus demander (déclaration)
- Complications déclarées (AVC, hypertension pulmonaire, rein) (carte de soins)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
FIRST_CHECK | 45 min | Premier point après la prise | src/trevor/conversation/pain_check.py:35 |
SAME_RECHECK | 30 min | Nouveau point après « pareil » | src/trevor/conversation/pain_check.py:36 |
BETTER_RECHECK | 3 h | Nouveau point après « mieux » | src/trevor/conversation/pain_check.py:37 |
ESCALATE_AFTER | 1 h | Douleur inchangée après une heure : niveau 2 | src/trevor/conversation/pain_check.py:38 |
DAY_CEILING | 20 h | Douleur encore là : niveau 3 | src/trevor/conversation/pain_check.py:39 |
EPISODE | 24 h | Durée d'un épisode | src/trevor/conversation/pain_check.py:40 |
HIGH_RISK | (avc, hypertension pulmonaire, rénale) | Complications qui font passer aux urgences dès le premier « pareil » | src/trevor/conversation/pain_check.py:41 |
Ce qui est affiché
Un message parmi : signe de gravité, pire, escalade, nouveau point, mieux, plafond de 20 heures, douleur disparue, fonction coupée. Le numéro d'urgence de ton pays est inséré. Rien n'est envoyé à un soignant.
Un exemple chiffré
Prise à 14 h, point à 14 h 45 : « pareil » avec 45 minutes écoulées et sans complication → nouveau point à 15 h 15 ; « pareil » à 15 h 15 (1 h 15 écoulée) → urgences (lu dans decide).
Ce que cet algorithme ne sait pas faire
- Les seuils de temps sont encore à valider par l'hématologie (docs/VALIDATION_MEDICALE_EN_ATTENTE.md).
- La liste des complications est lue dans le texte de la carte de soins : une complication non écrite ne baisse pas le seuil.
- Le premier message à l'écran verrouillé ne dit pas pourquoi il est envoyé, pour protéger ta vie privée.
- Trévor ne donne aucune dose et ne remplace pas un avis médical.
Code : src/trevor/conversation/pain_check.py (arm, due, decide, _pain_high_risk), src/trevor/conversation/rescue.py (arm after a dose), src/trevor/conversation/reminders.py (pain_check_tick)
Prises « par défaut » et taux de régularité des traitements
Quand tu es en mode « exception », Trévor affiche tes traitements comme pris tant que tu ne signales pas de dose manquée, et il écrit la nuit une ligne « pris » marquée supposée. Le taux de régularité de chaque traitement se calcule ensuite sur les jours notés.
Où tu le vois : Écran des traitements (« pris », « fait » pour un pansement), « Mes repères », bilan de consultation, vue du soignant.
Ce que l’algorithme lit
- Tes gestes : « pris », « dose manquée » avec sa raison (déclaration)
- Le mode des traitements et le rythme de chaque traitement (quotidien ou espacé) (déclaration / catalogue)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
CATCHUP_DAYS | 2 | Jours écoulés complétés chaque nuit | src/trevor/navigator/doses.py:24 |
REASONS | (forgot, unwell, no_supply, side_effects, away, other) | Raisons d'une dose manquée | src/trevor/navigator/doses.py:23 |
fenêtre du taux | 30 jours (par défaut) | Fenêtre par défaut du taux d'adhésion | src/trevor/storage/database.py:6241 |
seuil de consultation | 80 | Question de consultation si le taux est sous 80 % avec au moins 7 jours notés | src/trevor/conversation/consultation.py:42 |
Ce qui est affiché
Un état par jour et par traitement (pris, supposé, manqué avec raison), un taux en pourcentage, une série de jours consécutifs et le nombre de jours supposés.
Un exemple chiffré
Aucun exemple chiffré exécuté pour cette fiche (le calcul demande une base de données).
Ce que cet algorithme ne sait pas faire
- La série de jours consécutifs repart de zéro tant que le jour courant n'a pas de ligne : elle ne compte que si aujourd'hui est déjà noté.
- Le taux divise par les jours notés, pas par les jours de la fenêtre.
- Avec les prises par défaut, un taux élevé peut venir de l'absence de signalement.
- Le rattrapage de la nuit ne couvre que 2 jours : si Trévor n'a pas tourné plus longtemps, ces jours restent vides.
Code : src/trevor/navigator/doses.py (state, fill_defaults, declare_missed), src/trevor/storage/database.py (adherence_days, adherence_summary), src/trevor/navigator/checkin.py (inferred_taken)
Questions à poser à ton médecin
Trévor prépare jusqu'à cinq questions pour ta consultation à partir de tes données récentes : crises, régularité, signal de l'hydroxyurée, transfusion en retard, plaie, examens en retard. Chaque question désigne un sujet à aborder, jamais un diagnostic.
Où tu le vois : Préparation de consultation et trois points repris dans les tâches d'équipe (team_care.py:596-598).
Ce que l’algorithme lit
- Crises des 30 derniers jours et leur niveau de soins (journal des crises)
- Taux de régularité de chaque traitement (prises supposées comprises) (déclaration)
- Dernière transfusion et intervalle du programme (déclaration)
- Plaie de jambe, examens de prévention (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
crises | 2 | Seuil de la question sur la fréquence | src/trevor/conversation/consultation.py:29 |
jours notés / taux | 7 / 80 | Seuils de la question sur un traitement quotidien | src/trevor/conversation/consultation.py:42 |
retard de transfusion | 1 semaine | Retard à partir duquel la question est posée | src/trevor/conversation/consultation.py:58 |
maximum | 5 | Nombre maximal de questions après complétion | src/trevor/conversation/consultation.py:85 |
Ce qui est affiché
Une liste de questions rédigées en français, de 1 à 5 questions au moins complétées par les questions générales.
Un exemple chiffré
Aucun exemple chiffré exécuté.
Ce que cet algorithme ne sait pas faire
- La liste peut dépasser 5 questions avant la complétion : le plafond de 5 ne limite que les questions générales ajoutées.
- Les phrases sur les urgences, la transfusion et la plaie sont écrites en français dans le code, hors du système de traduction.
- Le taux inclut les prises supposées.
Code : src/trevor/conversation/consultation.py (suggested_questions), src/trevor/hydroxyurea.py (consult_questions)
Scores des questionnaires : confiance en soi, qualité de vie, utilité perçue
Trévor calcule le score de plusieurs questionnaires : confiance pour gérer ta maladie (9 à 45), qualité de vie EQ-5D-5L, qualité de vie PedsQL (0 à 100) et utilité perçue de Trévor (échelle USE ou courts questionnaires de 3 questions). Chaque score est enregistré avec ta réponse. Ce ne sont pas des dispositifs médicaux validés.
Où tu le vois : Résultat à la fin du questionnaire de gestion de la maladie (avec la comparaison à la moyenne des personnes), questionnaire de qualité de vie, radar par catégories.
Ce que l’algorithme lit
- Réponses à choix (le texte du choix, jamais un chiffre) (déclaration)
- Réponses numériques de 1 à 7 (utilité perçue) (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
bandes de confiance | [[42,très élevé],[36,élevé],[27,moyen],[0,faible]] | Niveaux du score de confiance (sur 45) | data/questionnaires/diseaseManagement.json (scoring.bands) |
formule simplifiée EQ-5D-5L | 100 − 5 × somme(niveau − 1) | Score de repli quand le jeu de valeurs national est absent | src/trevor/conversation/questionnaires/scoring.py:61-63 |
jeu de valeurs | data/scoring/eq5d5l_value_set.csv (absent du dépôt) | Fichier sous licence EuroQol à fournir ; le dépôt ne contient que le README | data/scoring/README.md |
PedsQL | 100 − position × 25 | Conversion d'une réponse en points | src/trevor/conversation/questionnaires/scoring.py:74 |
min_item / max_item | 1 / 7 | Bornes des items d'utilité perçue | data/questionnaires/useUtilite.json (scoring) |
Ce qui est affiché
Un nombre par questionnaire. EQ-5D-5L est étiqueté « simplifié » en l'absence du jeu de valeurs.
Un exemple chiffré
EQ-5D-5L avec les niveaux 1, 2, 3, 1, 4 : pénalité 0 + 1 + 2 + 0 + 3 = 6, score simplifié 100 − 30 = 70 (vérifié en exécutant eq5d5l_score).
Ce que cet algorithme ne sait pas faire
- Le score simplifié EQ-5D-5L n'est pas l'index de l'instrument : il ne se compare pas aux valeurs publiées.
- Avant le 4 octobre 2026, tout le monde avait le score d'une personne sans aucun problème parce que le niveau était lu comme un nombre ; une fonction de recalcul existe pour les anciennes réponses.
- Dans la confiance en soi, une réponse inconnue vaut 0 point, ce qui tire le score vers le bas sans que la question soit écartée.
- Le PedsQL officiel a des règles de score manquant que ce code n'applique pas : il fait la moyenne de ce qui est répondu.
- La comparaison « mieux ou moins bien que la moyenne » dépend des personnes qui ont répondu avant toi.
Code : src/trevor/conversation/questionnaires/scoring.py (compute_score, sum_map_score, band_label, category_label, eq5d5l_score, eq5d5l_levels, choice_level, pedsql_score, sum_numeric_score), src/trevor/conversation/display.py (format_self_efficacy_score), data/questionnaires/*.json (scoring)
Stock de médicaments et rappel de commande
Trévor estime combien de jours de traitement il te reste pour chaque médicament et te propose de préparer la commande quand le stock devient bas. Il n'envoie rien à la pharmacie sans ton accord.
Où tu le vois : « Mes médicaments » (« à commander », « bientôt », « ok »), et message de rappel de commande.
Ce que l’algorithme lit
- Durée d'une boîte en jours, nombre de boîtes, date du dernier retrait ou comptage (déclaration)
- Dates des commandes envoyées (historique des envois)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
LOW_DAYS | 7 | À commander à partir de 7 jours ou moins | src/trevor/conversation/pharmacy.py:52 |
SOON_DAYS | 14 | Bientôt à partir de 14 jours ou moins | src/trevor/conversation/pharmacy.py:53 |
rappel | 5 jours / 2 jours | Écart entre deux rappels / pause après une commande | src/trevor/conversation/reminders.py:1470-1472 |
MAX_BOX_DAYS / MAX_BOXES | 365 / 99 | Bornes de saisie | src/trevor/conversation/pharmacy.py:54-55 |
Ce qui est affiché
Un nombre de jours restants, un niveau (à commander, bientôt, ok, inconnu) et un message de rappel qui nomme le médicament et le nombre de jours.
Un exemple chiffré
Boîte de 30 jours, 2 boîtes, retrait il y a 55 jours : 30 × 2 − 55 = 5 jours restants, niveau « à commander » (calcul de days_left lu dans le code).
Ce que cet algorithme ne sait pas faire
- Le calcul suppose que tu prends exactement une boîte pour la durée indiquée, sans tenir compte des jours manqués, des doses changées ou des prises supplémentaires.
- Sans date de retrait, aucun rappel n'est possible.
- Je n'ai pas trouvé dans le code de vérification des interactions entre médicaments : Trévor ne signale aucune interaction.
Code : src/trevor/conversation/pharmacy.py (days_left, level, to_order, public), src/trevor/conversation/reminders.py (pharmacy_nudges)
Stress perçu : échelle PSS-10 et ressenti du jour
Trévor calcule ton score à l'échelle de stress perçu PSS-10 (de 0 à 40) et lui donne un niveau, puis réagit à ton ressenti du jour (0 à 10) par un conseil. Le questionnaire ne peut pas être refait avant 14 jours. Ce n'est pas un diagnostic ni un dispositif médical validé : le résultat t'oriente vers un professionnel.
Où tu le vois : « Mon stress » : ressenti du jour, PSS-10, tendances.
Ce que l’algorithme lit
- 10 réponses de Jamais à Très souvent, sur le dernier mois (déclaration)
- Ton niveau de stress du jour, de 0 à 10 (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
PSS_SCALE | Jamais 0 … Très souvent 4 | Points par réponse | src/trevor/conversation/stress.py:45 |
PSS_REVERSED | {3, 4, 6, 7} | Items inversés (indices à partir de 0) | src/trevor/conversation/stress.py:46 |
seuils PSS-10 | 13 et 26 | Limites hautes des niveaux faible et modéré | src/trevor/conversation/stress.py:82-87 |
délai minimal | 14 jours | Une nouvelle passation est refusée avant 14 jours | src/trevor/conversation/stress.py:141 |
Ce qui est affiché
Un score sur 40, un niveau et un conseil. Le ressenti du jour donne un conseil et, à partir de 8 sur 10, les lignes d'écoute. Ce n'est pas un diagnostic ni un dispositif médical validé : le résultat t'oriente vers un professionnel.
Un exemple chiffré
Toutes les réponses « Parfois » : chaque item vaut 2, inversé 4 − 2 = 2, donc 20 sur 40, niveau modéré (vérifié en exécutant pss_score).
Ce que cet algorithme ne sait pas faire
- Le conseil généré par le modèle de langage n'est pas le même d'une fois à l'autre ; seul le repli à règles simples est déterministe.
- Les limites 13 et 26 sont fixées dans le code sans source.
- Les libellés exacts sont requis : toute autre formulation rend le score impossible.
Code : src/trevor/conversation/stress.py (pss_score, pss_band, finish_pss10, finish_stress_checkin, _stress_recommendation)
« Comment ça va ? » espacé et valeurs supposées
Trévor ne te demande pas chaque jour comment tu vas. Par défaut, il suppose que tout va bien tant que tu ne dis rien, et il te pose une question brève de temps en temps, plus espacée quand tu réponds « bien ». Les jours supposés ne servent jamais de preuve.
Où tu le vois : Message « comment ça va ? » avec trois réponses (bien, moyen, pas bien) ; jours supposés marqués « supposé » dans les graphiques et le suivi.
Ce que l’algorithme lit
- Le mode de chaque domaine : exception, quotidien ou arrêt (douleur, humeur, traitements, eau) (déclaration)
- Ton dernier suivi, humeur, douleur, crise ou séjour à l'hôpital (déclaration)
- Le nombre de rappels ignorés d'affilée (historique des rappels)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
CHECKIN_EVERY_DAYS | 10 | Écart de départ entre deux questions | src/trevor/navigator/checkin.py:26 |
CHECKIN_MAX_EVERY_DAYS | 28 | Écart maximal | src/trevor/navigator/checkin.py:27 |
CHECKIN_SCHEDULE | (10, 14, 21, 28) | Écart après 1, 2, 3, 4 réponses « bien » d'affilée | src/trevor/navigator/checkin.py:28 |
CHECKIN_AFTER_BAD_DAYS | 3 | Délai avant la prochaine question après « pas bien » | src/trevor/navigator/checkin.py:29 |
SILENCE_DAYS | 7 | Aucune question si tu as noté quelque chose dans ces jours | src/trevor/navigator/checkin.py:30 |
LEVELS | {good: 8, mid: 5, bad: 3} | Humeur sur 10 enregistrée pour chaque réponse | src/trevor/navigator/checkin.py:31 |
reminder_misses | 3 | Au moins 3 rappels ignorés : plus de question | src/trevor/navigator/checkin.py:181 |
Ce qui est affiché
Une question « comment ça va ? » espacée, une humeur sur 10 enregistrée, et des jours supposés « tout va bien » (douleur 0, humeur 8, eau à l'objectif) affichés comme supposés.
Un exemple chiffré
Premier « bien » : écart de 10 jours ; deuxième « bien » d'affilée : 14 jours ; quatrième et plus : 28 jours. Un « pas bien » ramène la prochaine question à 3 jours (lu dans record_level).
Ce que cet algorithme ne sait pas faire
- Une absence de signalement est lue comme « tout va bien » : un jour de douleur non déclaré reste à 0 dans l'affichage supposé.
- Les valeurs supposées (humeur 8) sont des conventions, pas des mesures.
- Trois niveaux seulement : « moyen » vaut 5 sur 10, sans nuance.
- Le code cite la motivation (baisse d'observance des évaluations répétées) mais les nombres 10, 14, 21, 28 sont des choix de conception.
Code : src/trevor/navigator/checkin.py (mode, checkin_due, record_level, assumed_days, assumed_values), src/trevor/navigator/series.py (build)
Suivi de prévention, vaccins et rappels d'examens
Pour chaque examen de surveillance ou vaccin que tu suis, Trévor calcule la date due (dernière date + intervalle) et un état : à jour, bientôt, en retard ou jamais noté. Il t'envoie un rappel doux, un seul par échéance.
Où tu le vois : Suivi de prévention (✅ 🟡 🔴 ⬜), résumé « Mes vaccins », message de rappel.
Ce que l’algorithme lit
- Date du dernier examen ou vaccin (déclaration)
- Complications connues sur la carte de soins (déclaration (carte de soins))
- Rythme donné par ton équipe (suspend le rappel) (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
PREVENTION_SOON_DAYS | 60 | Préavis du suivi de prévention | src/trevor/conversation/engine.py:2737 |
SOON_DAYS (vaccins) | 60 | Même préavis pour les vaccins | src/trevor/lifecourse/vaccine_log.py:40 |
PLAN_MONTHS | grippe 12 ; pneumocoque 60 ; méningocoque 60 | Rythme usuel des trois vaccins du plan | src/trevor/lifecourse/vaccine_log.py:38 |
REMINDER_MONTHS | (12, 60, 120) | Rappels possibles d'un vaccin que tu ajoutes | src/trevor/lifecourse/vaccine_log.py:39 |
_KDIGO_VISITS | G1 (1,1,2) … G5 (4,4,4) | Contrôles par an selon le DFG et l'albuminurie | src/trevor/lifecourse/complications.py:110 |
Ce qui est affiché
Une ligne par examen ou vaccin : dernière date, échéance, état (à jour, bientôt, en retard, jamais), et le rappel texte « en retard » ou « à refaire vers JJ.MM.AAAA ».
Un exemple chiffré
Dernier vaccin de la grippe le 15.10.2025, intervalle 12 mois : échéance le 15.10.2026, le 06.11.2026 il est « en retard » (calculé à la main avec la règle aujourd'hui ≥ échéance).
Ce que cet algorithme ne sait pas faire
- Les intervalles sont des repères généraux : ton centre de référence fixe le rythme exact.
- Un « jamais noté » ne dit pas que l'examen n'a pas été fait, seulement que tu ne l'as pas noté.
- Deux modules calculent les mêmes états (plan de prévention dans engine.py, calendrier dans screening.py, carnet de vaccins dans vaccine_log.py) avec la même règle de 60 jours écrite à trois endroits.
- Une date future est refusée et toute année avant 1990 est refusée à la saisie.
Code : src/trevor/conversation/engine.py (_prevention_rows_compute), src/trevor/lifecourse/vaccine_log.py (custom_rows), src/trevor/lifecourse/complications.py (exam_intervals, kdigo_visits_per_year), src/trevor/conversation/reminders.py (prevention_due_reminders), data/prevention.json
Enseignements sur tes crises et ta régularité
Trévor compare, sur 120 jours, le nombre de tes crises ce mois-ci et le mois précédent, ton sommeil avant les crises, le jour de la semaine le plus fréquent, ta régularité par traitement et les semaines bien ou mal suivies. Ce sont des observations descriptives, jamais une preuve de cause.
Où tu le vois : Écran de progression et récapitulatif mensuel envoyé au plus une fois par mois et par personne si au moins un enseignement ressort (reminders.py:1380-1410). Les comparaisons de crises demandent que la maladie ait la prédiction de crise.
Ce que l’algorithme lit
- Dates de début des crises du journal (déclaration)
- Minutes de sommeil par nuit (montre / bague)
- Prises notées par traitement (déclaration)
Le calcul, étape par étape
Les valeurs utilisées
| Nom dans le code | Valeur | Rôle | Où |
|---|---|---|---|
WINDOW_DAYS | 120 | Fenêtre d'analyse | src/trevor/conversation/insights.py:24 |
MIN_CRISES_TREND | 2 | Crises minimales pour une tendance | src/trevor/conversation/insights.py:25 |
MIN_CRISES_PATTERN | 4 | Crises minimales pour chercher un motif de sommeil | src/trevor/conversation/insights.py:26 |
MIN_SLEEP_DAYS | 15 | Nuits mesurées minimales | src/trevor/conversation/insights.py:27 |
SLEEP_GAP_MINUTES | 40 | Écart de sommeil jugé notable | src/trevor/conversation/insights.py:28 |
MIN_WEEKS_COMPARE | 3 | Semaines minimales de chaque groupe | src/trevor/conversation/insights.py:29 |
CRISIS_GAP_DAYS | 0.5 | Écart de jours de crise par semaine jugé notable | src/trevor/conversation/insights.py:30 |
seuils de régularité | 90 et 70 | Messages « belle régularité » et « un rappel peut t'aider » | src/trevor/conversation/insights.py:137-140 |
Ce qui est affiché
Une liste de messages avec un ton (bon, info, à surveiller). Vide si rien n'est fiable. Le message sur les semaines bien suivies rappelle que c'est une piste à confirmer avec ton équipe, pas une certitude.
Un exemple chiffré
Aucun exemple chiffré exécuté (le calcul demande une base de données).
Ce que cet algorithme ne sait pas faire
- Comparer deux mois avec 2 crises ou plus donne une tendance fragile : un seul épisode de plus bascule le message de « stables » à « augmentent ».
- La comparaison adhésion/crises ne tient pas compte du fait que tu prends parfois mieux ton traitement quand tu vas mieux.
- Les seuils 90 et 70 % de la régularité diffèrent du 80 % de la fiche hydroxyurée.
- Les jours de crise ne viennent que du journal des crises.
Code : src/trevor/conversation/insights.py (compute_insights, _weekly_adherence_and_crises)
