> ⚠️ **GAB SENSIBLE — VALIDATION BOSS OBLIGATOIRE avant tout usage.** (child-safety / RGPD / orientation / career). Contenu extrait sans invention ; à relire par un humain.

# GAB-366 · OrientationLearningTrainingRouteCompare — « Comparer des formations »

**Archétype / renderer_key :** `compare_grid` (cartographie) · **module :** EdTechOrientationLearning
**Critère validé :** changer le JSON change la comparaison sans modifier le HTML. ✅ check.py 12/12.

> ⚠️ **GAB SENSIBLE — REVUE BOSS REQUISE.** Contenu d'orientation pour mineurs (child-safety / RGPD). Toute mise en prod doit être relue par Boss. Aucune invention de contenu pédagogique : tout vient STRICTEMENT du HTML source. Garde-fous neutralité/admission ci-dessous à ne pas affaiblir.

## ⚙️ renderer_key à concevoir (pas de moteur kit)
`compare_grid` n'a **pas** de moteur de référence dans le kit. Le renderer a donc été **dérivé de l'écran source lui-même** (stage `data-tpl="366"`, handlers `d366C`) : grille 2 colonnes de cartes formation + chips de critères neutres + panneau de feedback + rappel de neutralité. Le moteur est autonome, piloté à 100 % par l'instance.

## Pack (structure officielle par-GAB)
```
GAB-366/
  renderer.html            ← moteur comparaison (ne pas modifier par instance)
  instance.example.json    ← SOURCE DE VÉRITÉ (contenu réel extrait du HTML, à plat)
  schema.contract.json     ← contrat de validation
  README-contract.md       ← ce fichier
```

## Champs requis (instance, à plat)
`gab_id` · `compare_id` · `formations[]{label,kind,details}` · `neutral_criteria[]{label,feedback,warning}` · `neutrality_warning`
Optionnels : `title`, `state_label`, `criteria_prompt`, `use_when[]`, `do_not_use_when[]`, `child_safety{}`.

## Ce qui vient du JSON vs HTML
- **JSON** : les 2 (+) cartes formation, leurs détails, chaque critère neutre + son message de feedback + son flag `warning`, le rappel de neutralité, les listes use/do_not_use.
- **HTML** : grille de comparaison, chips, panneau de feedback, layout, badge d'état, slots.

## Garde-fous (child_safety) — NE PAS AFFAIBLIR
- **Comparaison neutre** : `neutrality_warning` obligatoire — « aucune formation n'est la meilleure dans l'absolu, ça dépend de TON projet ». Absent → BLOCKED.
- **Admission jamais garantie** : le critère Admission porte `warning:true` et invite à un plan B.
- **Choix personnel préservé** : l'outil compare, il ne décide pas (pas de verdict « meilleure formation »).
- **BLOCKED** si < 2 formations / `neutral_criteria` vides / `neutrality_warning` absent.

## QA à vérifier
1. Modifier un `feedback`/`details` → rendu change sans toucher au HTML (critère d'or). 2. `formations` à 1 élément → BLOCKED propre. 3. Clic critère Admission → panneau warning « admission NON garantie » + rappel neutralité visible. 4. `neutrality_warning` retiré → BLOCKED. 5. Responsive 375/768/1024.

## external_refs / dependencies
- **GAB-367** (OrientationLearningDecisionMatrix) : référencé dans `do_not_use_when` (« matrice de décision → GAB-367 »). Hors-lot logique mais même lot fichier 366→370. Aucune dépendance de code.
- Aucune autre dépendance externe.

## Source
`INDEX-300-orientationlearning-GAB-366-370-PLAYABLE.html` (stage `data-tpl="366"`, commentaire `<!-- GAB-366 -->`, handlers `d366C`).
