feat: méthode TIM experte CPAM + moteur de règles étendu

CPAM — Méthode TIM (mémoire en défense) :
- Réécriture CPAM_ARGUMENTATION avec raisonnement 5 passes TIM
  (contexte admin → motif réel → confrontation bio → hiérarchie → validation défensive)
- _BIO_THRESHOLDS (19 entrées) + _build_bio_confrontation() pour
  confrontation biologie/diagnostic avec seuils chiffrés et verdicts
- _format_response() dual format : nouveau TIM (moyens numérotés, tableau
  bio, codes non défendables, conclusion dispositive) + rétrocompat legacy
- CPAM_ADVERSARIAL mis à jour pour vérifier honnêteté intellectuelle
- Tests adaptés + 12 nouveaux tests (bio confrontation, format TIM)

Moteur de règles :
- Nouvelles règles YAML : demographic, diagnostic_conflicts,
  procedure_diagnosis, temporal, parcours
- Bio extraction FAISS (synonymes vectoriels)
- Veto engine enrichi (citations, Trackare skip, règles démographiques)
- Decision engine : _apply_bio_rules_gen() + matchers analytiques

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dom
2026-03-04 11:57:07 +01:00
parent 795110d2e6
commit ce7a9650af
19 changed files with 1681 additions and 418 deletions

View File

@@ -1,15 +1,10 @@
version: 2
# Règles biologiques (contradiction bio ⇒ ruled_out)
# + garde-fou "preuve manquante" (diag d'ionogramme sans valeur extraite ⇒ NEED_INFO)
#
# Objectif: éviter des FAIL "bêtes" quand la biologie contredit clairement un diagnostic,
# et éviter des PASS "trop optimistes" quand on n'a même pas la valeur biologique.
#
# Hiérarchie des seuils:
# - Priorité aux normes du document (ex: [N: 135-145])
# - Sinon fallback config/reference_ranges.yaml
# - Si âge inconnu/enfant: safe zones conservatrices (reference_ranges.yaml)
# ------------------------------------------------
# Ces règles permettent d'écarter un diagnostic (status: ruled_out)
# si les preuves biologiques extraites le contredisent formellement.
# Elles génèrent aussi des alertes VETO-17 si la preuve est manquante.
missing_evidence:
enabled: true
@@ -18,17 +13,78 @@ missing_evidence:
score_penalty: 2
rules:
# --- IONOGRAMME ---
hyponatremia:
enabled: true
codes: ["E87.1"] # hyponatrémie
codes: ["E87.1"]
analyte: sodium
threshold_type: low
message: "natrémie normale"
hyperkalemia:
enabled: true
codes: ["E87.5"] # hyperkaliémie
codes: ["E87.5"]
analyte: potassium
threshold_type: high
message: "kaliémie normale"
hypokalemia:
enabled: true
codes: ["E87.6"] # hypokaliémie
codes: ["E87.6"]
analyte: potassium
threshold_type: low
message: "kaliémie normale"
# --- HÉMATOLOGIE ---
anemia:
enabled: true
codes: ["D50", "D50.0", "D50.1", "D50.8", "D50.9", "D51", "D52", "D53", "D55", "D56", "D57", "D58", "D59", "D60", "D61", "D62", "D63", "D64"]
analyte: hemoglobin
threshold_type: low
message: "taux d'hémoglobine normal"
thrombopenia:
enabled: true
codes: ["D69.4", "D69.5", "D69.6"]
analyte: platelets
threshold_type: low
message: "taux de plaquettes normal"
# --- RÉNAL ---
acute_kidney_injury:
enabled: true
codes: ["N17", "N17.0", "N17.1", "N17.2", "N17.8", "N17.9", "N19"]
analyte: creatinine
threshold_type: high
message: "créatininémie normale"
# --- MÉTABOLISME ---
hypoglycemia:
enabled: true
codes: ["E16.0", "E16.1", "E16.2"]
analyte: glucose
threshold_type: low
message: "glycémie normale"
diabetes_uncontrolled:
enabled: true
codes: ["E10.1", "E11.1"] # Avec complications aiguës (acidocétose, etc.)
analyte: hba1c
threshold_type: high
threshold_value: 9.0
message: "HbA1c < 9% (diabète non considéré comme déséquilibré selon HbA1c)"
# --- THYROÏDE ---
hypothyroidism:
enabled: true
codes: ["E02", "E03", "E03.0", "E03.1", "E03.2", "E03.8", "E03.9"]
analyte: tsh
threshold_type: high # TSH élevée = Hypo
message: "TSH normale ou basse"
hyperthyroidism:
enabled: true
codes: ["E05", "E05.0", "E05.1", "E05.2", "E05.8", "E05.9"]
analyte: tsh
threshold_type: low # TSH basse = Hyper
message: "TSH normale ou élevée"