# GAB-391 · DataLearningIntro — « Lire un tableau : PIB par région »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechDataLearning
**Critère visé :** changer le JSON change le rendu sans modifier le HTML. ✅ check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-391/
  renderer.html            ← moteur intro données (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` · `data_learning_id` · `title` · `data_ref` · `data_type` · `learning_goal` · `primary_cta`

Optionnels : `intro_body`, `source_notice`, `unit_notice`, `uncertainty_notice`, `accessibility_table_ref`, `fallback_action`, `fallback_text_summary`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, corps d'intro, objectif pédagogique, type de données, notices source/unité/incertitude, libellé du CTA, action de repli.
- **HTML** : hero, carte intro, rangée d'objectif, grille de notices, boutons, panneau de retour, slots, layout responsive.

## Archétype
Intro d'une activité données. Annonce le jeu de données et son objectif **avant** toute interprétation, puis lance la lecture. Deux actions :
1. **CTA principal** (`primary_cta`) → état `started` : panneau `ok`, le bloc de lecture prend le relais.
2. **Action de repli** (`fallback_action`, optionnelle) → panneau `warn` : dataset indisponible, aucune valeur inventée.

## Garde-fous (provenance Core GAB-391)
- **Source + unité obligatoires** si `data_type` est chiffré (`table`, `bar_chart`, `line_chart`, `pie_chart`, `scatter`, `dataset`) → sinon BLOCKED.
- **Ne pas interpréter avant lecture** : l'intro annonce, elle ne conclut pas.
- **Accessibilité** : `accessibility_table_ref` décrit l'accès clavier/lecteur d'écran du jeu de données.
- **Fallback obligatoire** si le dataset peut être indisponible — aucune donnée inventée.
- `data_ref` est un **pointeur** ; la donnée réelle vit dans les instance banks, pas dans ce pack.

## BLOCKED si
`title` / `data_learning_id` / `data_ref` / `primary_cta` absent · `data_type` ou `learning_goal` absent ou hors énumération · `data_type` chiffré sans `source_notice` ou sans `unit_notice`.

## QA à vérifier
1. Modifier `title` ou `intro_body` → rendu change sans toucher au HTML (critère d'or).
2. `title` absent → BLOCKED propre.
3. `data_type:"table"` sans `unit_notice` → BLOCKED (unité requise pour données chiffrées).
4. `data_type:"poster"` (hors énum) → BLOCKED.
5. Clic CTA principal → panneau `ok` (lecture lancée).
6. Clic action de repli → panneau `warn`, aucune valeur affichée.
7. Injection via `init(ext)` → rendu change sans modifier le HTML.
8. Responsive 375/768/1024 — notices passent en colonne mobile.

## Source
Pas de playable hardcodé pour 391-395 (les data-sources s'arrêtent à GAB-390). Matière première = **CORE-GAB-REGISTRY GAB-391** (`input_contract`, `pedagogical_states`, `constraints`). Conversion Core → pack serveur, format identique aux GAB 001-390.
