# GAB-284 · WritingLearningIntroConclusionBuilder — « L'intro et la conclu ne se ressemblent pas »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechWritingLearning
**Critère validé :** changer le JSON change le rendu (sections, parts, starters, forbidden, CTAs) sans modifier le HTML. ✅ check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-284/
  renderer.html            ← moteur intro/conclusion 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
```

## Archétype
Builder dual-section pour rédaction formelle (dissertation, essai, rapport). Affiche 2 onglets (intro / conclusion) avec chacun 3 `required_parts` ordonnés, des starters de phrase, une `opening_policy` (ouverture facultative), des `forbidden_patterns` transverses, et un bloc `reason_block` expliquant la logique des 2 sections distinctes.

## Champs requis (instance, à plat)
`gab_id` · `intro_conclusion_id` · `writing_context` · `section_type` · `sections{intro,conclusion}` · `success_criteria[]`

Optionnels : `title`, `subtitle`, `opening_policy{heading,text}`, `forbidden_patterns[]`, `reason_block{heading,text}`, `primary_cta{label,action,placeholder}`, `secondary_cta{label,action,reveal_text}`, `use_when[]`, `do_not_use_when[]`, `source_metadata`.

## Ce qui vient du JSON vs HTML
- **JSON** : labels des onglets, headings de sections, titres/corps/starters de chaque part, textes forbidden, libellés CTAs, placeholder textarea, texte reveal, reason_block.
- **HTML** : switch pill, grille de parts numérotées, blocs forbidden/opening/reason, boutons structurels, layout, fallback BLOCKED.

## Garde-fous (child_safety)
- **Anti-invention** : tout le contenu (parts, starters, forbidden) extrait du HTML source — aucun contenu hallucné.
- **BLOCKED** si `sections` absent/vide · `intro_conclusion_id` absent · `success_criteria` absent/vide.
- **Ouverture facultative** : le JSON `opening_policy` précise explicitement qu'elle n'est PAS obligatoire (fidèle à la source).
- **Forbidden_patterns** : listés comme trouvés dans la source, pas amplifiés.

## QA à vérifier
1. Switch intro → conclusion : les 3 parts + heading changent sans rechargement.
2. `sections:{}` vide → BLOCKED propre dans le panel.
3. Modifier un `starter` dans le JSON → affiché en italique sans toucher au HTML.
4. `forbidden_patterns` absent → bloc ⛔ masqué proprement.
5. Responsive 375/768/1024 — aucun débordement.

## Source
`INDEX-300-writinglearning-GAB-281-285-PLAYABLE.html` (stage `data-tpl="284"`, handlers `icPick` / `IC_DATA`, styles `.ic-*`).
