# GAB-305 · DocumentLearningInterpretEvidence — « Interpréter une preuve »

**Format :** GAB data-driven (moule GAB-VALIDE/GAM) · **renderer_key :** `interpret_steps` · **family_code :** `document_analysis`
**Critère validé :** changer le JSON change l'écran d'interprétation sans modifier le HTML. ✅ (check.py ; Playwright à faire)

## Pack (format GAB-VALIDE attendu)
```
GAB-305/
  renderer.html                       ← moteur interpret_steps générique (ne pas modifier par instance)
  instance-interpret-evidence.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-305` · `renderer_key: interpret_steps` · `family_code: document_analysis` · `site`
- `instance.title` — titre d'écran
- `instance.interpret_id` — identifiant stable de l'écran
- `instance.document_ref { src, kind, alt }` — réf média de la source
- `instance.evidence_ref { kind_label, text }` — **la preuve observée**, extraite du document (jamais inventée)
- `instance.interpretation_prompt` — la consigne posée à l'élève
- `instance.interpretation_rules { link_to_question_required, max_safe_level, note }` — règles d'inférence
- `instance.inference_levels[]` — chaque niveau : `{ level, label, verdict, tone, message }`. `verdict:'overinterpreted'` = surinterprétation signalée
- `instance.synthesis_on_success` — synthèse affichée seulement pour `max_safe_level` (inférence prudente reliée à la question)
- `accessibility[]` / `child_safety[]` — `no_invented_interpretation`, `overinterpretation_flagged`, `no_hard_failure`

## Comment le dev ajoute / modifie un niveau d'inférence
```json
{ "level": 2, "label": "Moyen", "verdict": "partial", "tone": "note", "message": "partial — plausible, mais précise le lien avec le document." }
```
Il l'ajoute/édite dans `instance.inference_levels`. Le moteur peint le bouton et gère le clic + feedback tout seul. **Il ne touche jamais renderer.html.**

## Le moteur (interpret_steps) fait
- affiche la preuve observée depuis `instance.evidence_ref`
- pose la consigne depuis `instance.interpretation_prompt`
- peint un bouton par `instance.inference_levels[]`
- clic sur un niveau = affiche son `message` avec le ton (ok / note / bad)
- si le niveau choisi == `interpretation_rules.max_safe_level` → ajoute `synthesis_on_success`
- BLOCKED si `evidence_ref.text` absent / `interpretation_prompt` absent / `inference_levels` vide

## Garde-fous (child_safety)
- `no_invented_interpretation` : la preuve et les niveaux viennent du document, le moteur n'invente aucune interprétation.
- `overinterpretation_flagged` : le niveau « Fort » (overinterpreted) est signalé `bad`, jamais validé — la surinterprétation est une faute pédagogique.
- `no_hard_failure` : un mauvais choix donne un feedback formatif, pas un blocage.

## 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="305"`, handler `d305Infer(...)`). Contenu extrait : preuve « Deux personnages portent un troisième, assis et immobile. » ; prompt « Choisis le niveau d'inférence raisonnable, lié à la question. » ; 3 niveaux (Prudent → interpreted / Moyen → partial / Fort → overinterpreted) ; synthèse « ✓ synthesized — preuve + interprétation prudente reliées à la question. ».
