> ⚠️ **GAB SENSIBLE — VALIDATION BOSS OBLIGATOIRE avant tout usage.** (child-safety / RGPD / orientation / career). Contenu extrait sans invention ; à relire par un humain.

# GAB-346 · SafetyFallbackLearningTechnicalError — « Erreur technique »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechSafetyFallbackLearning
**Critère validé :** changer le JSON change l'écran fallback sans modifier le HTML. ✅ check.py 12/12.

> ⚠️ **GAB SENSIBLE — REVUE BOSS REQUISE.** Cet écran relève de la sûreté enfant (child-safety) : gestion d'erreur sans exposer la stack à un mineur, anti-boucle, sauvegarde d'état, chemin de reprise sûr. Tout le contenu a été extrait STRICTEMENT du HTML source (aucune invention). Valider les libellés avec Boss avant tout usage prod.

## Pack (structure officielle par-GAB)
```
GAB-346/
  renderer.html            ← moteur fallback erreur (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` · `error_id` · `public_message` · `retry_policy{max_tries,retry_label,max_reached_label}` · `state_save`
Optionnels : `state`, `title`, `primary_cta{label,action}`, `secondary_cta{label,action}`, `fallback_feedback`, `admin_debug`, `no_infinite_loop`, `fallback_text_summary`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, message public, libellés des boutons, politique de réessai (nombre + libellés), message de fallback, état, info admin.
- **HTML** : layout, doc-paper, boutons structurels, panneaux de feedback, grille use_when / do_not_use_when, slots.

## Garde-fous (child_safety)
- **Pas de stack technique** : `public_message` est un message public utile ; la stack n'est jamais affichée à l'élève.
- **Anti-boucle infinie** : `retry_policy.max_tries` (=2 dans la démo) borne les réessais ; au-delà → état `max_retries`, bouton désactivé, bascule vers fallback.
- **Sauvegarde d'état** : `state_save` confirme que le travail est conservé avant reprise ou fallback.
- **Debug séparé** : `admin_debug` réservé admin, jamais présenté comme contenu pédagogique.
- **BLOCKED** si `public_message` / `retry_policy` / `state_save` absents.

## QA à vérifier
1. Modifier `public_message`/`retry_policy.max_tries` → rendu change sans toucher au HTML (critère d'or). 2. Champ requis vide → BLOCKED propre. 3. Réessayer jusqu'au max → `max_retries`, bouton désactivé, pas de boucle. 4. « Continuer autrement » → état `recovered` + travail conservé. 5. Responsive 375/768/1024.

## Source
`INDEX-300-safetyfallbacklearning-GAB-346-350-PLAYABLE.html` (stage `data-tpl="346"`, handlers `d346Retry` / `d346Fallback`).

## external_refs / dependencies
- `do_not_use_when` renvoie à **GAB-347** (SafetyFallbackLearningRateLimitOrQuota) pour le cas « quota dépassé » — hors lot fonctionnel mais même LOT de conversion (346-350). Aucune dépendance de code : référence pédagogique seulement.
