# GAB-296 · OralLearningVoiceClarity — « Clarté vocale · anti-discrimination »

**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-296/
  renderer.html            ← moteur clarté vocale (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
```

## Archétype

**OralLearningVoiceClarity** : présente 3 critères techniques observables de clarté orale
(débit, volume, articulation) avec une notice anti-discrimination explicite
(`no_identity_judgment_notice`). Jamais l'accent, jamais l'identité.
Un bloc `feedback_policy` illustre la prudence du feedback IA.
Un bloc `reason_block` explique l'éthique du choix de ces critères.

## Champs requis (instance, à plat)

| Champ | Type | Description |
|---|---|---|
| `gab_id` | string | `"GAB-296"` |
| `voice_clarity_id` | string | Identifiant unique de la session clarté |
| `practice_ref` | string | Référence à l'exercice/oral source |
| `clarity_criteria` | array | 3 critères : `{key, icon, label, text, meter_active, meter_total}` |
| `feedback_policy` | object | `{heading, example_text}` — exemple de feedback prudent |
| `no_identity_judgment_notice` | object | `{label, heading, bullets[]}` — notice anti-discrimination |

## Champs optionnels

`title`, `intro_text`, `reason_block{heading,text}`, `primary_cta{label,action}`,
`secondary_cta{label,action}`, `accessibility`, `child_safety`.

## Ce qui vient du JSON vs HTML

- **JSON** : titre, intro, notice safety (label + heading + bullets), 3 critères (icône, label, texte, niveaux de la barre), feedback exemple, reason_block, libellés CTA.
- **HTML** : layout, barres de niveau, blocs structurels, moteur, fallback BLOCKED.

## Garde-fous (child_safety / anti-discrimination)

- **NO_IDENTITY_JUDGMENT** : aucun critère ne juge l'accent, le timbre, le genre, l'origine.
- **Critères techniques seulement** : débit (120–150 mots/min), volume, articulation des consonnes.
- **BLOCKED** si `clarity_criteria` absent/vide, `no_identity_judgment_notice` absent,
  `voice_clarity_id` absent, `practice_ref` absent, `feedback_policy` absent.
- **Anti-invention** : le `feedback_policy.example_text` est un exemple illustratif,
  jamais un vrai feedback calculé sur une session réelle.

## QA à vérifier

1. Modifier un `text` dans `clarity_criteria` → rendu change sans toucher au HTML.
2. `clarity_criteria: []` → BLOCKED propre.
3. `no_identity_judgment_notice` absent → BLOCKED propre.
4. `meter_active = 0` → barre vide affichée sans erreur JS.
5. Injection externe `ENGINE.init(monInstance)` → rendu change.
6. Responsive 375/768/1024 → aucun débordement.

## Source

`INDEX-300-orallearning-GAB-296-300-PLAYABLE.html` (stage `data-tpl="296"`, bloc `<!-- ═══════════ GAB-296 VOICECLARITY ═══════════ -->`).

## external_refs / dependencies

Aucune dépendance externe hors-lot. Styles DS V2 autonomes dans le renderer.
Le `practice_ref` et le `voice_clarity_id` sont destinés à être résolus par le
moteur applicatif EdTechOralLearning au runtime — ils ne sont pas résolus dans ce renderer.
