# GAB-152 · GameMissionCard — « Carte mission »

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

## Pack (structure officielle par-GAB)
```
GAB-152/
  renderer.html            ← moteur carte mission (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` · `mission_card_id` · `mission_number` · `title` · `objective` · `cta_label`

## Champs optionnels
`mission_icon` · `xp_reward_ribbon` · `success_condition` · `constraint` · `reward` · `cta_feedback`

## Ce qui vient du JSON vs HTML
- **JSON** : numéro de mission, icône, titre, texte de chaque rangée (objectif/réussite/contrainte/récompense), libellé du bouton, feedback post-clic, ruban XP.
- **HTML** : layout carte, ribbon décoratif, rangées colorées, bouton structurel, slot-chips, pied de page.

## Garde-fous (child_safety)
- **BLOCKED** si `mission_number`, `title`, `objective` ou `cta_label` absents.
- Rangées optionnelles (`success_condition`, `constraint`, `reward`) masquées proprement si absentes.
- Ruban XP masqué si `xp_reward_ribbon` absent.
- Bouton désactivé après clic (évite double-soumission), feedback affiché depuis JSON.
- 0 contenu pédagogique en dur dans le HTML.

## QA à vérifier
1. Modifier `title`/`objective` → rendu change sans toucher au HTML (critère d'or).
2. `title` absent → BLOCKED propre, bouton désactivé.
3. `xp_reward_ribbon` absent → ruban masqué, reste intact.
4. `success_condition`+`constraint`+`reward` absents → ces rangées masquées, objective + CTA toujours visibles.
5. Clic CTA → bouton désactivé + message `cta_feedback`.
6. Instance externe injectée via `ENGINE.init(ext)` → rendu change sans modifier HTML.
7. Responsive 375/768/1024.

## Archétype pédagogique
Carte de présentation d'une mission ludique précise (objectif + réussite + contrainte + récompense).
Usage : série de missions enchaînées, cadrage d'une activité de classement/tri gamifiée.

## external_refs / dependencies
- `ENG-002` : intro session moteur (cas d'usage adjacent, non requis ici)
- `GAB-045` : intro aventure narrative (cas d'usage adjacent)
- `GAB-117` : consigne d'exercice (ne pas utiliser GAB-152 à sa place)
- `ENG-003` : objectif moteur de session (ne pas utiliser GAB-152 à sa place)

## Source
`INDEX-300-gamelearning-GAB-151-155-PLAYABLE.html` (stage `data-tpl="152"`, CSS `.gm-*`).
