# GAB-060 · StoryInlineQuestion — « Question dans la scène »

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

## Pack (structure officielle par-GAB)
```
GAB-060/
  renderer.html            ← moteur question inline (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` · `inline_question_id` · `scene_text` · `question_text` · `choices[]{id,text,is_correct,feedback}`

Optionnels : `primary_cta{label,action}`, `_note_dev`.

## Ce qui vient du JSON vs HTML
- **JSON** : texte de scène, question, chaque choix (texte + correct/incorrect + feedback), libellé du bouton CTA.
- **HTML** : layout de la carte, gestion de l'état (verrou post-réponse), styles OK/KO, affichage du feedback, bouton structurel.

## Garde-fous (child_safety)
- **Exactement 1 `is_correct:true`** obligatoire — le moteur émet BLOCKED si 0 ou plus d'un.
- **Verrou post-réponse** : `answered=true` dès le premier clic, tous les boutons passent `disabled`.
- **Anti-invention** : aucun texte pédagogique n'est codé en dur dans le HTML.
- **BLOCKED** si `choices` absent/vide, `scene_text` absent, `question_text` absent, 0 ou plusieurs `is_correct:true`.

## QA à vérifier
1. Clic bon choix → fond mint, mark ✓, feedback ok affiché.
2. Clic mauvais choix → fond coral sur sélection, fond mint sur le bon, feedback ko affiché.
3. Double clic → verrou actif, aucun changement d'état.
4. `choices:[]` → BLOCKED propre.
5. `scene_text` absent → BLOCKED propre.
6. Instance externe injectée via `ENGINE.init(ext)` → rendu change sans modifier le HTML.
7. Responsive 375/768/1024.

## external_refs / dependencies
- Signature couleur **magenta** (`--magenta:#B23CE0`) propre au module EdTechStoryLearning (GAB-060 à GAB-064).
- Aucun asset externe requis (aucune image, aucune icône CDN).
- `window.GAB_CTA_HANDLER(action, data)` : hook optionnel pour intégration dans un player narratif (non requis pour le rendu standalone).

## Source
`INDEX-300-storylearning-GAB-060-064-PLAYABLE.html` (stage `data-tpl="60"`, handler `iqPick`, CSS `.iq-*`).
