Cyber MawonajandClaude Opus 5 29424afdd5 Intégration des 7 textes détectés par le pipeline — la veille converge
make update écrivait jusqu'ici les changements de statut et de date, mais se
contentait de journaliser les ajouts et les décisions du Conseil : les mêmes
écarts seraient revenus à chaque passage, indéfiniment. Un rapport qui répète
les mêmes lignes cesse d'être lu.

Deux manques comblés :
- un écart d'ajout porte désormais la collecte qui l'a produit, et appliquer()
  crée réellement le texte via classer_nouveau()
- un écart de décision porte l'affaire collectée, et l'écrit dans decisions_cc

Une affaire orpheline est rattachée par similarité de titre : le registre du
Conseil donne l'intitulé complet (« Loi actualisant la programmation militaire
pour les années 2024 à 2030… »), la base le nom d'usage. L'affaire 2026-907 DC
a ainsi trouvé sa loi toute seule.

Résultat sur les sources réelles :
  passage 1 → 7 ajouts, 4 modifications
  passage 2 → 0 ajout,  4 modifications (décisions désormais écrites)
  passage 3 → 0 écart : « la base est conforme aux sources officielles »

Les 7 textes ajoutés sont des lois de janvier à avril 2026, hors de la fenêtre
du corpus mais relevées par la liste du Sénat qui couvre toute la session. Dont
la loi de finances pour 2026 (n° 2026-103), qui touche l'octroi de mer et étend
le versement mobilité aux DROM — donc pertinente pour la Guadeloupe. Toutes
entrent avec confiance = low et le drapeau de revue : le pipeline constate
qu'un texte existe, il ne prétend pas l'avoir analysé.

Base : 59 textes, 367 sources, 13 affaires CC, 0 texte sans lien.
176 tests, make verifier au vert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-25 22:41:18 -04:00

Veille législative Gwadloup

Plateforme de veille sur la production législative française — lois, projets et propositions de loi, ordonnances, décisions du Conseil constitutionnel — lue sous l'angle des libertés des individus, des associations et des entreprises, avec un zoom Guadeloupe et outre-mer.

Aucune donnée législative n'est inventée. Chaque fait porte sa source (adresse, date, extrait verbatim), son niveau de confiance et son fichier d'origine. Ce qui n'est pas établi est marqué « à vérifier », avec son motif affiché sur la fiche.


Ce que contient la base

Textes législatifs 59 — 52 issus du corpus de recherche, 7 ajoutés par le pipeline depuis les sources officielles
Sources vérifiables 367, toutes avec adresse — aucun texte sans lien
Événements de parcours 90
Affaires du Conseil constitutionnel 13
Analyses transversales 7
Échéances de calendrier 9
Marqueurs de citation résolus 100 % (332/332), dont 93 % avec un lien

Les valeurs déduites sont signalées comme telles, avec leur motif : 16 cotations Guadeloupe, 17 ventilations d'impact, et les 7 textes ajoutés par le pipeline — qui entrent tous avec la confiance la plus basse et le drapeau de revue.

Les 52 textes du corpus couvrent la fenêtre du 1ᵉʳ mai au 30 septembre 2026. Les 7 ajouts sont antérieurs (janvier à avril 2026) : le pipeline les a relevés sur la liste du Sénat, qui couvre toute la session. Parmi eux, la loi de finances pour 2026 (n° 2026-103), qui modifie l'octroi de mer et étend le versement mobilité aux départements d'outre-mer.


Architecture

veille_legislative_971/
├── data/input/      corpus de recherche — LECTURE SEULE, jamais modifié
├── pipeline/        Python 3.12 : parseurs, collecteurs, run de veille
├── web/             SvelteKit 2 + Svelte 5, rendu serveur sur adapter-node
├── systemd/         4 unités : timer du pipeline, socket + service de l'app
├── tests/           pytest, fixtures HTML figées — aucun test ne va au réseau
└── scripts/         contrôles de conformité

Une seule base SQLite, data/veille.db. La recherche plein texte est assurée par SQLite lui-même (FTS5). Aucun service externe n'est nécessaire au fonctionnement : ni moteur de recherche, ni réseau de diffusion, ni traceur.


Installation sur Debian ou Ubuntu vierge

Testé sur Debian 13 et Ubuntu 24.04.

1. Dépendances système

sudo apt update
sudo apt install -y git curl build-essential sqlite3 ca-certificates

2. Node.js ≥ 20.6

La version 20.6 est le minimum : l'application utilise node --env-file, qui n'existe pas avant.

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node --version    # doit afficher v20.6 ou plus

3. Python 3.12 et uv

curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
uv python install 3.12

4. Le projet

sudo mkdir -p /opt/veille-legislative
sudo chown "$USER:$USER" /opt/veille-legislative
git clone <adresse-du-depot> /opt/veille-legislative
cd /opt/veille-legislative

make install      # environnement Python + dépendances npm
cp .env.example .env
$EDITOR .env      # renseigner les identifiants PISTE — voir README-pipeline.md

5. Remplir la base et construire l'application

make seed         # → 52 textes, 360 sources
cd web && npm run polices && cd ..   # copie les polices depuis npm
make build
make verifier     # contrôles de conformité

6. Vérifier localement

cd web
HOST=127.0.0.1 PORT=3971 VEILLE_DB=/opt/veille-legislative/data/veille.db node build

Puis, dans un autre terminal :

curl -sI http://127.0.0.1:3971/ | head -1          # HTTP/1.1 200 OK
curl -s http://127.0.0.1:3971/api/textes | head -c 200

Mise en service

Compte dédié

sudo useradd --system --home /opt/veille-legislative --shell /usr/sbin/nologin veille
sudo chown -R veille:veille /opt/veille-legislative
sudo chmod 600 /opt/veille-legislative/.env

Unités systemd

sudo cp systemd/*.service systemd/*.timer systemd/*.socket /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now veille-web.socket        # l'app se réveille à la demande
sudo systemctl enable --now veille-legislative.timer # collecte 6 h, 18 h, dimanche 9 h

L'application est activée par socket : systemd tient le port ouvert et ne démarre Node qu'à la première requête ; sans trafic pendant IDLE_TIMEOUT (300 s), elle s'arrête. Sur un site de veille peu fréquenté, l'empreinte mémoire tombe à zéro entre deux visites — ce qui compte sur un serveur à 5 € par mois.

Avant de démarrer, ajustez ORIGIN dans veille-web.service : sans lui, les soumissions de formulaire sont refusées derrière un reverse proxy.

Reverse proxy

Caddy (le plus court, HTTPS automatique) :

veille.example.org {
    encode gzip zstd
    reverse_proxy 127.0.0.1:3971
}

nginx :

server {
    listen 443 ssl http2;
    server_name veille.example.org;

    gzip on;
    gzip_types text/css application/javascript application/json image/svg+xml;

    location / {
        proxy_pass http://127.0.0.1:3971;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host  $host;
    }
}

Avec nginx, remplacez ORIGIN par PROTOCOL_HEADER=x-forwarded-proto et HOST_HEADER=x-forwarded-host dans le service.

Vérifier

systemctl status veille-web.socket
systemctl list-timers veille-legislative.timer
journalctl -u veille-legislative -n 40

Commandes

make install     installe pipeline Python et application web
make seed        remplit la base depuis data/input/
make reseed      repart d'une base vierge
make update-dry  collecte réelle, aucune écriture, rapport des écarts
make update      collecte et applique
make test        pytest avec couverture
make lint        ruff
make dev         serveur de développement (port 5971)
make build       build de production
make check       vérification TypeScript
make verifier    contrôles de conformité au cahier des charges

Dégradations documentées

Situation Conséquence
Sans identifiants PISTE Le collecteur Légifrance se désactive et l'annonce dans le rapport. Le Sénat et le Conseil constitutionnel prennent le relais : les promulgations et les décisions restent suivies. Voir README-pipeline.md §3.
Une source indisponible Le collecteur concerné échoue seul ; les autres poursuivent. L'erreur figure au rapport de run.
Réseau coupé make update --hors-ligne travaille sur le cache HTTP. Côté navigateur, le service worker sert les pages déjà consultées, en signalant qu'elles peuvent être périmées.
Base absente L'application refuse de démarrer avec un message indiquant les emplacements essayés.

Deux adresses du cahier des charges sont mortes et ont été remplacées : senat.fr/lois/index.html et assemblee-nationale.fr/dyn/actualites-accueil/promulgations-de-lois renvoient toutes deux 404. La liste senat.fr/dossiers-legislatifs/lois-promulguees.html couvre l'ensemble des promulgations et tient lieu de source unique.


Sauvegarde

La base est un fichier unique :

sqlite3 data/veille.db ".backup /sauvegardes/veille-$(date +%F).db"

Ne copiez jamais le fichier pendant un passage du pipeline : le mode WAL laisse des fichiers annexes. .backup s'en charge correctement.


Interface de programmation

Ouverte, sans clé :

Route Objet
GET /api/textes liste filtrable — q, statut, theme, type, impact, guadeloupe, confiance, from, to, tri, page
GET /api/textes/[identifiant] fiche complète, sources et parcours compris
GET /api/echeances calendrier, avec ?jours=N en option
curl -s 'https://veille.example.org/api/textes?statut=saisie_cc&guadeloupe=forte' | jq '.total'

Licence

AGPL-3.0-or-later. Le corpus de data/input/ reste la propriété de ses auteurs.

Si vous réutilisez ces données, citez la source primaire — Journal officiel, assemblées, Conseil constitutionnel — plutôt que cette plateforme : elle n'est qu'un intermédiaire.

S
Description
No description provided
Readme
881 KiB
Languages
Python 71%
Svelte 13.9%
TypeScript 9.5%
CSS 2.6%
Shell 1.2%
Other 1.8%