# GAB-014 · SessionVersionMismatch — « Config de session modifiée en cours »

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

## Pack (structure officielle par-GAB)
```
GAB-014/
  renderer.html            ← moteur mismatch de version (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_version_id` · `title` · `body` · `primary_cta{label,action}`

Optionnels : `subtitle`, `version_label`, `session_hash`, `secondary_cta{label,action}`, `feedback_new`, `feedback_keep`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, sous-titre, corps, libellé du bouton principal, libellé du bouton secondaire, label de version, hash de session, messages de feedback.
- **HTML** : carte d'avertissement (fond gold), icône structurelle 🔄, zone code technique, layout, boutons structurels, fallback BLOCKED.

## Garde-fous
- **BLOCKED** si `title`, `body` ou `primary_cta` absents : la carte est masquée et le message d'erreur est affiché.
- `version_label` et `session_hash` sont combinés dans la zone code technique et masqués si absents tous les deux.
- Le bouton secondaire est masqué si `secondary_cta` absent de l'instance.
- Aucun contenu texte hardcodé dans le moteur HTML.

## Cas d'usage (source INDEX-300)
| use_when | do_not_use_when |
|---|---|
| La config a changé pendant la tentative | Simple reprise (→ GAB-006) |
| Version de session obsolète | Erreur provider (→ GAB-011) |
| Protéger la cohérence des données | Perte réseau (→ GAB-009) |

## QA à vérifier
1. Modifier `title`/`body`/`primary_cta.label` → rendu change sans toucher au HTML (critère d'or).
2. `title` absent → BLOCKED propre, carte masquée.
3. `version_label` + `session_hash` présents → affichés dans la zone code technique.
4. Clic bouton primary → `feedback_new` affiché en vert mint.
5. Clic bouton secondary → `feedback_keep` affiché en muted.
6. `secondary_cta` absent → bouton secondaire masqué.
7. Responsive 375/768/1024.

## Source
`INDEX-300-playengine-GAB-011-015-PLAYABLE.html` (stage `data-tpl="14"`, handler `verAction`).

## external_refs / dependencies
- GAB-006 (SessionResume) : destination alternative pour simple reprise.
- GAB-009 (NetworkLoss) : destination alternative pour perte réseau.
- GAB-011 (SessionProviderErrorBoundary) : destination alternative pour erreur provider.
