# GAB-301 · DocumentLearningIntro — Renderer data-driven (PILOTE simple texte/CTA)

**Archétype :** écran d'intro structurel (titre + média + bouton). Montre que MÊME un écran simple est piloté par JSON.
**Critère validé :** changer le JSON change le rendu sans modifier le HTML. ✅

## 3 couches
CORE-GAB.input_contract → schema.contract.json → valide instance → renderer.html (moteur générique).

## Fichiers
- `renderer.html` — moteur, **0 contenu en dur** (titre, type, objectif, **libellé du CTA** viennent du JSON).
- `instance.example.json` — **source de vérité**, le dev remplit ça.
- `schema.contract.json` — contrat dérivé du CORE-GAB.

## Point clé CTA
Le **bouton** est structurel (reste dans le HTML), mais son **libellé** (`primary_cta.label`) et son **action** (`primary_cta.action`) viennent du JSON. C'est la distinction que tu demandais : CTA structurel = HTML, contenu du CTA = JSON.

## Garde-fous (CORE-GAB)
- blocked : document_ref / document_type / analysis_goal absents → BLOCKED.
- document cassé → `fallback_text_summary` affiché (jamais d'écran vide).
- source absente → avertissement.
