# GAB-150 · InteractiveCompletionDebrief — « Débrief de fin d'activité »

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

## Pack (structure officielle par-GAB)
```
GAB-150/
  renderer.html            ← moteur débrief (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` · `debrief_id` · `title` · `primary_cta{label,action}`

Optionnels : `subtitle`, `header_emoji`, `observed{label,text}`, `understood{label,text}`, `next_action{label,text}`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, sous-titre, emoji, texte des 3 blocs pédagogiques, libellé du bouton CTA.
- **HTML** : structure de la carte, couleurs des blocs (obs=sky, und=violet, nxt=mint), mise en page, masquage conditionnel des blocs absents.

## Archétype
Débrief de clôture d'une activité interactive. Présente 3 moments pédagogiques :
1. **OBSERVÉ** (👀, sky) — ce que l'élève a pu constater dans la manipulation
2. **COMPRIS** (🧠, violet) — la conclusion cognitive à retenir
3. **FAIRE** (🚀, mint) — le prochain geste d'apprentissage conseillé

## Garde-fous (child_safety / anti-invention)
- Les 3 blocs sont optionnels — si absents du JSON, le HTML les masque proprement (pas d'erreur JS).
- **BLOCKED** si `title` absent / `debrief_id` absent / `primary_cta` absent.
- Aucun contenu pédagogique en dur dans le HTML — tout vient de l'instance.

## QA à vérifier
1. Modifier `title`/`observed.text` → rendu change sans toucher au HTML (critère d'or).
2. Supprimer `title` → BLOCKED propre, message d'erreur visible.
3. Instance externe injectée via `GAB150.init(ext)` → rendu adopte le nouvel contenu.
4. Blocs optionnels absents → sections masquées, 0 erreur JS.
5. Clic CTA → message de confirmation affiché.
6. Responsive 375/768/1024 — aucun débordement.

## Source
`INDEX-300-interactivelearning-GAB-146-150-PLAYABLE.html` (stage `data-tpl="150"`, helper `peConfirm()`).

## external_refs / dependencies
- **Séquence typique** : GAB-146 (SortLab) → GAB-147 (HypothesisTest) → GAB-148 (ScenarioBranch) → GAB-149 (FeedbackOverlay) → **GAB-150 (CompletionDebrief)**
- **Ne pas confondre avec** : GAB-129 (débrief exercice noté), GAB-021 (fin session moteur), GAB-109 (fin session Memory)
