# GAB-214 · AdaptiveLearningDifficultyAdjuster — « Ajusteur de difficulté »

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

## Pack (structure officielle par-GAB)
```
GAB-214/
  renderer.html            ← moteur ajusteur difficulté (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
```

## Archétype
**Choix de difficulté avec raison explicite.** L'élève reçoit une proposition d'ajustement (monter, rester, descendre) avec une justification transparente. Il choisit librement — aucun ajustement n'est imposé. Le bouton primary reste désactivé tant qu'aucun choix n'est sélectionné.

## Champs requis (instance, à plat)
`gab_id` · `adjuster_id` · `title` · `reason` (HTML autorisé) · `choices[]{key,icon,label,description,cta_confirm}`

Optionnels : `summary`, `safety_note` (HTML autorisé), `primary_cta{label_default,action}`, `skip_cta{label,action}`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, sous-titre, raison de la proposition, libellé/icône/description de chaque choix, texte du bouton de confirmation (mis à jour dynamiquement), note sécurité, libellé skip.
- **HTML** : structure carte, styles couleur par `key` (easier=mint, same=violet, harder=coral), animation icône, état désactivé/activé du CTA, guard BLOCKED.

## Garde-fous (child_safety)
- **Transparence obligatoire** : `reason` est un champ REQUIRED — doctrine PART-13A : chaque décision adaptative expose sa logique en langage élève. Pas de boîte noire.
- **Anti-sanction** : `safety_note` rappelle que l'ajustement n'est jamais punitif. Ne pas formuler de jugement définitif.
- **Choix libre** : le bouton primary reste désactivé si aucun choix n'est sélectionné — pas d'imposition d'une direction.
- **BLOCKED** si `title`, `reason` ou `choices` absents.

## QA à vérifier
1. Modifier `reason` ou un `label` dans le JSON → rendu change sans toucher au HTML (critère d'or).
2. `choices:[]` → BLOCKED propre.
3. `reason` absent → BLOCKED propre.
4. Clic choice `harder` → style coral + `✓` + CTA activé avec `cta_confirm`.
5. Clic primary sans sélection → bouton disabled (pas d'action).
6. Clic skip → panel ok « Pas maintenant ».
7. Responsive 375/768/1024.

## Doctrine AdaptiveLearning (PART-13A)
Ce gabarit fait partie de la vague 1 du module 13 (EdTechAdaptiveLearning). Il consomme un signal adaptatif (ex. issu de GAB-211) et propose un ajustement. Il ne s'affiche pas en cours d'évaluation officielle (garde applicatif externe). Il ne remplace pas LevelTestQuestionAdaptive.

## Source
`INDEX-300-adaptivelearning-GAB-211-215-PLAYABLE.html` (stage `data-tpl="214"`, handler `daPick()`).
