# GAB-155 · GameResultFeedback — « Feedback de fin de jeu »

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

## Pack (structure officielle par-GAB)
```
GAB-155/
  renderer.html            ← moteur feedback résultat (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
```

## Champs requis (instance, à plat)
`gab_id` · `game_result_id` · `title` · `score` · `error_count` · `time_display` · `primary_cta{label,action}`

Optionnels : `result_emoji`, `score_label`, `error_label`, `time_label`, `learning_heading`, `learning_icon`, `learning_text`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre du résultat, emoji d'ambiance, valeurs score/erreurs/temps, libellés des métriques, texte pédagogique d'apprentissage, libellé du bouton CTA.
- **HTML** : carte métriques à 3 colonnes, bloc apprentissage (masqué si absent), bouton structurel, layout, fallback.

## Garde-fous (child_safety)
- **Anti-invention** : `learning_text` peut contenir `<b>` uniquement (HTML restreint). Toute autre balise doit être nettoyée côté producteur.
- **Bloc apprentissage optionnel** : si `learning_text` est absent, le bloc est masqué (`hidden`) — aucun contenu fantôme affiché.
- **BLOCKED** si `title`, `score`, `error_count`, `time_display` ou `primary_cta` absent.
- **Distinction archétype** : ce GAB est distinct de GAB-129 (résultat exercice noté), GAB-150 (débrief manipulation) et GAB-021 (recap fin session moteur).

## QA à vérifier
1. Modifier `score`/`title`/`learning_text` → rendu change sans toucher au HTML (critère d'or).
2. `primary_cta` absent → BLOCKED propre.
3. `learning_text` absent → bloc `gf-learn` masqué.
4. CTA cliqué → panel confirmation (`panel ok`).
5. Responsive 375/768/1024 — carte métriques en colonne sur mobile.

## Source
`INDEX-300-gamelearning-GAB-151-155-PLAYABLE.html` (stage `data-tpl="155"`, commentaire `<!-- GAB-155 -->`).

## external_refs / dependencies
- **GAB-154** (ActionChallenge) : GAB précédant qui produit le `score` et `error_count` consommés ici. Les valeurs de l'instance exemple (`score:12`, `error_count:2`, `time_display:'⏱️ 1:42'`) sont extraites de l'écran source hardcodé — elles ont vocation à être injectées dynamiquement par le moteur de jeu à la fin de chaque session.
- Slots de la source hardcodée : `title` · `summary` · `result` · `primary_cta` (requis) + `score` · `learning` (optionnels) — alignés dans ce contrat.
