# GAB-312 · RevisionLearningPriorityQueue — « File de priorité »

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

> **renderer_key à concevoir (pas de moteur kit)** : `choice_select` n'a pas de moteur kit de référence dans ce lot. Le renderer est dérivé directement de l'écran source INDEX-300-revisionlearning-GAB-311-315-PLAYABLE.html (stage `data-tpl="312"`, handlers `d312Pick` / `d312Locked`).

## Pack (structure officielle par-GAB)
```
GAB-312/
  renderer.html            ← moteur file de priorité (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` · `priority_queue_id` · `queue_items[]{item_id, label, priority_level, priority_score, signal_source, teacher_override}`

Optionnels : `title`, `intro_label`, `feedback_selected`, `feedback_signal_prefix`, `feedback_locked`.

## Ce qui vient du JSON vs HTML
- **JSON** : chaque item de la file (label, niveau de priorité, score, signal source, verrou prof), les feedbacks sélection et verrouillage.
- **HTML** : grille de la file, badges de priorité colorés, interaction clavier/souris, message de blocage.

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

- **Anti-invention** : `signal_source` doit provenir de données utilisateur réelles (erreurs répétées, échéance). Ne jamais générer de `signal_source` sans données réelles.
- **Verrou prof** : `teacher_override:true` → item non ignorable par l'élève, feedback dédié affiché. Ne jamais permettre de contourner ce verrou.
- **BLOCKED** si `queue_items` absent/vide ou `priority_queue_id` absent.
- **Priorité = signal**, jamais une note officielle.

## QA à vérifier
1. Modifier un `label`/`signal_source` → rendu change sans toucher au HTML (critère d'or).
2. `queue_items:[]` → BLOCKED propre.
3. `priority_queue_id` absent → BLOCKED propre.
4. Clic item normal → feedback avec label + priority_level + signal affiché.
5. Clic item `teacher_override:true` → feedback verrouillé affiché.
6. Instance externe injectée (`ENGINE.init(monInstance)`) → rendu change.
7. Responsive 375/768/1024.

## Source
`INDEX-300-revisionlearning-GAB-311-315-PLAYABLE.html` (stage `data-tpl="312"`, handlers `d312Pick`, `d312Locked`).

## external_refs / dependencies

| Réf | Type | Description |
|-----|------|-------------|
| GAB-311 | Même lot (RevisionLearning) | Intro de séance — use_when avant GAB-312 |
| GAB-313 | Même lot (RevisionLearning) | Carte répétition espacée — use_when après sélection dans GAB-312 |
