# GAB-050 · StoryChoiceConsequence — « Choix à conséquence »

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

## Pack (structure officielle par-GAB)
```
GAB-050/
  renderer.html            ← moteur choix à conséquence (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` · `story_choice_id` · `question` · `choices[]{id, text, is_good, feedback_label, feedback_text}`

Optionnels : `fallback_text_summary`.

## Ce qui vient du JSON vs HTML
- **JSON** : question posée, lettre et texte de chaque option, booléen `is_good`, label et texte du feedback différencié.
- **HTML** : structure card, boutons, feedback box animée, styles mint/coral, lock après 1er clic, layout responsive.

## Archétype
Gabarit narratif « choix à conséquence » (StoryLearning wave 2). L'élève fait un choix parmi N options ; l'option bonne/mauvaise déclenche un feedback coloré différencié (mint = bonne approche, coral = conséquence négative). Un seul clic autorisé (lock moteur). Vise l'apprentissage par l'erreur sécurisée.

## Garde-fous
- **Lock après 1er clic** : `DATA._locked` mis à `true`, tous les boutons `disabled` — aucun double-clic possible.
- **BLOCKED** si `story_choice_id`, `question` ou `choices` absents/vides.
- **Anti-invention** : tout le contenu (question, options, feedbacks) vient du JSON. Le HTML ne contient aucun texte pédagogique en dur.
- **DS V2** : 0 `box-shadow rgba(0,0,0,…)` — ombres colorées uniquement.
- **Palette magenta** : signature du module EdTechStoryLearning (conformément à INDEX-300).

## QA à vérifier
1. Modifier `question` dans le JSON → titre hero + question card changent sans toucher au HTML.
2. Clic option `is_good:true` → option stylée mint + feedback mint révélé.
3. Clic option `is_good:false` → option stylée coral + feedback coral révélé.
4. Double-clic → second clic ignoré (lock actif).
5. `choices:[]` → BLOCKED propre.
6. `init(ext)` avec instance externe → rendu change.
7. Responsive 375/768/1024 — aucun débordement.

## External refs / dependencies
- Styles et tokens DS V2 : identiques à ceux de l'INDEX-300 source (mêmes variables CSS, même palette magenta pour StoryLearning).
- Référence module : GAB-049 (choix sans suite), GAB-051 (révélation directe) — voir INDEX-300 `use_when / do_not_use_when`.

## Source
`INDEX-300-storylearning-GAB-050-054-PLAYABLE.html` (stage `data-tpl="50"`, handler `consPick`).
