# GAB-262 · ComprehensionLearningTextDecode — « Lecture compréhensive guidée »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechComprehensionLearning
**Critère validé :** changer le JSON change le mode/titre/CTA sans modifier le HTML.

## Pack (structure officielle par-GAB)
```
GAB-262/
  renderer.html            ← moteur lecture guidée (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` · `text_decode_id` · `passage` · `passage_label` · `reading_modes[]{key,title,subtitle,primary_cta}` · `default_reading_mode`

Optionnels : `title`, `subtitle`, `annotation_legend[]{type,label}`, `why_block{heading,text}`, `secondary_cta`.

## Ce qui vient du JSON vs HTML
- **JSON** : texte du passage, étiquette contexte, liste des modes avec leurs titres/CTAs, mode par défaut, légende annotations, bloc explication, libellé bouton secondaire.
- **HTML** : layout zones, boutons structurels de mode, passage-wrap, legend-row, why-block, rendu bascule — aucun texte pédagogique en dur.

## Archétype pédagogique
GAB-262 est un écran de **lecture compréhensive guidée** : l'élève lit un passage court et choisit un mode d'approche cognitif (annotation, reformulation, visualisation, audio). Le moteur bascule dynamiquement le titre, le sous-titre et le CTA selon le mode actif. Applicable à tout niveau et toute matière (passage + label configurables).

## Garde-fous (child_safety)
- **Anti-invention** : le passage est strictement extrait du HTML source. Aucune phrase générée.
- **BLOCKED** si `passage` vide, `reading_modes` absent ou vide, `default_reading_mode` absent, `text_decode_id` absent.
- `default_reading_mode` doit correspondre à un `key` existant dans `reading_modes` — sinon fallback sur `modes[0]`.
- Le contenu du passage ne contient jamais de balises HTML en dur : le rendu (gras informatif/connecteurs) est à ajouter côté moteur si besoin.

## QA à vérifier
1. Modifier un `title`/`primary_cta` dans un mode → rendu change sans toucher au HTML (critère d'or).
2. `reading_modes:[]` → BLOCKED propre.
3. `passage` absent → BLOCKED.
4. Clic sur un mode-btn → titre/sous-titre/CTA et aria-pressed basculent.
5. CTA primaire → panel de confirmation affiché.
6. Responsive 375/768/1024.

## Source
`INDEX-300-comprehensionlearning-GAB-261-265-PLAYABLE.html` (stage `data-tpl="262"`, handlers `trPick`, const `TR_TYPES`).
