# GAB-233 · FeedbackLearningEncouragement — « Encouragement humain non-infantilisant »

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

## Pack (structure officielle par-GAB)
```
GAB-233/
  renderer.html            ← moteur encouragement Ketty (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
Encouragement factuel et contextuel porté par la voix Ketty. Anti-flatterie : le message est ancré dans une action concrète de l'élève (effort, erreur, progrès partiel…). Fréquence limitée à 1×/session pour éviter la lassitude.

## Champs requis (instance, à plat)
`gab_id` · `encouragement_id` · `encouragement_context` (enum 6 valeurs) · `title` · `body` · `primary_cta{label,action}`

Optionnels : `avatar_emoji`, `context_tag`, `hint`, `anti_flatter_note`, `context_variants{after_effort,after_mistake,partial_success,resume,before_retry,after_progress}`, `max_per_session`, `accessibility`, `child_safety`.

## Les 6 valeurs de encouragement_context
| Valeur | Déclencheur |
|---|---|
| `after_effort` | Après un effort visible (temps de réflexion) |
| `after_mistake` | Après une erreur non-grave |
| `partial_success` | Réussite partielle (ex : bonne formule, justification manquante) |
| `resume` | Reprise de session après interruption |
| `before_retry` | Avant un réessai équipé |
| `after_progress` | Progrès mesurable constaté |

## Ce qui vient du JSON vs HTML
- **JSON** : titre, corps (HTML léger), indice, variante active, libellé et action du bouton, note doctrine anti-flatterie, max_per_session.
- **HTML** : layout carte, avatar, context-tag, liste chips switchables, bouton structurel, zone doctrine, affichage d'erreur BLOCKED.

## Garde-fous (child_safety)
- **Anti-invention** : le contenu est extrait à 100% du HTML source hardcodé — aucune ligne inventée.
- **Anti-flatterie** : `body` doit être contextuel et factuel. Le moteur affiche la note `anti_flatter_note` en zone doctrine.
- **No reward trigger** : `child_safety.no_reward_trigger:true` — ce GAB ne déclenche jamais de reward.
- **Tone** : `human_to_human` — jamais infantilisant.
- **BLOCKED** si `encouragement_id` / `encouragement_context` / `title` / `body` absents ou context hors enum.

## QA à vérifier
1. Modifier `title`/`body`/`hint` dans l'instance → rendu change sans toucher au HTML (critère d'or).
2. `encouragement_context` hors enum → BLOCKED propre.
3. `body` absent → BLOCKED propre.
4. Clic sur un chip variante → titre/corps/indice mis à jour sans rechargement.
5. Instance externe injectée via `ENGINE.init(monInstance)` → rendu complet.
6. Responsive 375/768/1024 → 0 débordement horizontal.

## Source
`INDEX-300-feedbacklearning-GAB-231-235-PLAYABLE.html` (stage `data-tpl="233"`, handler `enPick`, variable `EN_CTX`).
