# 📋 PIPELINE VALIDATOR - Spécification Technique

## 🎯 OBJECTIF GÉNÉRAL

Créer une interface dédiée de validation qualitative permettant d'évaluer l'évolution du contenu à travers les différentes étapes d'un pipeline, en utilisant des critères LLM objectifs avec notation et justification détaillée.

---

## 🧠 COMPRÉHENSION DU BESOIN

### Workflow utilisateur
1. **Chargement** : Sélectionner une config de pipeline + une personnalité Google Sheets
2. **Exécution** : Run le pipeline complet (identique à pipeline-runner)
3. **Échantillonnage intelligent** : Extraire automatiquement 3 types d'éléments du contenu généré
4. **Évaluation multi-critères** : Chaque critère = 1 appel LLM → note/10 + justification
5. **Visualisation comparative** : Voir l'évolution d'un échantillon à travers toutes les étapes

### Valeur ajoutée
- **Traçabilité** : Comprendre l'impact réel de chaque layer du pipeline
- **Objectivité** : Évaluation quantitative via LLM (pas de subjectivité humaine)
- **Debugging** : Identifier quelle étape dégrade/améliore la qualité
- **Optimisation** : Comparer différentes configs de pipeline scientifiquement

---

## 🏗️ ARCHITECTURE SYSTÈME

### 1. FICHIERS À CRÉER

#### Frontend
- **`public/pipeline-validator.html`** - Interface principale
  - Section chargement (config + personnalité)
  - Zone de contrôle (run, status, progress)
  - Panneau d'échantillonnage (liste des 3 types)
  - Tableau de scores (critères × étapes)
  - Vue détaillée comparative (sélection d'échantillon)

- **`public/pipeline-validator.js`** - Logique frontend
  - Gestion UI (sélections, boutons, modals)
  - Communication WebSocket pour progression temps réel
  - Rendering des scores et graphiques
  - Navigation entre échantillons

- **`public/css/pipeline-validator.css`** - Styles dédiés
  - Layout responsive (sidebar + main content)
  - Cartes de scores avec couleurs (vert>7, orange 5-7, rouge<5)
  - Vue comparative side-by-side ou verticale

#### Backend
- **`lib/validation/ValidatorCore.js`** - Orchestrateur principal
  - Exécution pipeline avec sauvegarde toutes versions
  - Échantillonnage intelligent post-génération
  - Orchestration évaluations LLM par critère
  - Agrégation résultats + génération rapport

- **`lib/validation/SamplingEngine.js`** - Moteur d'échantillonnage
  - Extraction titres (H1, H2, H3, title tags)
  - Sélection paragraphes (longueur moyenne, représentatifs)
  - Extraction FAQ (paires question/réponse)
  - Parsing XML/HTML intelligent

- **`lib/validation/CriteriaEvaluator.js`** - Évaluateur multi-critères
  - Définition des critères d'évaluation (voir section dédiée)
  - Appels LLM avec prompts structurés
  - Parsing réponses LLM (score + justification)
  - Retry logic + gestion erreurs

- **`lib/validation/ValidationAPI.js`** - Endpoints API
  - POST `/api/validation/run` - Lancer validation complète
  - GET `/api/validation/status/:id` - Status temps réel
  - GET `/api/validation/results/:id` - Récupérer résultats
  - GET `/api/validation/sample/:id/:type/:index` - Détail échantillon

#### Modifications à faire
- **`lib/APIController.js`** - Ajouter routes validation
- **`lib/pipeline/PipelineExecutor.js`** - Ajouter flag `saveAllVersions: true` pour forcer sauvegarde toutes étapes intermédiaires
- **`server.js`** - Exposer endpoints validation

---

## 📊 ÉCHANTILLONNAGE INTELLIGENT

### Source des données : Objet `content` (pas de XML)

Après chaque étape du pipeline, on a un simple objet JavaScript :
```javascript
content = {
  "|MC0|": "Texte du mot-clé principal...",
  "|T0|": "Titre principal",
  "|T-1|": "Sous-titre 1",
  "|L-1|": "Texte liste 1...",
  "|FAQ_Q1|": "Question FAQ ?",
  "|FAQ_A1|": "Réponse FAQ...",
  ...
}
```

**Versions sauvegardées** : Chaque step sauvegarde son objet `content` en JSON
- `v1.0.json` (génération initiale)
- `v1.1.json` (après step 1)
- `v1.2.json` (après step 2)
- `v2.0.json` (final)

### Catégories d'échantillons

#### 1. **Titres** (TOUS)
**Sélection** : Toutes les balises contenant `T` dans leur nom
- `|T0|`, `|T-1|`, `|T+1|`, etc.

**Pourquoi tous** : Les titres sont critiques pour SEO et structure, peu nombreux

#### 2. **Contenus principaux** (4 échantillons)
**Sélection** : Balises de contenu long (`MC*`, `L*`)
- Prendre les 4 premières : `|MC0|`, `|MC+1|`, `|L-1|`, `|L+1|`

**Objectif** : Évaluer la qualité rédactionnelle sur échantillon représentatif

#### 3. **FAQ** (4 balises = 2 paires)
**Sélection** : Balises contenant `FAQ`
- 2 paires Q/A = 4 balises : `|FAQ_Q1|`, `|FAQ_A1|`, `|FAQ_Q2|`, `|FAQ_A2|`
- Si <2 paires disponibles, prendre ce qui existe

**Objectif** : Évaluer naturalité question/réponse

### Algorithme d'échantillonnage

```javascript
// Charger version finale
const finalContent = JSON.parse(fs.readFileSync('v2.0.json'));
const allTags = Object.keys(finalContent);

// Catégoriser automatiquement
const samples = {
  titles: allTags.filter(tag => tag.includes('T')),           // Tous
  content: allTags.filter(tag => tag.includes('MC') || tag.includes('L')).slice(0, 4),
  faqs: allTags.filter(tag => tag.includes('FAQ')).slice(0, 4)
};

// Pour chaque échantillon, extraire versions à travers toutes étapes
for (const tag of [...samples.titles, ...samples.content, ...samples.faqs]) {
  const versions = {};

  for (const versionPath of ['v1.0.json', 'v1.1.json', 'v1.2.json', 'v2.0.json']) {
    const versionContent = JSON.parse(fs.readFileSync(versionPath));
    versions[versionPath] = versionContent[tag] || "[Non disponible à cette étape]";
  }

  samplesData[tag] = {
    tag,
    type: tag.includes('T') ? 'title' : tag.includes('FAQ') ? 'faq' : 'content',
    versions
  };
}
```

---

## 🎯 CRITÈRES D'ÉVALUATION LLM

### Principe général
- **1 critère = 1 appel LLM** (parallélisation possible)
- **5 critères universels** applicables à tous types de contenu (titres, paragraphes, FAQ)
- **Prompt structuré** : contexte + critère + échelle notation + demande justification
- **Output attendu** : JSON `{ score: 8, reasoning: "Justification détaillée..." }`
- **LLM utilisé** : Claude Sonnet (objectivité optimale)
- **Temperature** : 0.3 (cohérence entre évaluations)

---

### 1. **Qualité globale** (0-10)

**Évalue** :
- Grammaire, orthographe, syntaxe impeccables
- Cohérence et fluidité du texte
- Pertinence par rapport au contexte (MC0, personnalité)

**Prompt template** :
```
Tu es un évaluateur objectif de contenu SEO.

CONTEXTE:
- Mot-clé principal: {MC0}
- Thématique: {T0}
- Personnalité: {personality.nom}
- Type de contenu: {type} (titre/contenu/faq)

ÉLÉMENT À ÉVALUER:
"{text}"

CRITÈRE: Qualité globale
Évalue la qualité rédactionnelle globale :
- Grammaire et syntaxe impeccables ?
- Texte fluide et cohérent ?
- Pertinent par rapport au mot-clé "{MC0}" ?

ÉCHELLE:
10 = Qualité exceptionnelle, aucune faute
7-9 = Bonne qualité, légères imperfections
4-6 = Qualité moyenne, plusieurs problèmes
1-3 = Faible qualité, nombreuses erreurs
0 = Inutilisable

Réponds en JSON strict:
{
  "score": 7.5,
  "reasoning": "Justification en 2-3 phrases concrètes..."
}
```

---

### 2. **Verbosité / Concision** (0-10)

**Évalue** :
- Densité informationnelle (info utile vs fluff)
- Longueur appropriée au type de contenu
- Évite délayage et remplissage inutile

**Prompt template** :
```
CRITÈRE: Verbosité et concision
Évalue la concision du texte :
- Densité informationnelle élevée (info utile / longueur totale) ?
- Longueur appropriée pour un {type} (ni trop court, ni verbeux) ?
- Absence de fluff et remplissage inutile ?

ÉCHELLE:
10 = Parfaitement concis, chaque mot compte
7-9 = Plutôt concis, peu de superflu
4-6 = Moyennement verbeux, du remplissage
1-3 = Très verbeux, beaucoup de fluff
0 = Délayage excessif

Réponds en JSON strict:
{
  "score": 8.0,
  "reasoning": "..."
}
```

---

### 3. **SEO et mots-clés** (0-10)

**Évalue** :
- Intégration naturelle des mots-clés pertinents
- Structure optimisée (densité, placement)
- Évite sur-optimisation (keyword stuffing)

**Prompt template** :
```
CRITÈRE: SEO et mots-clés
Évalue l'optimisation SEO :
- Mots-clés (notamment "{MC0}") intégrés naturellement ?
- Densité appropriée (ni trop faible, ni keyword stuffing) ?
- Structure SEO-friendly ?

ÉCHELLE:
10 = SEO optimal et naturel
7-9 = Bon SEO, quelques améliorations possibles
4-6 = SEO moyen, manque d'optimisation ou sur-optimisé
1-3 = SEO faible ou contre-productif
0 = Aucune considération SEO

Réponds en JSON strict:
{
  "score": 7.0,
  "reasoning": "..."
}
```

---

### 4. **Répétitions et variations** (0-10)

**Évalue** :
- Évite répétitions lexicales excessives
- Variété du vocabulaire et des formulations
- Usage de synonymes et paraphrases

**Prompt template** :
```
CRITÈRE: Répétitions et variations lexicales
Évalue la variété lexicale :
- Répétitions de mots/expressions évitées ?
- Vocabulaire varié et riche ?
- Paraphrases et synonymes utilisés intelligemment ?

ÉCHELLE:
10 = Très varié, aucune répétition notable
7-9 = Plutôt varié, quelques répétitions mineures
4-6 = Variété moyenne, répétitions visibles
1-3 = Très répétitif, vocabulaire pauvre
0 = Répétitions excessives

Réponds en JSON strict:
{
  "score": 8.5,
  "reasoning": "..."
}
```

---

### 5. **Naturalité humaine** (0-10)

**Évalue** :
- Le texte semble-t-il écrit par un humain (vs IA détectable)
- Variations de style, imperfections réalistes
- Évite patterns LLM typiques

**Prompt template** :
```
CRITÈRE: Naturalité humaine
Évalue si le texte semble écrit par un humain :
- Semble-t-il rédigé par un humain authentique ?
- Présence de variations naturelles et imperfections réalistes ?
- Absence de patterns IA typiques (phrases trop parfaites, formules creuses, superlatifs excessifs) ?

ÉCHELLE:
10 = 100% indétectable, parfaitement humain
7-9 = Très naturel, légères traces IA
4-6 = Moyennement naturel, patterns IA visibles
1-3 = Clairement IA, très artificiel
0 = Robotique et détectable immédiatement

Réponds en JSON strict:
{
  "score": 6.5,
  "reasoning": "..."
}
```

---

### Résumé des 5 critères

| Critère | Objectif | Score 10 = | Score 0 = |
|---------|----------|------------|-----------|
| **Qualité globale** | Vérifier la qualité rédactionnelle | Impeccable | Inutilisable |
| **Verbosité** | Évaluer la concision | Très concis | Délayage excessif |
| **SEO** | Mesurer l'optimisation | Optimal naturel | Aucun SEO |
| **Répétitions** | Vérifier la variété lexicale | Très varié | Très répétitif |
| **Naturalité** | Détecter l'origine humaine vs IA | 100% humain | Robotique |

---

## 🔄 WORKFLOW D'EXÉCUTION

### Phase 1 : INITIALISATION (Frontend)
1. Utilisateur charge config de pipeline (dropdown ou upload JSON)
2. Utilisateur sélectionne personnalité (dropdown depuis Google Sheets)
3. Affichage preview : pipeline steps + personnalité info
4. Bouton "Lancer Validation" → POST `/api/validation/run`

### Phase 2 : EXÉCUTION PIPELINE (Backend - ValidatorCore)
1. Créer UUID unique pour cette validation
2. Appeler PipelineExecutor avec `saveAllVersions: true`
   - Force sauvegarde objet `content` après chaque step
   - Génère versions JSON : v1.0.json (init) → v1.1.json (step1) → v1.2.json (step2) → v2.0.json (final)
3. Stocker toutes versions dans structure :
   ```
   validations/
     {uuid}/
       config.json              # Config pipeline utilisée
       personality.json         # Personnalité sélectionnée
       versions/
         v1.0.json             # { "|MC0|": "...", "|T0|": "...", ... }
         v1.1.json
         v1.2.json
         v2.0.json
       samples/
         all-samples.json      # (à créer après échantillonnage)
       results/
         evaluations.json      # (à créer après évaluations)
   ```
4. WebSocket broadcast progression : "Génération étape 1/4...", "Génération étape 2/4..."

### Phase 3 : ÉCHANTILLONNAGE (Backend - SamplingEngine)
1. Charger `v2.0.json` (version finale)
2. Extraire échantillons par filtrage automatique des balises :
   - Tous titres (balises contenant `T`) → liste `samples.titles`
   - 4 contenus (balises `MC*`, `L*`) → liste `samples.content`
   - 4 FAQ (balises `FAQ*`) → liste `samples.faqs`
3. Pour chaque échantillon, extraire versions à travers toutes étapes :
   ```javascript
   // Exemple pour "|MC0|"
   for (const versionFile of ['v1.0.json', 'v1.1.json', 'v1.2.json', 'v2.0.json']) {
     const versionContent = JSON.parse(fs.readFileSync(versionFile));
     samplesData["|MC0|"].versions[versionFile] = versionContent["|MC0|"];
   }

   // Résultat
   {
     "tag": "|MC0|",
     "type": "content",
     "versions": {
       "v1.0.json": "Texte initial...",
       "v1.1.json": "Texte après step1...",
       "v1.2.json": "Texte après step2...",
       "v2.0.json": "Texte final..."
     }
   }
   ```
4. Sauvegarder `samples/all-samples.json`
5. WebSocket broadcast : "Échantillonnage terminé : X titres, Y contenus, Z FAQ"

### Phase 4 : ÉVALUATION LLM (Backend - CriteriaEvaluator)
1. Pour chaque ÉCHANTILLON (tous types confondus : titres + contenus + FAQ)
2. Pour chaque CRITÈRE (5 critères universels)
3. Pour chaque VERSION (v1.0.json, v1.1.json, v1.2.json, v2.0.json)
4. Faire appel LLM :
   ```
   Prompt structure:
   ---
   Tu es un évaluateur objectif de contenu SEO.

   CONTEXTE:
   - Mot-clé principal: {MC0}
   - Thématique: {T0}
   - Personnalité: {personality.nom}

   ÉLÉMENT À ÉVALUER:
   Type: {type} (titre/paragraphe/FAQ)
   Contenu: "{content}"

   CRITÈRE: {criteriaName}
   Description: {criteriaDescription}

   TÂCHE:
   Évalue cet élément selon le critère ci-dessus.
   Donne une note de 0 à 10 (précision: 0.5).
   Justifie ta notation en 2-3 phrases concrètes.

   RÉPONSE ATTENDUE (JSON strict):
   {
     "score": 7.5,
     "reasoning": "Justification détaillée..."
   }
   ---
   ```
5. Parser réponse LLM, valider JSON, stocker dans :
   ```
   results/
     {sampleId}/
       {criteriaId}/
         v1.0.json
         v1.1.json
         ...
   ```
6. WebSocket broadcast progression : "Évaluation P1 - Critère 1/5 - Étape 2/4"

**Optimisation** : Paralléliser appels LLM (max 5 simultanés pour éviter rate limits)

### Phase 5 : AGRÉGATION (Backend - ValidatorCore)
1. Calculer scores moyens par :
   - Échantillon × Critère × Version → score moyen + justifications combinées
   - Critère × Version → score moyen global
   - Version globale → score moyen tous critères
2. Générer rapport JSON :
   ```json
   {
     "uuid": "...",
     "timestamp": "...",
     "config": {...},
     "personality": {...},
     "samples": {
       "titles": [...],
       "paragraphs": [...],
       "faqs": [...]
     },
     "evaluations": {
       "P1": {
         "qualite_redactionnelle": {
           "v1.0": { "score": 6.5, "reasoning": "..." },
           "v1.1": { "score": 7.0, "reasoning": "..." }
         }
       }
     },
     "aggregated": {
       "byVersion": {
         "v1.0": { "avgScore": 6.2, "breakdown": {...} },
         "v1.1": { "avgScore": 6.8, "breakdown": {...} }
       },
       "byCriteria": {...},
       "overall": { "avgScore": 7.3 }
     }
   }
   ```
3. Sauvegarder : `validations/{uuid}/report.json`
4. WebSocket broadcast : "✅ Validation terminée ! Score global : 7.3/10"

---

## 🎨 INTERFACE UTILISATEUR

### Layout général
```
+---------------------------------------------------------------+
| PIPELINE VALIDATOR                                    [Config]|
+---------------------------------------------------------------+
| [Config: default.json ▼] [Personnalité: Sophie ▼] [🚀 RUN]   |
+---------------------------------------------------------------+
| Progress: ████████████████░░░░ 80% - Évaluation P2...        |
+---------------------------------------------------------------+
|  ÉCHANTILLONS          |  VUE DÉTAILLÉE                       |
|                        |                                      |
|  📋 Titres (5)         |  Échantillon sélectionné: P2        |
|    ☑ T1: Comment...    |  ----------------------------------- |
|    ☐ T2: Les avantages |  📊 SCORES PAR ÉTAPE                |
|    ☐ T3: Guide...      |  v1.0 → v1.1 → v1.2 → v2.0          |
|                        |  6.5    7.2    7.8    8.1  (Qualité)|
|  📝 Paragraphes (4)    |  7.0    7.3    6.8    7.5  (Natural)|
|    ☐ P1: Introduction  |  ...                                 |
|    ☑ P2: Description   |  ----------------------------------- |
|    ☐ P3: Technique     |  📝 CONTENU PAR ÉTAPE               |
|    ☐ P4: Conclusion    |  [v1.0] [v1.1] [v1.2] [v2.0]        |
|                        |  (onglets ou slider)                 |
|  ❓ FAQ (2)            |                                      |
|    ☐ F1: Comment...?   |  Contenu de P2 à l'étape v1.1:      |
|    ☐ F2: Pourquoi...?  |  "Lorem ipsum dolor sit amet..."    |
|                        |                                      |
|                        |  ----------------------------------- |
|                        |  💬 JUSTIFICATIONS CRITÈRE          |
|                        |  Qualité rédactionnelle (v1.1): 7.2 |
|                        |  "La syntaxe est fluide mais..."    |
+---------------------------------------------------------------+
```

### Interactions clés

1. **Sélection échantillon** (sidebar gauche)
   - Click sur échantillon → charge vue détaillée
   - Highlight actif (bordure bleue)
   - Badge avec score moyen global (couleur selon score)

2. **Vue détaillée - Onglet Scores**
   - Graphique ligne : évolution score par critère à travers versions
   - Tableau scores : critères (lignes) × versions (colonnes)
   - Code couleur : 🟢 >7, 🟠 5-7, 🔴 <5
   - Hover sur score → tooltip avec justification courte

3. **Vue détaillée - Onglet Comparaison**
   - Slider ou onglets pour naviguer entre versions
   - Diff highlighting : vert (améliorations), rouge (dégradations) si possible
   - Métadonnées : durée step, module appliqué, LLM utilisé

4. **Vue détaillée - Onglet Justifications**
   - Accordéon : 1 section par critère
   - Pour chaque critère : timeline versions avec score + reasoning

5. **Export rapport**
   - Bouton "📥 Exporter rapport" → télécharge JSON complet
   - Bouton "📊 Exporter CSV scores" → tableau scores pour analyse externe

---

## 🔧 MODIFICATIONS NÉCESSAIRES

### Fichiers existants à modifier

#### 1. `lib/pipeline/PipelineExecutor.js`
**Modifications** :
- Ajouter paramètre config : `saveAllVersions: boolean`
- Si `true` : après chaque step, sauvegarder version intermédiaire
  - Nommer versions : v1.0, v1.1, v1.2, etc.
  - Stocker dans dossier spécifié : `outputDir`
- Retourner array de paths : `versionPaths: ['v1.0.xml', 'v1.1.xml', ...]`

**Pseudo-code** :
```javascript
SI saveAllVersions === true :
  versionPaths = []
  version = 1.0

  sauvegarder(content, `${outputDir}/v${version}.xml`)
  versionPaths.push(...)

  POUR CHAQUE step du pipeline :
    appliquer step
    version += 0.1
    sauvegarder(content, `${outputDir}/v${version}.xml`)
    versionPaths.push(...)

  version = 2.0
  sauvegarder(finalContent, `${outputDir}/v${version}.xml`)

  retourner { content, versionPaths, stats }
```

#### 2. `lib/APIController.js`
**Modifications** :
- Importer ValidatorCore, ValidationAPI
- Ajouter routes :
  ```
  POST   /api/validation/run
  GET    /api/validation/status/:id
  GET    /api/validation/results/:id
  GET    /api/validation/samples/:id
  DELETE /api/validation/:id
  ```
- Déléguer logique à ValidationAPI

#### 3. `server.js`
**Modifications** :
- Exposer routes validation via APIController
- Assurer WebSocket écoute events validation pour broadcast temps réel

#### 4. `lib/Main.js` (optionnel)
**Modifications** :
- Si ValidatorCore appelle handleFullWorkflow, s'assurer compatibilité avec flag saveAllVersions
- OU créer méthode dédiée `handleValidationWorkflow()`

---

## 📦 DÉPENDANCES

### NPM packages (déjà présents)
- `express` - API REST
- `ws` - WebSocket temps réel
- Tous les LLM clients (Anthropic, OpenAI, etc.)
- `uuid` - Génération IDs validation
- `fs` - Lecture/écriture fichiers JSON

### Packages potentiels à ajouter
- `diff` - Highlighting différences entre versions (optionnel, pour UI comparaison)
- Aucune autre dépendance nécessaire (sélection balises = filtrage JavaScript natif)

---

## 🧪 TESTING STRATEGY

### Tests unitaires
1. **SamplingEngine** :
   - Test filtrage titres (object avec balises T*, sans balises T)
   - Test sélection contenus (MC*, L*) avec slice
   - Test extraction FAQ (balises FAQ*, cas <2 paires disponibles)

2. **CriteriaEvaluator** :
   - Mock appels LLM → test parsing réponses
   - Test gestion erreurs (LLM timeout, JSON invalide)
   - Test retry logic

3. **ValidatorCore** :
   - Test orchestration complète (mock PipelineExecutor + SamplingEngine + Evaluator)
   - Test agrégation scores

### Tests d'intégration
1. Validation end-to-end :
   - Config pipeline simple (2 steps) + personnalité test
   - Vérifier génération toutes versions
   - Vérifier échantillonnage correct
   - Vérifier appels LLM réels (1 critère seulement pour rapidité)
   - Vérifier rapport final cohérent

### Tests UI
1. Chargement configs et personnalités
2. Affichage progression temps réel
3. Navigation entre échantillons
4. Affichage scores et graphiques
5. Export rapport

---

## 📈 MÉTRIQUES DE SUCCÈS

### Fonctionnel
- ✅ Exécution pipeline complète avec sauvegarde toutes versions
- ✅ Échantillonnage intelligent (diversité respectée)
- ✅ Évaluation LLM tous critères (100% réussite parsing)
- ✅ Rapport JSON complet et cohérent
- ✅ UI responsive et intuitive

### Performance
- ⏱️ Durée totale validation < 5min (pipeline 4 steps, 9 échantillons, 5 critères = ~180 appels LLM)
- ⏱️ Affichage progression temps réel < 500ms latence
- 💾 Stockage validation < 10MB (JSON + XMLs)

### UX
- 👁️ Clarté visualisation scores (code couleur intuitif)
- 🔍 Facilité navigation entre échantillons
- 📊 Pertinence justifications LLM (human-readable)

---

## 🚀 PHASES DE DÉVELOPPEMENT

### Phase 1 : Backend Core (Priorité 1)
1. Créer `ValidatorCore.js` - orchestration basique
2. Modifier `PipelineExecutor.js` - flag saveAllVersions (sauvegarde JSON après chaque step)
3. Créer `SamplingEngine.js` - filtrage balises simple (T*, MC*, L*, FAQ*)
4. Tester workflow complet sans évaluation LLM

### Phase 2 : Évaluation LLM (Priorité 1)
1. Créer `CriteriaEvaluator.js` - 2 critères seulement (qualité + naturalité)
2. Définir prompts LLM structurés
3. Implémenter parsing + retry logic
4. Tester sur 1 échantillon × 2 critères × 3 versions

### Phase 3 : API & WebSocket (Priorité 2)
1. Créer `ValidationAPI.js` - endpoints CRUD
2. Intégrer dans `APIController.js`
3. WebSocket broadcast progression
4. Tester via Postman/curl

### Phase 4 : Frontend Basique (Priorité 2)
1. Créer `pipeline-validator.html` - layout structure
2. Créer `pipeline-validator.js` - logique UI basique
3. Formulaire run + affichage progression
4. Affichage liste échantillons (sans vue détaillée)

### Phase 5 : Frontend Avancé (Priorité 3)
1. Vue détaillée échantillon (onglets scores/comparaison/justifications)
2. Graphiques évolution scores (Chart.js ou similaire)
3. Diff highlighting versions
4. Export rapport (JSON/CSV)

### Phase 6 : Critères Complets (Priorité 3)
1. Implémenter tous critères (5 par type)
2. Affiner prompts LLM selon résultats tests
3. Ajouter échantillonnage FAQ

### Phase 7 : Polish & Optimisation (Priorité 4)
1. Parallélisation appels LLM (pool workers)
2. Cache résultats évaluations (si re-run même config)
3. UI animations et micro-interactions
4. Documentation utilisateur

---

## ⚠️ POINTS D'ATTENTION

### Challenges techniques

1. **Volume appels LLM** :
   - Exemple : 4 steps × 9 échantillons × 5 critères = 180 appels
   - Solution : Parallélisation + gestion rate limits
   - Alternative : Évaluer seulement versions clés (v1.0, milieu, v2.0)

2. **Sélection balises robuste** :
   - Structures de balises variées selon templates
   - Solution : Filtrage simple par `.includes()` avec fallbacks, gestion balises manquantes

3. **Cohérence évaluations LLM** :
   - Variabilité réponses LLM même prompt
   - Solution : Temperature basse (0.3), prompts très structurés, moyenne sur 2-3 runs ?

4. **Storage validations** :
   - Accumulation fichiers si beaucoup de validations
   - Solution : Cleanup automatique après 7 jours, ou limit stockage 50 validations

### UX considérations

1. **Durée exécution longue** (3-5min)
   - User peut quitter page → validation continue en background
   - Notification email/webhook quand terminé ?
   - OU : Polling API status si user revient

2. **Complexité interface** :
   - Beaucoup d'informations (scores, justifications, versions)
   - Solution : Progressive disclosure (accordéons, onglets), filtres

3. **Interprétation scores** :
   - User peut ne pas comprendre critères
   - Solution : Tooltips explicatifs, guide méthodologie

---

## 🎓 ÉVOLUTIONS FUTURES

### V2 Features
1. **Comparaison multi-validations** :
   - Comparer 2 configs de pipeline côte à côte
   - Graphique : évolution scores Config A vs Config B

2. **Critères personnalisés** :
   - User peut définir ses propres critères d'évaluation
   - Upload JSON ou formulaire UI

3. **Benchmarking automatique** :
   - Base de données scores moyens par secteur/type contenu
   - Afficher percentile (votre score vs moyenne)

4. **Export rapport PDF** :
   - Rapport visuel professionnel (graphiques, tableaux)
   - Pour présentation clients/stakeholders

5. **A/B Testing intégré** :
   - Définir 2+ variants pipeline
   - Run validation sur tous, afficher gagnant selon critères pondérés

---

## ✅ CHECKLIST PRÉ-DÉVELOPPEMENT

Avant de commencer à coder, valider :

- [ ] Comprendre parfaitement workflow utilisateur (run test manuel similaire)
- [ ] Valider structure données échantillons (JSON schema)
- [ ] Tester 1 prompt LLM évaluation manuellement (Claude playground)
- [ ] Vérifier `PipelineExecutor` actuel peut sauvegarder versions intermédiaires
- [ ] Confirmer structure dossiers validations (`validations/{uuid}/...`)
- [ ] Designer mockup UI (Figma/papier) pour valider UX
- [ ] Estimer coût LLM par validation (180 appels × prix Claude)

---

## 💰 ESTIMATION COÛTS LLM

### Hypothèses
- Pipeline : 4 steps → 4 versions (v1.0, v1.1, v1.2, v2.0)
- Échantillons : ~5 titres + 4 contenus + 4 FAQ = **13 balises**
- Critères : **5 critères universels** (applicables à tous)
- Total appels : 13 échantillons × 5 critères × 4 versions = **260 appels**

### Coût par appel (Claude Sonnet)
- Input : ~500 tokens (contexte + prompt + échantillon)
- Output : ~150 tokens (JSON score + reasoning)
- Prix Claude Sonnet 4.5 : $3/M input + $15/M output
- Coût par appel : (500 × $3/1M) + (150 × $15/1M) = $0.0015 + $0.00225 = **~$0.00375**

### Coût total par validation
- 260 appels × $0.00375 = **~$0.98 par validation** (≈ $1)

### Optimisations possibles
1. **Réduire versions évaluées** (seulement v1.0, v1.2, v2.0) → 3 versions au lieu de 4 = **-25% = $0.73**
2. **Critères prioritaires** (3 au lieu de 5 : Qualité, SEO, Naturalité) → **-40% = $0.59**
3. **Échantillonnage réduit** (3 titres, 2 contenus, 2 FAQ = 7 balises) → **-46% = $0.53**
4. **Combiner toutes optimisations** → **~$0.25-$0.35 par validation**

### Recommandation
**Configuration standard** : 260 appels, $1/validation → Bon compromis exhaustivité/coût

**Configuration économique** : 3 critères + 3 versions + 7 balises = 63 appels → **$0.24/validation**

---

## 📝 RÉSUMÉ EXÉCUTIF

### Ce qui sera créé
1. **Interface web complète** : `pipeline-validator.html/.js/.css`
2. **Backend validation** : 4 nouveaux modules (`ValidatorCore`, `SamplingEngine`, `CriteriaEvaluator`, `ValidationAPI`)
3. **Modifications légères** : `PipelineExecutor` (flag saveAllVersions), `APIController` (routes)
4. **Système d'évaluation** : **5 critères universels** LLM (Qualité, Verbosité, SEO, Répétitions, Naturalité), notation 0-10 + justifications
5. **Visualisation avancée** : Scores évolution, comparaison versions, justifications détaillées

### Format de données
- **Entrée** : Objet JavaScript `content = { "|MC0|": "texte", "|T0|": "titre", ... }`
- **Versions sauvegardées** : JSON (`v1.0.json`, `v1.1.json`, `v1.2.json`, `v2.0.json`)
- **Échantillonnage** : Sélection automatique par filtrage de balises (pas de parsing XML)
- **Output** : Rapport JSON complet avec scores et justifications

### Code réutilisé
- 70% logique `pipeline-runner.html/.js` (UI run, progression, WebSocket)
- 100% `PipelineExecutor.js` (juste ajout flag `saveAllVersions`)
- 100% `LLMManager.js` (appels LLM pour évaluations)
- Structure dossiers `configs/`, `personalities` (Google Sheets)

### Complexité
- **Backend** : Moyenne (orchestration simple, sélection balises, appels LLM)
- **Frontend** : Moyenne-Haute (visualisation scores, comparaison versions)
- **Durée développement estimée** : 3-4 jours (phases 1-5)

### Coût opérationnel
- **~$1 par validation** (260 appels LLM Claude Sonnet)
- **Mode économique** : $0.24/validation (63 appels)

### Valeur business
- ✅ **Objectivité** : Validation qualité quantitative (vs jugement subjectif)
- ✅ **Traçabilité** : Impact mesurable de chaque layer pipeline
- ✅ **Optimisation** : Comparaison scientifique de configs (data-driven)
- ✅ **Reporting** : Scores quantitatifs présentables aux clients
- ✅ **Debugging** : Identification précise des étapes qui dégradent/améliorent

---

**DOCUMENT PRÊT POUR VALIDATION AVANT DÉVELOPPEMENT** 🚀
