# GAB-049 · StoryChoiceBasic — « Choix narratif simple »

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

## Pack (structure officielle par-GAB)
```
GAB-049/
  renderer.html            ← moteur choix narratif (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` · `choice_id` · `title` · `choices[]{letter, text, correct:boolean, feedback}`

Optionnels : `subtitle`, `_note_dev`, `renderer_key`.

## Ce qui vient du JSON vs HTML
- **JSON** : question (`title`), sous-titre (`subtitle`), texte de chaque option, quelle option est correcte, feedback différencié correct/wrong.
- **HTML** : layout card, boutons structurels, logique pick/reset, palette DS V2, animations.

## Archétype pédagogique
GAB-049 est le **dernier écran** d'une séquence StoryLearning (après GAB-045 intro, GAB-046 scène, GAB-047 dialogue, GAB-048 problème). Il demande à l'élève de faire un **choix narratif** pour avancer dans le récit, vérifie une compréhension légère, et révèle immédiatement si la réponse est correcte.

**Particularité** : 1 seule bonne réponse parmi N options (typiquement 2), feedback inline immédiat, possibilité de recommencer. Ce n'est pas un QCM noté — c'est un choix de récit à feedback pédagogique.

## Garde-fous (child_safety)
- **BLOCKED** si `title` absent / `choices` invalides (< 2 items) / aucun `correct:true`.
- **Anti-invention** : aucun texte de question, option ou feedback n'est hardcodé dans le moteur — tout vient de l'instance.
- **Reset toujours accessible** : l'élève peut recommencer le choix sans recharger.
- **Feedback signalétique** : ✓ vert (mint) pour le bon choix, ✕ rouge (coral) pour le mauvais — cohérent avec DS V2 StoryLearning (signature magenta).

## QA à vérifier
1. Modifier `title` → question change sans toucher au HTML (critère d'or).
2. `choices:[]` → BLOCKED propre.
3. `correct:true` absent → BLOCKED propre.
4. Clic option correcte → border mint + feedback ✓.
5. Clic option incorrecte → border coral + option correcte surlignée mint aussi.
6. Bouton reset → état initial restauré.
7. Responsive 375/768/1024.

## Source
`INDEX-300-storylearning-GAB-045-049-PLAYABLE.html` (stage `data-tpl="49"`, handlers `choicePick()` / `choiceReset()`).

## Contenu extrait du source (exemple d'instance)
- Question : *"Par où commencer l'enquête ?"*
- Sous-titre : *"Que faut-il comprendre d'abord ?"*
- Option A (correcte) : *"Les causes de la colère du peuple"* → feedback *"✓ Exact ! On comprend la colère avant de retenir la date."*
- Option B (incorrecte) : *"La date de la prise de la Bastille"* → feedback *"✕ La date vient après — comprends d'abord le pourquoi."*
