# GAB-192 · PathMapProgressTraveler — « Voyageur de progression A→B »

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

## Pack (structure officielle par-GAB)
```
GAB-192/
  renderer.html            ← moteur voyageur progression (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
```

## Archétype — ce que fait ce GAB
Affiche une **carte de chemin animée A→B** après qu'une mission a été validée côté serveur. Le "voyageur" (emoji paramétrable) se déplace du nœud de départ vers l'étape suivante avec :
- Piste colorée (mint → violet) animée en fill
- Deux nœuds : départ (complété) + arrivée (prochain)
- Bloc feedback de validation
- Barre de progression numérique (X/Total · %)
- CTA principal de navigation
- Bouton "Rejouer animation"
- Respect `prefers-reduced-motion` (fallback statique garanti)

## Champs requis (instance, à plat)
`gab_id` · `traveler_id` · `title` · `node_start_label` · `node_end_label` · `traveler_emoji` · `progress_current` · `progress_total` · `progress_percent` · `primary_cta{label,action}`

Optionnels : `subtitle` · `node_start_emoji` · `node_end_emoji` · `feedback_header` · `feedback_text` · `progress_label` · `replay_label` · `reduced_motion_note`

## Ce qui vient du JSON vs HTML
- **JSON** : contenu des deux nœuds, emoji voyageur, feedback, libellé barre, valeurs de progression, libellé CTA, libellé replay, note reduced-motion.
- **HTML** : layout de la piste, positionnement des nœuds, animation CSS, barre structurelle, bouton structurel, fallback.

## Garde-fous
- **État réel obligatoire** : ce gabarit ne doit s'afficher que si la mission est validée côté serveur — le mouvement du voyageur n'est pas décoratif.
- **BLOCKED** si `traveler_id`, `title`, `node_start_label`, `node_end_label`, `traveler_emoji` ou `primary_cta` sont absents.
- **prefers-reduced-motion** : les animations CSS sont désactivées via `@media`  ; le voyageur apparaît à la position finale statiquement.
- **XP gain** : si un gain XP doit être affiché en parallèle, utiliser PlayKit (hors périmètre de ce GAB).

## QA à vérifier
1. Modifier `node_end_label` / `feedback_text` → rendu change sans toucher au HTML (critère d'or).
2. `primary_cta` absent → BLOCKED propre.
3. `traveler_id` absent → BLOCKED listé.
4. CTA cliqué → panel vert confirme l'action.
5. Replay cliqué → animation relancée depuis 0%.
6. `prefers-reduced-motion` activé → animation inactive, voyageur visible position finale.
7. Responsive 375/768/1024 : chemin lisible, aucun débordement.

## Source
`INDEX-300-pathmap-GAB-191-195-PLAYABLE.html` (stage `data-tpl="192"`, handlers `ptReplay`, classes `.pt-*`).
