# GAB-322 · ResearchLearningQuestionBuilder — « Formuler une bonne question »

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

## Pack (structure officielle par-GAB)
```
GAB-322/
  renderer.html            ← moteur évaluateur de formulations (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` · `question_builder_id` · `title` · `instruction` · `question_criteria[]{id,label,kind,feedback}`

Optionnels : `primary_cta{label,action}`, `sub_questions`, `limits`, `school_level`, `impossible_guard`, `fallback_text_summary`.

## Ce qui vient du JSON vs HTML
- **JSON** : chaque formulation (`label`), son type (`kind`: broad/vague/valid), son feedback textuel au clic, le libellé du bouton CTA.
- **HTML** : liste des items cliquables, panel feedback, bouton structurel, layout, fallback.

## Archétype interactif
Chaque item de `question_criteria` est cliquable. Le clic affiche le `feedback` dans un panel coloré :
- `kind: 'valid'` → panel **ok** (vert mint)
- `kind: 'broad'` ou `kind: 'vague'` → panel **warn** (or)

Le CTA résume le nombre de formulations valides sur le total.

## Garde-fous (child_safety)
- **Anti-invention** : les libellés et feedbacks sont extraits du HTML source tel quel — aucune valeur pédagogique n'est inventée.
- **BLOCKED** si `question_criteria` absent/vide, `question_builder_id` absent, ou `title` absent.
- Les champs optionnels (`sub_questions`, `limits`, `school_level`, `impossible_guard`) sont `null` dans l'exemple — ils ne sont pas inventés si le contexte ne les fournit pas.

## QA à vérifier
1. Modifier un `label`/`feedback` → rendu change sans toucher au HTML (critère d'or).
2. `question_criteria:[]` → BLOCKED propre.
3. Clic item `broad` → panel warn avec le feedback exact.
4. Clic item `valid` → panel ok avec le feedback exact.
5. CTA → résumé valides/total.
6. Responsive 375/768/1024.

## Source
`INDEX-300-researchlearning-GAB-321-325-PLAYABLE.html` (stage `data-tpl="322"`, handler `d322Q`).

## external_refs / dependencies
- GAB-323 (ResearchLearningSearchQueryBuilder) : référencé dans `do_not_use_when` — construction de requête.
- GAB-324 (ResearchLearningSourceSelector) : référencé dans `do_not_use_when` — sélection de sources.
