# GAB-180 · LevelTestRecommendationBridge — « Pont vers recommandations »

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

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

## Archétype

**Composant transversal** : activé après affichage du profil (GAB-179). Traduit un diagnostic LevelTest en actions concrètes et priorisées vers les modules cibles (Visual/Exercise/Memory/Story). N'évalue pas, ne note pas — c'est un pont d'orientation.

## Champs requis (instance, à plat)

`gab_id` · `bridge_id` · `title` · `summary` · `items[]{priority, priority_label, type, icon, title, detail, confirm_feedback}` · `primary_cta{label, action, confirm_feedback}`

Optionnels : `banner_text`, `_note_dev`.

## Ce qui vient du JSON vs HTML

- **JSON** : titre du plan, sous-titre, texte bannière, tous les items (icône, priorité, type, titre, détail, feedback confirmation), libellé et feedback du bouton primaire.
- **HTML** : grille des items, système de priorités colorées, layout responsive, logique de confirmation, panel feedback.

## Garde-fous (child_safety)

- **BLOCKED** si `items` absent ou vide / `primary_cta` absent / `bridge_id` absent.
- **Anti-invention** : aucun texte pédagogique hardcodé dans le HTML — tous les libellés, titres, détails et feedbacks viennent exclusivement de l'instance JSON.
- **Jamais noté** : ce composant est un pont d'orientation, pas une évaluation. Il ne calcule pas de score, ne note pas l'élève.
- Les feedbacks de confirmation sont cosmétiques (UX) — ils ne valident pas pédagogiquement.

## Types de module supportés

| type    | couleur icône       | usage                         |
|---------|---------------------|-------------------------------|
| `fiche` | sky → sky-deep      | fiche visuelle (GAB-0xx)      |
| `exo`   | mint → mint-deep    | série d'exercices guidés      |
| `mem`   | violet → violet-deep| flashcards / mémorisation     |
| `story` | magenta → magenta-deep | narration / récit contexte |

## QA à vérifier

1. Modifier `title`/`items[0].title` → rendu change sans toucher au HTML (critère d'or).
2. `items: []` → BLOCKED propre.
3. `primary_cta` absent → BLOCKED propre.
4. Clic item → `confirm_feedback` de l'item affiché, flèche remplacée par ✓.
5. Clic primary_cta → `primary_cta.confirm_feedback` affiché, bouton passe en vert.
6. Instance externe injectée via `ENGINE.init(ext)` → rendu change sans modifier le HTML.
7. Responsive 375/768/1024 — aucun débordement horizontal.

## external_refs / dependencies

| GAB     | Rôle                                                  |
|---------|-------------------------------------------------------|
| GAB-179 | LevelTestProfileResult — ce pont est activé juste après |
| GAB-131 | Remédiation post-erreur — ne pas confondre avec GAB-180 |
| GAB-160 | Pont récompense PlayKit — ne pas confondre            |
| GAB-163 | Débrief mini-jeu — ne pas confondre                   |

## Source

`INDEX-300-leveltest-GAB-176-180-PLAYABLE.html` (stage `data-tpl="180"`, handler `peConfirm`).
