# GAB-329 · ResearchLearningBiasPerspectiveCheck — « Vérifier biais & perspective »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechResearchLearning
**Critère validé :** changer le JSON change la citation, les critères et les messages de verdict sans modifier le HTML.

## Pack (structure officielle par-GAB)
```
GAB-329/
  renderer.html            ← moteur biais & perspective (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` · `bias_check_id` · `source_quote` · `source_label` · `instruction` · `bias_criteria[]{id,label}` · `primary_cta{label,action}` · `verdict_thresholds{bias_probable{min_checked,state,panel_class,message}, isolated_clue{exact_checked,state,panel_class,message}, balanced{exact_checked,state,panel_class,message}}`

Optionnels : `title`, `progress_label_tpl`.

## Ce qui vient du JSON vs HTML
- **JSON** : citation source, libellé du bloc source, consigne, tous les critères cochables, template compteur, libellé du bouton, les 3 messages de verdict et leurs classes de panel.
- **HTML** : layout, liste de cases à cocher, bouton structurel, panel résultat, footer.

## Logique de verdict (3 seuils)
| Cases cochées | Rendu |
|---|---|
| ≥ `bias_probable.min_checked` (ex : 2) | panel `warn` — biais probable + rappel anti-relativisme |
| = `isolated_clue.exact_checked` (ex : 1) | panel `note` — indice isolé |
| = `balanced.exact_checked` (ex : 0) | panel `note` — aucun indice coché |

## Garde-fous (child_safety)
- **Anti-relativisme** : le message `bias_probable` contient obligatoirement un rappel du type « orientée ≠ fausse ».
- **Anti-invention** : le renderer n'invente aucun critère ; toute l'instance vient du JSON.
- **BLOCKED** si `bias_criteria` vide / `primary_cta` absent / `verdict_thresholds` incomplet.
- Accessibilité : `role="checkbox"` + `aria-checked` + navigation clavier (Enter/Espace).

## QA à vérifier
1. Modifier un `label` de critère → rendu change sans toucher au HTML (critère d'or).
2. `bias_criteria:[]` → BLOCKED propre.
3. 0 case cochée + CTA → panel `note` — aucun indice coché.
4. 1 case cochée + CTA → panel `note` — indice isolé.
5. 2+ cases cochées + CTA → panel `warn` — biais probable + anti-relativisme.
6. Instance externe injectée via `ENGINE.init(obj)` → rendu change.
7. Responsive 375/768/1024.

## Références externe (external_refs / dependencies)
- GAB-325 : vérif de fiabilité simple — à proposer quand le besoin est la fiabilité brute, pas la perspective.
- Ce GAB ne dépend d'aucun autre GAB de ce lot pour fonctionner.

## Source
`INDEX-300-researchlearning-GAB-326-330-PLAYABLE.html` (stage `data-tpl="329"`, handlers `d329Tick`, `d329Verdict`).
