From 5b54dafd8870260d340f96ca95d35be415f0435f Mon Sep 17 00:00:00 2001 From: bolbol Date: Mon, 27 Jul 2026 07:18:28 +0000 Subject: [PATCH] runbook: refonte site Veille Dr. Nexum (mono-usage, chat par article, arret scraper tunisien) --- ...veille-nexum-site-refonte-25-26-07-2026.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 common/veille-nexum-site-refonte-25-26-07-2026.md diff --git a/common/veille-nexum-site-refonte-25-26-07-2026.md b/common/veille-nexum-site-refonte-25-26-07-2026.md new file mode 100644 index 0000000..caf7cbe --- /dev/null +++ b/common/veille-nexum-site-refonte-25-26-07-2026.md @@ -0,0 +1,44 @@ +# Veille Dr. Nexum : site dedie (veille.bolbol.tn / nyora-veille) + +**Date** : 25-26/07/2026 · **Sphere** : infra + Nyora · **Statut** : deploye, en observation du prochain run reel + +## Contexte +Suite discussion sur la pollution des canaux Telegram et la difficulte de retrouver un sujet dans l'historique Telegram, Nabil a demande la construction d'un site archive pour la veille Dr. Nexum (3x/jour), en reutilisant l'app existante nyora-veille (port 3055) plutot qu'un nouveau build. + +## Decouverte critique : code mort React +Le dossier `frontend/src/routes/` (TanStack Router, `createFileRoute`) etait du code mort jamais branche -- l'app reellement servie est un `index.html` monolithe en JS vanilla (variables CSS `--bg/--card/--cyan` etc., pas de Tailwind). Deux cycles de build perdus avant de le decouvrir (`npm run build` ne transformait que 2 modules -- signal qui aurait du alerter plus tot). **Toute modification de ce site doit passer par `frontend/index.html` directement, jamais par `src/`.** + +## Site simplifie -- mono-usage +Nav Transit + Bibliotheque retirees de l'UI (boutons + defaut de page au login/reload -> `goP(3)` au lieu de `loadT()`). Les fonctions `loadT/drawT/loadB/drawB` restent dans le code (dead code inoffensif, plus jamais appelees). Page unique : "Veille Dr. Nexum". + +## Scraper tunisien arrete +Workflow n8n `9378593adccf42dc` ("VEILLE | Ingest Opportunites", scraping Telegram orientini/orientationtn) etait actif et polluait la table `opportunites` (job_id `tg--*`, 157 lignes). **Desactive + n8n redemarre.** 157 lignes purgees de la table. Le contenu Transit/Bibliotheque (194+190 lignes, sujet IA generaliste, source_instance=nyora) est distinct et n'a pas ete touche -- reste alimente en arriere-plan, juste retire de l'UI. + +## Schema DB (opportunites, additif, aucune perte de donnees) +Colonnes ajoutees : `introduction`, `verification`, `analyse_etendue` (ancien bouton "approfondir", non utilise dans l'UI finale -- remplace par le chat). Nouvelle table `opportunite_chat` (id, opportunite_id, role, content, date_capture) pour l'historique de chat persiste par article. + +## Backend (router opportunites.py) +- `GET /opportunites/?zone=transit&job_id=veille-ia-nexum-4ee61494&tag=X` -- liste filtree +- `GET /opportunites/tags?job_id=...` -- tags avec comptage, pour les chips de filtre +- `POST /opportunites/ingest` -- batch, dedup sur (date, titre, job_id) +- `GET/POST /opportunites/{id}/chat` -- chat scope a un article, historique persiste, contexte = contenu complet de l'item + historique de conversation, model mimo-v2.5 via Bifrost (`BIFROST_VK_NYORA_VEILLE`, deja existante, ajoutee au docker-compose + .env local de l'app) + +## Frontend (index.html) +Carte par opportunite : titre (gras, toujours visible) + introduction (visible, pas grasse) -> clic sur l'en-tete deplie resume/verification/pourquoi/titre suggere/angle/tags/lien. Tags multi-dimensionnels (createur auto-injecte + objet/mot-cle genere par l'agent). Bouton "Discuter avec Dr. Nexum" ouvre un panneau de chat inline par carte (multi-messages, historique charge a l'ouverture). Seuil de couleur du badge score calibre sur l'echelle reelle 0-100 (corrige une premiere erreur de calibration 0-10). + +## Pipeline (job veille-ia-nexum-4ee61494, hermes-agent-nyora) +- Bloc prompt "Email enrichi" supprime -> remplace par bloc "Ingestion vers le site" : le JSON `/opt/data/veille_enrich.json` inclut desormais `introduction` (identique mot pour mot a la ligne de contexte Telegram), `verification`, `tags` (objet/mot-cle uniquement, le tag createur est ajoute automatiquement par le script, pas par le LLM). +- Nouveau script `/opt/data/veille_ingest_send.py` (remplace `veille_email_send.py`, non supprime mais plus appele) : fusionne raw+enrich, injecte le tag source/createur, POST vers `http://veille-backend:8000/opportunites/ingest`. Verifie via `INGEST_OK`/`INGEST_FAILED` (meme pattern que l'ancien `EMAIL_SENT_OK`), n'a jamais bloque Telegram en cas d'echec. +- Template Telegram : ligne "Lien : [url]" ajoutee (absente avant). +- Telegram reste actif en parallele du site (decision explicite Nabil, le temps de valider le nouveau systeme). Email O365 completement retire. + +## Verifie en direct +Migration DB (0 perte sur 158 puis 28 lignes reelles apres purge tunisienne), ingestion end-to-end, chat end-to-end (reponse mimo-v2.5 coherente), build JS valide (`node --check`) avant chaque deploiement, contenu du bundle final verifie par grep post-build (le seul moyen fiable d'etre sur qu'un changement est reellement livre avec ce systeme de build). + +## Trouvaille annexe (sans lien avec la tache) +n8n + n8n-DB etaient `Exited (0)` depuis 17h au moment ou j'ai voulu interroger la DB pour trouver le scraper tunisien -- decouverte fortuite, redemarres. Cause non investiguee (pas un crash, exit propre -- arret manuel ou fenetre de maintenance ?). A surveiller si ca se reproduit. + +## Reste a faire / points ouverts +- Backfill des runs Dr. Nexum anterieurs a la mise en place (archives cron limitees a 2-3 jours, non tente). +- Nettoyage du code mort `frontend/src/` (routes/, App.tsx, lib/api.ts) -- inoffensif mais source de confusion future, a supprimer une prochaine session. +- Prochain run reel du job (prochain creneau 3x/jour) validera la chaine complete avec les nouveaux champs (introduction/verification/tags objet) -- a verifier sur le site apres.