> ⚠️ **GAB SENSIBLE — VALIDATION BOSS OBLIGATOIRE avant tout usage.** (child-safety / RGPD / orientation / career). Contenu extrait sans invention ; à relire par un humain.

# GAB-380 · CareerLearningEmptyState — « Métier · état vide »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechCareerLearning
**Critère validé :** changer le JSON change l'état vide sans modifier le HTML. ✅ check.py.

## 🚨 GAB SENSIBLE — REVUE BOSS OBLIGATOIRE
Ce gabarit touche à l'**orientation / career / child-safety / RGPD**.
- `child_safety.needs_boss_review = true` dans l'instance.
- Extraction **ULTRA-prudente** : **aucune** donnée métier inventée. Tout le contenu provient STRICTEMENT du HTML source (`<!-- GAB-380 -->`, handlers `d380Act` / `d380Report`).
- ⛔ **À FAIRE REVOIR PAR BOSS avant tout usage prod** (orientation/RGPD).

## Pack (structure officielle par-GAB)
```
GAB-380/
  renderer.html            ← moteur état vide (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` · `empty_state_id` · `empty_title` · `empty_message` · `actions[]{id,label,type,result_state,feedback}` · `no_fake_career` (DOIT être `true`).
Optionnels : `title`, `state_label`, `prompt`, `use_when[]`, `do_not_use_when[]`, `child_safety`, `accessibility`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre/message de l'état vide, prompt, chaque action (label, type, état résultant, feedback), garde-fou `no_fake_career`, listes use/do-not-use.
- **HTML** : carte vide centrée, rangée de chips, panel de feedback, bandeau garde-fou, layout usage, slots.

## Archétype
État vide « text_cta » : message diagnostic + boutons de pistes (CTA) qui poussent du texte. Aucune saisie ni scoring.

## Garde-fous (child_safety)
- **no_fake_career = true** (obligatoire) : on ne fabrique **jamais** de fausse fiche métier — `validate()` pousse un message `BLOCKED` si absent ou ≠ true.
- **Anti-invention** : `alternative_source` renvoie vers une source vérifiée (ONISEP / conseiller), **jamais** de contenu métier généré.
- **admin_report** : signale le manque à l'admin (log séparé) + message élève simple, **aucune fiche inventée**.
- **BLOCKED** si `empty_title` / `empty_message` absents, `actions` vides, ou `no_fake_career != true`.

## QA à vérifier
1. Modifier un `feedback`/`label` → rendu change sans toucher au HTML (critère d'or). 2. `actions:[]` ou `no_fake_career:false` → BLOCKED propre. 3. Clic « Reformuler » → état `clarification_needed`, aucun contenu métier inventé. 4. Clic « Signaler » → état `reported`, message admin. 5. Responsive 375/768/1024.

## external_refs / dependencies
- Renvoi hors-lot : `une fiche existe (→ GAB-372)` (fiche métier disponible) — référence narrative dans `do_not_use_when`, pas une dépendance technique.
- Cohorte du lot : GAB-376→380 (CareerLearning). GAB-380 = état vide terminal du module.

## Source
`INDEX-300-careerlearning-GAB-376-380-PLAYABLE.html` (stage `data-tpl="380"`, handlers `d380Act` / `d380Report`).
