# GAB-067 · StoryChapterEnd — « Fin de chapitre »

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

## Pack (structure officielle par-GAB)
```
GAB-067/
  renderer.html            ← moteur fin de chapitre (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

Écran de **clôture d'un chapitre** (plusieurs épisodes) : il combine synthèse des acquis (summary + key_points), célébration visuelle (medal_emoji, kick_label) et ouverture vers le chapitre suivant (primary_cta). Jalon majeur du parcours narratif.

À utiliser :
- Pour clôturer un chapitre (plusieurs épisodes)
- Synthèse + validation + ouverture vers la suite

Ne pas utiliser :
- Fin d'un épisode unique → GAB-059
- Cliffhanger → GAB-058
- Milieu de chapitre

## Champs requis (instance, à plat)
`gab_id` · `chapter_end_id` · `chapter_title` · `summary` · `key_points[]` · `primary_cta{label, action}`

Optionnels : `medal_emoji` (défaut 🏆), `kick_label`, `cta_validated_label`.

## Ce qui vient du JSON vs HTML
- **JSON** : emoji médaille, kick-label, titre du chapitre, résumé des acquis, liste de points-clés, libellé du bouton CTA, libellé post-validation.
- **HTML** : carte, animation médaille, chips points-clés, bouton structurel, état disabled post-clic, layout, fallback BLOCKED.

## Garde-fous (child_safety)
- **BLOCKED** si `chapter_title`, `summary`, `key_points` (vide) ou `primary_cta.label` absents.
- `key_points` : formulations courtes (≤ 60 caractères), factuelles — jamais de question ni contenu inexact.
- `summary` : bilan d'acquis à la 2e personne (tu), pas de question, pas de promesse hors-périmètre.
- Bouton désactivé après clic (idempotence, pas de double-navigation accidentelle).

## QA à vérifier
1. Modifier `chapter_title` / `summary` / un item `key_points` → rendu change sans toucher au HTML (critère d'or).
2. `key_points:[]` → BLOCKED propre.
3. `chapter_title` absent → BLOCKED propre.
4. Clic CTA → label change vers `cta_validated_label`, bouton désactivé, flèche → ✓.
5. `init(ext)` avec instance externe → rendu mis à jour sans rechargement.
6. Responsive 375/768/1024.

## Source
`INDEX-300-storylearning-GAB-065-069-PLAYABLE.html` (stage `data-tpl="67"`, handler `chendNext()`).

## external_refs / dependencies
- **GAB-059** : fin d'épisode unique (écran voisin dans le lot GAB-065-069)
- **GAB-058** : cliffhanger (écran voisin)
- **GAB-068** : recommandation de suite (écran voisin, même lot)
