# GAB-310 · DocumentLearningDocumentSynthesis — « Synthétiser un dossier »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechDocumentLearning
**Critère validé :** changer le JSON change les idées, l'instruction et les feedbacks sans modifier le HTML. check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-310/
  renderer.html            ← moteur synthèse de dossier (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` · `synthesis_id` · `ideas[]{text,required:boolean}` · `primary_cta{label,action}`

Optionnels : `title`, `instruction`, `feedback_all_ok`, `feedback_offtopic`, `feedback_missing`, `fallback_text_summary`.

## Ce qui vient du JSON vs HTML
- **JSON** : chaque idée (texte + statut required), l'instruction, les trois feedbacks, le libellé du bouton CTA.
- **HTML** : grille d'idées avec checkboxes, bouton structurel, logique de validation (compter required/non-required cochés), layout.

## Archétype pédagogique
GAB-310 est l'archétype **synthèse de dossier** : l'élève doit sélectionner les idées obligatoires (avec preuves) en évitant les items hors-sujet. La distinction synthèse vs résumé linéaire est portée par l'instruction et les feedbacks différenciés.

Logique de validation (trois branches) :
1. Toutes les idées `required:true` cochées **et** aucune `required:false` cochée → `feedback_all_ok` (panel ok).
2. Au moins un item `required:false` coché → `feedback_offtopic` (panel warn).
3. Item(s) `required:true` non cochés → `feedback_missing` avec `{n}` = nombre manquant (panel warn).

## Garde-fous (child_safety)
- Au moins 1 idée `required:true` dans l'instance — sinon BLOCKED.
- Au moins 1 idée `required:false` recommandée pour que l'exercice soit discriminant (le schema le documente).
- BLOCKED explicite si `ideas` absent/vide, `synthesis_id` absent, ou `primary_cta` absent.
- Feedback `feedback_missing` utilise le placeholder `{n}` — le moteur l'interpole côté rendu, jamais en dur.

## QA à vérifier
1. Modifier un `text` → rendu change sans toucher au HTML (critère d'or).
2. `ideas:[]` → BLOCKED propre.
3. `synthesis_id` absent → BLOCKED.
4. Cocher toutes required + aucune non-required → feedback_all_ok (vert).
5. Cocher une non-required → feedback_offtopic (orange).
6. Omettre une required → feedback_missing avec n correct (orange).
7. Injection externe `ENGINE.init(monInstance)` → rendu change.
8. Responsive 375/768/1024 — aucun débordement horizontal.

## Source
`INDEX-300-documentlearning-GAB-306-310-PLAYABLE.html` (stage `data-tpl="310"`, handlers `d310Idea` + `d310Check`).
