# GAB-148 · InteractiveScenarioBranch — « Scénario à embranchements »

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

## Pack (structure officielle par-GAB)
```
GAB-148/
  renderer.html            ← moteur scénario à embranchements (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
```

## Archétype

**InteractiveScenarioBranch** : une question pédagogique centrale + N choix mutuellement exclusifs (min 2), chacun déclenchant l'affichage d'une branche de conséquences pédagogiques. Aucun choix n'est "faux" — chaque option oriente la suite de façon distincte.

Différent de :
- GAB-049 (choix qui modulent une histoire narrative)
- GAB-117 (QCM avec une seule bonne réponse)
- GAB-046 (scénario fictif Story)

## Champs requis (instance, à plat)
`gab_id` · `scenario_id` · `instruction` · `choices[]{id,label,description?}` · `branches{[id]:string}`

Optionnels : `title`, `branch_heading`, `branch_placeholder`, `feedback`.

## Ce qui vient du JSON vs HTML
- **JSON** : la question (`instruction`), chaque choix (`label`, `description`), chaque branche de conséquence (`branches`), le titre de zone (`branch_heading`), le placeholder initial (`branch_placeholder`), le feedback global (`feedback`).
- **HTML** : layout carte, grille de boutons, zone branche, animation, palette DS V2.

## Garde-fous (child_safety)
- **BLOCKED** si `instruction` absente, `choices` vides, ou `branches` absent — le moteur affiche un message d'erreur lisible et ne rend rien.
- **HTML inline** autorisé dans `branches` (balises `<b>`, `<em>`, `<strong>` uniquement) — jamais de scripts ni d'attributs d'événements.
- **Choix non jugés** : le GAB ne doit pas désigner un choix comme "mauvais" — chaque branche est une conséquence neutre (logique pédagogique, pas notation).

## QA à vérifier
1. Modifier `instruction` + `choices` → rendu change sans toucher au HTML (critère d'or).
2. `choices:[]` → BLOCKED propre.
3. `branches` absent → BLOCKED propre.
4. Clic sur chaque choix → branche correspondante affichée, `branch_heading` visible.
5. Feedback global visible après première sélection.
6. ENGINE.init(extInstance) → rendu change (injection externe).
7. Responsive 375/768/1024.

## Source
`INDEX-300-interactivelearning-GAB-146-150-PLAYABLE.html` (stage `data-tpl="148"`, handler `scPick`, objet `SC_DATA`).

## external_refs / dependencies

Aucune dépendance externe (renderer 100 % autonome, palette DS V2 inline).
