# GAB-302 · DocumentLearningSourceCard — « Fiche source & fiabilité »

**Format :** GAB data-driven (moule GAB-VALIDE/GAM) · **renderer_key :** `source_card` · **family_code :** `document_analysis`
**Critère validé :** changer le JSON change la fiche sans modifier le HTML. ✅ (check.py ; Playwright à faire)

## Pack (format GAB-VALIDE attendu)
```
GAB-302/
  renderer.html                          ← moteur source_card générique (ne pas modifier par instance)
  instance-document-source-card.json     ← SOURCE DE VÉRITÉ (le dev remplit ça)
  schema.json                            ← contrat de validation
  README-contract.md                     ← ce fichier
```

## Le JSON déclare
- `gab_id: GAB-302` · `renderer_key: source_card` · `family_code: document_analysis` · `site`
- `instance.title` — titre d'écran
- `instance.document_ref { src, kind, alt }` — réf média de la source
- `instance.source_title` / `instance.source_type` — nature de la source
- `instance.known_metadata[]` — chaque métadonnée : `{ field, value, known, why }`. **`known:false`** = on ne sait pas (jamais inventé)
- `instance.reliability { score 0..1, label, rationale }` — fiabilité = signal, pas une note
- `instance.primary_cta { label, action }` — le **label** vient du JSON
- `accessibility[]` / `child_safety[]` — `no_invented_metadata`, `uncertainty_made_visible`, `no_hard_failure`

## Comment le dev ajoute une métadonnée
```json
{ "field":"Technique", "value":"eau-forte", "known":true, "why":"Gravure à l'acide — technique identifiée." }
```
Il l'ajoute dans `instance.known_metadata`. Le moteur l'affiche et gère le clic tout seul. **Il ne touche jamais renderer.html.**

## Le moteur (source_card) fait
- peint chaque métadonnée (connue/inconnue) depuis `instance.known_metadata`
- clic sur un champ = affiche son `why` (pour les inconnus : rappelle qu'on n'invente pas)
- CTA (label du JSON) = révèle la barre de fiabilité = `instance.reliability.score`
- BLOCKED si `known_metadata` vide / `source_type` absent / `document_ref` absent

## Garde-fous (child_safety)
- `no_invented_metadata` : une métadonnée inconnue reste « non identifié », jamais hallucinée.
- `uncertainty_made_visible` : l'incertitude est affichée, pas masquée.
- `score_is_signal_not_grade` : la fiabilité n'est pas une note officielle.

## Inline vs externe
Inline (`window.GAB_INSTANCE`) = copie de démo pour ouvrir sans serveur. **Source de vérité = le .json.**
Moteur prêt pour l'externe : `DATA = (arguments.length && ext) ? ext : (window.GAB_INSTANCE || null)`.

## Source d'origine
`GAB-001-390-DATA-SOURCES/INDEX-300-documentlearning-GAB-301-305-PLAYABLE.html` (stage `data-tpl="302"`). Contenu extrait des champs (Caricature / ≈1789 / Auteur inconnu / Provenance incertaine) + notes des handlers `d302Field(...)`.
