# GAB-308 · DocumentLearningChartAnalysis — « Analyser un graphique »

**Archétype / renderer_key :** `media_viewer` (cartographie) · **module :** EdTechDocumentLearning
**Note renderer_key :** `media_viewer` est à concevoir (pas de moteur kit de référence). Le renderer est dérivé directement de l'écran source (stage `data-tpl="308"`, handlers `d308Bar`, `d308Axis`).
**Critère validé :** changer le JSON change le graphique sans modifier le HTML.

## Pack (structure officielle par-GAB)
```
GAB-308/
  renderer.html            ← moteur graphique (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` · `chart_analysis_id` · `data_points[]{label,height_pct,value,unit,is_peak,bar_feedback,hint_suffix}` · `axis_verify_cta_label`

Optionnels : `title`, `chart_title`, `chart_type`, `axis_x_label`, `axis_y_label`, `axis_feedback`, `axis_verified_label`, `completion_trigger`, `fallback_text_summary`.

## Ce qui vient du JSON vs HTML
- **JSON** : libellés des barres, hauteurs, valeurs, feedbacks au clic, libellé et feedback du bouton axes, indicateur de pic.
- **HTML** : structure du graphique en barres, bouton structurel, panel de feedback, layout, fallback.

## Contenu extrait de la source
- **Barres** : 1787 (35%, 8 sols), 1788 (55%, 11 sols), 1789 (90%, 14 sols — pic, `is_peak:true`).
- **Feedbacks barres** : extraits verbatim de la source (`d308Bar` handler).
- **Feedback axes** : "Axe X = années · Axe Y = prix en sols. Sans l'unité, la hausse n'a pas de sens." (verbatim `d308Axis`).
- **CTA** : "Vérifier axes & unité" → désactivé après clic, label "✓ Axes vérifiés".

## Garde-fous (child_safety)
- **Anti-invention** : tout le contenu (labels, feedbacks, valeurs) est extrait verbatim de la source. Aucune valeur inventée.
- **BLOCKED** si `data_points` absent/vide, `chart_analysis_id` absent, `gab_id` absent, `axis_verify_cta_label` absent.
- **Pic unique** : `is_peak:true` sur exactement une barre. Si plusieurs, le moteur sélectionne le premier.
- **height_pct** : valeur proportionnelle 1-100, jamais recalculée par le moteur.

## QA à vérifier
1. Cliquer barre non-pic → panel note + hint_suffix. 2. Cliquer barre pic → panel ok (complétion). 3. Cliquer "Vérifier axes" → panel note + axe feedback + bouton désactivé. 4. `data_points:[]` → BLOCKED propre. 5. Injection externe `ENGINE.init({...})` → rendu change. 6. Responsive 375/768/1024 — barres non débordantes.

## Source
`INDEX-300-documentlearning-GAB-306-310-PLAYABLE.html` (stage `data-tpl="308"`, handlers `d308Bar`, `d308Axis`).

## external_refs / dependencies
Aucune dépendance externe. `renderer_key: media_viewer` est à concevoir côté kit (pas de moteur kit existant à cette date).
