# GAB-003 · SessionStepPlayerShell — « Shell runtime de l'étape courante »

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

## Pack (structure officielle par-GAB)
```
GAB-003/
  renderer.html            ← moteur shell step (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_step_id` · `session_title` · `total_steps` · `steps[]{badge, content, mod}`

Optionnels : `current_step_index`, `back_cta`, `next_cta`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre de la session, séquence d'étapes (badge/contenu/module), index de départ, libellés des boutons nav, total étapes.
- **HTML** : topbar avec bouton retour, barre de progression, slot de contenu (badge + contenu + mod), footer de navigation Précédent/Suivant, layout, fallback BLOCKED.

## Archétype
Le shell est un **conteneur orchestrateur** : il ne contient aucun contenu pédagogique en dur. Son rôle est de garder header et navigation constants pendant qu'un provider (StoryLearning, VisualLearning, MemoryLearning, ExerciseLearning, PlayKit…) rend l'étape courante dans son slot.

## Garde-fous
- **BLOCKED** si `session_title` absent, `steps` vide ou `total_steps` invalide.
- `current_step_index` hors borne → clamp silencieux à 0 (pas d'erreur silencieuse visible).
- Ne jamais utiliser pour un bloc autonome hors session, l'écran de fin (→ GAB-013) ou une transition narrative (→ GAB-005).

## QA à vérifier
1. Modifier `session_title` ou une étape `steps[i].content` → rendu change sans toucher au HTML (critère d'or).
2. `steps:[]` → BLOCKED propre dans le slot.
3. Navigation Précédent/Suivant → étapes défilent en boucle, barre et label d'étape se mettent à jour.
4. `current_step_index` hors borne → clamp à 0, pas d'erreur JS.
5. Injection externe `ENGINE.init({...})` → rendu change sans recharger.
6. Responsive 375/768/1024.

## external_refs / dependencies
- **GAB-013** : écran de fin de session (à utiliser à la place du shell sur la dernière étape).
- **GAB-005** : transition narrative entre deux étapes (à insérer entre deux steps si besoin).
- **GAB-004** : SessionProgressHeader (header de progression compact, peut être placé au-dessus du shell).

## Source
`INDEX-300-playengine-GAB-001-005-PLAYABLE.html` (stage `data-tpl="3"`, handlers `shellNext`/`shellPrev`, tableau `shellSteps`).
