# GAB-045 · StoryAdventureIntro — « Intro d'aventure narrative »

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

## Pack (structure officielle par-GAB)
```
GAB-045/
  renderer.html            ← moteur intro aventure (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
GAB-045 ouvre un épisode narratif (StoryLearning). Sa fonction est de placer l'élève dans un contexte vivant, d'énoncer une mission pédagogique claire, et de déclencher l'aventure par un CTA. Le contenu sombre (card `#2A1B45 → ink`) avec le dégradé magenta-sky est la signature visuelle du module StoryLearning.

## Champs requis (instance, à plat)
`gab_id` · `adventure_id` · `title` · `body` · `primary_cta{label, icon, action}`

Optionnels : `mission_tag`, `mission_icon`, `title_em`, `objective`, `accepted_feedback`, `accepted_icon`.

## Ce qui vient du JSON vs HTML
- **JSON** : mission tag + icône, titre complet + fragment em coloré, corps narratif, objectif Mission, libellé/icône/action du bouton CTA, texte du bandeau accepted.
- **HTML** : card sombre, layout, bouton structurel, bandeau accepted (visibilité hidden/visible), slots panel.

## Garde-fous (child_safety)
- **Anti-invention** : contenu extrait uniquement du source HTML (stage `data-tpl="45"`, handler `advStart()`). Aucun texte inventé.
- **BLOCKED** si `title`, `body` ou `primary_cta` absent — message d'erreur lisible à l'écran.
- `title_em` doit être un sous-fragment de `title` — sinon le titre s'affiche sans `<em>`.
- `body` : texte narratif contextuel uniquement, jamais de règle pédagogique directe (domaine du GAB suivant).

## QA à vérifier
1. Modifier `body`/`title`/`objective` → rendu change sans toucher au HTML (critère d'or).
2. `primary_cta` absent → BLOCKED propre.
3. Clic CTA → bouton grisé + icône ✓ + label "Mission acceptée" + bandeau vert `accepted_feedback`.
4. `title_em` absent → title affiché sans em coloré, pas d'erreur JS.
5. Responsive 375/768/1024 → aucun débordement.

## Source
`INDEX-300-storylearning-GAB-045-049-PLAYABLE.html` (stage `data-tpl="45"`, handlers `advStart()`).
