# GAB-008 · SessionCheckpointSave — « Indicateur de sauvegarde discret »

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

## Pack (structure officielle par-GAB)
```
GAB-008/
  renderer.html            ← moteur toast checkpoint (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` · `checkpoint_id` · `body` · `save_state`

Optionnels : `icon`, `toast_auto_dismiss_ms`, `trigger_label`, `context_note`.

## Ce qui vient du JSON vs HTML
- **JSON** : message du toast (`body`), icône (`icon`), état sauvegarde (`save_state`), délai auto-dismiss (`toast_auto_dismiss_ms`), libellé bouton déclencheur (`trigger_label`), note de contexte (`context_note`).
- **HTML** : structure du toast, animation slide-up, couleur mint succès, logique auto-dismiss, moteur de validation BLOCKED.

## Archétype
Toast de feedback non bloquant signalant silencieusement à l'élève que sa progression est sauvegardée. Signature colorimétrique : **mint** = succès. Apparaît puis disparaît automatiquement (2,5 s par défaut) sans interrompre le flow.

## Garde-fous (child_safety)
- **BLOCKED** si `body` absent/vide, `save_state` absent, ou `checkpoint_id` absent.
- Le toast est `role="status" aria-live="polite"` : annonce discrète aux lecteurs d'écran sans interrompre.
- `prefers-reduced-motion` : transitions réduites à 0,12 s.
- Toast non bloquant : l'élève peut continuer sans interaction.

## QA à vérifier
1. Modifier `body` → message du toast change sans toucher au HTML (critère d'or).
2. `body` vide ou absent → BLOCKED propre, bouton désactivé.
3. `save_state` absent → BLOCKED propre.
4. Cliquer "Simuler" → toast mint apparaît, disparaît après 2,5 s.
5. `toast_auto_dismiss_ms: 4000` → disparaît après 4 s.
6. Instance externe injectée via `ENGINE.init(ext)` → rendu change sans modifier le HTML.
7. Responsive 375/768/1024 : aucun débordement.

## external_refs / dependencies
- `use_when` : une étape importante est franchie / un checkpoint est enregistré / renforcer le sentiment de sécurité.
- `do_not_use_when` : à chaque micro-interaction (bruit) → celébrer une réussite → GAB-KIT-050 / progression complète → GAB-004.
- Aucune dépendance externe hors-lot.

## Source
`INDEX-300-playengine-GAB-006-010-PLAYABLE.html` (stage `data-tpl="8"`, handlers `ckptFire`, styles `.ckpt-*`).
