Données & Base de Données
L'Orchestrateur d'Ingestion
L'ingestion de CLAIR est une application Node.js / TypeScript pilotée par CLI (services/ingestion/src/cli.ts basée sur Commander). Elle télécharge les données publiques, effectue les transformations, alimente PostgreSQL, établit les liaisons cross-chambres et déclenche l'enrichissement par IA.
⏱️ Les Deux Passages Planifiés (Railway)
| Passage | Planification (UTC) | Heure de Paris | Commande Exécutée |
|---|---|---|---|
| Ingestion Nightly | 0 3 * * * | 5h (été) / 4h (hiver) | node --max-old-space-size=6144 services/ingestion/dist/cli.js smart-sync --all |
| Ingestion Intraday | 0 6-21/2 * * * | Toutes les 2h (8h à 22h) | node services/ingestion/dist/cli.js sync-intraday |
- Le passage intraday ne rafraîchit que les éléments volatils du jour : agenda Sénat (J-2 à J+2), vidéos et replays de l'Assemblée et du Sénat. Il ne touche pas aux scrutins ou aux statistiques.
- Le passage nightly effectue le rafraîchissement complet, la réconciliation de graphe et les calculs de statistiques.
🔄 Déroulement du Batch Nocturne (smart-sync --all)
🔗 Algorithme des Rattachements d'Entités
L'ordre des rattachements est strictement séquentiel pour éviter les faux positifs :
- Débats et Scrutins : Rattachement des prises de parole antérieures aux votes en séance.
- Interventions et Dossiers : Liaison par numéro de texte législatif.
- Commissions et Avis : Parsing des comptes rendus PDF (via
pdftotext) pour extraire les positions de commission sur les amendements. - Scrutins et Dossiers : Suppression des liaisons obsolètes, rattachement Sénat, analyse TF-IDF sur les titres de lois et numéros de texte.
- Amendements et Scrutins : Rapprochement dans la table de jointure
scrutin_amendement, puis propagation du dossier vers les amendements. - Nature des Scrutins : Classification automatique de la nature du vote (texte entier, amendement, motion, etc.).
🛡️ Résilience et Gestion des Échecs
- Non-blocage : L'échec de téléchargement ou de parsing d'une source isole l'erreur dans
sync_logs.statut = 'failed'et continue le traitement des sources suivantes. - Idempotence : Toutes les écritures en base utilisent des clauses
upsertPrisma basées sur les identifiants uniques officiels. - Traçabilité : Consultation instantanée de la santé des flux via
pnpm ingestion:status.