# GAB-283 · WritingLearningParagraphBuilder — « Construire un paragraphe argumentatif »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechWritingLearning
**Critère validé :** changer le JSON change les slots/règles/CTA sans modifier le HTML. ✅ check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-283/
  renderer.html            ← moteur paragraph builder (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` · `paragraph_builder_id` · `paragraph_goal` · `paragraph_slots[]{slot_id,label,content,starter}` · `coherence_rules` · `completion_rules{min_slots,max_slots,rationale}`

Optionnels : `title`, `subtitle`, `primary_cta{label,action,placeholder}`, `rubric_ref`, `use_when[]`, `do_not_use_when[]`.

## Ce qui vient du JSON vs HTML
- **JSON** : contenu de chaque slot (label, content, starter), règles de cohérence, raison pédagogique, libellé du bouton CTA, placeholder textarea, rubric_ref.
- **HTML** : layout 4 slots colorés, boîtes coherence/reason, boutons structurels, moteur validate/init.

## Archétype
WritingLearningParagraphBuilder est un **outil de structuration de paragraphe en 4 slots ordonnés** : TOPIC (phrase d'amorce) → EVIDENCE (preuve/exemple) → ANALYSIS (explication du lien) → TRANSITION (ouverture vers la suite). Chaque slot renforce le précédent ; un slot manquant ou mal enchaîné brise le fil rouge.

## Garde-fous (child_safety)
- **Anti-artificiel** : les starters sont des aides explicites, pas des formules imposées (l'élève peut ne pas les utiliser).
- **Cohérence fil rouge** : la règle `coherence_rules` est affichée — l'élève comprend POURQUOI les slots s'enchaînent.
- **BLOCKED** si `paragraph_slots` vide / `paragraph_goal` absent / `paragraph_builder_id` absent / `coherence_rules` absent / `completion_rules` absent.
- **4 slots fixes** : `completion_rules.min_slots === completion_rules.max_slots === 4`. Un paragraphe avec 3 ou 5 slots serait structurellement déficient — ce verrou est intentionnel et pédagogiquement documenté.

## QA à vérifier
1. Modifier `content` d'un slot → rendu change sans toucher au HTML (critère d'or).
2. `paragraph_slots:[]` → BLOCKED propre.
3. Clic CTA primaire → textarea s'ouvre avec le `placeholder` du JSON.
4. Clic CTA secondaire → `rubric_ref` affiché dans panneau.
5. Responsive 375/768/1024 — aucun débordement horizontal.

## Source
`INDEX-300-writinglearning-GAB-281-285-PLAYABLE.html` (stage `data-tpl="283"`, bloc GAB-283 PARAGRAPHBUILDER, handlers `gabWrite` / `gabReveal`).
