# GAB-125 · ExerciseOpenExplain — « Explication ouverte »

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

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

GAB-125 est un exercice de **rédaction ouverte** : l'élève rédige librement (textarea), puis révèle une **grille de critères de réussite** à cocher (auto-évaluation). Aucune correction automatique — l'évaluation reste à la charge de l'élève ou de Ketty (IA cadrée).

## Champs requis (instance, à plat)
`gab_id` · `exercise_id` · `instruction` · `question` · `cta_label` · `criteria[]`

Optionnels : `title`, `answer_placeholder`, `word_count_hint`, `criteria_header`, `ai_feedback_note`, `accessibility`, `child_safety`.

## Ce qui vient du JSON vs HTML
- **JSON** : instruction badge, question, placeholder, hint comptage mots, libellé du bouton CTA, libellé grille, chaque critère, note IA.
- **HTML** : layout textarea, barre compteur, bouton structurel, liste critères, tick-box, note IA.

## Garde-fous (child_safety)

- **Données locales uniquement** : aucune réponse élève n'est transmise (état uniquement dans le DOM).
- **Auto-évaluation** : la grille de critères est indicative, pas un score officiel.
- **BLOCKED** si `question` absent / `instruction` absent / `criteria` vide.
- **CTA structurel** : libellé vient du JSON (`cta_label`), jamais en dur dans le HTML.

## QA à vérifier
1. Modifier `question` → rendu change sans toucher au HTML (critère d'or).
2. `criteria:[]` → BLOCKED propre dans le panel d'erreur.
3. Clic CTA → grille révélée, bouton désactivé ; tick fonctionne au clic et au clavier.
4. Compteur mots se met à jour à chaque frappe.
5. Instance externe injectée via `ENGINE.init(ext)` → rendu change.
6. Responsive 375/768/1024.

## Source
`INDEX-300-exerciselearning-GAB-121-125-PLAYABLE.html` (stage `data-tpl="125"`, handlers `oeCount`, `oeReveal`, `oeTick`).

## Dépendances externes (external_refs / dependencies)
- `ai_feedback_note` mentionne **Ketty** (mascotte IA DIGIKA). Ce champ est optionnel ; le renderer l'affiche s'il est présent mais ne dépend pas de l'API Ketty. Si un consommateur veut brancher Ketty : utiliser EdTechChatAPI-v4 (hors scope GAB-125).
