# GAB-303 · DocumentLearningObserveDescribe — « Observer ≠ interpréter »

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

## Pack (structure officielle par-GAB)
```
GAB-303/
  renderer.html            ← moteur observe/zones (ne pas modifier par instance)
  instance.example.json    ← SOURCE DE VÉRITÉ (à plat)
  schema.contract.json     ← contrat de validation
  README-contract.md       ← ce fichier
```

## Champs requis (instance, à plat)
`gab_id` · `observe_id` · `document_ref` · `observable_zones[]` (zone + fait observé) · `observe_order` · `description_rules`
Optionnels : `observation_prompt`, `modes` (Observer / Interpréter), `source_notice`.

## Ce qui vient du JSON vs HTML
- **JSON** : zones observables + leur fait, l'ordre d'observation, les feedbacks, les libellés des 2 modes.
- **HTML** : scène, zones cliquables, bascule de modes, layout, fallback.

## Garde-fous
- **Séparer voir / interpréter** : en mode « interpréter », message qui renvoie à l'observation factuelle d'abord ; l'interprétation vient à GAB-305.
- **Anti-invention** : les faits observés viennent de l'écran source, jamais hallucinés.
- **BLOCKED** si `observable_zones` vide.

## external_refs / dependencies
- **`renderer_key: annotation_media`** — famille de moteur dérivée du **GAB-389** (MediaLearningMediaAnnotation), moteur de référence du kit. GAB-389 n'est PAS converti ici : c'est la **dépendance d'archétype** (cf `MOTEURS/annotation_media.html`). Référence documentaire uniquement.

## QA à vérifier
1. Modifier un fait de zone → rendu change sans toucher au HTML. 2. `observable_zones:[]` → BLOCKED. 3. Mode « interpréter » → message de recadrage observation. 4. Responsive 375/768/1024.

## Source
`INDEX-300-documentlearning-GAB-301-305-PLAYABLE.html` (stage `data-tpl="303"`, handlers `d303Mode`/`d303Zone`).
