Files
nav-carte/V2-cadrage/I-prompt-session-3-ia-deploy.md
2026-04-28 14:00:05 +02:00

195 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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