# GAB-201 · PlayEngineCompositeSessionIntro — « Intro session multi-formats »

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

## Pack (structure officielle par-GAB)
```
GAB-201/
  renderer.html            ← moteur intro session composite (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` · `session_intro_id` · `title` · `summary` · `items[]{num,label,mod_class,mod_tag,duration}` · `primary_cta{label,action}`

Optionnels : `objective`, `estimated_duration`, `difficulty`, `secondary_cta{label,action}`, `secondary_cta_note`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre session, résumé contextuel, objectif, durée/niveau, liste ordonnée des formats avec leurs modules et durées, libellé du bouton primaire et secondaire.
- **HTML** : layout bannière, stats-row, liste formats, boutons structurels, panel feedback.

## Archétype
GAB-201 est l'**intro d'une session composite multi-formats**. Il annonce le déroulé avant démarrage. PlayEngine orchestre mais ne possède pas la logique de chaque format (STORY, VISUAL, INTERACTIVE, EXERCISE…) — le `mod_class` est une référence de routing, jamais du contenu dupliqué.

## Garde-fous
- **BLOCKED** si `items` absent ou vide.
- **BLOCKED** si `primary_cta` absent.
- **BLOCKED** si `session_intro_id` absent.
- Ne pas utiliser pour une session 1 seul bloc (→ GAB-002) ni pour une intro de parcours (→ GAB-186).
- `mod_class` doit appartenir à l'allowlist : `story|visual|interactive|exercise|game|audio|memory`.

## QA à vérifier
1. Modifier `title`/`summary`/`items` → rendu change sans toucher au HTML (critère d'or).
2. `items:[]` → BLOCKED propre.
3. `primary_cta` absent → BLOCKED propre.
4. Injection via `ENGINE.init(monInstance)` → rendu change.
5. Responsive 375/768/1024 : stats-row en colonne sur mobile, cta-row en colonne.

## external_refs / dependencies
- **GAB-002** : session 1 bloc (utiliser à la place de GAB-201 si session simple).
- **GAB-186** : intro de parcours (utiliser à la place si contexte PathMap/LevelTest intro).
- **GAB-202** : BlockStack (pile ordonnée de blocs multi-modules — suite logique de GAB-201).

## Source
`INDEX-300-playengine-composite-GAB-201-205-PLAYABLE.html` (stage `data-tpl="201"`, bloc `.ci-card`, handlers `peConfirm` / `peNote`).
