# GAB-385 · MediaLearningTranscriptSync — « Synchro transcript »

**Archétype / renderer_key :** `media_viewer` (cartographie) · **module :** EdTechMediaLearning
**Note :** `renderer_key` à concevoir (pas de moteur kit) — renderer dérivé de l'écran source.
**Critère validé :** changer le JSON change l'affichage sans modifier le HTML. ✅ check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-385/
  renderer.html            ← moteur synchro transcript (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` · `transcript_sync_id` · `segments[]{time, text, confidence}`

Optionnels : `title`, `media_hint`, `export_label`, `export_format`, `use_when`, `do_not_use_when`, `slots`, `accessibility`, `child_safety`.

## Ce qui vient du JSON vs HTML
- **JSON** : chaque segment (timestamp, texte, niveau de confiance), libellé du bouton export, hint utilisateur, format d'export.
- **HTML** : grille de segments, affichage des badges de confiance faible, moteur de sélection/activation, export, layout, fallback BLOCKED.

## Archétype de l'écran source
GAB-385 implémente la **synchronisation transcript/média** : l'élève clique un segment et le média se positionne sur ce timestamp (et inversement). Les segments à `confidence:'low'` déclenchent un avertissement pédagogique visible — jamais masqué. Un bouton d'export permet de récupérer le transcript hors ligne.

## renderer_key — note architecturale
`media_viewer` n'a pas de moteur kit de référence dans la cartographie actuelle. Ce renderer est **dérivé directement de l'écran source** (handlers `d385Seg` / `d385Export` du fichier `INDEX-300-medialearning-GAB-381-385-PLAYABLE.html`, stage `data-tpl="385"`). À intégrer dans le kit `media_viewer` lors de sa création officielle.

## Garde-fous (child_safety)
- **Pas d'autoplay** : le lecteur ne se déclenche jamais seul (`no_autoplay: true`).
- **Anti-invention transcript** : le moteur n'invente aucun texte — il n'affiche que ce que l'instance fournit (`no_invented_transcript: true`).
- **Confiance faible visible** : tout segment `confidence:'low'` est marqué visuellement (badge ⚠, couleur gold) et génère un avertissement au clic — **jamais masqué, jamais présenté comme sûr**.
- **BLOCKED** si `gab_id` absent / `transcript_sync_id` absent / `segments` vides.

## QA à vérifier
1. Modifier un `text`/`time` → rendu change sans toucher au HTML (critère d'or).
2. `segments:[]` → BLOCKED propre.
3. Clic segment `confidence:'low'` → panel warn + badge ⚠.
4. Clic segment `confidence:'high'` → panel ok avec timestamp et texte.
5. Bouton export → transcript formaté avec timestamps et flags confiance.
6. Navigation clavier (Tab + Enter/Space) sur tous les segments.
7. Responsive 375/768/1024.

## external_refs / dependencies
- **GAB-384** (MediaLearningAudioPlayer) : GAB-385 est l'extension "avec sync" de GAB-384. Ne pas utiliser GAB-385 pour un lecteur audio simple (→ GAB-384).
- **GAB-383** (MediaLearningVideoPlayer) : la synchro transcript peut s'appliquer aussi à la vidéo — GAB-385 est le moteur générique transcript, GAB-383 gère le lecteur vidéo.

## Source
`INDEX-300-medialearning-GAB-381-385-PLAYABLE.html` (stage `data-tpl="385"`, handlers `d385Seg`, `d385Export`).
