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

# GAB-347 · SafetyFallbackLearningRateLimitOrQuota — « Quota atteint »

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

> ⚠️ **GAB SENSIBLE (child-safety / RGPD) — REVUE BOSS REQUISE.**
> Cet écran touche au freemium / monétisation (présentation Premium) et au cadrage « équitable » d'une limite IA pour un public scolaire potentiellement mineur. Tout le contenu a été extrait **strictement** du HTML source `INDEX-300-safetyfallbacklearning-GAB-346-350-PLAYABLE.html` (bloc `<!-- GAB-347 -->`, handlers `d347Alt`/`d347Up`). **Aucune invention.** À valider par Boss avant tout usage prod (wording « sans pression », gratuité des alternatives, conservation du travail).

## Pack (structure officielle par-GAB)
```
GAB-347/
  renderer.html            ← moteur écran quota (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` · `rate_limit_id` · `fair_message` · `reset_time` · `free_alternatives[]{icon,label,kind,feedback}`
Optionnels : `title`, `state_badge`, `work_preserved`, `alternatives_intro`, `degraded_mode`, `upgrade{available,no_pressure}`.

## Ce qui vient du JSON vs HTML
- **JSON** : le message équitable, l'heure de reset (dans le message), l'intro, chaque alternative (icône, libellé, type, feedback au clic), le statut Premium.
- **HTML** : le panneau d'alerte, la liste des alternatives, le layout, le fallback, la navigation clavier.

## Garde-fous (child_safety)
- **Pas de blocage sec** : `free_alternatives` jamais vide → BLOCKED sinon. Une limite atteinte propose TOUJOURS au moins une alternative gratuite.
- **Sans pression** : Premium (`kind:'upgrade'`) présenté en panneau `note`, le feedback rappelle que « les alternatives gratuites restent pleinement utilisables ».
- **Travail préservé** : `work_preserved` — le message le rappelle (« Ton travail est conservé »).
- **Reset visible** : `reset_time` obligatoire — on indique quand la limite se lève.
- **BLOCKED** si `fair_message` / `reset_time` / `free_alternatives` absents.

## QA à vérifier
1. Modifier `fair_message`/un `feedback` → rendu change sans toucher au HTML (critère d'or). 2. `free_alternatives:[]` → BLOCKED propre. 3. Clic alternative gratuite → panneau ok. 4. Clic Premium → panneau note « sans pression ». 5. Responsive 375/768/1024.

## external_refs / dependencies
- `do_not_use_when` source : erreur technique → **GAB-346** (SafetyFallbackLearningTechnicalError) — hors lot 347, simple renvoi.
- Aucune dépendance de données externe ; instance autoportante.

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