# GAB-268 · ComprehensionLearningTrapDetector — « Lire une image ou un schéma »

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

## Pack (structure officielle par-GAB)
```
GAB-268/
  renderer.html            ← moteur lecture image/schéma (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` · `image_reading_id` · `title` · `summary` · `callouts[]{num,label,text}` · `alt_text`

Optionnels : `visual_type`, `image_url`, `subtitle`, `instruction`, `reason_title`, `reason_text`, `visual_type_variants[]{key,title,summary,primary_cta_label}`, `primary_cta{label,action}`, `secondary_cta{label,action}`, `icon`, `text_version`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, résumé, callouts (numéros, libellés, textes), alt_text, reason_title/text, libellé des CTA.
- **HTML** : layout callout-list, reason-block, barre alt-text, boutons structurels, slot-list.

## Garde-fous (child_safety)
- **alt_text obligatoire** : absent = BLOCKED (accessibilité a11y non négociable).
- **callouts vides = BLOCKED** : le GAB n'a aucun sens sans annotation pédagogique.
- **image_url absent ou _TODO** : rendu en mode fallback (pas d'img cassée). Un asset réel devra être fourni par le producteur de contenu.
- **Anti-invention** : l'image_url de la source HTML est un graphique SVG généré dynamiquement — pas d'asset exportable. Marqué `_TODO` en attendant un vrai asset.

## _TODO (contenus manquants de la source)
- `image_url` : aucun asset image dans la source — graphique généré en HTML/CSS dynamiquement.

## QA à vérifier
1. Modifier `callouts[0].text` → rendu change sans toucher au HTML (critère d'or).
2. `callouts:[]` → BLOCKED propre.
3. `alt_text` absent → BLOCKED propre.
4. `visual_type` = valeur inconnue → fallback sur `title`/`summary` directs (pas de crash).
5. Responsive 375/768/1024 — aucun débordement.

## Source
`INDEX-300-comprehensionlearning-GAB-266-270-PLAYABLE.html` (stage `data-tpl="268"`, handlers `irPick`, `IR_TYPES`, `peConfirm`/`peNote`).

## external_refs / dependencies
- `canonical_name` : `ComprehensionLearningTrapDetector` issu de `_workflow-industrialize.js` — la source HTML nomme ce GAB `ComprehensionLearningImageReading`. Aucune divergence de contenu, uniquement un renommage dans le workflow.
- Lot parent : `LOT-comprehensionlearning-GAB-266-270`
- Autres GABs du même lot : GAB-266 (InstructionDecoding), GAB-267 (AudioListening), GAB-269 (MindMap), GAB-270 (TLDR).
