# I — Prompt Session 3 : IA + Deploy NAV V2 > **Session dédiée Claude Code, modèle Opus pilote avec délégation sous-agents Sonnet autorisée.** > Prérequis : Sessions 1 et 2 terminées (front navigable, fiches visibles, formulaire OK). > Durée estimée : 6-8h. > Autonomie : 6/10 (checkpoints : test pipeline IA sur 3 fiches + deploy final). ## Mission Brancher la couche IA et déployer la V2 : 1. Worker IA async qui enrichit les soumissions (Mistral Nemo) 2. Chatbot recherche sémantique (Mistral Small) 3. Bandeau bas stats (coût IA + dons + activité) 4. Page `/a-propos` (souveraineté, gouvernance, transparence Liberapay) 5. Deploy production `nav.trans-former.fr` 6. Test pipeline IA sur les 3 fiches réservées ## Fichiers de référence (à LIRE en premier) Tous dans `C:\Users\jules\Dropbox\ATIS - IPCJRA\0 INBOX\NAV-V2-recherches\` : - `G-prompt-dev-final.md` (vision V2, étapes 4, 5, 7, 8, 9) - `B-provider-ia-souverain.md` (Mistral Nemo + Small, circuit breaker 20€/mois) - `C-systeme-dons.md` (Liberapay widget) - `F-spec-pipe-collaboration.md` (§3 prompts IA exacts, §4 endpoints) - `VPS-check.md` (deploy process) - `palette-nav-v2.md` (palette bandeau + /a-propos) - `seed-test-pipe-ia.json` (3 fiches CNOA/Archireport/Collectif Fil réservées pour test worker) Journal projet : `1 PROJETS\TECH - infra VPS, website pro, RAG\nav-carte\JOURNAL-V2.md` Code en cours : `1 PROJETS\TECH - infra VPS, website pro, RAG\nav-carte\` ## Décisions tranchées (Sessions 1 + 2 + pilote S3) - Circuit breaker 20€/mois dépassé → **bandeau "manque de fonds" + CTA Liberapay + pédagogie "1€ = N requêtes" + transparence origine Liberapay** - Transparence Liberapay (origine belge, asso non-lucrative, hébergement FR/UE éthique) → section dédiée dans `/a-propos` - From email modération : `contact@trans-former.fr` - Liberapay URL : `liberapay.com/trans-former.fr` (widgets fournis dans C-systeme-dons.md) - **Seuil email modération : 5 fiches `pending`** → envoi mail Jules via Resend - **Facteur CO2eq : 0.052 kg CO2/kWh (RTE FR)** pour calcul bandeau carbone - **Scraping : crawl4ai seul, pas de fallback httpx+BS4** (diag VPS pilote : crawl4ai occupe 4.3 MB, ms-playwright absent donc crawl4ai tourne en mode statique léger — un seul chemin de code, plus simple à maintenir) - **Rate limit chatbot : 10 req/IP/jour** (F §8, fichier JSON `/tmp/nav-ratelimit/{IP_hash}.json`, cron reset journalier) - **Prompts Mistral Nemo + Small : copier-coller exact depuis F §3 et §4**, ne pas reformuler - **Stack deploy : systemd + Caddy sur nav.trans-former.fr** (même domaine que V1, pas de sous-domaine API) - **Endpoint soumission** : `/api/organisations` (POST JSON standard, déjà existant — S2 a utilisé `organisations.post.ts`) ## État S1 et S2 — à lire AVANT de coder **Lecture obligatoire en premier** : `1 PROJETS/TECH - infra VPS, website pro, RAG/nav-carte/JOURNAL-V2.md` Points d'attention : - 96 fiches importées NocoDB, 3 réservées test pipe IA (CNOA, Archireport, Collectif Fil) - 8 anciens records V1 (IDs 1-8, `moderation_status null`) à purger avant deploy prod - Divergence taxonomie `moderation_status` tranchée : `approved`/`rejected` partout, `pending` = absence de validation - Endpoint NocoDB correct : `/api/v1/db/meta/tables/{id}/columns` (v0.301.5) - Disque VPS 76% (21/04) — surveiller pendant scraping, alerter si > 85% - Conflit lib Python `rich` résolu avec `--ignore-installed` — vérifier au passage que lightrag tourne toujours (TODO S1) ## Préflight avant tout code (obligatoire) 1. Lire `JOURNAL-V2.md` en entier 2. Lire `F-spec-pipe-collaboration.md` §3, §4, §6 (circuit breaker), §7 (endpoints), §9 (worker) 3. `ssh vps-hetzner "cat /opt/nav-carte/.env | grep -E 'MISTRAL|NOCODB|RESEND'"` → vérifier toutes les clés présentes 4. `ssh vps-hetzner "df -h /"` → confirmer disque < 85% 5. Si une clé manque ou disque > 85% → STOP, remonter au pilote Jules ## Test coût AVANT de scaler (règle sacrée) Étape 5 (test pipe IA) : 1. Lancer le worker sur **1 seule fiche** (CNOA) 2. Vérifier `stats_usage` : tokens_in, tokens_out, cout_eur 3. Extrapoler coût pour 96 fiches → **si > 1€ pour le batch test, STOP + ping Jules** 4. Si OK, lancer sur les 2 fiches restantes (Archireport, Collectif Fil) ## Credentials ``` VPS : ssh vps-hetzner (port 4422) NocoDB : localhost:8070 Token nav-v2-worker : dans /opt/nav-carte/.env Mistral API key : dans /opt/nav-carte/.env (MISTRAL_API_KEY) Resend SMTP : /opt/vps-kit/.env Deploy : /opt/nav-carte/ (systemd nav-carte.service) Domaine : nav.trans-former.fr (Caddy config existante) ``` ## Étapes ### Étape 4 — Worker IA enrichissement (4-5h) - [ ] Script `worker/enrich.js` (Node.js, lancé via systemd timer toutes les 5 min) - [ ] Pipeline : 1. Fetch `organisations` WHERE `moderation_status=pending` AND `ai_processed=false` (LIMIT 5 par run) 2. Pour chaque fiche : - Scrape URL via **crawl4ai** (timeout 3 min, mode statique) — si échec : flag `scrape_status=failed`, pas de fallback httpx+BS4 - Truncate contenu scrapé à 4k tokens - Appel Mistral Nemo avec prompt **F §3 (copier-coller exact)** - Parser réponse → update `description_enrichie`, `points_cles`, `tags_fonction` (si IA propose), `ai_raw_output`, `ai_processed=true`, `scrape_status` - Log dans `stats_usage` (model, tokens_in, tokens_out, cout_eur, timestamp, orga_id) 3. Si **circuit breaker 20€/mois dépassé** : skip enrich, log, trigger bandeau "manque de fonds" 4. Si **5 fiches en attente modération** : email Jules via Resend (from `contact@trans-former.fr`) 5. Si scrape échoué : flag `scrape_status=failed`, review manuel - [ ] Gestion erreurs : retry 2x, puis flag `scrape_status=failed` ### Étape 5 — Test pipeline IA sur 3 fiches (1-2h) Utiliser `seed-test-pipe-ia.json` (3 entrées : CNOA, Archireport, Collectif Fil) : - [ ] Injecter manuellement dans NocoDB avec `moderation_status=pending`, `ai_processed=false` - [ ] Déclencher worker manuellement (pas attendre cron) - [ ] Observer les 3 runs, documenter : - Temps d'exécution par fiche - Qualité `description_enrichie` et `points_cles` - Fonctions détectées par l'IA vs fonctions Jules - Coût Mistral (stats_usage) - [ ] Produire `1 PROJETS/TECH - infra VPS.../nav-carte/PIPE-IA-DOC.md` : documentation précise du pipeline, input, output, prompts, paramètres — servira de base pour le futur **skill `/mistral-nemo-vps`** ### Étape 5bis — Chatbot recherche (3-4h) - [ ] Composant `ChatbotSheet.vue` (bottom-sheet Headless UI, mobile + desktop) - [ ] Message onboarding : texte exact E §6 - [ ] Template requête : champs besoin / thématique / lieu → prompt structuré - [ ] API `POST /api/chatbot` : - Input : question utilisateur + contexte JSON des fiches (top N matchs par taxonomie) - Appel Mistral Small (prompt F §3) - Output : fiches recommandées + explication 1-2 lignes par fiche - [ ] Rate limit : 10 req/IP/jour, fichier JSON `/tmp/nav-ratelimit/{IP_hash}.json` (F §8, aligné avec S2) ### Étape 7 — Bandeau bas + Liberapay (1-2h) - [ ] Composant `BandeauBas.vue`, fond `--nav-primary` 60% - [ ] **Gauche** : stats live depuis `stats_usage` - Coût mois en cours / 20€ - Nombre tokens utilisés - Carbone estimé : kWh × **0.052 kg CO2eq/kWh (RTE FR)** — valeur tranchée - [ ] **Milieu** : CTA "Soutenir NAV" → Liberapay widget (snippet C-systeme-dons.md) - [ ] **Droite** : compteurs semaine (nouveaux dons, fiches ajoutées, requêtes chatbot) - [ ] **Mode "manque de fonds"** (si circuit breaker dépassé) : bandeau bascule en mode "NAV a épuisé son budget IA ce mois — aide-nous à continuer" + pédagogie "1€ permet ~X requêtes" (calcul depuis prix Mistral) ### Étape 8 — Page `/a-propos` (1-2h) - [ ] Sections : - **NAV** — mission, esprit collaboratif, pour qui - **Souveraineté** — IA française (Mistral), hébergement FR (Hetzner), zéro cookie US - **Gouvernance** — qui tient le projet, transparence code (GitHub si public) - **Transparence Liberapay** — origine (asso belge Liberapay Recurrent Donations ASBL), non lucrative, pas de cut par défaut, hébergement FR/UE éthique, modèle de dons récurrents - **Transparence IA** — modèles utilisés, circuit breaker, coût mensuel visible sur bandeau - [ ] Badges : "IA souveraine", "Hébergé en France", "Zéro cookie US" - [ ] Lien vers formulaire + widget Liberapay ### Étape 9 — Deploy + tests (2-3h) - [ ] Build production (`npm run build`) - [ ] **Avant deploy** : purger les 8 anciens records V1 (IDs 1-8, `moderation_status null`) dans NocoDB - [ ] Deploy via `git pull && systemctl restart nav-carte.service` - [ ] Vérifier DNS `nav.trans-former.fr`, HTTPS Caddy (config V1 déjà présente — vérifier si routes V2 nécessitent ajustement) - [ ] **Checkpoint Jules** : test manuel - Soumettre une fiche test via `/contribuer` - Vérifier passage dans worker (cron 5 min) - Jules valide en NocoDB manuellement - Vérifier apparition sur la carte - [ ] Tester chatbot avec 2-3 requêtes réelles - [ ] Tester mobile iOS Safari + Android Chrome ## Checkpoints Jules 1. Avant étape 5 : valider texte onboarding chatbot + prompt recherche 2. Étape 5 test pipe : valider qualité enrichissement sur 3 fiches 3. Étape 8 : review texte `/a-propos` (ton Jules appliqué) 4. Étape 9 : checkpoint deploy final + submit test ## Délégation (Opus pilote) - Sonnet 1 : worker IA + test pipe 3 fiches + PIPE-IA-DOC (étapes 4-5) - Sonnet 2 : chatbot (étape 5bis) - Sonnet 3 : bandeau + /a-propos (étapes 7-8) - Opus : deploy + checkpoint finaux + debug ## Règles - Tester pipeline IA sur 1 fiche AVANT de scaler aux 3 - Circuit breaker 20€ = sacré, jamais dépasser - Secrets via `.env`, jamais dans le code - Si blocage > 30 min → reporter au pilote - À la fin : mettre à jour JOURNAL-V2 avec backlog V3 détaillé ## Output attendu 1. V2 déployée sur `nav.trans-former.fr` 2. ~103 fiches sur la carte + 3 fiches enrichies par IA 3. Worker cron 5 min opérationnel 4. Chatbot fonctionnel 5. Bandeau live avec stats 6. Liberapay relié + page `/a-propos` complète 7. `PIPE-IA-DOC.md` produit (base skill `/mistral-nemo-vps`) 8. `JOURNAL-V2.md` final avec backlog V3