# GAB-231 · FeedbackLearningInstantFeedback — « Retour immédiat polymorphe »

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

## Pack (structure officielle par-GAB)
```
GAB-231/
  renderer.html            ← moteur feedback instantané (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 pédagogique

GAB-231 est le gabarit de **feedback immédiat polymorphe** de la boucle FeedbackLearning. Il affiche un retour contextuel en 1-2 phrases juste après qu'une réponse a été soumise. L'état `feedback_state` pilote l'ensemble du rendu visuel (couleur, icône, titre, CTA) depuis le JSON — aucun contenu en dur dans le HTML.

Boucle canonique :
```
réponse élève → GAB-231 InstantFeedback → NextStep ou RetryGuide (GAB-234) ou ExplainMistake (GAB-232)
```

## Champs requis (instance, à plat)

`gab_id` · `feedback_id` · `feedback_state` · `title` · `feedback` · `primary_cta` · `states{correct,almost,incorrect,incomplete,needs_review}`

Optionnels : `hint`, `hint_icon`, `explanation`, `retry_cta`, `next_action`.

## Les 5 feedback_state (extraits du source HTML)

| state | couleur | icône source | titre source |
|---|---|---|---|
| `correct` | mint (vert) | ✓ | Excellent ! |
| `almost` | gold (or) | 💡 | Presque ! |
| `incorrect` | coral (rouge) | ✕ | Pas encore |
| `incomplete` | sky (bleu) | ⋯ | Réponse incomplète |
| `needs_review` | magenta | 📖 | À revoir avant d'avancer |

## Ce qui vient du JSON vs HTML

- **JSON** : `feedback_state`, `title`, `feedback`, `hint`, `hint_icon`, `primary_cta`, et le dictionnaire `states` (chaque state complet).
- **HTML** : structure de carte, styles par state (classes CSS), moteur ENGINE, layout, slots panel.

## Garde-fous (child_safety + doctrine)

- **NO-REWARD-WRITE strict** : GAB-231 n'écrit JAMAIS XP, coins ou badges. La récompense reste côté PlayKit Rewards (séparation idempotente).
- **Anti-invention** : tous les textes (feedback, hint, CTA) proviennent du source HTML — aucun contenu inventé.
- **BLOCKED** si `feedback_id`, `feedback_state`, `feedback` ou `states` sont absents.
- **Non-culpabilisant** : les feedbacks négatifs (`incorrect`, `needs_review`) sont factuels et orientés action, jamais humiliants.

## QA à vérifier

1. Modifier `feedback_state` dans l'instance → rendu couleur + titre + CTA change sans toucher au HTML.
2. `feedback_state` absent → BLOCKED propre avec liste des champs manquants.
3. `states` vide `{}` → BLOCKED 'states vide ou absent'.
4. Injecter via `ENGINE.init(ext)` → le rendu change.
5. Responsive 375/768/1024 — CTA pleine largeur mobile.

## external_refs / dependencies

Ce gabarit s'inscrit dans la boucle FeedbackLearning (module 15, vague 1) avec :
- **GAB-232** FeedbackLearningExplainMistake — suite possible après `incorrect` ou `almost`
- **GAB-233** FeedbackLearningEncouragement — suite possible après `almost` ou `incomplete`
- **GAB-234** FeedbackLearningRetryGuide — suite possible après `almost`, `incorrect`, `incomplete`
- **GAB-235** FeedbackLearningSuccessSummary — suite possible après `correct`
- **PlayKit Rewards** (externe au module) — orchestre les récompenses XP/badges/coins déclenchées APRÈS le feedback, jamais par lui.

## Source

`INDEX-300-feedbacklearning-GAB-231-235-PLAYABLE.html` (stage `data-tpl="231"`, handlers `ifSet`, objet `IF_STATES`).
