Phase 4 : impacts par public, arbitrages, calendrier — les 7 critères §7 passent
Impacts : le rapport ne dresse pas de tableau texte × public, mais il consacre un chapitre à chacun (sec04 individus, sec05 associations, sec06 entreprises). C'est ce placement éditorial — un choix explicite de l'auteur, pas une inférence — qui sert de base à la ventilation. Le sens vient de la cotation manuelle de l'annexe quand elle existe, sinon du vocabulaire, et le texte est alors marqué « à vérifier » (17 cas). Arbitrages de la validation de phase 5 portés en points clés : loi-riposte affiche l'AFD à 500 €, et le montant de 1 500 € n'apparaît que présenté comme la version sénatoriale abandonnée. Migration 004 + calendrier : 9 échéances nationales transcrites du corpus avec leur extrait source. Celle des sénatoriales porte explicitement concerne_guadeloupe = 0 — série 1, renouvelée en 2023. Défaut de qualité corrigé : un titre de section nommant plusieurs textes (« Cohésion républicaine, logement, GloBE, entrisme ») faisait hériter chaque phrase de transition aux quatre, polluant leurs résumés. Une section n'est dédiée que si elle nomme un seul texte. 118 tests, 92 % de couverture. Les 7 garde-fous du §7 et les 5 démos du §8.7 sont automatisés dans tests/test_acceptation.py. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c28243cf87
commit
f3e546cfc4
@@ -24,7 +24,7 @@ import sqlite3
|
||||
import time
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
from pipeline import chemins, db, guadeloupe
|
||||
from pipeline import chemins, db, guadeloupe, impacts, resolution_conflits
|
||||
from pipeline.journal import configurer, logger
|
||||
from pipeline.modeles import Source, Texte
|
||||
from pipeline.parseurs import (
|
||||
@@ -32,6 +32,7 @@ from pipeline.parseurs import (
|
||||
bibliographie,
|
||||
chapitres,
|
||||
citations,
|
||||
echeances,
|
||||
tableaux_sec10,
|
||||
)
|
||||
|
||||
@@ -50,10 +51,13 @@ class CompteRendu:
|
||||
evenements: int = 0
|
||||
decisions_cc: int = 0
|
||||
analyses: int = 0
|
||||
echeances: int = 0
|
||||
|
||||
textes_sans_source: list[str] = field(default_factory=list)
|
||||
textes_sans_resume: list[str] = field(default_factory=list)
|
||||
pertinences_deduites: list[str] = field(default_factory=list)
|
||||
impacts_deduits: list[str] = field(default_factory=list)
|
||||
verdicts_appliques: int = 0
|
||||
avertissements: list[str] = field(default_factory=list)
|
||||
|
||||
marqueurs_avec_lien: int = 0
|
||||
@@ -69,6 +73,7 @@ class CompteRendu:
|
||||
f" événements : {self.evenements}",
|
||||
f" décisions CC : {self.decisions_cc}",
|
||||
f" analyses : {self.analyses}",
|
||||
f" échéances : {self.echeances}",
|
||||
"",
|
||||
"Résolution des citations",
|
||||
f" avec lien : {self.marqueurs_avec_lien}",
|
||||
@@ -81,6 +86,8 @@ class CompteRendu:
|
||||
f" textes sans résumé : {len(self.textes_sans_resume)}"
|
||||
+ (f" → {', '.join(self.textes_sans_resume)}" if self.textes_sans_resume else ""),
|
||||
f" pertinences déduites : {len(self.pertinences_deduites)}",
|
||||
f" impacts déduits : {len(self.impacts_deduits)}",
|
||||
f" arbitrages appliqués : {self.verdicts_appliques}",
|
||||
]
|
||||
if self.avertissements:
|
||||
lignes.append("")
|
||||
@@ -114,6 +121,7 @@ def ensemencer(cx: sqlite3.Connection) -> CompteRendu:
|
||||
_rattacher_sources(texte, repertoire, lecture, marqueurs_annexe)
|
||||
_rattacher_redaction(texte, lecture)
|
||||
_coter_guadeloupe(texte, compte)
|
||||
_ventiler_impacts(texte, lecture, compte)
|
||||
|
||||
if not texte.sources:
|
||||
compte.textes_sans_source.append(texte.id)
|
||||
@@ -130,13 +138,22 @@ def ensemencer(cx: sqlite3.Connection) -> CompteRendu:
|
||||
compte.marqueurs_sans_lien = len(repertoire.resolus_sans_lien)
|
||||
compte.marqueurs_non_resolus = len(repertoire.non_resolus)
|
||||
|
||||
# 5. Écriture.
|
||||
# 5. Arbitrages de la validation de phase 5 — le §7 du cahier des charges
|
||||
# exige que la loi « Riposte » porte l'AFD à 500 € et non à 1 500 €.
|
||||
verdicts = resolution_conflits.lire_verdicts(
|
||||
chemins.PHASE5_VALIDATION.read_text(encoding="utf-8")
|
||||
)
|
||||
compte.verdicts_appliques = resolution_conflits.appliquer(textes, verdicts)
|
||||
|
||||
# 6. Écriture.
|
||||
db.enregistrer_textes(cx, textes.values())
|
||||
|
||||
lectures = analyses.parser(chemins.INSIGHTS.read_text(encoding="utf-8"))
|
||||
with db.transaction(cx):
|
||||
for analyse in lectures:
|
||||
db.enregistrer_insight(cx, analyse)
|
||||
for echeance in echeances.echeances_nationales():
|
||||
db.enregistrer_echeance(cx, echeance)
|
||||
|
||||
statistiques = db.statistiques(cx)
|
||||
compte.textes = statistiques["textes"]
|
||||
@@ -144,6 +161,7 @@ def ensemencer(cx: sqlite3.Connection) -> CompteRendu:
|
||||
compte.evenements = statistiques["evenements"]
|
||||
compte.decisions_cc = statistiques["decisions_cc"]
|
||||
compte.analyses = statistiques["insights"]
|
||||
compte.echeances = statistiques["echeances"]
|
||||
|
||||
if compte.textes < TEXTES_ATTENDUS_MINIMUM:
|
||||
compte.avertissements.append(
|
||||
@@ -234,6 +252,23 @@ def _coter_guadeloupe(texte: Texte, compte: CompteRendu) -> None:
|
||||
compte.pertinences_deduites.append(texte.id)
|
||||
|
||||
|
||||
def _ventiler_impacts(
|
||||
texte: Texte, lecture: chapitres.LectureChapitres, compte: CompteRendu
|
||||
) -> None:
|
||||
"""Répartit l'effet du texte entre les trois publics suivis."""
|
||||
ventilation = impacts.ventiler(texte.id, lecture, regime=texte.regime_libertes)
|
||||
if not ventilation.impacts:
|
||||
return
|
||||
|
||||
texte.impacts = ventilation.impacts
|
||||
if ventilation.deduit:
|
||||
texte.a_verifier = True
|
||||
texte.motif_verification = _ajouter_motif(
|
||||
texte.motif_verification, impacts.MOTIF_VERIFICATION
|
||||
)
|
||||
compte.impacts_deduits.append(texte.id)
|
||||
|
||||
|
||||
def _ajouter_motif(existant: str | None, nouveau: str) -> str:
|
||||
if not existant:
|
||||
return nouveau
|
||||
|
||||
Reference in New Issue
Block a user