Skip to content

Résoudre un signalement de chemin

Un médecin a signalé, depuis la page de résultats, qu'une liste (préférée, alternative ou réserve) devrait contenir ou ne pas contenir certaines préparations. Les signalements sont listés sur /recommendations/reports/, chacun avec son issue GitLab.

La correction est presque toujours une modification de données dans l'admin (sélecteur, préparation, arbre). Le risque n'est pas de rater la correction, c'est de changer un autre chemin sans le voir. Tout se fait en local sur une copie de prod ; prod ne reçoit que les clics admin finaux.

Outils

Recette Rôle
just check-path-reports Verdict OK / KO de chaque signalement ouvert, avec les préparations manquantes et en trop.
just snapshot-paths NOM [BASELINE] Photo des trois listes de tous les chemins terminaux dans tasks/snapshots/NOM.json (ignoré par git). Avec BASELINE, imprime chemin par chemin ce qui a changé.

Les deux lisent la base sans cache et n'écrivent que le JSON. Un chemin est identifié par ses ids de choix triés (bpco:2,3,5,19) ; choice_ids dans l'entrée garde l'ordre réel, à coller dans le lien « expliquer ».

Procédure

  1. Restaurer prod en local : ./scripts/local/download_prod_data.sh --fresh-dump. Puis just snapshot-paths baseline et just check-path-reports.
  2. Diagnostiquer avec la page « expliquer » (/recommendations/explain/?is_bpco=1&choice_ids=2,19,3,5&preparation=<id>), l'aperçu du formulaire de sélecteur (/recommendations/selectors/) et la checklist Pourquoi une préparation ne sort pas. Les signalements qui partagent le même dernier choix et la même liste ont presque toujours la même cause : un lot = une cause.
  3. Corriger dans l'admin local, puis just check-path-reports et just snapshot-paths apres baseline. Le diff attendu, c'est les chemins signalés modifiés comme demandé, et rien d'autre. Chaque autre ligne est un effet de bord : resserrer le sélecteur (ajouter les classes, viser le dernier choix plutôt qu'un choix amont partagé, viser une forme précise) ou l'accepter si c'est la même logique clinique sur un chemin frère. Si c'est raté, relancer l'étape 1.
  4. Rejouer les mêmes clics admin sur prod, noter les étapes au fur et à mesure en local pour ne pas les retrouver de mémoire.
  5. Archiver les signalements résolus depuis /recommendations/reports/ (l'issue GitLab se ferme) et répondre au médecin : chemin, verdict (corrigé / comportement voulu / à décider / hors moteur), effets de bord acceptés.
Cause Correction
Critère de sélecteur trop étroit ou manquant créer ou modifier un sélecteur sur le choix concerné
Donnée de préparation fausse (forme, classe, indication, disponible) corriger la préparation ; l'import Swissmedic ne remplit forme et indication que si elles sont vides, la correction tient
Structure de l'arbre (un AND amont qu'aucun choix aval n'annule) déplacer des sélecteurs ou réordonner via « question suivante » ; décision produit
Comportement voulu (pistes préférée et alternative) pas de correction, répondre au médecin

Pièges

  • Formes galéniques Swissmedic : un Respimat et un Ventolin aérosol portent tous deux « Solution pour inhalation par nébuliseur ». Un sélecteur « forme seule » laisse passer plus que prévu ; ajouter les classes.
  • Dosages en double : les commandes lisent les listes du moteur avant le dédoublonnage par gamme et dispositif de la page de résultats. Un chemin peut lister deux dosages là où le médecin voit une carte. Vérifier aussi l'indication du dosage coché avant de parler de bug.
  • no_alternative sur un choix vide la liste alternative de tout chemin qui y passe ; une alternative demandée impose de le retirer et de poser de vrais sélecteurs alternatifs.
  • Réordonner l'arbre change les choice_ids : les signalements gardent l'ancien chemin, à mettre à jour dans l'admin. Un choix supprimé rend le signalement KO sans interrompre la commande.
  • Question sautée : snapshot_paths suit uniquement « question suivante », les chemins avec question passée ne sont pas énumérés.
  • Cache : la page « tous les chemins » et le graphe sont cachés 24 h. Invalidé à l'enregistrement d'un sélecteur, sinon clear_decision_graph_cache.