# GAB-137 · InteractiveDragExplore — « Exploration par déplacement »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechInteractiveLearning
**Critère validé :** changer le JSON change les jetons, les zones et les feedbacks sans modifier le HTML. check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-137/
  renderer.html            ← moteur drag-explore (tap-to-place, 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` · `drag_explore_id` · `title` · `instruction` · `items[]{id,label,best_zone}` · `zones[]{id,label}` · `feedback{partial,all_correct,partial_correct}`

Optionnels : `instruction_armed`, `instruction_continue`, `cta_label`.

## Ce qui vient du JSON vs HTML
- **JSON** : chaque jeton (label, id, best_zone), chaque zone (id, label), les 3 messages de feedback, les instructions, le libellé du bouton reset.
- **HTML** : layout pool/board, logique tap-to-place, barre de statut armé/non-armé, rendu feedback, bouton structurel.

## Archétype : tap-to-place (pattern B)
Interaction en 2 temps : (1) tap sur un jeton → sélection + arming des zones, (2) tap sur une zone → dépôt. Re-tap sur un jeton placé = le rapatrier dans le pool. Pattern accessible clavier + mobile.

## Garde-fous (child_safety / anti-notation)
- L'activité est **exploratoire et non notée** — les feedbacks sont informatifs, jamais des notes officielles.
- `best_zone` sert à calculer un feedback de guidage, pas une évaluation sanctionnée.
- **BLOCKED** si `items` vide / `zones` vide / `feedback` absent.
- Les `best_zone` des items doivent référencer des `id` présents dans `zones`.

## QA à vérifier
1. Modifier un `label` de jeton → rendu change sans toucher au HTML (critère d'or).
2. `items:[]` → BLOCKED propre.
3. `zones:[]` → BLOCKED propre.
4. `feedback` absent → BLOCKED propre.
5. Tous jetons placés au bon endroit → `feedback.all_correct` affiché.
6. Erreurs de placement → `feedback.partial_correct` avec `{correct}/{total}`.
7. Re-tap jeton placé → retour dans le pool.
8. Bouton reset → pool reconstitué, zones vidées.
9. Responsive 375/768/1024.

## external_refs / dependencies
- Aucune dépendance externe. Renderer autonome (0 import, 0 fetch).
- Référence usage : `do_not_use_when` → tri NOTÉ (→ GAB-122), association paires (→ GAB-105).

## Source
`INDEX-300-interactivelearning-GAB-136-140-PLAYABLE.html` (stage `data-tpl="137"`, handlers `dePick / deDrop / deFeedback`).
