# GAB-258 · CollaborationLearningCorrectionSwap — « Correction croisée avec checklist »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechCollaborationLearning
**Critère validé :** changer le JSON change le rendu (titres, rôles, checklist, bouton) sans modifier le HTML.

## Pack (structure officielle par-GAB)
```
GAB-258/
  renderer.html            ← moteur correction croisée (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` · `correction_swap_id` · `title` · `checklist[]{id,text,status}` · `roles[]{id,tag,description}` · `primary_cta{label,action}`

Optionnels : `subtitle`, `swap_domain`, `swap_domain_enum`, `estimated_duration`, `checklist_label`, `reason_label`, `reason_text`, `secondary_cta{label,action}`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, sous-titre, liste des rôles, tous les critères de la checklist avec leur statut, le texte de justification pédagogique, le libellé des boutons.
- **HTML** : grille rôles A/B, rendu visuel de la checklist (ok/ko/todo), bloc raison, boutons structurels, layout responsive.

## Archétype pédagogique
GAB-258 concrétise le variant `correction_swap` du PART-17A (PairTask). L'échange de copies est encadré par une grille de critères objectifs (`checklist`) pour neutraliser les jugements subjectifs entre pairs. Les deux rôles (ÉLÈVE A rédige, ÉLÈVE B relit) alternent (A↔B). Le `swap_domain` permet d'adapter à 4 domaines : `math_proof`, `text_argument`, `language_writing`, `science_method`.

## Garde-fous (child_safety)
- Aucun commentaire subjectif inter-élèves exposé : la checklist force des critères objectifs.
- `status` enum strict (`ok`/`ko`/`todo`) — aucune valeur libre non encadrée.
- BLOCKED si `checklist` vide / `roles` vides / `primary_cta` absent.
- Les rôles sont rendus dynamiquement depuis l'instance — aucun rôle hardcodé dans le HTML.

## QA à vérifier
1. Modifier un `text` de critère → rendu change sans toucher au HTML (critère d'or).
2. `checklist:[]` → BLOCKED propre.
3. `roles:[]` → BLOCKED propre.
4. `primary_cta` absent → BLOCKED propre.
5. Instance externe injectée via `ENGINE.init(ext)` → rendu s'adapte.
6. Responsive 375/768/1024.

## Source
`INDEX-300-collaborationlearning-GAB-256-260-PLAYABLE.html` (stage `data-tpl="258"`, section GAB-258 CorrectionSwap).
