# GAB-300 · OralLearningFinalRehearsal — « Répétition finale avant le jour J »

**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-300/
  renderer.html            <- moteur répétition finale (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` · `final_rehearsal_id` · `oral_context_ref` · `rehearsal_checklist{heading, items[]{label,done}}` · `completion_policy` · `next_action{primary_cta_label, primary_cta_confirm, secondary_cta_label, secondary_cta_reveal}`

Optionnels : `title`, `subtitle`, `milestone_banner{icon,label,text}`, `recording_policy{options[]{id,icon,label,detail}}`, `timer_policy{duration_min,label}`, `final_plan_ref`, `self_review_ref`, `teacher_review_ref`, `privacy_notice{heading,bullets[]}`, `non_certification_notice{heading,text}`, `reason_block{heading,text}`, `source_metadata`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, checklist items + état done/todo, options recording, textes non-certification, bullets privacy, raison pédagogique, libellés CTA, confirm message.
- **HTML** : moteur, layout, styles, animations, grille fr-options, blocs structurels, BLOCKED handler.

## Archétype
Écran de clôture de séquence (FinalRehearsal) : checklist pré-répétition + choix opt-in recording + doctrine non-certification + privacy notice RGPD-lite + explication pédagogique. Conçu pour être rassurant, sans pression de performance.

## Garde-fous (child_safety)
- **NON-CERTIFICATION absolue** : `completion_policy='non_certifying'` vérifié à la validation — le moteur n'attribue jamais de note, badge ou certificat.
- **Recording opt-in** : aucun enregistrement forcé, choix explicite JSON via `recording_policy.options`.
- **Privacy notice locale** : bullets venant du JSON — jamais durcis dans le HTML.
- **BLOCKED** si `final_rehearsal_id`, `oral_context_ref`, `rehearsal_checklist` (items vides), `completion_policy` ou `next_action` absents.
- **Données locales** : le moteur n'envoie aucune donnée réseau (pas de fetch, pas de beacon).

## QA à vérifier
1. Modifier un `item.label` dans la checklist → rendu change sans toucher au HTML.
2. `rehearsal_checklist.items:[]` → BLOCKED propre.
3. `completion_policy` absent → BLOCKED.
4. Clic "AVEC enregistrement" → feedback vert "✓ Choix : AVEC enregistrement".
5. Clic CTA primaire → confirm message JSON, bouton grisé.
6. Clic CTA secondaire → reveal teacher_review_ref JSON.
7. Responsive 375/768/1024 — fr-options en 1 col sur mobile.
8. 0 ombre noire `rgba(0,0,0,...)`.
9. 1 seul bloc `<script>` sans attribut.
10. `window.GAB_INSTANCE` inline == instance.example.json (jumeau exact).

## external_refs / dependencies
- Chaîne oral vague 2 : GAB-296 (VoiceClarity) → GAB-297 (StressSupport) → GAB-298 (ImprovisationPrompt) → GAB-299 (AnswerFollowUp) → **GAB-300 (FinalRehearsal)**.
- `oral_context_ref` → DNB_oral_séance_finale (contexte pédagogique défini dans le CORE-GAB registry).
- `final_plan_ref` → plan à 4 sections temporelles construit dans un GAB amont (SpeechPlan).
- `self_review_ref` → grille d'auto-évaluation post-répétition (module aval).
- `teacher_review_ref` → grille enseignant (clarté, structure, contenu, gestion du stress).

## Source
`INDEX-300-orallearning-GAB-296-300-PLAYABLE.html` (stage `data-tpl="300"`, CSS `.fr-*` + `.safety-block` + `.reason-block`). GAB-300 = bornage symbolique : 300/625 GAB designed.
