# GAB-009 · SessionConnectionFallback — « Fallback perte réseau + retry »

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

## Pack (structure officielle par-GAB)
```
GAB-009/
  renderer.html            ← moteur fallback réseau (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` · `title` · `body` · `retry_cta`

Optionnels : `fallback_id`, `icon`, `hint`, `status_offline_label`, `status_searching_label`, `status_online_label`, `retry_searching_label`, `retry_success_label`, `secondary_cta`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, message corps, tous les libellés boutons (retry initial, retry en cours, retry succès), libellés de statut (offline, searching, online), bouton secondaire, icône.
- **HTML** : structure de la carte fallback, animation spinner (état UI piloté par le moteur), badge de statut, layout, gestion des états offline/searching/online.

## Archétype
Écran de **protection de session** : affiché quand la connexion est perdue pendant une session PlayEngine. Couleur signature **gold** (alerte non bloquante — la progression est sauvegardée). Le moteur gère les 3 états UI : `offline` → `searching` → `online` avec retour automatique à `offline` après 2,5 s (simulation de démo).

## Garde-fous (child_safety)
- **Anti-invention** : aucun texte pédagogique en dur dans le HTML.
- **BLOCKED** si `gab_id`, `title`, `body` ou `retry_cta` absents.
- Les libellés de statut ont des valeurs par défaut dans le moteur — l'instance peut les omettres sans bloquer le rendu.
- `secondary_cta` optionnel : masqué proprement si absent.

## QA à vérifier
1. Modifier `body` dans l'instance → rendu change sans toucher au HTML (critère d'or).
2. Supprimer `retry_cta` → BLOCKED propre affiché.
3. Cliquer le bouton retry → animation searching 1,6 s → état online → retour offline 2,5 s.
4. `secondary_cta` absent → bouton ghost masqué, pas d'erreur JS.
5. Responsive 375/768/1024.

## Slots (canon PART-01B — source HTML)
Requis : `title` · `body` · `retry_cta`
Optionnels : `hint` · `secondary_cta` · `icon` · statut labels · retry state labels

## Source
`INDEX-300-playengine-GAB-006-010-PLAYABLE.html` (stage `data-tpl="9"`, handler `fbRetry()`, classe `.fallback-card`).
