# GAB-147 · InteractiveHypothesisTest — « Test d'hypothèse »

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

## Pack (structure officielle par-GAB)
```
GAB-147/
  renderer.html            ← moteur test d'hypothèse (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

GAB-147 est un **test d'hypothèse interactif** : l'apprenant est confronté à une hypothèse (affirmation scientifique ou causale), manipule un paramètre parmi N options, et observe si le résultat confirme, infirme ou nuance l'hypothèse. L'accent est mis sur la **démarche** (formuler → tester → conclure), pas juste sur le résultat.

**Use when :** démarche scientifique (hypothèse + test), vérifier une affirmation par expérimentation, comprendre la démarche, pas que le résultat.  
**Do not use when :** simulation simple sans hypothèse (→ GAB-138), cause-effet multi-switches (→ GAB-141), QCM noté (→ GAB-117).

## Champs requis (instance, à plat)

`gab_id` · `hypothesis_id` · `hypothesis_text` · `items[]{key,emoji,label,value,fill_pct,verdict}` · `conclusion_placeholder`

Optionnels : `title`, `hypothesis_keywords[]`, `parameter_label`, `result_label`, `default_item_key`, `conclusion_label`, `primary_cta{label,action}`.

## Ce qui vient du JSON vs HTML

- **JSON** : texte de l'hypothèse, mots-clés en gras, chaque paramètre (emoji + label + valeur numérique + pourcentage de barre + verdict), placeholder initial, libellé du bouton CTA.
- **HTML** : structure 4 étapes (Hypothèse → Paramètre → Résultat → Conclusion), barre de progression animée, layout, compteur CSS auto-incrémenté.

## Garde-fous (child_safety)

- **Anti-invention** : tout le contenu (hypothèse, paramètres, valeurs, verdicts) est extrait strictement du HTML source — aucun contenu inventé.
- **BLOCKED** si `hypothesis_text` absent / `items` vide ou absent / `conclusion_placeholder` absent.
- `fill_pct` dans [0, 100] — contrôle visuel uniquement, pas de valeur pédagogique officielle.
- Les verdicts viennent du JSON ; le moteur ne génère jamais de feedback inventé.

## QA à vérifier

1. Modifier `hypothesis_text` → affiché sans rebuild HTML.
2. Modifier un `verdict` d'item → le verdict change au clic sur ce bouton.
3. `items:[]` → BLOCKED propre avec message lisible.
4. Clic "Diminuer" → valeur = 35, barre = 25%, verdict confirme l'hypothèse.
5. Clic "Augmenter" → valeur = 175, barre = 90%, verdict contraposée.
6. Instance externe injectée via `ENGINE.init(ext)` → rendu change sans modifier le HTML.
7. Responsive 375/768/1024 : pas de débordement, boutons empilés sur mobile (flex-column < 560px).

## external_refs / dependencies

Aucune référence externe hors-lot. Ce GAB est autonome dans le lot interactivelearning-GAB-146-150.

## Source

`INDEX-300-interactivelearning-GAB-146-150-PLAYABLE.html` (stage `data-tpl="147"`, handler `htTest`, data `HT_DATA`).
