# GAB-298 · OralLearningImprovisationPrompt — « Impro avec cadre · anti-panique »

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

## Pack (structure officielle par-GAB)
```
GAB-298/
  renderer.html            ← moteur improvisation cadrée (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` · `impro_prompt_id` · `prompt` · `preparation_policy{duration_s,instruction}` · `response_frame[]{phase,duration_s,instruction}` · `success_criteria`

Optionnels : `title`, `subtitle`, `difficulty`, `difficulty_max`, `timebox`, `hint_allowed`, `starter_phrases`, `fallback_prompt`, `rationale`, `primary_cta{label,action,timer_s,timer_label}`, `source_metadata`.

## Ce qui vient du JSON vs HTML
- **JSON** : le prompt (question d'impro), la politique de préparation, les phases du cadre de réponse, les 3 amorces, le fallback, le rationale pédagogique, le libellé et la durée du timer CTA.
- **HTML** : layout des zones, affichage du timer, couleurs des phases (PREP=sky/SPEAK=violet/PAUSE=mint), panel feedback, liste des slots.

## Garde-fous (child_safety / anti-panique)
- **ANTI-PANIQUE** : `fallback_prompt` fournit systématiquement une porte de sortie bienveillante. Jamais culpabilisant.
- **Cadre imposé** : `response_frame` empêche la page blanche. L'élève a toujours une structure (Annonce + 2 raisons + conclusion).
- **Starters** : 3 amorces permettent de démarrer sans effort de formulation à froid.
- **BLOCKED** si `prompt` absent · `preparation_policy` absent · `response_frame` vide · `success_criteria` absent.

## QA à vérifier
1. Modifier `prompt` → texte de la question change sans toucher au HTML (critère d'or).
2. `response_frame:[]` → BLOCKED propre.
3. Timer 30s → décompte visible, fin = message vert.
4. `hint_allowed` → bouton apparaît, clic affiche le hint depuis le JSON.
5. `starter_phrases` absentes → bloc starters masqué (pas d'erreur).
6. Responsive 375/768/1024.

## external_refs / dependencies
- **Chaîne Oral vague 2** : ce GAB s'insère entre GAB-297 (OralLearningStressSupport) et GAB-299 (OralLearningAnswerFollowUp).
- GAB-297 : quand l'élève est très stressé, orienter vers 297 avant 298.
- GAB-299 : après une réponse à un prompt d'impro, une relance bienveillante peut suivre via 299.

## Source
`INDEX-300-orallearning-GAB-296-300-PLAYABLE.html` (stage `data-tpl="298"`, section `<!-- GAB-298 IMPROVISATIONPROMPT -->`).
