# GAB-169 · AudioPronunciationFeedback — « Feedback de prononciation »

**Archétype / renderer_key :** `media_viewer` (cartographie) · **module :** EdTechAudioLearning
**renderer_key à concevoir (pas de moteur kit)** : le renderer est dérivé directement de l'écran source (aucun moteur kit media_viewer préexistant dans le lot).
**Critère validé :** changer le JSON change le rendu (scores, conseils, bandeau) sans modifier le HTML. ✅ check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-169/
  renderer.html            ← moteur feedback prononciation (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` · `pronunciation_feedback_id` · `scores[]{dimension, value(0..100), level('good'|'mid'|'low')}`

Optionnels : `title`, `warning_text`, `tips_label`, `tips[]`, `accessibility{rgpd_notice, no_official_grade}`.

## Ce qui vient du JSON vs HTML
- **JSON** : chaque dimension de score, sa valeur numérique, son niveau (good/mid/low), le label du bloc conseils, chaque conseil textuel, le bandeau doctrine prudente.
- **HTML** : mise en page des cartes scores (flex), coloration selon `level`, bloc conseils conditionnel, structure du bandeau avertissement, layout responsive.

## Garde-fous (child_safety & doctrine prudente)
- **Feedback INDICATIF** : `no_official_grade: true` — le rendu affiche clairement que le score n'est jamais au bulletin.
- **RGPD mineur** : `rgpd_notice` dans l'instance, rendu via `warning_text` ; aucune transmission audio sans consentement parental explicite.
- **Anti-invention** : les `tips` proviennent exclusivement de l'écran source (3 conseils extraits). Contenu manquant = `_TODO`.
- **BLOCKED** si `scores` absent ou tableau vide / `pronunciation_feedback_id` absent / `gab_id` absent.
- **Reconnaissance vocale imparfaite** : le bandeau doctrine l'indique explicitement, surtout pour enfants.

## QA à vérifier
1. Modifier une `value` dans `scores` → rendu change sans toucher au HTML (critère d'or).
2. `scores: []` → BLOCKED propre.
3. `level: "low"` → valeur en rouge coral.
4. `tips: []` → bloc conseils masqué sans erreur.
5. `init(extInstance)` → rendu change avec instance externe.
6. Responsive 375/768/1024 — scores empilés sur mobile (flex-direction: column).

## Source
`INDEX-300-audiolearning-GAB-166-170-PLAYABLE.html` (stage `data-tpl="169"`, styles `.pf-*`).

## external_refs / dependencies
- **GAB-167 (AudioListenAndRepeat)** : ce GAB-169 est typiquement affiché *après* un enregistrement via GAB-167. Il n'y a pas de dépendance technique directe, mais le flux pédagogique canonique est : écouter (167) → enregistrer (167) → voir feedback (169).
- Aucun moteur kit `media_viewer` préexistant dans ce lot — renderer auto-suffisant.
