# GAB-224 · SmartSelectFallbackChoice — « Choix de secours honnête »

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

## Pack (structure officielle par-GAB)
```
GAB-224/
  renderer.html            ← moteur fallback honnête (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` · `fallback_choice_id` · `title` · `fallback_reason` · `reason_text` · `alternatives[]{rank,label,format,action}` · `primary_cta{label,action}`

Optionnels : `banner_label`, `secondary_cta{label,action}`, `fallback_reason_enum`, `distinction_note`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, raison du fallback, texte explicatif, liste ordonnée des alternatives, libellés des boutons CTAs, note de distinction.
- **HTML** : layout carte fallback, numérotation alternatives, boutons structurels, gestion des clics, slot-chips.

## Garde-fous (child_safety)
- **Fallback honnête** : `reason_text` doit expliquer franchement pourquoi l'activité idéale est indisponible. Jamais masquer avec un message générique.
- **224 ≠ 210** : SmartFallback (224) = ressource cible existe ailleurs. UnsupportedModuleFallback (210) = bloc cassé techniquement. Ne pas masquer un bug derrière un fallback pédagogique.
- **BLOCKED** si `fallback_reason` absent / `alternatives` vide / `primary_cta` absent.
- **fallback_reason** doit appartenir à l'enum des 6 valeurs : `content_unavailable`, `format_unavailable`, `level_unavailable`, `access_limited`, `technical_limit`, `no_exact_match`.

## QA à vérifier
1. Modifier `reason_text` → rendu change sans toucher au HTML (critère d'or).
2. `alternatives:[]` → BLOCKED propre.
3. `fallback_reason` absent → BLOCKED listant le champ.
4. Clic CTA primaire → feedback action affiché.
5. Clic alternative → feedback format affiché.
6. Responsive 375/768/1024.

## Source
`INDEX-300-smartselect-GAB-221-225-PLAYABLE.html` (stage `data-tpl="224"`, CSS `.fb-*`, JS `peNote`/`peSelect`).

## Dépendances / références externes
Aucune dépendance hors-lot. Note : GAB-210 (UnsupportedModuleFallback) est référencé dans la `distinction_note` comme cas à NE PAS confondre — il est dans un autre module/lot, pas une dépendance fonctionnelle.
