# GAB-001 · SessionLoadingInitial — Écran de chargement initial de session

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechPlayEngine
**Critère validé :** changer le JSON change le titre, le sous-titre et les étapes sans modifier le HTML. check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-001/
  renderer.html            ← moteur chargement (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` · `session_loading_id` · `session_title` · `body` · `steps[]{num,label}`

Optionnels : `icon`, `subtitle`, `estimated_duration`, `progress_percent`, `hint`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre session, sous-titre body, icône orbe, liste des étapes animées, hint optionnel.
- **HTML** : orbe animé, séquence CSS steps (`.lit`), barre de progression, layout, fallback BLOCKED.

## Archétype
Écran d'attente transitoire affiché le temps que le PlayEngine résolve les providers de la session. S'auto-rejoue toutes les 4 secondes pour simuler la progression. Aucun contenu pédagogique propre — ce GAB ne fait que nommer et lister les étapes.

## Garde-fous (child_safety / anti-invention)
- Les étapes affichées proviennent **uniquement** de `steps[]` — jamais hardcodées dans le HTML.
- **BLOCKED** si `session_title`, `body` ou `steps` sont absents ou vides.
- L'animation est pilotée par `steps.length` — la largeur finale de la barre est toujours 100 % quelle que soit la longueur de la liste.
- `progress_percent` (optionnel) n'est pas encore consommé par le moteur actuel — champ réservé pour usage futur du PlayEngine.

## QA à vérifier
1. Modifier `session_title` → titre change sans toucher au HTML (critère d'or).
2. Modifier `steps` (ajouter/retirer une étape) → animation s'adapte, barre = 100 % final.
3. `steps:[]` → BLOCKED propre, aucune animation lancée.
4. `session_title` absent → BLOCKED mentionnant le champ.
5. `init(ext)` avec instance externe → rendu change, pas le HTML.
6. Responsive 375 / 768 / 1024 — orbe et étapes centrées, pas de dépassement.
7. `prefers-reduced-motion` — animations quasi-instantanées.

## Slots source
`INDEX-300-playengine-GAB-001-005-PLAYABLE.html` (stage `data-tpl="1"`, handler `runLoading()`).

## external_refs / dependencies
- Aucune dépendance externe (polices Google Fonts non requises en prod — le moteur fonctionne avec les polices système).
- Aucune référence à un autre GAB du lot. Le rendu BLOCKED recommande GAB-012 (session vide/invalide) et GAB-011 (erreur provider connue) — ces GABs sont hors périmètre de ce fichier.
