# Import du Livre VI complet

## TERMINE le 31 juillet 2026

Tous les articles du Livre VI EN VIGUEUR sont au corpus : 744 articles.

Les 36 numeros que la cartographie ASPAJ 2017 reference encore ont ete verifies
un par un sur les pages de section : AUCUN n'est en vigueur. Trente et un
affichent une plage de dates fermee (« VERSION EN VIGUEUR DU ... AU ... »), qui
vaut abrogation sur ce code ; cinq sont absents du sommaire officiel, dont les
numeros fantomes R628-43, R628-65, R628-86 et R628-97.

Ils sont consignes dans PurgeCartographieSeeder avec leur motif, pour que leurs
renvois cessent d'afficher des accordeons « texte a importer » impossibles a
remplir.

Enseignement a retenir : la cartographie de 2017 n'est PAS une liste de
reference. Seule la page de section fait foi, et un article qu'on n'y trouve pas
« en vigueur depuis » n'est pas manquant, il a disparu.

## État
- `manquants.txt` : les articles cités par la cartographie L/R et absents du corpus,
  marqués `visible` (affichés sur une fiche existante, donc source des mentions
  « texte à importer ») ou `differe` (pas encore de fiche).
- `file.json` : les 41 lots de 14 articles, visibles d'abord. Chaque lot porte un
  `etat` : `a_faire`, `fait`, ou `partiel` avec la liste des articles écartés.

## Pourquoi séquentiel
Les agents partagent un seul navigateur. Deux agents lancés en parallèle se
bloquent mutuellement et calent au bout de dix minutes : c'est arrivé sur les lots
L624-L626 et L631-L645, perdus. **Un lot à la fois.**

## Pourquoi le navigateur et pas curl
Légifrance renvoie 403 à curl (anti-bot). WebFetch résume le texte au lieu de le
reproduire, ce qui est inacceptable pour un texte de loi. Et la recherche web
renvoie des identifiants LEGIARTI périmés : vérifié sur R621-3, R622-1, R622-10,
dont les moteurs donnaient la version 2014 au lieu de celle de 2021 ou 2023.
Seules les pages de SECTION donnent la version réellement en vigueur.

## Contrôle avant intégration
Un texte de loi approximatif est pire que pas de texte. Avant d'intégrer un lot :
- identifiant `LEGIARTI` présent et cohérent avec la date annoncée ;
- pas d'anomalie de copie (mot doublé, alinéa coupé, référence incohérente) ;
- en cas de doute, l'article est écarté et refait, pas importé « pour voir ».
Exemple : L622-19 a été écarté du premier lot, son texte comportant « en
application des des articles » et un identifiant incohérent avec sa date.

## Après intégration
`php artisan db:seed --class=CorpusExtensionSeeder` puis relecture humaine dans
/admin/corpus/validation : tout arrive avec `human_validated_at` à NULL.

## Nommage des fichiers de lot — piège
Le seeder ne lit que `database/seeders/data/corpus-extension-*.json`. Un lot nommé
autrement est écrit sur disque et **silencieusement ignoré** : le seeder annonce
« 0 versions créées » sans erreur. C'est arrivé deux fois. Les lots doivent donc
s'appeler `corpus-extension-livre6-lot-NN.json`.

## Cycle par lot
1. lire le prochain lot `a_faire` dans `file.json` ;
2. lancer UN agent avec la consigne de méthode (navigateur, pages de section,
   verbatim, écarter en cas de doute) et le nom de fichier attendu ;
3. `python3 storage/app/private/import-livre6/integrer.py <lot>` — contrôle la
   forme, écarte ce qui ne passe pas, marque le lot et signale les textes à
   relire (mots doublés : souvent des coquilles officielles, à reproduire) ;
4. `php artisan db:seed --class=CorpusExtensionSeeder` ;
5. lot suivant.

## Écrire au fur et à mesure — appris à la dure
Un agent qui garde tout en mémoire et n'écrit qu'à la fin perd TOUT s'il tombe.
C'est arrivé deux fois sur le même lot (erreur réseau, puis blocage du flux).
La consigne est donc : écrire le fichier dès qu'une moitié du lot est
récupérée, puis le réécrire complet. La deuxième tentative a ainsi sauvé 6
articles sur 14 au lieu de rien.
Corollaire : un lot peut être « partiel ». Le marquer comme tel et reporter les
articles manquants dans un nouveau lot, plutôt que de tout refaire.

## Mode autonome
L'exploitant a demandé que la chaîne se poursuive sans validation intermédiaire :
intégrer, relancer le lot suivant, et ne rendre compte qu'aux jalons ou en cas
d'incident. Ne pas redemander « je continue ? » à chaque lot.

## Plage fermée = abrogation, sur tout le Livre VI
Vérifié à l'échelle du livre entier (relevé du 30/07/2026, LEGISCTA000006113780) :
576 articles « en vigueur depuis », 31 « en vigueur du … au … », et AUCUN
croisement plage fermée + data-abrogated="false". Sur ce code, une plage fermée
signifie donc toujours abrogation, jamais version différée.
Nuance importante : cela vaut pour la page de SECTION. L643-8, lui, a bien une
version différée au 01/01/2027 — visible sur sa page d'article. Les deux
vérifications restent complémentaires.

## Renumérotation R -> D : réécrire, ne pas purger
Plusieurs articles ont migré de la série R vers la série D sans changer de
contenu : R641-10 -> D641-10 (décret 2020-101), R626-9 à R626-15 -> D626-9 à
D626-15, D626-65. Un renvoi vers l'ancien numéro doit être RÉÉCRIT, pas
supprimé : le texte existe toujours.

## Collision de numeros de lot
Un lot ecrit sur disque sans entree dans `file.json` n'est pas vu par le calcul
`max(lot)+1` : une renumerotation ulterieure peut reattribuer son numero et
ecraser son fichier. C'est arrive une fois — l'agent l'a detecte et a ecrit dans
un fichier `-bis`, ce qui a sauve le lot.
Regle : avant toute renumerotation, prendre le maximum entre les numeros de la
file ET ceux des fichiers `corpus-extension-livre6-lot-*.json` presents sur
disque.
