# GAB-354 · MotivationLearningChallengeChoice — « Choisir un défi »

**Archétype / renderer_key :** `choice_select` (cartographie) · **module :** EdTechMotivationLearning
**Statut source :** V1_CORE · S · P0 (extrait de INDEX-300-motivationlearning-GAB-351-355-PLAYABLE.html)
**renderer_key à concevoir (pas de moteur kit) :** `choice_select` n'a pas de moteur kit de référence dans la bibliothèque actuelle — le renderer est dérivé de l'écran source lui-même.

## Pack (structure officielle par-GAB)

```
GAB-354/
  renderer.html            ← moteur choix de défi (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` · `challenge_choice_id` · `intro_label` · `choices[]{key,icon,label,color_token,feedback}` · `decline_label` · `decline_feedback`

Optionnels : `initial_state`, `accessibility{keyboard_navigable,focus_visible,prefers_reduced_motion}`, `child_safety{right_to_decline,no_judgment_on_decline,partial_success_valued,reward_transparent}`, `choices[].is_recommended`.

## Ce qui vient du JSON vs HTML

- **JSON** : libellé introductif, chaque choix (icône, label, couleur, feedback), libellé et feedback du refus, badge « recommandé ».
- **HTML** : grille de cartes, sélection visuelle (outline violet), rendu panel feedback, bouton de refus structurel, layout.

## Archétype pédagogique

GAB-354 implémente le pattern **choix de difficulté à transparence totale** :
- L'élève choisit parmi 3 niveaux (faible/médian/ambitieux) présentés avec honnêteté sur la récompense et le risque.
- La réussite partielle est valorisée explicitement dès la présentation du choix.
- Le refus du défi est un droit affiché, sans jugement (`right_to_decline: true`).

## Garde-fous (child_safety)

- **Droit de refus non négociable** : `decline_label` + `decline_feedback` sont des champs REQUIS — le bouton ne peut pas être supprimé par l'instance.
- **Transparence récompense** : `child_safety.reward_transparent` doit être `true` ; le feedback de chaque choix DOIT mentionner la récompense ou le risque (contrainte de schéma).
- **Aucun jugement sur le refus** : le `decline_feedback` de l'instance de référence reflète la règle source : « aucun jugement ».
- **BLOCKED** si `choices` vide/absent, `decline_label` absent, `decline_feedback` absent, `intro_label` absent.

## QA à vérifier

1. Modifier le `label` / `feedback` d'un choix → rendu change sans toucher au HTML (critère d'or data-driven).
2. `choices:[]` → BLOCKED propre (message dans panel.bad).
3. `decline_label` absent → BLOCKED propre.
4. Clic sur un choix → outline violet + panel.ok avec le bon feedback.
5. Clic decline → panel.note avec `decline_feedback`, sans outline sur les cartes.
6. `is_recommended:true` sur un choix → badge « recommandé » affiché.
7. Instance externe injectée via `ENGINE.init(ext)` → rendu change sans modifier le HTML.
8. Responsive 375/768/1024 → aucun débordement.

## external_refs / dependencies

Aucune dépendance vers un autre GAB dans le lot.
Relation contextuelle (hors lot, non bloquante) :
- **GAB-355** (MotivationLearningComeBackLater) : cité dans la zone `do_not_use_when` de GAB-354 — si l'élève veut revenir plus tard plutôt que choisir un défi, c'est GAB-355 qui prend la main. Aucune dépendance technique directe.

## Source

`INDEX-300-motivationlearning-GAB-351-355-PLAYABLE.html` · bloc `data-tpl="354"` · handlers `d354Pick` / `d354Decline`.
