# GAB-292 · OralLearningSpeechPlan — « Plan d'exposé anti-récitation »

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

## Pack (structure officielle par-GAB)
```
GAB-292/
  renderer.html            ← moteur plan oral (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` · `speech_plan_id` · `topic` · `plan_sections[]{id,label,time_start,time_end,color_role,text}` · `duration_target` · `success_criteria`

Optionnels : `hook_help`, `transition_prompts`, `key_message`, `speaker_notes_policy`, `example_plan`, `source_metadata`, `primary_cta{label,action}`, `secondary_cta{label,action}`, `anti_recitation_rationale`, `accessibility`, `child_safety`.

## Ce qui vient du JSON vs HTML
- **JSON** : sujet (`topic`), durée (`duration_target`), toutes les sections temporelles (`plan_sections`), message-clé (`key_message`), consigne anti-récitation (`speaker_notes_policy`), exemple plan (`example_plan`), libellés des CTAs.
- **HTML** : timeline colorée, zones structurelles, moteur JS, layout, fallback BLOCKED.

## Archétype — plan oral anti-récitation
GAB-292 produit un plan d'exposé structuré en sections temporelles. Chaque section porte une couleur de rôle (`hook`, `body1`, `body2`, `closing`) et un horodatage. L'élève voit le plan-trame mais **pas de texte à lire** (consigne `speaker_notes_policy`). Le CTA principal déclenche une aide contextuelle pour construire son propre plan ; le CTA secondaire révèle un `example_plan` sur un sujet différent.

## Garde-fous (child_safety + anti-invention)
- **BLOCKED** si `plan_sections` absent ou vide, `topic` absent, ou `duration_target` absent.
- **success_criteria** : champ requis dans le contrat mais **absent du HTML demo** → instance porte `_TODO` explicite ; le renderer l'affiche en mode TODO-warning sans crasher.
- Aucune récitation imposée : le rendu est conçu pour des mots-clés, jamais un texte complet.
- `color_role` accepte : `hook` / `body1` / `body2` / `closing` — tout rôle inconnu est rendu sans style spécial (dégradation gracieuse).

## _TODO / contenus manquants
- `success_criteria` : non fourni dans le HTML demo (GAB source affiche juste le chip slot). À compléter par l'instance réelle (ex: « contact visuel maintenu · respect du temps · 3-4 mots-clés max par fiche »).
- `transition_prompts` : slot optionnel listé mais sans contenu demo — non inclus dans l'instance example.

## QA à vérifier
1. Modifier `topic` / `plan_sections[].text` → rendu change sans toucher au HTML (critère d'or).
2. `plan_sections:[]` → BLOCKED propre affiché.
3. `topic` absent → BLOCKED propre affiché.
4. CTA primaire → message aide « Construis ton plan ».
5. CTA secondaire → `example_plan` affiché.
6. Responsive 375/768/1024 — sections sans débordement.
7. Instance externe injectée via `ENGINE.init(myInstance)` → rendu change.

## Source
`INDEX-300-orallearning-GAB-291-295-PLAYABLE.html` (stage `data-tpl="292"`, section GAB-292 SPEECHPLAN, lignes 370–456).
