# GAB-238 · FeedbackLearningCompareAnswer — « Comparaison côte à côte »

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

## Pack (structure officielle par-GAB)
```
GAB-238/
  renderer.html            ← moteur comparaison (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` · `compare_id` · `user_answer` · `expected_answer` · `diff_items[]{status,label,detail}` · `primary_cta{label,action}`

Optionnels : `title`, `subtitle`, `compare_type`, `reason_title`, `reason_text`, `privacy_note`, `secondary_cta{label,action}`.

## Ce qui vient du JSON vs HTML
- **JSON** : la réponse élève, l'attendu template, les écarts (diff_items), le reason_text, la privacy_note, les libellés des CTA.
- **HTML** : colonnes yours/expected, diff-box, reason-block, privacy-banner, bouton structurel, layout responsive.

## Garde-fous
- **Privacy-aware** : `user_answer` est un affichage transitoire uniquement — jamais stocké durablement en base.
- **Anti-invention** : `expected_answer` doit être un template pédagogique validé — jamais généré par IA à la volée en contexte sensible.
- **No-reward-write** : ce gabarit n'écrit jamais de XP, coins ou badges. C'est PlayKit qui orchestre la gamification.
- **BLOCKED** si `compare_id` / `user_answer` / `expected_answer` / `diff_items` / `primary_cta` absents.

## Distinctions (GAB-238 vs adjacents)
- **GAB-236 PartialCredit** : bilan "garder/corriger" qualitatif, sans affichage de la raw answer.
- **GAB-238 CompareAnswer** : comparaison structurée côte à côte réponse élève vs attendu template + diff explicites.
- **StepByStepSolution** : correction complète détaillée — pas le rôle ici.

## QA à vérifier
1. Modifier `user_answer`/`expected_answer` → colonnes changent sans toucher au HTML (critère d'or).
2. `diff_items:[]` → BLOCKED propre.
3. `primary_cta` absent → BLOCKED propre.
4. Instance externe injectée via `ENGINE.init(ext)` → rendu change.
5. Responsive 375/768/1024 — colonnes empilées sur mobile.

## Source
`INDEX-300-feedbacklearning-GAB-236-240-PLAYABLE.html` (stage `data-tpl="238"`, bloc `.ca-card`).
