Skip to content

Repository files navigation

Ratio Legis

Pour un article de code français en vigueur aujourd'hui, répondre à une seule question : pourquoi existe-t-il sous cette forme ? — en remontant aux matériaux publics qui l'expliquent : exposé des motifs, étude d'impact, avis du Conseil d'État, commentaire du rapport de commission, amendement qui a écrit l'alinéa, considérant de la directive transposée.

Le produit est un graphe de provenance normative dans une base SQLite, et une couche de restitution strictement ancrée : aucune phrase affirmative sans citation résoluble au passage. Périmètre actuel : le Code de la consommation, ses trois parties, 2 104 articles en vigueur.

Spécification : ratio-legis-feuille-de-route.md. Contribuer : CONTRIBUTING.md. Attribution des sources : ATTRIBUTION.md.

Ce que le graphe vaut, en deux chiffres, et par qui ils ont été mesurés. Sur les 100 articles du jeu d'annotation, annotés indépendamment par sept modèles de langue (docs/39), le graphe désigne le bon document 65 fois sur 74, et quand il affirme qu'un passage motive l'article, c'est le passage annoté 30 fois sur 53 — 56,6 %, borne de Wilson 0,43 ; sur les 73 articles que l'annotateur a motivés, il retrouve le passage 30 fois. Il trouve le rapport qui explique l'article ; il ne trouve qu'une fois sur deux le paragraphe qui l'explique (rejoué sur la base du jour par tools/annotation/verifier.py). Aucun de ces verdicts n'est humain, et aucune confiance de ce dépôt ne l'est : le producteur des arêtes est déterministe, l'instrument qui les mesure est l'auteur ou des agents, jugeant sur des tirages reproductibles. Tant que le jeu d'annotation n'est pas relu à la main, tout chiffre de ce fichier est une auto-évaluation, et il est présenté comme tel.

Pourquoi ce projet existe

Les matériaux sont publics. Ce qui manque est le chaînage entre le texte consolidé qu'on lit et ces matériaux, et la chaîne est rompue en aval de la promulgation : la codification à droit constant renumérote, les lois sans rapport thématique modifient, les amendements se justifient en une ligne, la raison d'une transposition est à Bruxelles, une ordonnance n'a pas de débat, un décret n'a pas d'exposé des motifs.

Sur le code de la consommation, la rupture se mesure. 78 % des articles de la partie législative semblent issus d'une ordonnance — la recodification de 2016 — et 80,7 % ont une loi dans leur ascendance dès qu'on franchit un saut de renumérotation. Un rapport de 2013 commente L. 121-105, jamais L. 224-65 : motive atteint 162 articles par leur numéro d'aujourd'hui, 783 en remontant les numéros d'avant. Le graphe existe pour tenir cette chaîne, et pour dire honnêtement où elle s'arrête.

Ce qu'il fait

Cinq questions, chacune rendue en ligne de commande, en HTML, et par l'API. Rien à installer pour voir le résultat : les rendus d'exemple sont publiés à hugofara.github.io/ratio-legis — une page d'entrée dit lequel regarder pour quoi. Les mêmes fichiers sont versionnés dans restitution/exemples/.

Pourquoi cet article. La fiche de provenance, arête par arête, et la note « pourquoi cet article » sous le contrat du § 4.3 — toute phrase produite est citable, celles qui ne le sont pas sont supprimées et le compte s'affiche en pied de page (zéro sur 11 641 constats). Aucun modèle de langue n'intervient : la note est assemblée par gabarits, les passages sont verbatim.

python3 restitution/graphe.py travail/ratio-legis.sqlite L224-43
python3 restitution/note.py   travail/ratio-legis.sqlite L224-43
python3 restitution/note.py   travail/ratio-legis.sqlite --contrat     # éprouver le contrat

Qui a écrit chaque alinéa. Le surlignage : la couleur donne le texte qui a introduit l'alinéa, la trame signale qu'il a été retouché depuis, la marque nomme l'amendement quand la chaîne y mène. 99,1 % des 7 504 alinéas en vigueur ont un texte introducteur ; un article sur six est écrit par deux textes ou plus (docs/25).

python3 restitution/surlignage.py travail/ratio-legis.sqlite L111-1 --html sortie.html

Ce qu'on a voulu y écrire et qui n'y est pas. Les 148 870 amendements des deux chambres avec leur sort en huit familles comparables, et l'irrecevabilité lue là où la chambre l'écrit — sur 16 643 irrecevabilités, 4 660 au titre de l'article 40, 1 218 cavaliers. 321 articles en vigueur portent au moins une tentative, par trois voies jamais confondues : l'alinéa écrit qui subsiste (resulte_de), la cible que le dispositif déclare (vise, la seule ouverte à un amendement rejeté), la subdivision du texte sur laquelle il fut déposé (depose_sur) (docs/30).

python3 restitution/tentatives.py travail/ratio-legis.sqlite L111-3        # 67 tentatives, 56 non abouties
python3 restitution/tentatives.py travail/ratio-legis.sqlite --sommet 25   # les plus disputés

Ce qui bougerait si je modifiais cet article. Le retentissement descend le graphe des 12 534 renvois, par onde : sur L111-1, 69 articles à relire, dont 20 dont la raison n'est pas documentée. Il dit ce qu'il faudrait relire ; il ne dit pas ce qu'il faudrait y écrire (docs/29).

python3 restitution/retentissement.py travail/ratio-legis.sqlite L111-1 --profondeur 2
python3 restitution/retentissement.py travail/ratio-legis.sqlite --sommet 25

Ce que le fonds documentaire tait. Pour chaque article en vigueur, un verdict — et surtout le verdict négatif, raison non documentée, qui distingue « nous n'avons pas cherché » de « nous avons cherché dans treize sources et il n'y a rien ». Les métriques d'hygiène législative sont dans data/mesures/hygiene.tsv et sous /mesures (docs/18).

Ce qu'on peut lui dire. Chaque arête de chaque page porte un lien signaler, qui ouvre un rapport pré-rempli — article, arête, cible, preuve — dans les issues du dépôt. Un lien faux coûte plus que dix liens manquants, et le lecteur qui en voit un est le seul juge humain que le projet ait.

Ce qui est classé, non affirmé. Un rapport au Président, une étude d'impact, une directive motivent le texte entier ; aucune arête ne désigne le passage qui concerne l'article, et le graphe n'en fabrique pas. Il classe les passages par le vocabulaire qu'ils partagent avec l'article, pesé par sa rareté dans le code, montre les termes qui ont produit le classement, et se tait quand rien ne partage un terme propre à l'article. Mesuré : le passage attendu dans les trois montrés 12 fois sur 17 rapports au Président, 17 fois sur 21 couples (article, considérant) (docs/28, docs/48).

Pour les outils tiers, la même chose en API et en dump ouvert :

pip install '.[api]'
RATIO_LEGIS_BASE=data/diffusion/ratio-legis.sqlite uvicorn restitution.api:app
# GET /articles/{numero}  /note  /surlignage  /retentissement  /tentatives
# GET /renvois/sommet  /tentatives/sommet  /mesures  /docs
python3 tools/diffusion/dump.py travail/ratio-legis.sqlite data/diffusion

12 ms de médiane, 21 ms au 95ᵉ centile. Chaque réponse porte l'attribution et l'avertissement de non-interprétation, en en-tête et dans la charge utile (docs/24, docs/23).

Ce qu'il ne fait pas

Il n'interprète pas. Il ne dit ni ce qu'un article veut dire, ni s'il s'applique à votre cas, ni ce qu'il faudrait y écrire. Il rend des matériaux et le chemin qui y mène ; l'usage des travaux préparatoires en interprétation est juridiquement discuté et n'est pas la bataille du projet. Ce n'est pas un moteur de recherche juridique : consulter le droit positif est un problème que Légifrance a résolu.

Il ne couvre qu'un code. Le code de la consommation a été choisi pour ses défauts utiles — recodifié, très transposé, récent. Tout élargissement passe par une nouvelle note de cadrage, pas par une option.

Il ne contient pas les débats. Le graphe sait ce que le Parlement a fait — déposé, adopté, rejeté, déclaré irrecevable —, pas ce qu'il a dit. « Retiré » ne dit pas si l'auteur a cédé ou obtenu satisfaction, et cela se lit dans le compte rendu de séance, qui n'y est pas.

Il ne rediffuse pas les rapports parlementaires. Leur corps n'est ni dans le dépôt ni dans le dump : le CRPA exclut les documents parlementaires (art. L300-2), et les conditions des deux chambres ne se transmettent pas sous Licence Ouverte. Restent l'URL, le hachage, les offsets, et des extraits de 400 caractères au plus (ATTRIBUTION.md).

Aucun modèle de langue ne décide d'une arête, et aucun n'écrit une phrase de la restitution. Des agents ont servi de juges dans les mesures de précision récentes — deux par fiche, en colonnes séparées, arbitre sur désaccord, et le fichier dit qui a tranché — jamais de producteurs de lien. La topologie du graphe vient de règles déterministes et de correspondances textuelles vérifiables.

Il ne se déclare pas conforme. Les confiances portées par les arêtes sont des bornes inférieures de Wilson à 95 %, calculées sur des tirages reproductibles jugés par l'auteur ou par des agents — celles de porte_sur, vise et depose_sur dans le tableau ci-dessous viennent toutes de juges Sonnet, deux par fiche, un arbitre sur désaccord ; la fiche dit qui a tranché. Le critère de sortie de la phase 3 est une évaluation humaine en aveugle sur un jeu d'annotation validé, et ce jeu ne l'est pas. Tant que les 100 articles ne sont pas relus à la main, la phase 0 reste ouverte et chaque mesure du projet est une auto-évaluation. Les agents ont rendu ce bloquant moins visible, pas plus petit.

Il ne comble pas le silence réglementaire. La partie législative est documentée à 94 % ; la partie réglementaire à 15 %, et c'est elle qui porte la masse des obligations qu'un consommateur rencontre. C'est un état du fonds documentaire français, pas un défaut du périmètre, et il est mesuré plutôt que masqué. Deux gisements le feraient baisser — les circulaires, les avis du Conseil d'État sur les décrets — et aucun n'est dans le projet.

Pour qui

Le légiste — qui rédige dans une administration, une commission, un cabinet. Avant d'écrire, il consulte ce qui a été tenté sur l'article et ce qui l'a bloqué ; après avoir écrit, ce que sa modification déplacerait ; en lisant, qui a écrit chaque alinéa et à quel moment de la navette.

Le chercheur et le journaliste — les métriques d'hygiène législative publiables : part des articles sans aucune motivation traçable, par partie du code ; part des amendements adoptés sans objet publié ; fondements d'irrecevabilité ; durée de la navette. Tout est dans un TSV versionné et se recalcule d'une commande.

Le juriste praticien, la DGCCRF, l'association de consommateurs — la fiche de provenance d'un article, pour retrouver l'étude d'impact qui l'a chiffré ou l'amendement qui l'a écrit. Avec la mise en garde qui s'affiche à chaque page : ce sont des matériaux, pas une interprétation.

L'outilleur — la base SQLite, l'API, le dump sous Licence Ouverte avec l'attribution qui voyage avec la donnée. Le code est sous AGPL-3.0 : un service bâti dessus rend son code.

Ce n'est pas pour qui cherche le droit applicable à une situation, ni pour qui veut une réponse en langue naturelle à « que veut dire cet article ».

Lire un score

Chaque arête porte une méthode — declaree (une source dit le lien), derivee (une correspondance textuelle l'établit), inferee (un alignement de contenu la désigne) — et une confiance, qui n'est pas un ressenti : c'est la borne inférieure de Wilson d'un tirage jugé, dont la fiche est versionnée dans data/mesures/ avec le nom du juge. Une arête à 0,76 vient d'un tirage de vingt jugé 19 sur 20. Une confiance qui n'a pas de fiche n'existe pas dans ce dépôt.

Cloner et lancer

Le dépôt ne contient que du code, des plans de récupération et des mesures : ni le fonds, ni les corpus, ni la base. travail/ est un cache reconstructible.

git clone https://github.com/HugoFara/ratio-legis.git && cd ratio-legis
python3 -m venv .venv && . .venv/bin/activate
pip install -e .              # pymupdf, la seule dépendance
pip install -e ".[api]"       # + fastapi et uvicorn, si vous servez l'API

bash tools/phase0/miroir_dila.sh data/raw/dila   # 6,4 Go — long, une seule fois
./pipeline.sh                                     # miroir + plans → base complète

python3 restitution/graphe.py travail/ratio-legis.sqlite L224-43

Prérequis : Python ≥ 3.14 (pipeline.sh refuse de démarrer en deçà), plus curl, tar et git. Une seule dépendance hors bibliothèque standard, pymupdf, qui ne sert qu'à lire les PDF des études d'impact et des avis du Conseil d'État.

Ce que ça coûte. Le miroir DILA pèse 6,4 Go et sa première récupération est longue ; ensuite elle est incrémentale. Les corpus téléchargés — rapports, amendements, textes en discussion — ajoutent 1,5 Go, le miroir EUR-Lex des 284 actes de l'Union 153 Mo. L'ingestion, une fois tout sur le disque, prend environ quinze minutes et produit une base de 466 Mo, zéro violation d'intégrité. Comptez 9 Go de disque.

Si quelque chose manque, le pipeline le dit et s'arrête plutôt que de produire une base incomplète en silence. Chaque étape est idempotente.

Tenir à jour : ./quotidien.sh enchaîne miroir, incréments, reconstruction, dump et rapport de différences, et s'arrête tôt quand rien n'a bougé. Il est déclenché par un minuteur systemd utilisateur (deploiement/, docs/26). L'incrément porte sur la source ; le graphe est reconstruit en entier, si bien qu'une base servie un mardi est exactement celle qu'on obtiendrait en repartant de zéro.

Deux étapes demandent le réseau au-delà des sources : la vérification des identifiants CELEX auprès de Cellar, dont le résultat est versionné, et le miroir EUR-Lex, stocké hors dépôt avec son manifeste horodaté.

État

Phase 2 close avec deux dérogations écrites, phase 4 entamée, validation humaine de la phase 0 toujours ouverte. Les critères de sortie de la phase 2 mesurés contre leurs seuils :

Critère § 4.2 Seuil Mesuré
couverture produite_par > 95 % 2 081 / 2 104 — 98,9 % atteint
couverture issu_de > 90 % 70 / 70 lois et ordonnances utiles — 100 % atteint — les incréments DOLE sont lus depuis docs/50
couverture resulte_de > 60 % 83 / 896 — 9,3 % non atteint, décision go du § 8 rendue dans docs/21 § 7 : le grain de l'article est tenu par le commentaire de rapport et par le texte discuté, non par l'amendement
précision resulte_de > 95 % 36 / 40 sur un tirage unique de la base finale — 90,0 %, Wilson 0,7695 (docs/59 § 3) non atteint ; avant : 71 / 77, Wilson 0,8402 ; re-mesuré le 24 septembre 2026 sur la population d'après docs/52, 18 / 20, deux juges et un arbitre (docs/53) ; 18 / 20 sur les arêtes des législatures XVI et XVII (docs/50 § 7, une fausse arbitrée juste en docs/55), 35 / 37 sur la population du 21 septembre

Ce que la base contient

Nœuds Arêtes
Articles — lignées (dont 2 104 en vigueur) 4 058 produite_par — quel texte a produit la version 8 145
Versions d'articles 6 362 repris_de — continuité d'un alinéa par-delà la recodification 6 137
Segments (alinéas) 28 294 renumerote_de 2 095 (232 inférées d'une arrivée ou d'un départ)
Documents (rapports, exposés, études d'impact, avis) 834 motive — un passage qui motive, avec offsets 1 724
Amendements (33 199 Sénat, 115 671 Assemblée, législatures XIII à XVII) 148 870 renvoie_a — le graphe de renvois 12 535
Acteurs 2 656 resulte_de — l'amendement qui a écrit ou retouché l'alinéa 693 (confiance 0,77)
Actes de l'Union 284 cite_acte_ue / transpose / transpose_article — l'article de la directive que l'article du code transpose, lu dans les tableaux de concordance 1 572 / 8 / 33 (0,90)
Considérants de l'Union 7 674 article_acte_ue — articles d'actes déclarés 6 237
Textes en discussion 945 porte_sur — l'article du texte → l'article du code 126 164 (7 645 internes, 0,80 ; 268 résolues par le contenu, 0,91)
Sorts d'amendements, en huit familles 148 870 vise — l'amendement qui visait l'article, abouti ou non 1 105 (1 091 par le numéro, 0,91 ; 14 par le contenu, 0,78)
Correspondances de texte entre les deux corpus 322 depose_sur — l'article du code que l'amendement touche, par l'alinéa du texte qu'il nomme 2 401 (0,87 par l'alinéa, 0,91 par l'article nommé, 0,80 par l'article entier)

Le verdict

Le taux global d'articles sans raison documentée ne veut rien dire : il faut séparer les parties, parce qu'un décret n'a ni exposé des motifs, ni débat, ni amendement.

partie articles un passage les motive origine située motivation du texte raison non documentée
L 1 293 787 (60,9 %) 129 307 70 (5,4 %)
R 632 43 7 58 524 (82,9 %)
D 179 1 0 11 167 (93,3 %)

Les parties R et D étaient exclues du périmètre initial pour un motif que docs/27 a montré faux ; le périmètre couvre les trois parties et le silence réglementaire est mesuré sur un périmètre qui ne l'exclut plus.

Au grain de l'article — « pourquoi cet article dit ceci ». Les deux tableaux sont recalculés à chaque reconstruction par tools/mesures/grain.py, avec les définitions du verdict, dans data/mesures/grain.tsv :

Articles remontant à un passage qui les motive 792 (37,6 %)
Articles reliés à un article de texte en discussion 964 (45,8 %)
Articles nommant un acte de l'Union 117
Articles reliés à un article d'acte de l'Union par un tableau de concordance 35
Articles remontant à un amendement identifié 142
Articles cités par un autre article du fonds 1 031 (49,0 %)

Au grain du texte — « pourquoi ce texte existe ». Un rapport au Président motive une ordonnance de plusieurs centaines d'articles, pas l'alinéa qu'on lit ; la restitution affiche l'avertissement chaque fois qu'elle sert l'un faute de l'autre. Un texte qui n'a fait que recodifier l'article ne le motive pas (docs/39 § 3) :

Articles atteignant un document motivant le texte 1 282 (60,9 %)
dont par un rapport au Président 771
dont par un exposé des motifs 938
dont par une étude d'impact 701
dont par un avis du Conseil d'État 245
Articles atteignant un considérant européen 117
Articles atteignant une transposition déclarée 75

Les chiffres publiés jusqu'au 24 septembre 2026 avaient été recopiés à la main, par des requêtes perdues ; la ventilation par type de document, en particulier, ne suivait pas la réserve de la recodification (994 rapports au Président, 206 exposés des motifs). Ceux-ci se recalculent.

Tous ces comptes suivent la chaîne de renumérotation ; un compteur qui ne le dit pas est ininterprétable sur ce corpus.

Ce qui reste à faire

Bloquant, et hors de portée du code : la validation à la main des 100 articles du jeu d'annotation. Ils portent cent verdicts d'agents (docs/39) — une pré-annotation, pas une vérité terrain. L'outillage de l'annotateur est prêt (docs/36). Après elle, l'évaluation humaine en aveugle de la note, critère de sortie de la phase 3.

Couverture. Les amendements de la XVe législature sont en base depuis le 26 septembre 2026 — le serveur de l'Assemblée a fini par servir l'archive —, et leurs arêtes mesurées (docs/58) ; les constantes sont à re-mesurer sur un tirage unique de la base entière. Ceux de la XIIIe, jamais publiés en open data, sont lus page à page sur le site de l'Assemblée : 9 244 amendements de séance sur 91 textes. 229 des 232 jeux d'amendements de l'Assemblée trouvent leur texte discuté. Les tableaux de concordance sont lus dans deux études d'impact (docs/54) ; les autres ne transposent vers notre code aucune disposition.

Dix-neuf arêtes jugées fausses sont dans la base, et le harnais (tools/mesures/rejouer.py) les nomme à chaque passage. Quatre sont des depose_sur sans garde : un amendement que la source range sous un autre texte et un alinéa mal cité (docs/51), un amendement qui écrit dans un autre article que celui du texte et un « Art. L. 423-2 » nouveau qui renumérote l'ancien (docs/52). Quatre sont des resulte_de sans garde, des tirages de docs/50 § 7 et de docs/53 : deux formules administratives partagées par un passage destiné ailleurs, une rédaction non retenue, un alinéa attribué au mauvais amendement du dossier. Sept viennent du tirage unique qui mesure les constantes (docs/59 § 3) : quatre resulte_de (deux formules partagées, un segment voisin, une rédaction non retenue) et trois depose_sur par l'article entier — dont une, L121-2, écartée depuis (docs/60 § 1). Cinq porte_sur viennent des tirages de docs/60 § 4 : un numéro cité dans un tableau, une référence dans l'instruction d'un autre code, deux articles créés sous un numéro que le fonds donne à une autre disposition, un article abrogé puis réécrit sur place. Les trois « incises » de la XIIIe et de la XVe sont justes depuis que la retouche compte (§ 1). Les autres ont été réparées à la source, ou arbitrées sur pièces (docs/55) : l'ancre d'une insertion n'est pas une cible, et la garde qui l'écarte est posée ; les cinq verdicts humains de docs/21 contestés en docs/49 § 6 et l'agrément « Mon Accompagnateur Rénov' » sont justes.

Les arêtes récentes ont chacune leur maille nommée, dans la section « ce qui n'est pas fait » de leur document — les dernières : le plan propre d'un amendement hors glissement, les 124 articles écrits que rien ne contient (docs/47 § 5), laissés pour les raisons de docs/54 § 4 ; les formules banales de resulte_de, dont aucune règle mesurée ne sépare les justes (docs/54 § 1).

Le silence réglementaire ne baissera que par des corpus qui ne sont pas dans le projet : les circulaires, faisables ; les avis du Conseil d'État sur les décrets, non publiés — question de droit d'accès, pas d'outillage.

Les tranches

Le projet avance par tranches, chacune documentée dans docs/ avec ce qu'elle a mesuré et ce qu'elle laisse ouvert. Les chiffres ci-dessus sont ceux d'aujourd'hui ; ceux des documents sont ceux de leur date.

Tranche Ce qu'elle produit Document
1. LEGI → graphe articles, versions, segments, repris_de docs/06
2. Rapports → motive le passage d'un rapport qui commente l'article docs/07
3. Renvois « si je modifie cet article, qu'est-ce qui bouge » docs/08
4. Amendements → resulte_de l'amendement qui a écrit l'alinéa docs/09
5. Amendements non adoptés ce qui a été tenté sans aboutir docs/10
6. Assemblée nationale la XIVe législature, les deux chambres chargées docs/11
7. But déclaré et rapports au Président l'objet de l'amendement, la motivation des ordonnances docs/12
8. Couche européenne l'acte de l'Union que l'article cite, la transposition déclarée docs/13
9. Considérants le motif que l'Union écrit elle-même, et l'article visé de l'acte docs/14
10. Motivation gouvernementale exposé des motifs, étude d'impact, avis du Conseil d'État docs/15
11. Textes en discussion sous quel article du texte l'article du code a été débattu docs/16
12. Sections appariées les commentaires de rapport que rien ne rattachait docs/17
13. Verdict et hygiène raison non documentée, et les métriques publiables docs/18
Phase 3 la note « pourquoi cet article », sous contrat docs/19
14. Dossiers des textes le dossier législatif de chaque texte, déclaré par DOLE docs/20
15. Précision de resulte_de les 277 arêtes examinées une à une, six gardes, la décision go/no-go docs/21
16. Lecture et performance 425 ms → 9 ms par article, et une restitution redevenue reproductible docs/22
17. Dump ouvert republier le graphe, sans rediffuser ce qu'on n'a pas le droit de rediffuser docs/23
18. API de lecture interroger le graphe en 12 ms, avec l'attribution qui voyage avec la donnée docs/24
19. Surlignage par étape quel texte a introduit chaque alinéa, malgré la recodification docs/25
20. Réincrémentation quotidienne le fonds avait un an de retard ; l'orchestration le maintient à jour docs/26
21. Parties R et D le périmètre couvre les trois parties ; le silence réglementaire n'en venait pas docs/27
22. Classement intra-document classer sans rattacher, quand aucune arête ne désigne le passage docs/28
23. Retentissement « si je modifie cet article, qu'est-ce qui bouge », en produit à part docs/29
24. Sort des amendements huit familles comparables, et l'irrecevabilité lue là où la chambre l'écrit docs/30
25. Correspondance des textes apparier les identifiants de texte des deux corpus, et mesurer leur plafond docs/31
26. Textes déposés de l'Assemblée charger par le numéro de dépôt que le rapport déclare, faute de lien DOLE docs/32
27. Article écrit dans la citation l'en-tête d'un alinéa cité désigne l'article qu'on écrit, non du droit existant docs/33
28. Hôte du code cité un code nommé dans une citation ne déclare pas ce que le texte modifie docs/34
29. depose_sur re-mesuré une garde devenue fabricante d'unicité, et un numéro de subdivision lu en entier docs/35
30. Jeu d'annotation, prêt 25 offsets sur 66 ne résolvaient plus, la XVIe législature n'avait pas de corps ; l'outillage de l'annotateur docs/36
31. Dossiers de tout l'historique le corpus ne suivait que le dossier d'origine ; 94 dossiers, 106 articles L motivés de plus docs/37
32. Lignées un numéro n'est pas un article : 285 numéros réutilisés en 2016, 144 « passages motivants » qui expliquaient une autre disposition docs/38
33. Cent verdicts d'agents le jeu annoté par sept modèles pour 72 $ ; motive retrouvé au passage 29/72, rapport au Président sans arête 18/72 ; ce que cela ne vaut pas docs/39
34. États intermédiaires 764 arêtes porte_sur que la loi promulguée n'a pas confirmées ; 31 « origines situées » qui n'en étaient pas docs/40
35. Deux tirages jugés à deux porte_sur 34/35 et 18/20 ; depose_sur 7/15 — la composition est exacte, ce qu'elle prétend ne l'est pas ; 304 arêtes à cibles hors du code retirées docs/41
36. depose_sur par l'alinéa trois voies — l'article nommé, l'alinéa du texte, l'article entier — mesurées à trois juges : 18/20, 7/10, 7/10 ; 1 155 arêtes docs/42
37. vise et porte_sur corrigés l'ancre, le code hôte, le numéro glissé, les quatre chiffres ; vise mesurée pour la première fois : 9/20 avant, 16/20 après docs/43
38. L'instruction qui gouverne l'alinéa lue dans le texte à toutes ses occurrences, bornée par le paragraphe de tête ; alinea 17/20, vise 20/20 docs/44
39. La pastille et l'incise la « sous-instruction » n'en était pas une : la pastille du Sénat comptait pour un alinéa, et le deux-points de « les mots : « … » sont remplacés » cachait 22 604 cibles à porte_sur ; +1 269 internes jugées 20/20 ; alinea 16/20 puis 19/20 après deux gardes, jugée par des agents Sonnet docs/45
40. Le code hôte de l'instruction le numéro nu sous un article multi-codes, rattaché par l'instruction qui le porte ou qui gouverne l'alinéa nommé ; vise +40, jugées 19/20 ; la fausse est un numéro glissé que la garde ne voit pas docs/46
41. Le numéro glissé par le contenu l'article que le texte écrit sous un numéro que la loi a donné à un autre : 358 contredits, 234 résolus vers la version qui les contient, jugés 20/20 ; vise suit sauf plan propre (3/14 avant la garde) docs/47
42. Classement, harnais, accueil le classement pèse par la rareté dans le fonds et sait se taire, mesuré 17/21 ; le harnais rejoue 700 verdicts contre la base et trouve dix fausses servies ; « signaler cette arête » sur chaque arête docs/48
43. Les dix du harnais, et la re-mesure neuf réparées à la source : le bloc guillemeté et la date du texte pour vise, l'en-tête de la petite loi pour porte_sur (2 837 en-têtes rendus), la destination du passage et l'hôte de l'alinéa pour resulte_de ; le harnais voit les lignées, les voies, et reconnaît une arête dont l'identifiant a glissé ; re-mesuré par dix juges Sonnet 5 : vise 47/50, resulte_de 35/37, porte_sur 20/20 ; cinq verdicts humains contestés docs/49
44. Incréments DOLE, doublons, législatures XVI et XVII les incréments DOLE et JORF enfin lus (issu_de 70/70) ; un même amendement de l'Assemblée publié deux fois, 6 112 copies fondues ; le projet de loi Hamon perdu par un saut de ligne ; 55 000 amendements de plus ; vise résolue par le contenu vers un article que la loi a créé, 10/10 ; re-mesuré : vise 64/70, resulte_de 52/57 docs/50
45. depose_sur re-mesurée sur les arêtes nouvelles : alinea 10/20, « VI (nouveau). – » n'était pas une borne ; article_entier 3/20, l'article qui réécrit une autre loi passait pour mono-cible ; réparées, 20/20 et 12/15 sur un second tirage disjoint ; la reconstruction reprend 15 minutes docs/51
46. Projets déposés et trait insécable les 79 jeux de l'Assemblée sans texte l'étaient faute de lire projets-pl : 192 sur 192 ; les textes de l'Assemblée depuis 2017 écrivent « L. 123‑9 » avec un trait insécable, que porte_sur ne lisait pas — 866 arêtes internes de plus ; « L. 121-84-10-1 » lu « L121-84-1 » ; deux gardes article_entier ; depose_sur 1 156 → 1 836, mesurée 19/20, 13/15, 18/19, 20/20 docs/52
47. Le trait insécable à la lecture U+2011 ramené à « - » par les deux texte_brut, textes et rapports — 37 490 numéros lus dans les rapports au lieu de 34 988, motive +2 / −1 ; vise re-mesurée 20/20 et 1/1, resulte_de 18/20 : 0,8621, 0,7412, 0,8240 docs/53
48. Tableaux de concordance l'article de la directive que l'article du code transpose, lu dans les annexes des études d'impact avec la position des blocs du PDF : 33 arêtes, 33/33, 35 articles en vigueur ; deux gardes resulte_de mesurées et abandonnées ; les fiches montrent la version écrite par la loi du dossier docs/54
49. Trois arbitrages l'ancre d'une insertion n'est pas une cible de porte_sur — garde posée, 339 arêtes internes retirées, six anciens « justes » rendus sur le code hôte arbitrés faux ; on juge contre l'article du fonds, non le numéro écrit ; cinq verdicts humains contestés et « Mon Accompagnateur Rénov' » arbitrés justes, resulte_de 71/77, Wilson 0,8402 ; le harnais échoue de 8 arêtes au lieu de 15 docs/55
50. Tisseuse contre vise, et legi.py l'extracteur de Tricoteuses sur les 199 arêtes jugées : l'article retrouvé 47 fois sur 163 justes, muet sur « ainsi rédigé » et la création, 3 de nos 34 fausses commises aussi, toutes de version ; legi.py non retenu, la décision écrite docs/56
51. La XIIIe législature 9 244 amendements de séance lus page à page ; 256 → 281 articles portant une tentative ; vise 16/20, les quatre fausses d'articles additionnels qui numérotent eux-mêmes — gardée, re-mesurée 20/20 sur un tirage disjoint ; « E (nouveau). – » et l'apostrophe typographique ; la scission des lignées renumérotées essayée et retirée ; la XVe entrée en base docs/57
52. La XVe législature 42 400 amendements ; vise 20/20, alinea 20/20 ; le numéro que l'instruction déclare comparé au contenu (32 résolus, 20/20), la réécriture qui nomme un autre article, la chaîne sans les frères, « Compléter l'article 5 » ; article_entier 15/20 puis 19/20, visee 18/20 puis 13/13 ; trois verdicts de la XIIIe rendus contre le fonds docs/58
53. Retouche, lignées, constantes la retouche d'un alinéa compte pour resulte_de, trois incises rejugées ; la lignée arrivée d'un autre numéro scindée, le numéro lu comme existant ou créé, 87 liens de renumérotation inférés ; constantes sur un tirage unique de 40 par arête : vise 0,91, resulte_de 0,77, visee 0,91, alinea 0,87, article_entier 0,80 docs/59
54. L'ancre, l'autre norme, le départ l'ancre n'est plus une cible nommée ; l'amendement qui n'agit que sur une autre norme n'écrit pas notre alinéa (5 fausses, 0 juste) ; la lignée que « devient » vide est scindée, le numéro ne désigne l'ancienne que s'il la fait quitter ; porte_sur déclarée 32/40 puis 37/40 : constante 0,80, non 0,91 docs/60

D'où ça vient

La phase 0 a produit une note de cadrage, un rapport de vérification des sources, un golden set de 25 articles chaînés à la main et un prototype du résolveur (docs/00 à docs/05). Ce qu'elle a établi tient encore :

  • Un seul saut de concordance rétablit l'origine réelle. 78 % du code semble issu d'ordonnances ; 74 % est d'origine législative dès qu'on remonte la recodification de 2016. C'est la thèse du projet, vérifiée sur son périmètre.
  • Atteindre le dossier n'est pas atteindre la motivation. L'exposé des motifs ne nomme l'article que dans 6,4 % des cas, l'étude d'impact dans 24,8 % : c'est le plafond réel d'une restitution ancrée au grain de l'article, et pourquoi la restitution sépare ce qui porte sur l'article de ce qui porte sur le texte.
  • L'arête resulte_de ne peut pas s'attacher à la version en vigueur sur un corpus recodifié ; elle s'attache à la version historique que l'amendement a écrite, et le graphe remonte les segments.
  • Le modèle est au grain du segment, parce que 39,8 % des articles sont repris du texte déposé entre 10 % et 90 % — ni gouvernementaux ni parlementaires, mais les deux selon l'alinéa (docs/06).

Ce qu'elle a invalidé : le tableau synoptique du Sénat prévu comme premier échelon n'existe pas ; DuraLex, deuxième échelon, est abandonné depuis 2019 ; les ordonnances ne sont pas sans motivation — 90,6 % ont un rapport au Président. Et une conclusion de la phase 0 était fausse : les amendements de l'Assemblée de la XIVe législature sont bien en open data ; un 404 sur une URL recopiée prouve que l'URL est mauvaise, jamais que la donnée est absente (docs/10 § 4).

Les écarts pris sur la stack recommandée — SQLite plutôt que PostgreSQL, un minuteur systemd plutôt que Dagster, des expressions régulières plutôt que lxml — sont écrits au § 6 bis de la feuille de route, pour qu'ils soient des décisions et non des dérives.

Projets voisins

Aucun ne pose la même question. Chacun en tient un morceau. État vérifié le 26/09/2026 : dates des derniers commits et contenu des pages.

En France, sur les mêmes sources.

  • Tricoteuses : « La loi sous git » publie les codes consolidés avec leur historique, et tricoteuses-legifrance lit LEGI, JORF, DOLE et KALI, dossiers législatifs compris (TypeScript, PostgreSQL, AGPL). Son module Tisseuse trouve les liens entre textes et extrait les instructions modificatives (insert_after, replace, delete, avec le rang d'occurrence). Il fait donc ce que DuraLex faisait, et il est maintenu. Passé sur les 199 arêtes vise jugées, il retrouve l'article 47 fois sur 163 justes : il ne modélise ni « est ainsi rédigé » ni la création d'un article, et ne choisit pas la version (docs/56). Son grain de retouche et ses 538 tests unitaires sont à reprendre ; ce n'est pas un substitut.
  • legi.py (Legilibre) : parse LEGI vers SQLite, commits en septembre 2026. Non retenu : il oriente les liens par l'attribut sens, qui n'est pas fiable, et ne découpe pas l'alinéa (docs/56 § 4).
  • La Fabrique de la loi (Regards Citoyens, médialab) : la navette jusqu'à la promulgation, et le premier surlignage par étape. Le parser n'a pas de commit depuis mars 2022, le corpus s'arrête au 29/07/2024, et le certificat TLS du site est expiré.
  • Archéo Lex, DuraLex, SedLex (Legilibre) : arrêtés en 2019, antérieurs au format LEGI d'octobre 2023. Ils servent de références de conception, pas de dépendances.

Ailleurs, la même chaîne sous d'autres formes.

  • legislation.gov.uk rattache les Explanatory Notes du gouvernement à chaque section d'une loi en vigueur, avec ses versions. C'est le chaînage officiel le plus proche, sans les amendements et sans les renumérotations.
  • buzer.de donne, pour chaque paragraphe d'une loi fédérale allemande, la loi qui l'a modifié en dernier. Il ne lie la Begründung du Bundestag qu'au niveau de la loi entière.
  • Legislative Influence Detector (DSSG Chicago, KDD 2016) et LobbyPlag (RGPD, 2013) demandent qui a écrit le passage, par similarité de texte (Smith-Waterman) avec des lois-types ou des notes de lobbies, et non par le chaînage documentaire. Les deux sont arrêtés.
  • Parltrack suit les procédures et les amendements du Parlement européen. Il est maintenu. C'est la couche en amont de la directive, que les considérants ne couvrent pas.

Ce qu'aucun ne fait : franchir une recodification à droit constant, tenir l'amendement rejeté comme une provenance, et ne rien affirmer sans citation résoluble au passage.

Licence et attribution

Code sous AGPL-3.0. Les données amont sont sous Licence Ouverte / Etalab 2.0 et leur attribution est obligatoire — dans l'interface, dans l'API, dans tout export. Une exception, documentée : le corps des rapports de commission, qui n'est ni versionné ni rediffusé (ATTRIBUTION.md).

About

Graphe de provenance normative du droit français : pour un article de code en vigueur, remonter aux matériaux qui expliquent pourquoi il existe sous cette forme.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages