# GAB-357 · MotivationLearningBadgeUnlock — « Débloquer un badge »

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

## Pack (structure officielle par-GAB)
```
GAB-357/
  renderer.html            ← moteur badge unlock (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` · `badge_unlock_id` · `badge_name` · `criteria_label` · `criteria_current` · `criteria_target` · `criteria_met` · `anti_farming_message` · `unlock_success_message`

Optionnels : `badge_emoji`, `badge_vs_metric_note`, `cta_unlock_label`, `cta_farming_label`, `fallback_text_summary`.

## Ce qui vient du JSON vs HTML
- **JSON** : nom du badge, emoji, critère textuel, score actuel/cible, flag `criteria_met`, message de succès, message anti-farming, note badge≠métrique, libellés boutons.
- **HTML** : barre de progression, bouton structurel, note permanente, layout, fallback BLOCKED.

## Archétype
Badge unlock à critères prouvés. Contrairement à GAB-356 (célébration simple), ce gabarit exige :
1. Un **critère chiffré** et un statut `criteria_met`.
2. Un mécanisme **anti-farming** (bouton dédié → panel bad).
3. Une **note pédagogique permanente** : le badge récompense le parcours, il ne remplace pas la maîtrise réelle.

## Garde-fous (child_safety)
- **Anti-farming** : `anti_farming_message` est un champ requis — empêcher le farming est une exigence éthique, pas optionnelle.
- **Badge ≠ métrique** : `badge_vs_metric_note` rappelle que le badge ne se substitue pas à l'évaluation des compétences.
- **BLOCKED** si `badge_unlock_id`, `badge_name`, `criteria_label`, `anti_farming_message` ou `unlock_success_message` absent.
- Le bouton unlock est désactivé si `criteria_met` est `false`.

## QA à vérifier
1. Modifier `badge_name`/`criteria_label` → rendu change sans toucher au HTML (critère d'or).
2. `badge_unlock_id` absent → BLOCKED propre.
3. Clic « Tenter de farmer » → panel bad avec `anti_farming_message`.
4. Clic « Débloquer » avec `criteria_met:true` → panel ok + bouton désactivé.
5. `criteria_met:false` → bouton unlock désactivé au chargement.
6. Responsive 375/768/1024.

## Source
`INDEX-300-motivationlearning-GAB-356-360-PLAYABLE.html` (stage `data-tpl="357"`, handlers `d357Unlock`, `d357Farm`).
