# GAB-176 · LevelTestIntro — « Intro test de niveau »

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

## Pack (structure officielle par-GAB)
```
GAB-176/
  renderer.html            ← moteur écran intro (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
**LevelTestIntro** : écran d'introduction au test de niveau interne (diagnostic non noté). Établit un contrat de confiance avec l'élève : non-évaluation, règles de fonctionnement, bouton de démarrage. Toujours placé **avant** GAB-177 (question adaptative) dans un flux LevelTest.

## Champs requis (instance, à plat)
`gab_id` · `leveltest_intro_id` · `title` · `disclaimer{icon,html}` · `rules[]` · `primary_cta{label,action}`

Optionnels : `subtitle`, `hero_icon`, `stats[]{value,label}`, `rules_heading`.

## Ce qui vient du JSON vs HTML
- **JSON** : disclaimer (icône + texte HTML), emoji hero, titre, sous-titre, stats métriques, heading règles, chaque règle, libellé et action du CTA.
- **HTML** : layout carte, grille stats, liste règles avec marqueurs ▸, bouton structurel, states panel ok/bad.

## Garde-fous (child_safety)
- **BLOCKED** si `disclaimer` absent, `rules` tableau vide, ou `primary_cta` absent.
- **Non-évaluation stricte** : ce gabarit est réservé aux diagnostics internes. Interdiction d'usage pour un examen noté (→ GAB-132) ou un contrôle officiel.
- `disclaimer.html` peut contenir `<b>` pour mise en gras pédagogique ; pas de lien ni de script inline.
- Le libellé du CTA vient toujours du JSON — jamais hardcodé dans le HTML.

## QA à vérifier
1. Modifier `title` / `rules` / `primary_cta.label` → rendu change sans toucher au HTML (critère d'or).
2. `primary_cta` absent → BLOCKED propre.
3. `rules:[]` → BLOCKED — tableau vide non admis.
4. `disclaimer` absent → BLOCKED.
5. Clic CTA → panel ok avec `action` affiché.
6. `stats` absent → grille absente, rendu dégradé proprement.
7. Responsive 375/768/1024 — grille stats 3→2 colonnes sur mobile.

## Source
`INDEX-300-leveltest-GAB-176-180-PLAYABLE.html` (stage `data-tpl="176"`, bloc `.lti-card`).

## Références hors-lot (external_refs / dependencies)
- **GAB-177** (LevelTestQuestionAdaptive) : écran suivant dans le flux LevelTest — reçoit les réponses adaptatives.
- **GAB-131** : remédiation post-erreur (hors scope de ce gabarit).
- **GAB-132** : intro examen noté — ne pas confondre avec ce gabarit (non noté).
- **GAB-151** : intro mini-jeu — hors scope LevelTest.
