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

# GAB-361 · OrientationLearningIntro — « Explorer, pas décider à ta place »

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

## ⚠️ GAB SENSIBLE — REVUE BOSS OBLIGATOIRE AVANT PROD
Ce gabarit relève de l'**orientation / career / child-safety / RGPD**. À ce titre :
- **Aucune invention** : 100 % du contenu provient du HTML source (`INDEX-300-orientationlearning-GAB-361-365-PLAYABLE.html`, stage `data-tpl="361"`, handlers `d361Mode` / `d361Start`).
- **Pas de profilage** : l'intro ne crée aucun profil élève (`child_safety.no_profiling: true`).
- **Pas de destin figé** : neutralité posée d'emblée (`child_safety.no_fixed_destiny: true`).
- **Partage contrôlé** : confidentialité gérée par l'utilisateur (`child_safety.privacy_controlled_sharing: true`).
- 🚩 **FLAG REVUE BOSS** : tout ajout/modif de contenu d'orientation (textes du cadre, libellés de mode, formulations) doit être **validé par Boss** avant déploiement. Champ `child_safety.review_required` posé dans l'instance.

## Pack (structure officielle par-GAB)
```
GAB-361/
  renderer.html            ← moteur intro orientation (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` · `intro_id` · `title` · `body` · `modes[]{id,label,state,default}` · `primary_cta{label,action}` · `contract_items[]{icon,title,text}`
Optionnels : `kind_label`, `started_cta_label`, `slots[]{key,required}`, `use_when[]`, `do_not_use_when[]`, `child_safety{}`, `accessibility{}`.

## Ce qui vient du JSON vs HTML
- **JSON** : carte (kind_label, title, body), les modes (solo / famille-prof + état), le **libellé** du CTA (et celui après démarrage), les 3 items de cadre (icône + titre + texte), les slots, les listes use_when / do_not_use_when.
- **HTML** : layout, doc-card, rangée de boutons mode, bouton CTA structurel, grille de contrat (animation `.show`), panels d'état, grille usage. Aucun texte métier en dur.

## Garde-fous (child_safety) — câblés
- **BLOCKED** si `title` / `body` / `modes` / `primary_cta.label` / `contract_items` absents (le moteur affiche un panel `bad` listant le champ + mot `BLOCKED` dans `validate()`).
- **Neutralité** : le cadre (« aucune voie meilleure ») est du contenu source, pas une opinion ajoutée.
- **Anti-invention** : si une formulation source manque, mettre `"_TODO": "..."` dans l'instance plutôt que d'halluciner.

## QA à vérifier
1. Modifier `title`/`body`/un `contract_items[].text` → rendu change sans toucher au HTML (critère d'or).
2. `contract_items:[]` ou `modes:[]` → BLOCKED propre.
3. Clic CTA en mode solo → panel ok « mode solo » + CTA désactivé.
4. Sélection mode famille/prof puis CTA → panel ok « mode famille/prof ».
5. Responsive 375/768/1024 → 0 débordement.

## external_refs / dependencies
- **GAB-362** (OrientationLearningInterestExplorer) : référencé dans `do_not_use_when` (« explorer les intérêts (→ GAB-362) ») comme renvoi de cadrage. Aucune dépendance de code — simple mention textuelle de hors-périmètre, extraite du source. Pas d'identifiant d'un autre GAB dans le moteur (leak-check OK).
- Source d'extraction : `/var/www/2.SOURCES/GAB/GAB-001-390-DATA-SOURCES/GAB-DATA-SOURCES/INDEX-300-orientationlearning-GAB-361-365-PLAYABLE.html` (stage `data-tpl="361"`).

## Source
`INDEX-300-orientationlearning-GAB-361-365-PLAYABLE.html` (stage `data-tpl="361"`, handlers `d361Mode` / `d361Start`).
