# GAB-288 · WritingLearningRewriteImprove — « Réécrire et améliorer »

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

## Pack (structure officielle par-GAB)
```
GAB-288/
  renderer.html            ← moteur réécriture anti-ghostwriter (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

**WritingLearningRewriteImprove** : écran d'amélioration guidée d'un brouillon élève avec protection anti-IA-ghostwriter. L'IA propose des suggestions ciblées sur des critères explicites (clarté, preuve, concision), l'élève valide chaque modification (accepter / modifier autrement / refuser). Tracked_changes obligatoire — l'élève voit toujours ce qui a changé. Rationale pédagogique affichée (pourquoi pas de réécriture totale par IA).

## Champs requis (instance, à plat)
`gab_id` · `rewrite_id` · `original_text_ref` · `rewrite_goal` · `improvement_criteria[]{tag,description}` · `rewrite_policy{label,rules[]}`

## Champs optionnels
`title`, `subtitle`, `rewrite_goal_label`, `before_after_view{before_label,before_text_plain,before_strikethroughs,after_label,after_text_plain,after_insertions,suggestions_count}`, `student_choice_required`, `student_choice_buttons[]{label,action}`, `ai_assist_policy`, `reason_block{title,text}`, `primary_cta{label,action,reveal_text}`, `secondary_cta{label,action,reveal_text}`, `source_metadata`

## Ce qui vient du JSON vs HTML

- **JSON** : texte original, objectif de réécriture, critères d'amélioration, règles policy, diff before/after, boutons de choix élève, libellés CTA, texte raison pédagogique.
- **HTML** : moteur de rendu, layout policy, zone diff, grille critères, boutons de choix, reason block, CTA row, logique BLOCKED.

## Garde-fous (child_safety / anti-ghostwriter)

- **Anti-ghostwriter** : `rewrite_policy` contient les règles de limitation de l'IA (max 30% modifié par suggestion). Ces règles viennent du JSON — jamais hardcodées.
- **Validation élève obligatoire** : `student_choice_required:true` affiche les boutons accept/modify/refuse.
- **BLOCKED** si `rewrite_id`, `original_text_ref`, `rewrite_goal`, `improvement_criteria` (vide) ou `rewrite_policy` absents.
- **Pas d'invention** : le texte original (`original_text_ref`) est celui de l'élève — le moteur ne le modifie pas.

## QA à vérifier

1. Modifier `improvement_criteria` → les critères affichés changent sans toucher au HTML.
2. `improvement_criteria:[]` → BLOCKED propre.
3. `student_choice_required:false` → boutons de choix masqués.
4. CTA primaire → panel reveal avec `reveal_text`.
5. Responsive 375/768/1024 — pas de débordement.
6. `init(extInstance)` → rendu change sans modifier le HTML (critère data-driven).

## Source

`INDEX-300-writinglearning-GAB-286-290-PLAYABLE.html` (stage `data-tpl="288"`, section `<!-- GAB-288 REWRITEIMPROVE -->`).
