# GAB-013 · SessionEndRouter — « Routeur de fin de session »

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

## Pack (structure officielle par-GAB)
```
GAB-013/
  renderer.html            ← moteur routeur fin de session (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
```

## Archétype

**SessionEndRouter** : gabarit de routage affiché lorsqu'une session PlayEngine se termine. Il affiche les destinations disponibles (Recap / Reward / Feedback) et route vers la bonne selon le contexte de fin. Aucune destination n'est codée en dur dans le HTML : tout vient du champ `destinations[]` de l'instance.

## Champs requis (instance, à plat)

`gab_id` · `session_end_router_id` · `completion_state` · `next_action` · `destinations[]{key, icon, label, kit_id, description}`

Optionnels : `title`, `subtitle`, `end_badge_label`, `result`, `score`, `reward_context`, `feedback`.

## Ce qui vient du JSON vs HTML

- **JSON** : badge de fin, titre, sous-titre, chaque destination (icône, libellé, identifiant KIT, description de routage).
- **HTML** : grille des cartes destination, zone flèche, animation d'activation, layout, fallback BLOCKED.

## Garde-fous

- **BLOCKED** si `destinations` absent/vide, `completion_state` absent, `next_action` absent.
- Les identifiants KIT (KIT-031/KIT-032/KIT-033) viennent du JSON — ne pas les hardcoder.
- `completion_state` doit piloter toute logique de routage côté consommateur (pas dans ce renderer).
- Ombre DS V2 : 0 `rgba(0,0,0,…)` — ombres colorées uniquement.

## QA à vérifier

1. Modifier un `label`/`description` dans `destinations[]` → rendu change sans toucher au HTML (critère d'or).
2. `destinations:[]` → BLOCKED propre.
3. `completion_state` absent → BLOCKED propre.
4. Clic sur une destination → carte active + flèche avec description visible.
5. Inject via `ENGINE.init(monInstance)` → rendu change sans reload.
6. Responsive 375/768/1024 : destinations en colonne sur mobile.

## external_refs / dependencies

- **KIT-031** (Recap), **KIT-032** (Reward), **KIT-033** (Feedback) : destinations cibles du routeur. Ces GAB/KIT sont hors de ce lot (LOT-playengine-GAB-011-015). Les identifiants sont extraits du HTML source et stockés dans `destinations[].kit_id` — jamais hardcodés dans le renderer.

## Source

`INDEX-300-playengine-GAB-011-015-PLAYABLE.html` (stage `data-tpl="13"`, handler `routeTo`, section `<!-- GAB-013 -->`).
