# GAB-188 · PathMapMissionNode — « Nœud mission »

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

## Pack (structure officielle par-GAB)
```
GAB-188/
  renderer.html            ← moteur nœud 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_node_id` · `title` · `objective` · `primary_cta{label,action}`

Optionnels : `icon`, `state`, `module_label`, `difficulty`, `estimated_duration`, `activity_count`, `reward_context`, `secondary_cta{label,action}`, `accessibility`, `child_safety`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre de la mission, icône, état (active/available/completed), label du module cible, objectif pédagogique, difficulté, durée, nb activités, contexte récompense, libellés des deux boutons.
- **HTML** : structure de la carte, pills, barre de métadonnées, layout, gestion d'état visuel.

## Garde-fous (child_safety)
- **Récompense non hardcodée** : `reward_context` est une description textuelle ; la récompense réelle est injectée par PlayKit à la validation de session. `child_safety.reward_hardcoded` doit être `false`.
- **BLOCKED** si `mission_node_id`, `title`, `objective` ou `primary_cta` absent.
- **secondary_cta optionnel** : si absent, le bouton Détails n'est pas rendu — aucune erreur.

## QA à vérifier
1. Modifier `title`/`objective` → rendu change sans toucher au HTML (critère d'or).
2. `primary_cta` absent → BLOCKED propre.
3. `state: 'completed'` → carte avec bordure mint + pill « Terminé ».
4. `secondary_cta` absent → 1 seul bouton, pas d'erreur JS.
5. Responsive 375/768/1024.

## Nœuds connexes (external_refs / dependencies)
- **GAB-152** — `PathMapMiniGameMission` : à utiliser à la place de GAB-188 si la mission est un mini-jeu.
- **GAB-047** — mission story : à utiliser si la mission est narrative.
- **GAB-189** — `PathMapLockedNode` : nœud verrouillé pédagogique (même LOT).
- **GAB-190** — `PathMapCheckpointBoss` : checkpoint-boss de fin de segment (même LOT).

## Source
`INDEX-300-pathmap-GAB-186-190-PLAYABLE.html` (stage `data-tpl="188"`, handlers `peConfirm`/`peNote`).
