# GAB-117 · ExerciseMCQSingle — « QCM à réponse unique »

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

## Pack (structure officielle par-GAB)
```
GAB-117/
  renderer.html            ← moteur QCM single (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` · `exercise_id` · `question` · `choices[]{id,text,is_correct}` · `feedback_correct` · `feedback_incorrect`

Optionnels : `title`, `instruction`, `feedback_correct_header`, `feedback_incorrect_header`.

## Ce qui vient du JSON vs HTML
- **JSON** : texte de la question, libellé + statut de chaque option, feedback correct, feedback incorrect, headers feedback, instruction.
- **HTML** : structure options, lock après sélection, révélation bonne réponse, layout, fallback BLOCKED.

## Garde-fous (child_safety)
- **Exactement 1 `is_correct:true`** dans `choices` — si plusieurs → utiliser GAB-118.
- **Lock immédiat** après sélection : pas de retry possible (aucune chance de tâtonner).
- **Bonne réponse toujours révélée** si une mauvaise option est choisie.
- **BLOCKED** si `question` absent / `choices` absent ou vide / `feedback_correct` absent / `feedback_incorrect` absent.

## QA à vérifier
1. Modifier `question`/`choices`/`feedback_*` → rendu change sans toucher au HTML (critère d'or).
2. `choices:[]` → BLOCKED propre.
3. Clic bonne réponse → feedback vert, option verte, toutes locked.
4. Clic mauvaise réponse → feedback rouge, mauvaise option rouge, bonne option verte révélée.
5. Double clic après réponse → aucun effet (guard `answered`).
6. Responsive 375/768/1024.

## Source
`INDEX-300-exerciselearning-GAB-116-120-PLAYABLE.html` (stage `data-tpl="117"`, handler `mcqsPick()`).

## Références hors-lot (external_refs / dependencies)
- GAB-118 (ExerciseMCQMultiple) : variante avec plusieurs bonnes réponses.
- GAB-119 (ExerciseTrueFalse) : variante binaire Vrai/Faux.
- GAB-096 : quiz d'aperçu non noté (ne pas utiliser GAB-117 pour ce cas).
- GAB-049 : choix narratif (ne pas utiliser GAB-117 pour ce cas).
