# GAB-184 · LevelTestTeacherSummary — « Résumé professeur »

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

## Pack (structure officielle par-GAB)
```
GAB-184/
  renderer.html            ← moteur résumé prof (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` · `teacher_summary_id` · `title` · `stats_group{count_label,count_value,completion_label,completion_value,confidence_label,confidence_value}` · `distribution[]{label,pct,level}` · `suggestions[]`

Optionnels : `session_label`, `stats_individual{...}`, `distribution_title`, `suggestions_title`, `mode_group_label`, `mode_individual_label`, `primary_cta{label,action}`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, label session, stats groupe/élève, distribution (label/pct/level), pistes pédagogiques, libellés des boutons de mode, libellé du CTA.
- **HTML** : layout carte, barres de distribution, grille stats, zone actions, switch groupe/élève, bouton structurel.

## Archétype fonctionnel
Vue prof post-diagnostic : 2 modes (groupe agrégé / par élève). La distribution pilote les couleurs de barres via `level` (`high`→mint, `mid`→gold, `low`→coral). Les pistes pédagogiques (`suggestions`) sont du texte libre avec `<b>` pour mettre en gras la notion ciblée.

## Garde-fous (child_safety)
- **Diagnostic INTERNE uniquement** : aucune note officielle, non comparable entre classes.
- **Non-jugement** : vue prof / aide à la planification, pas évaluation du prof ou des élèves.
- **BLOCKED** si `title` absent / `stats_group` absent / `distribution` vide / `suggestions` vides.
- `stats_individual` optionnel : si absent, le mode « Par élève » s'affiche mais les stats sont vides (non BLOCKED).

## QA à vérifier
1. Modifier une `distribution[].pct` → barre change de largeur sans toucher au HTML.
2. `distribution:[]` → BLOCKED propre.
3. Switch mode groupe → individuel → stats changent, layout identique.
4. Instance externe injectée via `ENGINE.init(ext)` → rendu change.
5. Responsive 375/768/1024.

## Source
`INDEX-300-leveltest-GAB-181-185-PLAYABLE.html` (stage `data-tpl="184"`, handler `tsModeSwitch`).
