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
@@ -0,0 +1,32 @@
-- ============================================================================
-- Migration 002 — régime de libertés
--
-- L'annexe du rapport (`sec10.md`, note méthodologique) cote chaque texte selon
-- trois régimes : « droits+ » (création ou extension de droits), « contrôle+ »
-- (restriction, ou extension des pouvoirs de contrôle), « mixte » ou « neutre ».
--
-- Cette cotation porte sur le texte dans son ensemble : elle ne dit pas quel
-- public est touché. Elle est donc stockée à part, et non dépliée d'office dans
-- `impacts` — remplir les trois publics à partir d'une cotation globale
-- reviendrait à inventer une ventilation que la source ne donne pas.
-- ============================================================================
ALTER TABLE textes ADD COLUMN regime_libertes TEXT
CHECK (regime_libertes IN ('droits_plus', 'controle_plus', 'mixte', 'neutre'));
ALTER TABLE textes ADD COLUMN regime_libertes_note TEXT;
CREATE INDEX idx_textes_regime ON textes (regime_libertes);
DROP VIEW v_textes;
CREATE VIEW v_textes AS
SELECT
t.*,
(SELECT COUNT(*) FROM sources s WHERE s.texte_id = t.id) AS nb_sources,
(SELECT COUNT(*) FROM evenements e WHERE e.texte_id = t.id) AS nb_evenements,
CASE WHEN t.statut = 'saisie_cc'
OR EXISTS (SELECT 1 FROM decisions_cc d
WHERE d.texte_id = t.id AND d.date_decision IS NULL)
THEN 1 ELSE 0 END AS devant_cc
FROM textes t;
+43
View File
@@ -0,0 +1,43 @@
-- ============================================================================
-- Migration 003 — la facette « devant le Conseil constitutionnel »
--
-- Trois situations désignent un texte suspendu au Conseil constitutionnel, et
-- le corpus les documente inégalement :
--
-- 1. le statut vaut littéralement `saisie_cc` ;
-- 2. une affaire est enregistrée avec le résultat `en_instance` (« 2026-915
-- DC ») — c'est le résultat qui fait foi, et non l'absence de date de
-- décision : le corpus cite plusieurs décisions rendues sans les dater
-- (« Mixte ; 25 articles censurés (déc. 2026-903 DC) »), or celles-là ne
-- sont plus en instance ;
-- 3. la source signale la saisine sans donner de numéro d'affaire — cas de la
-- loi actualisant la programmation militaire, « Conseil constitutionnel
-- saisi le 6 juill. » (`sec10.md`, tableau B). Aucune ligne `decisions_cc`
-- ne peut être créée faute de numéro : c'est l'événement `saisine_cc`,
-- non suivi d'un `decision_cc`, qui fait foi.
--
-- Sans le troisième cas, la facette remonte 6 textes là où le §8.7 du cahier
-- des charges en attend au moins 7.
-- ============================================================================
DROP VIEW v_textes;
CREATE VIEW v_textes AS
SELECT
t.*,
(SELECT COUNT(*) FROM sources s WHERE s.texte_id = t.id) AS nb_sources,
(SELECT COUNT(*) FROM evenements e WHERE e.texte_id = t.id) AS nb_evenements,
CASE
WHEN t.statut = 'saisie_cc' THEN 1
WHEN EXISTS (SELECT 1 FROM decisions_cc d
WHERE d.texte_id = t.id
AND d.date_decision IS NULL
AND COALESCE(d.resultat, 'en_instance') = 'en_instance') THEN 1
WHEN EXISTS (SELECT 1 FROM evenements e
WHERE e.texte_id = t.id AND e.type_etape = 'saisine_cc')
AND NOT EXISTS (SELECT 1 FROM evenements e
WHERE e.texte_id = t.id AND e.type_etape = 'decision_cc')
AND t.statut <> 'promulguee' THEN 1
ELSE 0
END AS devant_cc
FROM textes t;