feat(aep): carte AEP — push Gitea 2026-04-28

This commit is contained in:
Jules Neny
2026-04-28 14:00:05 +02:00
commit 21c44d8193
86 changed files with 31855 additions and 0 deletions

View File

@@ -0,0 +1,194 @@
# 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