# GAB-165 · GameMiniBoss — « Mini-boss pédagogique »

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

## Pack (structure officielle par-GAB)
```
GAB-165/
  renderer.html            ← moteur mini-boss (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` · `miniboss_id` · `title` · `objective` · `skills[]{icon,label}` · `stats[]{value,label}` · `primary_cta{label,action,feedback}`

Optionnels : `banner_label`, `subtitle`, `objective_prefix`.

## Ce qui vient du JSON vs HTML
- **JSON** : bannière, titre, sous-titre, objectif, liste de compétences, stats (durée/marge/récompense), libellé et feedback du bouton.
- **HTML** : layout carte, décor ⚔️, grille de stats, chips de compétences, bouton structurel, zone feedback, slots footer.

## Garde-fous (child_safety)
- **Anti-invention** : tous les textes (banner, title, subtitle, objective, skills, stats, CTA) viennent exclusivement du JSON. Aucun contenu pédagogique n'est codé en dur dans le HTML.
- **objective** accepte les balises `<b>` uniquement pour mettre en valeur les termes clés (causes, événements, etc.) — toutes les autres balises sont échappées.
- **BLOCKED** si `title`, `objective`, `skills`, `stats` ou `primary_cta` sont absents ou vides.
- **Stats** : 3 blocs attendus dans l'ordre (Durée, Marge, Récompense) — libellés et valeurs viennent du JSON.

## QA à vérifier
1. Modifier `title`/`subtitle`/`objective` → rendu change sans toucher au HTML (critère d'or).
2. `skills:[]` → BLOCKED propre.
3. `primary_cta` absent → BLOCKED propre.
4. Clic bouton CTA → `primary_cta.feedback` affiché sous le bouton (animation slide-in).
5. Instance externe injectée via `ENGINE.init(ext)` → rendu change sans modifier le HTML.
6. Responsive 375 px : stats en colonne unique.

## Source
`INDEX-300-gamelearning-GAB-161-165-PLAYABLE.html` (stage `data-tpl="165"`, handler `peConfirm()`, CSS `.mb-*`).

## external_refs / dependencies
- `peConfirm()` helper utilisé dans le source playable pour le feedback CTA est réimplémenté nativement dans le moteur ENGINE (autonome, sans dépendance externe).
- Icône joueur 👑 et décor ⚔️ sont des emoji natifs (pas d'assets externes).
