# GAB-172 · AudioOralExamPractice — « Entraînement examen oral »

**Archétype / renderer_key :** `media_viewer` (cartographie) · **module :** EdTechAudioLearning
**Note :** renderer_key `media_viewer` sans moteur kit de référence — renderer conçu à partir de l'écran source lui-même.

## Pack (structure officielle par-GAB)
```
GAB-172/
  renderer.html            ← moteur entraînement 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` · `title` · `instruction` · `steps[]{index, title, description, duration}`

Optionnels : `oral_exam_id`, `estimated_duration`, `format_label`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre de la session, consigne, chaque étape (titre, description, durée), durée totale indicative, libellé du format.
- **HTML** : moteur de progression des étapes, états visual (active/done), boutons Précédent/Suivant, banner de complétion.

## Archétype
Gabarit de progression linéaire avec étapes marquables : l'élève avance étape par étape, chaque étape pouvant être marquée "faite" avant de passer à la suivante. Conçu pour structurer une présentation orale (introduction → développement → conclusion), générique pour tout format (brevet, grand oral, soutenance, exposé).

## Garde-fous (child_safety)
- Le renderer ne joue **aucun audio** : c'est un guide de progression visuelle, pas un lecteur média. Le titre `AudioOralExamPractice` indique l'usage dans un contexte audio-learning, non la présence d'audio dans ce gabarit.
- **Aucun contenu pédagogique inventé** : les 3 étapes (Introduction/Développement/Conclusion) sont extraites mot pour mot de l'écran source HTML.
- **BLOCKED** si `steps` est absent/vide, `title` absent, `instruction` absente ou `gab_id` absent.
- Durées affichées comme indicatives (chaînes libres, jamais interprétées comme contraintes dures).

## QA à vérifier
1. Modifier un `title` ou `description` d'étape dans le JSON → rendu change sans toucher au HTML (critère data-driven).
2. `steps:[]` → BLOCKED propre avec message explicite.
3. Navigation Précédent/Suivant → états active/done corrects.
4. Dernière étape + Suivant → banner "Entraînement terminé" visible + bouton désactivé.
5. ENGINE.init(customInstance) → rendu change sans recharger la page.
6. Responsive 375/768/1024 : aucun débordement.

## Source
`INDEX-300-audiolearning-GAB-171-175-PLAYABLE.html` (stage `data-tpl="172"`, section `<!-- GAB-172 -->`, handlers `oePick / oePrev / oeNext`).

## external_refs / dependencies
- **GAB-171 (AudioReadingCoach)** : gabarit complémentaire du même lot, pour la lecture phrase par phrase. Le slot-panel de GAB-172 dans la source référence GAB-171 comme alternative (lecture phrase par phrase vs examen oral structuré).
- **GAB-132** : examen écrit (alternative non-oral, référencée dans do_not_use_when de la source).
- Aucun moteur kit de référence pour `media_viewer` dans ce lot — le renderer est autonome.
