# GAB-249 · AssessmentLearningTeacherReview — « Statut de ta réponse »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechAssessmentLearning
**Critère validé :** changer le JSON change le statut, la chaîne sécurité et le CTA sans modifier le HTML. check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-249/
  renderer.html            ← moteur revue prof IDOR-proof (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
Vue **ÉLÈVE** du statut de sa copie soumise à revue prof. Chaque élève ne voit QUE sa propre copie (IDOR-proof). Le renderer expose :
1. Un chip `review_status` (5 valeurs possibles) — piloté par l'instance.
2. La chaîne sécurité serveur (4 conditions cumulatives + 1 danger) — identique à GAB-227.
3. Les notices anti-cross-leak, meanwhile et non-official — textes venant du JSON.
4. Un CTA unique (continuer les révisions) — libellé et action depuis l'instance.

## Champs requis (instance, à plat)
`gab_id` · `review_instance_id` · `title` · `subtitle` · `review_status` · `review_status_enum[]` · `status_label` · `status_description` · `security_chain[]{step,state}` · `security_banner_title` · `security_banner_text` · `anti_cross_leak_notice` · `primary_cta{label,action}`

Optionnels : `meanwhile_notice`, `non_official_title`, `non_official_text`.

## Ce qui vient du JSON vs HTML
- **JSON** : statut affiché, libellés des 5 enums, chaîne sécurité (étapes et états), toutes les notices, libellé et action du CTA.
- **HTML** : layout, couleurs DS V2, animation tr-pulse, chip de statut structurel, moteur enum.

## Garde-fous (child_safety / sécurité)
- **Anti-IDOR** : chaîne de 4 conditions cumulatives serveur-side OBLIGATOIRE avant exposition copie. Si une échoue → `not_available`, jamais exposer.
- **Anti-cross-leak** : GAB-249 n'affiche JAMAIS les copies d'autres élèves. Données multiples du serveur = bug P0 RGPD.
- **Non-officiel** : le commentaire prof est un retour pédagogique personnel, jamais une note au bulletin ou dans Pronote.
- **BLOCKED** si `review_instance_id` absent / `review_status` absent / `security_chain` vide.

## QA à vérifier
1. Modifier `review_status` → chip + status-box changent sans toucher au HTML (critère d'or).
2. `security_chain:[]` → BLOCKED propre.
3. `review_instance_id` absent → BLOCKED propre.
4. Clic chip `not_available` → status-box bascule visuellement.
5. Clic CTA → feedback action affiché.
6. Responsive 375/768/1024 — security-chain wrappée proprement.

## external_refs / dependencies
- **GAB-227 (AssessmentLearningIDOR)** — chaîne sécurité 4 conditions identique, référence explicite dans `security_banner_title`.
- **EdTechAuth V2 `verifyUserMatch`** — audit P0 référencé dans `security_banner_text`.

## Source
`INDEX-300-assessmentlearning-GAB-246-250-PLAYABLE.html` (stage `data-tpl="249"`, handlers `peSelect` / `peConfirm`).
