# GAB-132 · ExerciseExamModeQuestion — « Question mode examen »

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

## Pack (structure officielle par-GAB)
```
GAB-132/
  renderer.html            ← moteur question examen (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
Question type brevet/DNB avec :
- Header sombre avec titre de session et barème en badge doré
- Label de consigne (durée conseillée) optionnel
- Énoncé de la question
- Bloc « Attendus pour la note maximale » (liste à puces)
- Zone de saisie textarea libre (resize vertical)
- Deux boutons : Brouillon (sauvegarde provisoire) + Rendre (soumission)
- Feedback contextuel : trop court (gold), rendu OK (mint), brouillon (sky)

## Champs requis (instance, à plat)
`gab_id` · `exercise_id` · `title` · `question` · `attendus[]`

Optionnels : `consigne_label`, `bareme`, `placeholder`, `min_length`, `feedback_too_short`, `feedback_submitted` (supporte `{length}`), `feedback_draft`, `cta_draft_label`, `cta_submit_label`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, barème, consigne, question, liste des attendus, placeholder, seuil min_length, tous les feedbacks, libellés des boutons.
- **HTML** : layout carte sombre, header, textarea, boutons structurels, feedback panel, slots display.

## Garde-fous (child_safety)
- **BLOCKED** si `question` absent, `attendus` vide ou absent, `exercise_id` absent.
- Le moteur valide les 3 champs requis métier avant tout rendu ; en cas d'erreur, le message BLOCKED est affiché dans le feedback panel.
- `feedback_submitted` supporte `{length}` interpolé côté moteur (nombre de caractères saisis).
- `min_length` par défaut à 20 si absent — empêche les soumissions vides.

## QA à vérifier
1. Modifier `question`/`attendus` → rendu change sans toucher au HTML (critère d'or).
2. `attendus:[]` → BLOCKED propre dans le feedback panel.
3. Soumission réponse < `min_length` → feedback gold affiché.
4. Soumission réponse >= `min_length` → feedback mint avec longueur interpolée.
5. Clic brouillon → feedback sky.
6. `ENGINE.init(autreInstance)` → rendu change (injection externe).
7. Responsive 375/768/1024.

## Source
`INDEX-300-exerciselearning-GAB-131-135-PLAYABLE.html` (stage `data-tpl="132"`, handlers `exmDraft`, `exmSubmit`, styles `.exm-*`).
