# GAB-177 · LevelTestQuestionAdaptive — « Question adaptative »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechLevelTest
**Critère validé :** changer le JSON change la question, les choix et les feedbacks sans modifier le HTML. ✅ check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-177/
  renderer.html            ← moteur question adaptative (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` · `question_id` · `question_text` · `choices[]{letter,text,correct:boolean}` · `feedback_correct` · `feedback_incorrect` · `cta_next_label`

Optionnels : `title`, `progress_current`, `progress_total`, `level`, `level_label`, `branch_header`, `next_level_if_correct`, `next_level_label_correct`, `next_level_if_incorrect`, `next_level_label_incorrect`.

## Ce qui vient du JSON vs HTML
- **JSON** : texte de la question, libellés et statut correct de chaque choix, feedbacks de branche (correct/incorrect), libellé bouton Continuer, progression, niveau initial et niveaux suivants adaptatifs.
- **HTML** : carte QCM, barre de progression, chips de niveau, bloc branche, layout, fallback BLOCKED.

## Garde-fous (child_safety / anti-invention)
- **Anti-invention** : le contenu de la question exemple (triangle rectangle / hypoténuse) est extrait directement du HTML source GAB-177, sans modification ni ajout pédagogique.
- **BLOCKED** si `question_text` absent, `choices` vide/absent ou sans `correct:true`, `feedback_correct`/`feedback_incorrect`/`cta_next_label` absents.
- **Exactement 1 `correct:true`** dans choices (validé par schema.contract.json).
- **Branche réellement adaptative** : `next_level_if_correct` et `next_level_if_incorrect` doivent être différents.

## QA à vérifier
1. Modifier `question_text` / `choices` → rendu change sans toucher au HTML (critère d'or).
2. `choices:[]` → BLOCKED propre.
3. Bonne réponse → `feedback_correct` affiché + niveau bascule vers `next_level_if_correct`.
4. Mauvaise réponse → `feedback_incorrect` affiché + bonne réponse révélée + niveau bascule vers `next_level_if_incorrect`.
5. Bouton "Question suivante" → réinitialise choix, incrémente compteur.
6. Instance externe injectée via `ENGINE.init(data)` → rendu change.
7. Responsive 375/768/1024.

## Source
`INDEX-300-leveltest-GAB-176-180-PLAYABLE.html` (stage `data-tpl="177"`, handlers `qaPick` / `qaContinue`).

## external_refs / dependencies
Aucune dépendance cross-lot. GAB-177 est autonome dans EdTechLevelTest.
- GAB-176 (LevelTestIntro) : écran d'introduction précédant les questions.
- GAB-178 (LevelTestConfidenceAsk) : question de confiance succédant chaque question adaptative.
Ces GABs sont dans le même lot (LOT-leveltest-GAB-176-180) mais chacun est indépendant.
