# GAB-068 · StoryNextRecommendation — « Recommandation de suite »

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

## Pack (structure officielle par-GAB)
```
GAB-068/
  renderer.html            ← moteur recommandation (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` · `recommendation_id` · `section_title` · `next_title` · `next_why` · `primary_cta{label,action}`

Optionnels : `section_icon`, `next_icon`, `next_tag`, `alt_link_label`, `alt_feedback`, `selected_tag`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre de section, icône d'en-tête, icône recommandation, tag catégorie, titre activité recommandée, justification pédagogique (`next_why`), libellé du bouton, texte lien alternatif, feedback alternatif, tag post-sélection.
- **HTML** : carte structurelle, zone rec-main cliquable, zone feedback alternatif, slots debug, layout.

## Garde-fous (child_safety)
- **Justification obligatoire** : `next_why` est requis — une recommandation sans justification pédagogique est BLOCKED (cf. `do_not_use_when` source : "sans justification pédagogique").
- **Sélection idempotente** : un second clic sur la carte ne fait rien (`data-picked` guard).
- **BLOCKED** si `section_title` / `next_title` / `next_why` / `primary_cta` absent.

## QA à vérifier
1. Modifier `next_title`/`next_why` → rendu change sans toucher au HTML (critère d'or).
2. `next_why` absent → BLOCKED propre.
3. Clic carte → tag mis à jour avec `selected_tag`, second clic ignoré.
4. Clic lien alternatif → `alt_feedback` affiché.
5. Responsive 375/768/1024 — aucun débordement.

## external_refs / dependencies
- Référence `GAB-031` (action générique) mentionnée dans `do_not_use_when` — GAB hors-lot, pas de dépendance de rendu.
- Référence `PathMap` mentionnée dans `do_not_use_when` pour parcours complet — composant hors-lot, pas de dépendance de rendu.

## Source
`INDEX-300-storylearning-GAB-065-069-PLAYABLE.html` (stage `data-tpl="68"`, handler `recSelect`).
