# GAB-358 · MotivationLearningQuestPrompt — « Proposer une quête »

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

## Pack (structure officielle par-GAB)
```
GAB-358/
  renderer.html            ← moteur quête (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` · `quest_id` · `pedagogical_objective` · `completion_criteria` · `steps[]{step_number,label}` · `exit_no_penalty` · `exit_message` · `completion_message`

Optionnels : `title`, `difficulty`, `duration_estimate`, `pathmap_link`, `non_manipulative_reward`, `primary_cta{label,action}`, `fallback_text_summary`.

## Ce qui vient du JSON vs HTML
- **JSON** : objectif pédagogique, titre de la quête, liste des étapes (numéro + label), message de fin, message d'abandon, libellé du bouton.
- **HTML** : moteur de progression (cases cochables), bouton d'abandon, layout, BLOCKED, responsive.

## Archétype pédagogique
GAB-358 formalise une **quête pédagogique** : objectif mesurable, étapes progressives, critère de fin explicite, et sortie sans pénalité. Anti-manipulation : récompense uniquement pédagogique (PathMap), jamais de badge isolé (→ GAB-357), jamais de pénalité d'abandon.

## Garde-fous (child_safety)
- **exit_no_penalty = true** obligatoire — un élève peut quitter sans conséquence négative.
- **completion_criteria explicite** — le critère de fin doit être mesurable, jamais vague.
- **Non-manipulative_reward** : aucune récompense externe artificielle ; le progrès pédagogique est la seule récompense.
- **BLOCKED** si `pedagogical_objective`, `completion_criteria`, `steps` vides/absents, ou `exit_no_penalty` absent.

## QA à vérifier
1. Modifier `pedagogical_objective` → titre de quête change sans toucher au HTML.
2. Ajouter/retirer une étape dans `steps` → liste et compteur se mettent à jour.
3. Cocher toutes les étapes → `completion_message` affiché, bouton abandon désactivé.
4. Clic abandon → `exit_message` affiché, aucune pénalité.
5. `steps:[]` → BLOCKED propre.
6. Instance externe via `init(ext)` → rendu change sans modifier le HTML.
7. Responsive 375/768/1024.

## Source
`INDEX-300-motivationlearning-GAB-356-360-PLAYABLE.html` (stage `data-tpl="358"`, handlers `d358Step`, `d358Exit`).

## external_refs / dependencies
| Réf | Rôle |
|---|---|
| GAB-357 · MotivationLearningBadgeUnlock | Badge isolé → utiliser GAB-357, pas GAB-358 |
| GAB-356 · MotivationLearningProgressCelebration | Célébration simple → utiliser GAB-356, pas GAB-358 |
