extract.py contenait 4 responsabilités mélangées (320 lignes) :
parsing JSON tolérant, résolution de zones, crop Recodage avec classification
métier, orchestration. Séparation en modules cohérents :
- pipeline/json_utils.py : parsing tolérant réutilisable (strip fences,
virgules manquantes, troncature des boucles d'objets vides, fermeture
des structures JSON ouvertes). N'a aucune connaissance métier OGC.
- pipeline/recueil.py : toute la logique spécifique à la page recueil —
résolution de zones configurables, filter_cim10_codes, classification
DP/DR/DAS par règle métier, run_recodage_crop_pass, merge_codage_reco,
enrich_recueil (orchestration des trois : checkboxes + ghs_injustifie
+ crop Recodage). Chaque fonction est testable indépendamment du VLM.
- pipeline/extract.py : réduit à l'orchestration pure — ingest, routing,
boucle page par page, délégation à recueil.enrich_recueil, validation
ATIH finale. Plus aucune logique métier enfouie.
La fonction extract_dossier garde exactement la même signature et produit
le même JSON en sortie : aucun breaking change externe.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>