# GAB-010 · SessionAccessGate — « Accès requis / étape verrouillée »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechPlayEngine
**Critère validé :** changer le JSON change la variante active et tous les textes sans modifier le HTML. check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-010/
  renderer.html            ← moteur garde d'accès (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` · `gate_instance_id` · `gate_type` (enum login/prereq/premium) · `variants{login:{title,sub,body,primary_cta}, prereq:{...}, premium:{...}}` · `secondary_cta`

Optionnels : `icon`, `hint`, `accessibility`, `child_safety`.

## Ce qui vient du JSON vs HTML
- **JSON** : toutes les variantes textuelles (title, sub, body, primary_cta pour chaque gate_type), secondary_cta commun, icône, hint.
- **HTML** : structure de carte, switch de variantes, boutons structurels, palette sky DS V2, layout, fallback BLOCKED.

## Archétype UX
GAB-010 est un **écran de garde d'accès** (SessionAccessGate) : il bloque l'accès à une session ou une étape et propose une action de déblocage. Trois variantes sont supportées :
- **login** : session réservée aux élèves connectés (CTA = "Me connecter")
- **prereq** : étape verrouillée par un prérequis pédagogique (CTA = "Faire le prérequis")
- **premium** : contenu IA avancé nécessitant un abonnement (CTA = "Découvrir l'offre")

Le switch de variantes est interactif (boutons cliquables) et piloté par `gate_type` (variante active au chargement).

## Garde-fous (child_safety)
- **Ton incitatif, jamais punitif** : le gate ne punit pas l'élève, il l'invite à progresser.
- **premium_gate_tone** dans l'instance : `"incitatif, jamais punitif"` — à respecter dans toute surcharge de contenu.
- **BLOCKED** si `gate_type`, `variants`, `secondary_cta` ou `gate_instance_id` absent.
- **Aucun lien externe** : pas de lien sortant hors réseau Allo Education.

## QA à vérifier
1. Modifier `gate_type` → variante active change sans toucher au HTML (critère d'or).
2. `variants` absent → BLOCKED propre.
3. Clic switch "prereq" → title/sub/body/primary_cta changent instantanément.
4. Clic switch "premium" → ton incitatif, jamais punitif.
5. Instance externe injectée via `ENGINE.init({...})` → rendu change.
6. Responsive 375/768/1024 → aucun débordement.

## Références externes (external_refs / dependencies)
- **GAB-009** (SessionConnectionFallback) : si perte réseau → ne pas afficher GAB-010. Priorité GAB-009.
- **KIT-045** (déblocage célébratoire) : après déblocage réussi, ne pas ré-afficher GAB-010 — passer à KIT-045.
- **GAB-002** (session non démarrée) : si session jamais démarrée → GAB-002, pas GAB-010.

## Source
`INDEX-300-playengine-GAB-006-010-PLAYABLE.html` (stage `data-tpl="10"`, handlers `gateSwitch`, `gateData`).
