# GAB-042 · KettyInterventionCompact — « Intervention compacte de Ketty »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechPlayKit
**Critère validé :** changer le JSON change la bulle/persona/CTA sans modifier le HTML. ✅ check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-042/
  renderer.html            ← moteur intervention Ketty (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` · `intervention_id` · `persona_name` · `persona_emoji` · `body`

Optionnels : `persona_tag`, `cta_label`, `tone`.

## Ce qui vient du JSON vs HTML
- **JSON** : texte de la bulle (`body`), nom de la mascotte (`persona_name`), emoji avatar (`persona_emoji`), badge sous le nom (`persona_tag`), libellé du bouton replay (`cta_label`).
- **HTML** : structure carte (avatar + bulle + flèche), animation typewriter, animation ketty-bob, bouton replay structurel, layout.

## Archétype
GAB-042 est une **intervention non intrusive** de la mascotte dans le flow pédagogique. Elle diffère du module Ketty complet (chat) : pas d'historique, pas de saisie utilisateur. Un seul message, une animation typewriter, un bouton replay. Taille S · priorité P0.

## Garde-fous (child_safety)
- **body vide → BLOCKED** : une intervention sans texte n'a aucun sens pédagogique.
- **Anti-hallucination** : aucun contenu textuel en dur dans le moteur. Le `body` injecté doit venir du contexte pédagogique (GamificationAdapter, moteur exercice, etc.), jamais généré aléatoirement.
- **prefers-reduced-motion** : si actif, le texte s'affiche immédiatement sans effet typewriter.
- **Limite corps** : un `body` de plus de 200 caractères est hors spec (format XS/S) ; à signaler au consommateur.

## QA à vérifier
1. Modifier `body` → texte dans la bulle change sans toucher au HTML (critère d'or).
2. Modifier `persona_name`/`persona_emoji` → avatar et nom changent.
3. `body` absent → BLOCKED propre, pas d'erreur JS.
4. `cta_label` absent → libellé par défaut affiché.
5. Clic replay → animation typewriter relancée.
6. `prefers-reduced-motion` → texte immédiat, 0 animation.
7. Responsive 375/768/1024 : avatar et bulle sans débordement.

## Source
`INDEX-300-playkit-GAB-041-044-PLAYABLE.html` (stage `data-tpl="42"`, handler `kettyReplay()`, constante `KETTY_MSG`).
