Reconstruire le parcours d'un dossier législatif
Modéliser un dossier législatif comme une suite d'étapes procédurales et non comme une simple liste de documents, en combinant les données Assemblée et Sénat.
Contenu de la recette
Cette recette est indexée par Moulineuse et peut servir de point de départ pour vos explorations SQL, Typesense ou scripts agents.
But
Reconstruire un dossier législatif de façon exploitable pour une UI ou pour une analyse métier.
Le principe central est le suivant :
- une étape correspond à une lecture ou à un événement terminal
- une étape peut contenir plusieurs versions du texte
Il ne faut donc pas faire une timeline de documents bruts.
Modèle métier recommandé
Types d'étapes
depotlecturecmpconseil_constitutionnelpromulgation
Structure recommandée d'une lecture
{
"type": "lecture",
"chambre": "assemblee",
"lecture_label": "Première lecture",
"versions": {
"texte_entree": { "uid": "...", "label": "..." },
"texte_adopte_commission": { "uid": "...", "label": "..." },
"texte_base_seance": { "uid": "...", "label": "..." },
"texte_adopte_seance": { "uid": "...", "label": "..." }
},
"votes": {
"vote_commission": "adopte|rejete|inconnu",
"vote_seance": "adopte|rejete|inconnu"
},
"amendements": {
"commission": "...",
"seance": "..."
}
}
Sous-étapes d'une lecture
Une lecture ne se réduit pas à une simple suite de documents. Elle suit en pratique la logique suivante.
1. Dépôt ou transmission dans la chambre
Le texte d'entrée de la lecture est :
- soit le texte initial déposé dans la chambre d'origine
- soit le texte transmis par l'autre chambre
Ce texte est renvoyé :
- à une commission saisie au fond
- et éventuellement à des commissions saisies pour avis
2. Travaux et vote de la commission au fond
La commission au fond examine le texte, l'amende puis vote sur l'ensemble du texte issu de ses travaux.
L'ordre logique à reconstruire est :
texte_entreeamendements_commissionvote_commissiontexte_adopte_commissionsi le vote est favorable
Deux situations doivent être distinguées :
- si le vote de commission est favorable, le texte adopté par la commission devient en principe le texte discuté en séance
- si le vote de commission est négatif, le texte de la commission ne devient pas la base de la séance, qui repart du texte déposé ou transmis
3. Exception budgétaire
Pour les textes budgétaires, notamment :
- projets de loi de finances (PLF)
- projets de loi de financement de la sécurité sociale (PLFSS)
et possiblement d'autres catégories à confirmer,
la séance repart du texte déposé ou transmis même si la commission a adopté un texte.
Il faut donc distinguer :
texte_adopte_commission: texte produit par la commission si elle l'a adoptétexte_base_seance: texte effectivement discuté en séance
Ces deux valeurs peuvent être différentes.
4. Séance publique et vote sur l'ensemble
Le texte de référence en séance est amendé, puis soumis à un vote sur l'ensemble.
L'ordre logique à reconstruire est :
texte_base_seanceamendements_seancevote_seancetexte_adopte_seancesi le vote est favorable
Deux situations doivent être distinguées :
- si le vote sur l'ensemble est favorable, le texte adopté en séance est transmis à l'étape suivante
- si le vote sur l'ensemble est négatif, la navette se poursuit avec le texte initialement déposé, éventuellement modifié par le Gouvernement selon le cadre procédural
Conséquence pour la reconstruction
Pour chaque lecture, il faut idéalement reconstruire les objets suivants :
texte_entreeamendements_commissiontexte_base_seancevote_commissiontexte_adopte_commissionamendements_seancevote_seancetexte_adopte_seancevote_commission
et ne pas supposer que :
- le texte de commission existe toujours
- le texte de commission devient toujours le texte de séance
- le texte adopté en séance est toujours transmis à l'étape suivante
Règles de priorité entre sources
Principe de priorité absolue
Il faut utiliser en priorité les données déjà présentes dans les bases et dans les objets de dossier.
Les pages officielles de l'Assemblée ou du Sénat ne doivent être utilisées qu'en dernier recours, quand on a vérifié que l'information n'est pas déjà présente :
- dans
assemblee.dossiers.data.actesLegislatifs - dans
assemblee.documents - dans les métadonnées de classification des documents
- dans les structures
steps,textsetlecturescôté Sénat
Autrement dit :
- d'abord les données structurées du projet
- ensuite seulement, si nécessaire, les pages officielles comme outil de contrôle ou de complément
Si la chambre active est le Sénat
- utiliser prioritairement les données et la présentation Sénat
- utiliser l'Assemblée en complément seulement
Si la chambre active est l'Assemblée
- utiliser prioritairement les données et la présentation Assemblée
- utiliser le Sénat en complément seulement
Sources utiles dans canutes
Assemblée
assemblee.dossiersassemblee.documentsassemblee.acteursassemblee.organesassemblee.scrutins
Le champ essentiel est assemblee.dossiers.data -> 'actesLegislatifs'.
En pratique, pour reconstruire une lecture Assemblée, il faut exploiter ensemble :
assemblee.dossiers.data -> 'actesLegislatifs'assemblee.documents- les champs de classification des documents
- les références documentaires présentes dans les actes :
texteAssocieReftexteAdopteReftextesAssocies[].texteAssocieRef
Champs particulièrement utiles dans les actes :
codeActestatutConclusion.libelledecision.libelleformuleDecision
Champs particulièrement utiles dans les documents :
classification.statutAdoption.libellecycleDeVie.chrono.dateDepotcycleDeVie.chrono.datePublicationtitres.titrePrincipal
Sénat
Pour la structure générale d'un dossier et ses textes finaux, voir notamment les tables et jointures exploitées dans la recette :
reconstruire_dossiers_documents_senat.md
En pratique, pour reconstruire une lecture Sénat, il faut partir d'abord des steps du dossier Sénat, puis seulement utiliser les texts en fallback.
Le bon ordre est donc :
stepspour la structure des lecturestextspour identifier les textes d'entrée, de commission, de base de séance et de sortielecturescomme aide de cohérence s'il y a ambiguïté
Règles de regroupement Assemblée
À ne pas faire
- créer une étape distincte pour
BTC,BTAouTAP - ignorer les références documentaires présentes dans les actes sous prétexte qu'un lien est aussi visible sur la page officielle
- considérer qu'un dossier au simple dépôt est "vide" si un sous-acte final pointe déjà vers un
texteAssocieRef
À faire
- rattacher
BTCà la lecture en cours comme texte de commission - rattacher
BTAouTAà la lecture en cours comme texte adopté - traiter
TAPcomme variante de texte adopté, pas comme nouvelle lecture - distinguer si possible le texte de commission du texte effectivement discuté en séance
- distinguer si possible le texte adopté par la commission du simple état des travaux de commission
- en cas de texte budgétaire, ne pas supposer que
BTCsoit la base de la séance - traiter aussi comme textes principaux les préfixes documentaires autres que
PRJLetPION, par exemplePNRE, lorsqu'ils apparaissent danstexteAssocieRefoutexteAdopteRef - utiliser en priorité les actes de type :
...-COM-FOND-RAPPORTpour le texte adopté en commission...-DEBATS-DECpour le texte adopté en séance et le sort du vote de séance
- utiliser
classification.statutAdoption.libelledu document comme signal fort pour le sort du vote, avant de recourir à un fallback externe
Duplication documentaire Assemblée
Une même lecture Assemblée peut apparaître sous deux formes documentaires successives :
- une première étape enrichie avec texte d'entrée, texte de commission et texte adopté en séance
- puis un document final redondant représentant le texte adopté de cette même lecture
Il faut fusionner ces deux états quand ils désignent la même lecture.
Signaux utiles de fusion :
- proximité temporelle
- même numéro documentaire ou numéro final dérivable depuis l'URL
- nature documentaire différente mais cohérente (
TAPpuisBTA, ou document publié final)
Exemples observés :
188puis1992115puis263
Règles de regroupement Sénat
À faire
- partir d'abord des
stepspour construire les lectures Sénat - regrouper dans une lecture Sénat :
- texte transmis
- amendements et vote de commission si identifiables
- texte adopté par la commission
- texte de base de séance si identifiable
- amendements et vote de séance si identifiables
- texte adopté en séance (
tas...)
- absorber dans la lecture Sénat le texte de résultat de séance cohérent dans le temps, au lieu de le laisser remonter comme étape autonome
À ne pas faire
- créer une étape autonome pour un texte Sénat dont l'origine est seulement :
de la commissionrésultat des travaux de la commission
- créer une étape autonome pour un texte de résultat de séance si un
stepSénat de la même lecture l'absorbe déjà
Événements à conserver comme étapes autonomes
- Conseil constitutionnel
- promulgation
Schéma logique de reconstruction
- Partir de la suite procédurale : dépôt, lectures, CMP, CC, promulgation.
- Identifier la chambre active de chaque lecture.
- Pour l'Assemblée, rassembler les versions du texte à partir des actes et des documents liés.
- Pour le Sénat, construire d'abord les lectures à partir des
steps, puis compléter par lestextsseulement si nécessaire. - Distinguer, si les données le permettent,
texte_entree,amendements_commission,vote_commission,texte_adopte_commission,texte_base_seance,amendements_seance,vote_seanceettexte_adopte_seance. - Tenir compte des cas de rejet en commission ou en séance.
- Tenir compte des exceptions budgétaires, où la base de la séance peut rester le texte déposé.
- Fusionner les éventuelles étapes documentaires redondantes d'une même lecture.
- Insérer ensuite les événements hors chambre.
- Vérifier le résultat avec les pages officielles Assemblée et Sénat, uniquement comme contrôle final.
Requêtes utiles pour l'Assemblée
Récupérer un dossier et ses métadonnées de titre
Le champ titreDossier.titreChemin permet en général de reconstruire la page officielle Assemblée du dossier sous la forme https://www.assemblee-nationale.fr/dyn/{legislature}/dossiers/{titreChemin}.
SELECT
uid,
data ->> 'legislature' AS legislature,
data -> 'titreDossier' ->> 'titre' AS titre,
data -> 'titreDossier' ->> 'titreChemin' AS titre_chemin,
data -> 'titreDossier' ->> 'senatChemin' AS senat_chemin,
data -> 'procedureParlementaire' ->> 'libelle' AS procedure_libelle
FROM assemblee.dossiers
WHERE uid = 'DLR5L17N52985';
Récupérer les documents du dossier
SELECT
uid,
data -> 'titres' ->> 'titrePrincipal' AS titre_principal,
data ->> 'denominationStructurelle' AS denomination_structurelle,
data -> 'cycleDeVie' -> 'chrono' ->> 'dateDepot' AS date_depot,
data -> 'cycleDeVie' -> 'chrono' ->> 'datePublication' AS date_publication,
data ->> 'dossierRef' AS dossier_ref
FROM assemblee.documents
WHERE data ->> 'dossierRef' = 'DLR5L17N52985'
ORDER BY COALESCE(
data -> 'cycleDeVie' -> 'chrono' ->> 'dateDepot',
data -> 'cycleDeVie' -> 'chrono' ->> 'datePublication'
) NULLS LAST;
Requêtes utiles pour le Sénat
Récupérer les métadonnées générales du dossier
SELECT
trim(l.loicod) AS code,
trim(l.signet) AS signet,
trim(l.loiint) AS titre,
trim(tp.typloilib) AS type,
trim(et.etaloilib) AS etat,
TO_CHAR(l.date_loi, 'YYYY-MM-DD') AS date_loi,
TO_CHAR(l.loidatjo, 'YYYY-MM-DD') AS date_jo
FROM senat.dosleg_loi AS l
LEFT JOIN senat.dosleg_typloi AS tp ON tp.typloicod = l.typloicod
LEFT JOIN senat.dosleg_etaloi AS et ON et.etaloicod = l.etaloicod
WHERE trim(l.loicod) = '73567';
Pour reconstruire les textes et les étapes Sénat, réutiliser la logique documentée dans reconstruire_dossiers_documents_senat.md.
Règles de vérification manuelle
Toujours vérifier le résultat sur :
- la page dossier de l'Assemblée nationale
- la page dossier du Sénat
Points à vérifier :
- ordre des lectures
- présence ou non d'une procédure accélérée
- existence d'une CMP
- texte déposé ou transmis de la lecture
- présence des amendements et du vote de commission si visibles
- présence du texte adopté par la commission si le vote est favorable
- identification correcte du texte de base de la séance
- présence des amendements et du vote de séance si visibles
- présence du texte adopté en séance
- sens des votes de commission et de séance quand ils sont visibles
- absence de doublon documentaire pour une même lecture
- absence d'étape autonome pour un simple texte de commission ou de résultat déjà absorbé dans une lecture
- présence du Conseil constitutionnel
- présence de la promulgation
Anti-patterns
- faire correspondre les étapes uniquement par numéro de texte
- hardcoder des numéros (
2469,263,2250, etc.) - dupliquer une lecture parce qu'un
TAPou unBTCexiste - supprimer automatiquement la dernière étape "finale"
- utiliser la page officielle Assemblée ou Sénat pour une information déjà présente dans les actes ou les documents
- considérer les
textsSénat comme source principale de structure quand lesstepssont disponibles
Sortie attendue pour une UI
Une UI dossier devrait idéalement afficher :
- une timeline d'étapes procédurales
- pour chaque lecture, un bloc contenant :
- texte d'entrée
- amendements en commission
- vote de la commission
- texte adopté par la commission
- texte de base de séance
- amendements en séance
- vote de séance
- texte adopté en séance
- et, si possible, l'information de rejet ou d'adoption aux votes clés
- puis les événements hors chambre :
- CMP
- Conseil constitutionnel
- promulgation
Conséquence pratique pour le développement
Avant toute modification de la page dossiers_legislatifs/[id], il faut valider que le code respecte bien ce modèle de données et non une simple liste de documents triés par date.
Concrètement, il faut privilégier une architecture en deux couches :
- une couche de reconstruction procédurale par lecture
- une couche de présentation UI
La logique métier de regroupement ne doit pas vivre principalement dans le composant Svelte de rendu.
À propos de ces recettes
Les recettes Moulineuse documentent des requêtes et des méthodes réutilisables pour analyser les données juridiques et parlementaires avec les outils Tricoteuses. Elles servent aussi directement au serveur MCP Moulineuse pour guider les usages et les extractions possibles.
Voir le serveur MCP Moulineuse