# GAB-119 · ExerciseTrueFalse — « Vrai / Faux »

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

## Pack (structure officielle par-GAB)
```
GAB-119/
  renderer.html            ← moteur Vrai/Faux (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` · `answer` (enum `'true'`/`'false'`)

Optionnels : `title`, `instruction`, `feedback_correct`, `feedback_wrong`, `label_true`, `label_false`.

## Ce qui vient du JSON vs HTML
- **JSON** : la question (affirmation à juger), la bonne réponse (`'true'` ou `'false'`), les deux feedbacks, les libellés des boutons, la consigne.
- **HTML** : les deux boutons structurels, la zone de feedback, le layout, les états visuels (reveal-ok / reveal-ko).

## Garde-fous (child_safety)
- **Anti-invention** : aucun contenu pédagogique en dur dans le HTML ; tout vient de l'instance.
- **Verrouillage** : après une première sélection, les boutons sont `disabled` + `aria-disabled=true` — aucune modification possible.
- **Révélation neutre** : la bonne réponse est toujours affichée en vert (`reveal-ok`), qu'elle soit choisie ou non.
- **BLOCKED** si `question` absent, `answer` absent, ou `answer` différent de `'true'`/`'false'`.

## QA à vérifier
1. Modifier `question` / `answer` / feedbacks → rendu change sans toucher au HTML (critère d'or).
2. `answer` absent ou invalide → BLOCKED propre, zone exercice masquée.
3. `answer='false'` + clic Vrai → bouton Faux `reveal-ok`, bouton Vrai `reveal-ko`, feedback `feedback_wrong` affiché.
4. `answer='false'` + clic Faux → bouton Faux `reveal-ok`, feedback `feedback_correct` affiché.
5. Second clic après réponse → aucun effet (verrouillage).
6. Instance externe injectée → rendu change sans modifier le HTML.
7. Responsive 375 / 768 / 1024 — boutons empilés en mobile.

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