📅 Réforme des horaires pour une Vitrine démocratique Bêta 2.0

Système de mise à jour 6 fois/jour - Architecture complète (Heure de Montréal)

📅 15 mars 2026
🎯 6 blocs par jour
⏱️ ~54 min données / ~57 min vitrine

🎯 Contexte et Objectifs

⚠️ Nouvelle contrainte AWS Lambda :
Tous les raffineurs doivent être découpés en plusieurs lambdas si leur exécution dépasse 15 minutes.
L’architecture a été adaptée pour garantir que chaque lambda respecte ce timeout maximal.

Objectif Principal

La Vitrine Démocratique se met à jour 6 fois par jour (toutes les 4 heures) avec les dernières données des médias et analyses.

Délai de disponibilité: Les données collectées sur une fenêtre de 4h sont traitées en ~54 minutes (datamarts).

Exemple: Bloc débute à 11:03 → Datamarts prêts vers 11:57 → Frontend vitrine vers 12:00 (heure de Montréal)

⏱️ Horaire Complet (6 blocs/jour):
🌅
MATIN
Données: 3h-7h
Glue Job: 07:03
Pipeline: 07:06-07:57
Données prévues: ~07:57
🎯 Vitrine: 08h
☀️
MIDI
Données: 7h-11h
Glue Job: 11:03
Pipeline: 11:06-11:57
Données prévues: ~11:57
🎯 Vitrine: 12h
🌤️
APRÈS-MIDI
Données: 11h-15h
Glue Job: 15:03
Pipeline: 15:06-15:57
Données prévues: ~15:57
🎯 Vitrine: 16h
🌆
SOIRÉE
Données: 15h-19h
Glue Job: 19:03
Pipeline: 19:06-19:57
Données prévues: ~19:57
🎯 Vitrine: 20h
🌑
MINUIT
Données: 19h-23h
Glue Job: 23:03
Pipeline: 23:06-23:57
Données prévues: ~23:57
🎯 Vitrine: 00h
🌙
NUIT
Données: 23h-3h
Glue Job: 03:03
Pipeline: 03:06-03:57
Données prévues: ~03:57
🎯 Vitrine: 04h

🔧 Architecture des Glue Jobs (ETL)

Le pipeline utilise deux types de Glue Jobs AWS pour gérer l'extraction, la transformation et le chargement des données:

1️⃣ Glue Job GÉNÉRALE (toutes les 4h)
  • Les extracteurs collectent les données brutes des médias (HTML, PDF, XML…) → stockées dans le data lake
  • Les chargeurs dissectent ces données brutes et les exportent en CSV → stockés dans le datawarehouse
  • Récupère tous les CSV produits par les chargeurs dans les 4 dernières heures (datawarehouse)
  • Les convertit en fichiers Parquet (format orienté colonnes requis par AWS Athena — Athena ne peut pas lire du CSV)
  • Indexe les données dans les tables Glue correspondantes → rendues requêtables via Athena
  • Point d'entrée pour DATA_PREPARATION et tout le pipeline RADAR+
  • Durée: max 2 minutes
2️⃣ Glue Jobs SPÉCIFIQUES (après chaque raffineur)
  • 1 par raffineur — écrit les résultats vers Athena
  • Durée: ~3 min chacun, mais ils tournent en parallèle → +9 min au total sur le chemin critique

🔬 Architecture Scientifique avec Modèles Locaux

Les raffineurs dépendants de la saillance utilisent salient_index comme source de vérité. Les raffineurs longs sont systématiquement splittés en plusieurs lambdas de 15 min max pour respecter la contrainte AWS Lambda et accélérer le pipeline.

Pipeline scientifique — DATA_PREPARATION (6 phases, 5 modèles):

  1. Phase 1/6 — CAP themes: Classification thématique sur toutes les phrases (batch)
  2. Phase 2/6 — Canadian political parties: Détection des partis politiques sur toutes les phrases (batch)
  3. Phase 3/6 — Sentiment: Analyse de sentiment sur toutes les phrases (batch)
  4. Phase 4/6 — GLiNER (INFER API): Extraction NER sur toutes les phrases (batch) — 18 labels
  5. Phase 5/6 — gemma3:27b (Ollama): Normalisation + traduction EN/FR des entités, avec cache inter-articles
  6. Phase 6/6 — Assemblage: Fusion sentence_analysis + colonnes entités par article → radar_articles (29 colonnes)

⚖️ Trade-off: Plus lent que GPT-4 (~25 min vs ~2 min), mais scientifiquement rigoureux, reproductible, et traçable.
💡 Objectif d'optimisation continue: Réduire le délai de traitement en améliorant les performances des modèles locaux et l'architecture du pipeline.

📈 Visualisation des Blocs

Exemple affiché pour le bloc 08:00 (MATIN), pipeline 07:00→08:10. Survoler une barre pour voir les horaires exacts.
11:00
11:10
11:20
11:30
11:40
11:50
12:00
12:10
GJ 2m
GLUE JOB GÉNÉRALE
DATA_PREPARATION (15min)
1m
SALIENT_OBJECTS
OBJECT_EXTRACTION (15min)
+GJ 3m
+GJ 3m
1m
SALIENT_INDEX
+GJ 3m
1m
ISSUES_SCORE
+GJ 3m
1m
PARTY_SCORE_SALIENT_SHADOW
+GJ 3m
1m
PARTY_SCORE
+GJ 3m
5m
HEADLINE_OF_HEADLINES
+GJ 3m
5m
HEADLINES_ISSUES
+GJ 3m
5m
REFLET
+GJ 3m
3m
VITRINE_GRAPH_DATA
✅ 11:57 données prêtes
1x/jour (bloc 16:00)
1m
+GJ 3m
HEADLINES_ISSUES_WEEKLY
1m
+GJ 3m
HEADLINES_ISSUES_MONTHLY
1m
+GJ 3m
ISSUES_SCORE_WEEKLY
1m
+GJ 3m
ISSUES_SCORE_MONTHLY
1m
+GJ 3m
PARTY_SCORE_SALIENT_SHADOW_WEEKLY
1m
+GJ 3m
PARTY_SCORE_SALIENT_SHADOW_MONTHLY
1m
+GJ 3m
PARTY_SCORE_WEEKLY
1m
+GJ 3m
PARTY_SCORE_MONTHLY
1m
+GJ 3m
REFLET_WEEKLY
1m
+GJ 3m
REFLET_MONTHLY

🔄 Comparaison des Horaires

✅ HORAIRE ACTUEL (APPLIQUÉ DANS LE TS) — UTC
GLUE JOB: 00:03 04:03 08:03 12:03 16:03 20:03
DATA_PREPARATION: 00:06 04:06 08:06 12:06 16:06 20:06
OBJECT_EXTRACTION: 00:24 04:24 08:24 12:24 16:24 20:24
SALIENT_OBJECTS: 00:16 04:16 08:16 12:16 16:16 20:16
SALIENT_INDEX: 00:20 04:20 08:20 12:20 16:20 20:20
HEADLINE_OF_HEADLINES: 00:28 04:28 08:28 12:28 16:28 20:28
VITRINE_GRAPH_DATA: 00:39 08:39 12:39 16:39 20:39

ISSUES_SCORE: 12:09 16:09 20:09
PARTY_SCORE: 00:29 04:29 08:29 12:29 16:29 20:29
PARTY_SCORE_SALIENT_SHADOW: 00:31 04:31 08:31 12:31 16:31 20:31
HEADLINES_ISSUES: 12:14 16:14 20:14
REFLET: 12:25 16:25 20:25
── HEBDOMADAIRE / MENSUEL ──
ISSUES_SCORE_WEEKLY: 20:11
HEADLINES_ISSUES_WEEKLY: 20:17
PARTY_SCORE_WEEKLY: 20:20
PARTY_SCORE_SALIENT_SHADOW_WEEKLY: 20:22
REFLET_WEEKLY: 20:28

ISSUES_SCORE_MONTHLY: 20:14
HEADLINES_ISSUES_MONTHLY: 20:18
PARTY_SCORE_MONTHLY: 20:22
PARTY_SCORE_SALIENT_SHADOW_MONTHLY: 20:24
REFLET_MONTHLY: 20:30

SONAR: 12:00
SONAR_HEATMAPS (mercredi): 12:30
HOT_20 (vendredi): 16:30
Mélange de cadences: certains daily en 3x/jour, d'autres en 6x/jour
VITRINE_GRAPH_DATA en 5x/jour (pas encore aligné 6x)
Horaires de production exprimés en UTC dans le code actuel
Le ciblage final est documenté en heure de Montréal
🟡 HORAIRE CIBLE (À VENIR) — Montréal (EST/EDT)
GLUE JOB: 03:03 07:03 11:03 15:03 19:03 23:03
DATA_PREPARATION: 03:06 07:06 11:06 15:06 19:06 23:06
OBJECT_EXTRACTION: 03:24 07:24 11:24 15:24 19:24 23:24
SALIENT_OBJECTS: 03:16 07:16 11:16 15:16 19:16 23:16
SALIENT_INDEX: 03:42 07:42 11:42 15:42 19:42 23:42
HEADLINE_OF_HEADLINES: 03:46 07:46 11:46 15:46 19:46 23:46
VITRINE_GRAPH_DATA: 03:57 07:57 11:57 15:57 19:57 23:57

ISSUES_SCORE: 03:31 07:31 11:31 15:31 19:31 23:31
PARTY_SCORE_SALIENT_SHADOW: 03:31 07:31 11:31 15:31 19:31 23:31
PARTY_SCORE: 03:46 07:46 11:46 15:46 19:46 23:46
HEADLINES_ISSUES: 03:46 07:46 11:46 15:46 19:46 23:46
REFLET: 03:46 07:46 11:46 15:46 19:46 23:46
── HEBDOMADAIRE / MENSUEL ──
ISSUES_SCORE_WEEKLY: 15:35
HEADLINES_ISSUES_WEEKLY: 15:17
PARTY_SCORE_SALIENT_SHADOW_WEEKLY: 15:35
PARTY_SCORE_WEEKLY: 15:35
REFLET_WEEKLY: 15:37

ISSUES_SCORE_MONTHLY: 15:39
HEADLINES_ISSUES_MONTHLY: 15:20
PARTY_SCORE_SALIENT_SHADOW_MONTHLY: 15:39
PARTY_SCORE_MONTHLY: 15:39
REFLET_MONTHLY: 15:40

SONAR: 07:00
SONAR_HEATMAPS (mercredi): 07:30
HOT_20 (vendredi): 11:59
6 blocs complets par jour (toutes les 4h)
~54 min données (~57 min vitrine) sur le chemin principal
Chaînage explicite DATA_PREPARATION → OBJECT_EXTRACTION → SALIENT_INDEX → ISSUES_SCORE / PARTY_SCORE / PARTY_SCORE_SALIENT_SHADOW → enrichissements aval (selon les dépendances)
Cadence réaliste 6x/jour pour le cœur + daily ciblés + weekly/monthly
API Future: Élimination de VITRINE_GRAPH_DATA, accès direct aux Parquet

📊 Suivi de Migration

✅ Conforme (TS actuel) : horaire déjà aligné avec la cible. 🟡 À adapter : horaire encore à migrer.

Lecture rapide par raffineur (base: bloc MIDI 11:00, heure de Montréal).

Raffineur Horaire TS actuel Horaire cible Statut
DATA_PREPARATION 11:06 11:06 ✅ Conforme
OBJECT_EXTRACTION 11:24 11:24 ✅ Conforme
SALIENT_OBJECTS 11:16 🔴 À débrancher
PARTY_SCORE_SALIENT_SHADOW (daily) 11:31 11:31 ✅ Conforme
PARTY_SCORE (daily) 6x/jour @ :29 🔴 À débrancher
ISSUES_SCORE (daily) 3x/jour @ :09 6x/jour @ :31 🟡 À adapter
SALIENT_INDEX 6x/jour @ :20 6x/jour @ :42 🟡 À adapter
HEADLINE_OF_HEADLINES 6x/jour @ :28 6x/jour @ :46 🟡 À adapter
HEADLINES_ISSUES (daily) 3x/jour @ :14 6x/jour @ :46 🟡 À adapter
REFLET (daily) 3x/jour @ :25 6x/jour @ :46 🟡 À adapter
VITRINE_GRAPH_DATA 5x/jour @ :39 🔴 À débrancher (post-API)

🚀 Prochaines Étapes

✅ Validation de l'horaire (COMPLÉTÉ)

Approbation de l'équipe et confirmation des durées réelles en production

✅ Déploiement de RADAR_DATA_PREPARATION

Remplace radar-articles-segmented — 5 modèles, 6 phases, 29 colonnes vers radar_articles — SALIENT_INDEX lit désormais directement depuis radar_articles

� Mise à jour de tous les raffineurs (EN COURS)

Migration UTC → heure locale Montréal - Application du nouvel horaire - Ajout du 6ème bloc (minuit) - Mise à jour des payloads

🧪 Phase de Test (2 semaines)

Monitoring intensif des temps d'exécution - Ajustements si nécessaire - Validation de la synchronisation

📈 Optimisation Continue

Réduction progressive des marges de sécurité - Documentation des métriques

Version: Bêta 2.0 | Dernière mise à jour: 15 mars 2026

🌅
08:00
Bloc MATIN (3:00-7:00)