# GAB-223 · SmartSelectFormatChoice — « Sélection du format pédagogique »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechSmartSelect
**Critère validé :** changer le JSON change la grille et les justifications sans modifier le HTML.

## Pack (structure officielle par-GAB)
```
GAB-223/
  renderer.html            ← moteur grille de formats (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` · `format_choice_id` · `title` · `recommended_format` · `formats[]{key,icon,label,description,available,info,cta_primary}`

Optionnels : `subtitle`, `header_icon`, `info_label`, `a11y_note`, `cta_secondary_label`, `fallback_text_summary`.

## Ce qui vient du JSON vs HTML
- **JSON** : chaque format (icône, label, description, disponibilité), la justification au clic, le format présélectionné, les libellés CTA, la note accessibilité.
- **HTML** : grille CSS, styles sélection/indisponible, boutons structurels, layout, fallback BLOCKED.

## Garde-fous (child_safety)
- **Anti-waouh** : un format `available:false` est affiché grisé avec 🚫, jamais masqué. SmartSelect refuse les formats sans alignement pédagogique.
- **Accessibilité obligatoire** : `a11y_note` rappelle que chaque format doit fournir son fallback adapté (transcript, alternative statique, sous-titres).
- **BLOCKED** si `formats` vide / `recommended_format` absent / `format_choice_id` absent.
- **0 contenu en dur** dans le moteur : aucune mention de "Pythagore" ou d'un format spécifique dans le HTML.

## QA à vérifier
1. Modifier un `info` dans le JSON → justification change sans toucher au HTML (critère d'or).
2. `formats:[]` → BLOCKED propre.
3. `recommended_format` absent → BLOCKED.
4. Clic sur format `available:false` → ignoré, pas de sélection.
5. Clic sur format disponible → info et CTA mis à jour depuis JSON.
6. Responsive 375px → grille 2 colonnes, 768px+ → 4 colonnes.

## Archétype
GAB-223 est le **sélecteur de canal pédagogique** dans la chaîne SmartSelect :
221 ContentMatch → 222 LevelFit → **223 FormatChoice** → 224 FallbackChoice → 225 ReasonCard.

Il ne choisit pas le contenu (GAB-221), ne choisit pas le niveau (GAB-222) : il choisit uniquement le **format de livraison** selon le signal de blocage. Use when 2+ formats disponibles et accessibilité respectée.

## Source
`INDEX-300-smartselect-GAB-221-225-PLAYABLE.html` (stage `data-tpl="223"`, handlers `fcPick`, constante `FC_FORMATS`).

## external_refs / dependencies
Aucune dépendance externe. Ce GAB est autonome.

Références chaîne SmartSelect (lots voisins) :
- GAB-221 SmartSelectContentMatch — sélection du contenu
- GAB-222 SmartSelectLevelFit — sélection du niveau
- GAB-224 SmartSelectFallbackChoice — alternative si format indisponible
- GAB-225 SmartSelectReasonCard — méta-carte d'explication transparente
