# GAB-278 · MethodLearningMethodPracticeLoop — « Boucle de pratique guidé → autonome »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechMethodLearning
**Critère validé :** changer le JSON change la boucle (courbe, seuils, exit_rules, CTAs) sans modifier le HTML.

## Pack (structure officielle par-GAB)
```
GAB-278/
  renderer.html            ← moteur boucle pratique (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` · `practice_loop_id` · `method_ref` · `practice_steps[]{attempt,phase,status}` · `progression_rules[]` · `exit_rules[]`

Optionnels : `title`, `subtitle`, `progression_rule`, `mistake_threshold`, `mistake_threshold_action`, `mistake_threshold_current`, `anti_repetition_notice`, `why_this_curve`, `primary_cta{label,action}`, `secondary_cta{label,action}`, `primary_cta_feedback`, `secondary_cta_feedback`, `use_when[]`, `do_not_use_when[]`.

## Ce qui vient du JSON vs HTML
- **JSON** : nombre de tentatives, phases (guided/semi/autonomous), statuts (done/todo), seuil d'alerte, règles de sortie, texte anti-répétition, rationale pédagogique, libellés des boutons et feedbacks.
- **HTML** : grille de la courbe, blocs exit/anti/why, boutons structurels, layout, fallback BLOCKED.

## Archétype pédagogique
GAB-278 modélise la **boucle de pratique guidé→autonome** (scaffolded_fade) : retrait progressif des supports sur N tentatives. La courbe visualise le passage guidé→semi→autonome. Exit quand les critères de sortie sont tous atteints. Lié à GAB-279 (transfert) et GAB-280 (autonomie certifiée) dans la chaîne Method vague 2.

## Garde-fous (child_safety)
- **Anti-répétition vide** : `anti_repetition_notice` présent dans l'instance ; masqué proprement si absent.
- **BLOCKED** si `practice_steps`, `exit_rules`, `progression_rules` absents/vides, ou `method_ref`/`practice_loop_id` absents.
- **Threshold optionnel** : si `mistake_threshold` absent, le bloc seuil est masqué sans erreur.

## QA à vérifier
1. Modifier `practice_steps` (ajouter/retirer tentatives) → courbe se redessine sans toucher au HTML.
2. `exit_rules:[]` → BLOCKED propre.
3. `practice_steps` absent → BLOCKED listant le champ.
4. CTA primaire → feedback `primary_cta_feedback` · bouton se désactive.
5. CTA secondaire → feedback `secondary_cta_feedback`.
6. Responsive 375/768/1024.

## external_refs / dependencies
- **method_ref** `GAB-271-Pythagore` : référence au GAB source de la méthode (hors lot 276-280). Aucun contenu de GAB-271 n'est dupliqué ici — seule la clé de référence est stockée.
- Chaîne Method vague 2 : GAB-276 (erreurs) → GAB-277 (modèle) → **GAB-278** (loop) → GAB-279 (transfert) → GAB-280 (autonomie).

## Source
`INDEX-300-methodlearning-GAB-276-280-PLAYABLE.html` (stage `data-tpl="278"`, bloc `.gab-card.ic278`).
