# GAB-116 · ExerciseQuestionCard — « Carte question (conteneur) »

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

## Pack (structure officielle par-GAB)
```
GAB-116/
  renderer.html            ← moteur carte question (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_card_id` · `instruction` · `question`

Optionnels : `title`, `illustration{src,alt}`, `primary_cta{label,action}`, `child_safety`.

## Ce qui vient du JSON vs HTML
- **JSON** : texte de la consigne, texte de la question, libellé du bouton CTA, illustration éventuelle.
- **HTML** : layout de la carte, zone instruction, zone question, zone illustration (masquée si absente), bouton structurel, fallback BLOCKED.

## Archétype
Conteneur générique pour tout exercice : il pose uniquement l'énoncé (instruction + question).
Le type de réponse (QCM, vrai/faux, réponse courte…) est fourni par les gabarits consommateurs GAB-117 à GAB-120.

## Garde-fous (child_safety)
- **BLOCKED** si `instruction` ou `question` absent.
- **0 contenu en dur** dans le HTML : toute modification de l'énoncé se fait dans l'instance JSON.
- **illustration** optionnelle : si absente du JSON, la zone n'est jamais rendue (pas de `src` vide).
- **CTA** : libellé vient du JSON, jamais hardcodé.

## QA à vérifier
1. Modifier `question` ou `instruction` dans le JSON → rendu change sans toucher au HTML (critère d'or).
2. Retirer `instruction` → BLOCKED propre.
3. Retirer `question` → BLOCKED propre.
4. Ajouter `illustration{src,alt}` → zone image apparaît.
5. Supprimer `illustration` → zone masquée, aucune erreur.
6. Responsive 375/768/1024 — aucun débordement.

## external_refs / dependencies
GAB-116 est le **conteneur d'énoncé** ; les gabarits suivants en sont les consommateurs naturels :
- **GAB-117** (ExerciseMCQSingle) — QCM réponse unique
- **GAB-118** (ExerciseMCQMultiple) — QCM réponses multiples
- **GAB-119** (ExerciseTrueFalse) — Vrai / Faux
- **GAB-120** (ExerciseShortAnswer) — Réponse courte

## Source
`INDEX-300-exerciselearning-GAB-116-120-PLAYABLE.html` (stage `data-tpl="116"`, zone `.ex-stem`).
