# GAB-109 · MemorySessionEnd — « Fin de session mémoire »

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

## Pack (structure officielle par-GAB)
```
GAB-109/
  renderer.html            ← moteur bilan 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

**MemorySessionEnd** est l'écran de clôture d'une session de révision mémoire. Il affiche :
- un **emoji** de célébration (champ `emoji`)
- un **titre** de bilan (champ `title`)
- deux **stats** côte à côte : cartes retenues (fond mint) + cartes à revoir (fond gold)
- un **bouton CTA** qui clôture la session et passe en état « done » (fond mint, désactivé)

## Champs requis (instance, à plat)
`gab_id` · `session_end_id` · `title` · `stat_ok_value` · `stat_ok_label` · `stat_review_value` · `stat_review_label` · `primary_cta{label, action}`

Optionnels : `emoji`, `_note_dev`, `primary_cta.done_label`.

## Ce qui vient du JSON vs HTML
- **JSON** : emoji, titre, valeurs et libellés des deux stats, libellé du bouton, libellé post-clic.
- **HTML** : grille de stats, bouton structurel, gestion de l'état « done », layout, fallback BLOCKED.

## Garde-fous (child_safety / anti-invention)
- Aucun contenu pédagogique n'est en dur dans le HTML.
- Si un champ requis est absent → `BLOCKED` affiché, aucun rendu partiel.
- `stat_ok_value` et `stat_review_value` doivent être des entiers ≥ 0.

## Comportement du bouton CTA
1. Libellé initial : `primary_cta.label`
2. Au clic : bouton → fond `--mint`, texte → `primary_cta.done_label` (défaut : `'Session terminée'`), désactivé.

## QA à vérifier
1. Modifier `title` → rendu change sans toucher au HTML (critère d'or).
2. `title` absent → BLOCKED propre, zone remplacée par le message d'erreur.
3. Clic CTA → état done (vert, désactivé, texte done_label).
4. Responsive 375px → stats en 1 colonne, bouton pleine largeur.

## Source
`INDEX-300-memorylearning-GAB-106-110-PLAYABLE.html` (stage `data-tpl="109"`, handler `sseFinish()`).

## external_refs / dependencies
- **GAB-021** (fin de session moteur générique) : à utiliser à la place de GAB-109 pour les fins de session hors contexte mémorisation.
- **GAB-059** (fin d'épisode Story) : à utiliser pour les fins d'épisode narratif.
- **GAB-110** (MemoryWeakCardsReview) : gabarit complémentaire à proposer après GAB-109 pour réviser les cartes faibles identifiées par `stat_review_value`.
