# GAB-106 · MemoryClozeCard — « Carte à trou »

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

## Pack (structure officielle par-GAB)
```
GAB-106/
  renderer.html            <- moteur carte à trou (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
**MemoryClozeCard** : une phrase à compléter avec un mot/expression manquant, retrouvé en cliquant parmi plusieurs options proposées. Feedback immédiat : correct → trou rempli + options désactivées ; incorrect → flash rouge 600ms.

## Champs requis (instance, à plat)
`gab_id` · `cloze_card_id` · `label` · `sentence_before` · `answer` · `options[]{label,correct}`

Optionnels : `sentence_after`, `feedback_correct`, `feedback_wrong`, `primary_cta{label,action}`.

## Ce qui vient du JSON vs HTML
- **JSON** : le libellé d'instruction (`label`), les fragments de phrase (`sentence_before`, `sentence_after`), la réponse attendue (`answer`), la liste des options avec leur statut (`options`), les feedbacks texte, le libellé du bouton CTA.
- **HTML** : structure de la carte, blank visuel, rendu des options, animations correct/wrong, layout responsive.

## Garde-fous (child_safety)
- **Anti-invention** : aucun contenu pédagogique n'est en dur dans le HTML. Tout vient de l'instance.
- **BLOCKED** si `options` absent/vide, `sentence_before` absent, ou `answer` absent.
- `options` doit contenir exactement 1 entrée `correct:true` — la logique de pick vérifie `opt.correct`.
- `answer` doit correspondre au `label` de l'option correcte (cohérence sémantique).

## QA à vérifier
1. Modifier `sentence_before` / `options` / `feedback_correct` → rendu change sans toucher au HTML (critère d'or).
2. `options:[]` → BLOCKED propre affiché.
3. Clic option correcte → blank rempli avec `answer`, option styled `.correct`, autres `.disabled`.
4. Clic option incorrecte → option flash `.wrong` 600ms, blank inchangé, feedback bad.
5. Responsive 375/768/1024 — options wrap sans débordement.

## external_refs / dependencies
- Aucune dépendance externe. Pas de lien inter-lot.
- Police DM Sans / Nunito / JetBrains Mono : chargées via Google Fonts si disponible, fallbacks système inclus dans CSS.
- Palette DS V2 conforme : violet #7B61FF, coral #FF6B7E, mint #1FCBB0, gold #FFB73D. Aucun `rgba(0,0,0,...)` en box-shadow.

## Source
`INDEX-300-memorylearning-GAB-106-110-PLAYABLE.html` (stage `data-tpl="106"`, handler `clzPick`).
