# GAB-327 · ResearchLearningCitationCapture — « Capturer une citation »

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

## Pack (structure officielle par-GAB)
```
GAB-327/
  renderer.html            ← moteur capture citation (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

Gabarit de **sélection d'option unique** : l'élève choisit un extrait parmi 3 propositions (une valide, une trop longue, une sans source). Chaque choix déclenche un feedback coloré (ok/warn/bad). Le bouton CTA confirme ou rappelle le feedback de l'option sélectionnée.

## Champs requis (instance, à plat)

`gab_id` · `citation_capture_id` · `instruction` · `options[]{id, label, kind, feedback, panel_style}`

Optionnels : `title`, `primary_cta{label, action}`, `slots`, `use_when`, `do_not_use_when`, `fallback_text_summary`.

## Ce qui vient du JSON vs HTML

- **JSON** : instruction, libellés des options, feedbacks, styles de panel, libellé du bouton.
- **HTML** : layout chips, logique de sélection exclusive, rendu panel coloré, structure CTA.

## Garde-fous (child_safety)

- **Anti-hallucination** : l'option `kind='halluc'` doit toujours contenir un feedback interdisant de citer une source non vérifiée.
- **Single-choice** : la sélection d'une chip désélectionne automatiquement les autres.
- **BLOCKED** si `options` vide / `citation_capture_id` absent / `instruction` absente.
- **panel_style** doit être cohérent avec `kind` : ok→ok, long→warn, halluc→bad.

## QA à vérifier

1. Modifier un `label`/`feedback` → rendu change sans toucher au HTML (critère d'or).
2. `options:[]` → BLOCKED propre avec message d'erreur.
3. Clic option `ok` → chip verte + panel mint.
4. Clic option `long` → chip orange + panel gold.
5. Clic option `halluc` → chip rouge + panel coral.
6. Instance externe injectée via `ENGINE.init(ext)` → rendu change sans modifier le HTML.
7. Responsive 375/768/1024 : chips en colonne sur mobile.

## external_refs / dependencies

- **GAB-326** (ResearchLearningNoteCapture) : `do_not_use_when` renvoie vers GAB-326 pour prise de notes paraphrasée.
- **GAB-328** (ResearchLearningSynthesisGrid) : gabarit de synthèse multi-sources, cité dans le fichier source comme usage adjacent.

## Source

`INDEX-300-researchlearning-GAB-326-330-PLAYABLE.html` (stage `data-tpl="327"`, handler `d327Cap`).
