# GAB-297 · OralLearningStressSupport — « Support stress · non-médical · opt-out »

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

## Pack (structure officielle par-GAB)
```
GAB-297/
  renderer.html            ← moteur support stress (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
Écran support pré-oral non médical : exercice de respiration guidé (pattern 4-7-8, 3 cycles),
opt-out explicite (exercice non obligatoire), fallback adulte de confiance en cas de crise forte.
Le bloc `non_medical_notice` est structurellement obligatoire et non éditable dans son sens légal.

## Champs requis (instance, à plat)
`gab_id` · `stress_support_id` · `support_goal` · `support_steps[]{step,verb,detail}` · `non_medical_notice{label,heading,body}` · `next_action{primary:{label,action}}`

Optionnels : `card_icon`, `card_tag`, `title`, `subtitle`, `breathing_timer{label,pattern,cycles,instruction,duration_seconds}`, `calm_mode`, `skip_allowed{icon,heading,body}`, `trusted_adult_suggestion`, `high_stress_fallback{label,heading,body,sos_notice}`, `source_metadata{reason_block_heading,reason_block_body}`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, sous-titre, étapes de respiration, libellés des boutons, contenu de tous les blocs (notice, steps, opt-out, fallback, sos_notice, reason).
- **HTML** : layout, animations breathing circle, timer JS, couleurs DS V2, structure slots.

## Garde-fous (child_safety / SAFETY)
- **NON_MEDICAL_NOTICE obligatoire** : l'écran ne peut pas s'afficher sans ce champ. Le sens légal (pas de diagnostic, pas de soin) ne peut pas être supprimé par l'instance.
- **OPT-OUT toujours visible** : `skip_allowed` ne peut jamais être masqué programmatiquement.
- **HIGH_STRESS_FALLBACK** : si présent, le `sos_notice` avec les numéros (3114, 3020) doit être affiché intégralement.
- **BLOCKED** si `stress_support_id` absent / `support_steps` vide / `non_medical_notice` absent / `next_action` absent.
- Ce GAB ne convient **pas** à un contexte de crise d'angoisse diagnostiquée ou de trouble anxieux : il redirige vers un humain.

## QA à vérifier
1. Modifier `title`/`support_steps` → rendu change sans toucher au HTML (critère d'or).
2. `support_steps:[]` → BLOCKED propre.
3. `non_medical_notice` absent → BLOCKED.
4. Bouton primaire → timer `breathing_timer.duration_seconds` démarre, feedback ✅ à la fin.
5. Bouton secondaire → `skip_feedback` s'affiche.
6. Responsive 375 / 768 / 1024 — 0 débordement.

## external_refs / dependencies
Aucune référence hors-lot. Contenu auto-suffisant extrait de `INDEX-300-orallearning-GAB-296-300-PLAYABLE.html` (stage `data-tpl="297"`).

## Source
`INDEX-300-orallearning-GAB-296-300-PLAYABLE.html` — stage `data-tpl="297"`, commentaire `<!-- GAB-297 STRESSSUPPORT -->`.
