# GAB-017 · SessionSkipStepConfirm — « Confirmation de saut d'étape »

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

## Pack (structure officielle par-GAB)
```
GAB-017/
  renderer.html            ← moteur confirmation saut (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` · `skip_confirm_id` · `title` · `body` · `skip_from_label` · `skip_to_label` · `primary_cta{label,action}` · `secondary_cta{label,action}`

Optionnels : `feedback_go`, `feedback_stay`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre de la question de confirmation, corps d'explication, libellés des étapes (skip_from_label / skip_to_label), libellés des deux CTA, feedbacks post-clic.
- **HTML** : card avec icône, zone preview dashed, deux boutons, zone feedback, layout — rien de ces éléments n'est en dur.

## Archétype
Confirmation à deux choix (saut d'une étape optionnelle) : CTA primaire (action irréversible — sauter) + CTA secondaire (rester). Pattern identique à GAB-016 (SessionExitConfirm) mais tonalité violet (saut d'étape) vs coral (sortie session).

## Garde-fous (child_safety)
- **Anti-invention** : `skip_from_label` et `skip_to_label` doivent venir du contexte de session réel, jamais inventés dans le HTML.
- **BLOCKED** si `title`, `primary_cta` ou `secondary_cta` absent.
- **Uniquement si étape skippable** : ne pas afficher ce GAB si l'étape est obligatoire.
- **Ne pas confondre** avec GAB-016 (sortie complète) ou GAB-019 (mode rapide global).

## QA à vérifier
1. Modifier `skip_from_label`/`skip_to_label` → preview change sans toucher au HTML (critère d'or).
2. `primary_cta` absent → BLOCKED propre.
3. Clic bouton "go" → `feedback_go` s'affiche en violet.
4. Clic bouton "stay" → `feedback_stay` s'affiche en mint.
5. Instance externe injectée via `ENGINE.init(ext)` → rendu change sans modifier le HTML.
6. Responsive 375/768/1024 — boutons s'empilent sur mobile.

## external_refs / dependencies
- **GAB-016** (SessionExitConfirm) : même pattern modal-confirmation, tonalité coral — pour sortie complète de session.
- **GAB-019** (SessionFastModePrompt) : pour activation du mode rapide global (toutes les étapes).
- **GAB-018** (SessionNavigationControls) : barre de contrôles qui déclenche l'ouverture de ce GAB via le bouton "Passer".

## Source
`INDEX-300-playengine-GAB-016-020-PLAYABLE.html` (stage `data-tpl="17"`, handler `skipAction()`).
