# GAB-044 · SubtleNotification — « Notification discrète »

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

## Pack (structure officielle par-GAB)
```
GAB-044/
  renderer.html            ← moteur toast non interruptif (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` · `notification_id` · `body`
Optionnels : `icon`, `duration_ms`, `trigger_label`, `note`.

## Ce qui vient du JSON vs HTML
- **JSON** : le corps du message (`body`), l'icône (`icon`), la durée d'auto-dismiss (`duration_ms`), le libellé du bouton déclencheur (`trigger_label`), la note éditoriale (`note`).
- **HTML** : structure toast, animation slide-in/fade, timer auto-dismiss, trigger button.

## Archétype UX
Toast non interruptif (XS · P0) : apparaît en haut, reste `duration_ms` ms (défaut 2 500), disparaît seul. Ne bloque **jamais** le flow. Design discret : fond `--ink`, icône `--mint`.

## Garde-fous
- **Anti-interruption** : ce GAB est réservé aux infos courtes non critiques (confirmation discrète, sync, sauvegarde). Pour une info importante à valider → GAB-026. Pour une erreur → GAB-030. Pour un checkpoint moteur → ENG-008.
- **BLOCKED** si `body` absent ou vide.
- `duration_ms` dans `[500, 10000]` recommandé.

## QA à vérifier
1. Modifier `body` → texte du toast change sans toucher au HTML (critère d'or).
2. `body` absent → BLOCKED propre dans la zone.
3. `icon` personnalisé (ex : `★`) → disque icône mis à jour.
4. `duration_ms: 5000` → toast reste 5 s avant auto-dismiss.
5. Instance externe injectée via `ENGINE.init(obj)` → rendu change.
6. Responsive 375/768/1024 — aucun débordement.

## external_refs / dependencies
Aucune dépendance hors-lot. GABs référencés en usage-panel (do_not_use_when) :
- **GAB-026** : info importante à valider
- **GAB-030** : erreur
- **ENG-008** : checkpoint moteur

## Source
`INDEX-300-playkit-GAB-041-044-PLAYABLE.html` (stage `data-tpl="44"`, handler `notifFire()`).
