# GAB-246 · AssessmentLearningRetakePolicy — « Règles de repassage anti-loop »

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

## Pack (structure officielle par-GAB)
```
GAB-246/
  renderer.html            ← moteur politique de repassage (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

GAB-246 est l'écran de **politique de repassage d'évaluation** (RetakePolicy) :
- Remédiation obligatoire avant tout retake (anti-boucle mécanique)
- Flow en étapes visuelles (avant / après remédiation)
- Limite de tentatives quotidienne configurable
- Protection anti-loop : après N échecs, bascule sur un RemediationPath long (ex: GAB-213)
- Bandeau légal : le retake ne remplace aucune note officielle

**Distinction avec les gabarits proches :**
- `ExerciseRetryPrompt` = retry UNE question isolée
- `GAB-234 FeedbackRetryGuide` = stratégie de retry sur UNE réponse
- **GAB-246 RetakePolicy** = règles de repassage de TOUTE l'évaluation (ce gabarit)

## Champs requis (instance, à plat)
`gab_id` · `retake_policy_id` · `title` · `summary` · `steps[]{num,role_label,step_title,step_detail}` · `attempts_text` · `anti_loop_text` · `primary_cta{label,action}`

Optionnels : `mode_chip`, `reason_title`, `reason_text`, `max_attempts_per_day`, `anti_loop_fallback_gab`, `non_official_title`, `non_official_text`, `retry_cta{label,action}`, `accessibility`, `child_safety`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, résumé, mode_chip, texte raison, toutes les étapes (role_label, step_title, step_detail), texte tentatives, texte anti-loop, bandeau légal, libellés des boutons.
- **HTML** : layout, flow visuel, couleurs DS V2, boutons structurels, fallback BLOCKED.

## Garde-fous (child_safety)
- **Anti-loop** : `anti_loop_text` obligatoire — toujours afficher la protection contre la boucle infinie.
- **Non-officiel** : `non_official_text` recommandé pour tout usage EdTech avec mineurs — le retake ne remplace aucune note officielle.
- **BLOCKED** si `retake_policy_id` absent / `steps` vide / `primary_cta` absent.
- Remédiation avant retake : la politique affichée impose une révision ciblée, pas un retry aveugle.

## QA à vérifier
1. Modifier `title`/`steps[0].step_title` → rendu change sans toucher au HTML (critère d'or).
2. `steps:[]` → BLOCKED propre dans le panneau.
3. `retake_policy_id` absent → BLOCKED propre.
4. Clic bouton primaire → panneau confirmation mint.
5. Clic retry_cta → panneau confirmation gold.
6. Responsive 375/768/1024.
7. Instance externe injectée via `ENGINE.init(ext)` → rendu change.

## external_refs / dependencies
- `GAB-213` (RemediationPath long) : référencé dans `anti_loop_fallback_gab` comme cible de bascule après 3 retakes échoués. Dépendance de navigation externe, pas de rendu inline.
- `GAB-234` (FeedbackRetryGuide) : gabarit adjacent cité dans la distinction ; distinct de GAB-246.

## Source
`INDEX-300-assessmentlearning-GAB-246-250-PLAYABLE.html` (stage `data-tpl="246"`, section `<!-- GAB-246 RETAKE POLICY -->`).
