Phase 2 : parseur de l'annexe sec10 — 52 textes, 12 affaires CC

Briques réutilisables :
- dates_fr : lit les formes réelles du corpus (« 23 avr. 2026 (JO 24 avr.) »,
  « 1er juill. », « 24.07.2026 ») et distingue une date exacte d'une échéance
  prévisionnelle (« Fin août 2026 » → situé au 25, libellé conservé, jamais
  présenté comme un fait)
- markdown : découpage des tableaux (barres échappées, lignes courtes),
  nettoyage, extraction des marqueurs [^dim07-24^] / [^phase5-3.1^]

Parseur sec10 :
- 27 lois promulguées + 21 lignes simples + 2 lignes éclatées en 4 textes = 52
- éclatement justifié : les lignes « accords Kazakhstan et Colombie » et
  « MACF » décrivent chacune deux textes de statuts différents
- migration 002 : regime_libertes stocké à part, faute de savoir quel public
  la cotation globale du rapport vise — dérouler « droits+ » sur les trois
  publics aurait inventé une ventilation absente de la source
- migration 003 : la facette « devant le CC » couvre aussi les saisines sans
  numéro d'affaire (programmation militaire), sinon 6 textes au lieu de 7

Trois pièges du corpus, corrigés et couverts par des tests :
- « eau » matchait comme sous-chaîne dans réseaux / drapeau / Retailleau
- une décision citée sans saisine créait une fausse saisine (loi Philippine)
- la date de saisine était pêchée dans la colonne « échéance », datant la
  saisine de l'aide à mourir du mois suivant

72 tests, 90 % de couverture sur pipeline/.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Cyber Mawonaj
2026-07-25 18:22:18 -04:00
co-authored by Claude Opus 5
parent 31d3935bce
commit c36b8dc631
12 changed files with 1747 additions and 1 deletions
+14
View File
@@ -82,6 +82,15 @@ class Pertinence(StrEnum):
FAIBLE = "faible"
class RegimeLibertes(StrEnum):
"""Cotation globale d'un texte par l'annexe du rapport (`sec10.md`)."""
DROITS_PLUS = "droits_plus" # création ou extension de droits
CONTROLE_PLUS = "controle_plus" # restriction, ou extension des contrôles
MIXTE = "mixte"
NEUTRE = "neutre"
class Confiance(StrEnum):
HIGH = "high"
MEDIUM = "medium"
@@ -258,6 +267,9 @@ class Texte(BaseModel):
themes: list[Theme] = Field(default_factory=list)
impacts: dict[Public, Impact] = Field(default_factory=dict)
regime_libertes: RegimeLibertes | None = None
regime_libertes_note: str | None = None
guadeloupe_pertinence: Pertinence | None = None
guadeloupe_note: str | None = None
@@ -353,6 +365,8 @@ class Texte(BaseModel):
{str(p): {"sens": str(i.sens), "note": i.note} for p, i in self.impacts.items()},
ensure_ascii=False,
),
"regime_libertes": str(self.regime_libertes) if self.regime_libertes else None,
"regime_libertes_note": self.regime_libertes_note,
"guadeloupe_pertinence": (
str(self.guadeloupe_pertinence) if self.guadeloupe_pertinence else None
),