Collecteurs, chacun isolé et tolérant à l'échec :
- legifrance : OAuth PISTE validé en production. Deux pièges vérifiés sur le
compte réel — seul le couple « Client ID / Client secret » ouvre un jeton
(la clé d'API donne invalid_client), et les identifiants de production ne
passent pas en bac à sable.
- senat : liste chronologique des lois promulguées. L'URL du §5.1
(senat.fr/lois/index.html) est morte ; l'équivalent fonctionnel est
/dossiers-legislatifs/lois-promulguees.html — 31 lois 2026 relevées.
- conseil_constitutionnel : sans le paramètre ?id=32246 la page des affaires en
instance ne rend que des QPC et aucune affaire DC. Les colonnes DC et QPC
diffèrent : lecture par en-tête, jamais par position.
Rapprochement à trois issues — numéro officiel, similarité de titre, et une
zone de signalement où le pipeline s'abstient plutôt que de fusionner.
make update-dry contre les sources réelles : aucun faux positif sur les 52
textes du corpus, et trois apports que le rapport n'avait pas — le numéro
d'affaire 2026-907 DC de la programmation militaire, la date de saisine du
16 juillet pour l'aide à mourir, les décisions du 23 juillet sur 908 et 909.
Une asymétrie de sources est documentée par un test plutôt que corrigée en
douce : le Sénat ne qualifie pas la loi 2026-650 d'organique, Légifrance si.
Le collecteur rapporte ce que sa source dit ; le champ n'est pas comparé.
Fixtures HTML figées : aucun test ne touche au réseau.
156 tests, 91 % de couverture (chaque module au-dessus du seuil de 70 %).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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>
Parseurs :
- blocs_claim : les quatre dialectes des rapports de dimension. Le cahier des
charges en postulait un seul ; sans les quatre, dim05 à dim12 étaient perdus,
soit les dimensions associations, entreprises, migration et calendrier.
- notes_bas_page : 258 notes, dont 104 sans URL. Les identifiants JORFTEXT
donnent lieu à une URL canonique reconstruite (schéma fixe, rien d'inventé) ;
les autres restent sans lien plutôt que d'être devinées.
- bibliographie : 481 références, toutes liées. Indexées par numéro de loi,
par affaire DC et par cote de document parlementaire — cette dernière étant
la seule identité d'un texte déposé et non examiné.
- chapitres : rattachement phrase par phrase, résumés repris tels quels.
Résolution des citations : 100 % des 332 marqueurs du rapport, 93 % avec un
lien vérifiable. Il a fallu six conventions de numérotation, une par famille de
dimension (marqueur de fin, en-tête de claim, section, rang, note, section.rang).
Trois pièges corrigés, tous couverts par des tests :
- « décision n° 2026-903 DC » lu comme une loi, ce qui volait à la loi 2026-403
les phrases — et donc les sources — qui parlaient d'elle
- retrait des marqueurs laissant « … dans les DROM . » ; corrigé à la source
sans toucher aux espaces avant « ; » et « » » qu'exige le français
- « programmation militaire 2024-2030 » lu comme la loi n° 2024-2030
make seed : 52 textes, 368 sources, 83 événements, 12 affaires CC, 7 analyses.
Zéro texte sans source URL (critère §8.2). Les 2 textes sans résumé et les 17
pertinences déduites sont marqués « à vérifier » avec leur motif.
99 tests.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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>
- pyproject/uv sur Python 3.12, dépendances épinglées
- migrations versionnées (PRAGMA user_version) ; 001_initial pose textes,
sources, evenements, decisions_cc, insights, veille_log, veille_changements
- index FTS5 à contenu externe, tokenizer unicode61 remove_diacritics 2 :
« chlordecone » retrouve « chlordécone », highlight() disponible
- vue v_textes : devant_cc combine le statut et les affaires CC en instance,
ce qui réconcilie le §7 (Riposte reste adoptee_non_promulguee) et le §8.7
(la facette saisie_cc doit remonter ≥ 7 textes)
- modèles pydantic refusant les incohérences de statut : promulguée sans
numéro, navette avec numéro officiel, slug malformé
- Makefile, .env.example, journalisation structlog
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Commit initial de l'existant avant toute modification (règle transverse du
playbook OKI). data/input/ est en lecture seule pour toute la suite du projet.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>