# GAB-324 · ResearchLearningSourceSelection — « Choisir ses sources »

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

## Pack (structure officielle par-GAB)
```
GAB-324/
  renderer.html            ← moteur sélection de sources (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` · `selection_id` · `intro_text` · `sources[]{source_id, icon, label, status, feedback}` · `selection_criteria[]`

Optionnels : `title`, `primary_cta{label, action}`, `validation_threshold`, `fallback_text_summary`, `accessibility`, `child_safety`.

## Ce qui vient du JSON vs HTML
- **JSON** : chaque source (icône, libellé, statut, feedback au clic), critères de sélection, libellé du bouton CTA, seuil de validation.
- **HTML** : grille synth-items, logique de comptage ok/inacc/low, bouton structurel, layout, fallback d'erreur.

## Logique de validation (moteur)
- Clic source `status:'ok'` → incrémente `okCount`. Quand `okCount ≥ validation_threshold` (défaut 2) → CTA déverrouillé.
- Clic source `status:'inacc'` → panel `warn` (fallback suggéré).
- Clic source `status:'low'` → panel `bad` (fiabilité faible, recoupement recommandé).
- CTA cliqué → panel `ok` de synthèse, bouton désactivé.

## Garde-fous (child_safety)
- **Pas de liens externes** : les sources sont des libellés pédagogiques, jamais des URLs réelles.
- **Anti-invention** : les feedbacks sont extraits du HTML source ; aucun contenu inventé.
- **BLOCKED** si `sources` vide / `selection_criteria` absent / `intro_text` absent.

## QA à vérifier
1. Modifier un `label`/`feedback` dans le JSON → rendu change sans toucher au HTML (critère d'or).
2. `sources:[]` → BLOCKED propre.
3. Clic 2 sources `ok` → CTA déverrouillé.
4. Clic source `inacc` → panel warn.
5. Clic source `low` → panel bad.
6. CTA → panel ok de synthèse.
7. Responsive 375/768/1024.

## Position dans le lot ResearchLearning
GAB-321 (Intro) → GAB-322 (Question) → GAB-323 (Requête) → **GAB-324 (Sources)** → GAB-325 (Fiabilité)

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