{
  "gab_id": "GAB-250",
  "renderer_key": "text_cta",
  "empty_state_id": "es-assessment-pythagore-q-missing",
  "_note_dev": "SOURCE DE VÉRITÉ. État vide AssessmentLearning anti-fake : aucun test inventé quand le pool questions n'est pas validé. Actions de secours dignes proposées. empty_reason enum(5 valeurs). Parallèle doctrinaire GAB-230 (SmartSelectEmptyChoice) et GAB-209 (SessionQualityGuard). Distinction explicite avec ErrorFallbackBlock (bug technique).",
  "title": "Évaluation indisponible",
  "body": "Je ne vais pas lancer un faux test. Les questions d'évaluation ne sont pas prêtes pour cette notion. Tu peux quand même réviser avec des ressources fiables.",
  "empty_reason": "questions_missing",
  "empty_reason_enum": ["no_assessment", "not_available_level", "questions_missing", "not_ready", "access_limited"],
  "anti_fake_title": "Doctrine anti-fake-assessment",
  "anti_fake_text": "AssessmentLearning refuse de générer un test inventé quand le pool de questions n'est pas validé. Un mauvais test est pire que pas de test : il fausse l'évaluation de l'élève ET érode la confiance dans la plateforme.",
  "parallel_note": "EmptyState (250) = anti-fake-assessment côté évaluation · SmartSelectEmptyChoice (230) = anti-fake-content côté sélection · SessionQualityGuard (209) = quality-gate côté session. C'est la MÊME doctrine appliquée à 3 modules différents : refuser de tricher par défaut.",
  "fallback_options": [
    {
      "icon": "📖",
      "color_key": "visual",
      "title": "Revoir la fiche méthode Pythagore",
      "description": "Contenu existant et validé · 5 minutes",
      "module_label": "VISUAL",
      "action": "open_visual_fiche"
    },
    {
      "icon": "⚒",
      "color_key": "exercise",
      "title": "Faire des exercices guidés",
      "description": "3-5 exercices · pratique sans pression évaluative",
      "module_label": "EXERCISE",
      "action": "open_exercises"
    },
    {
      "icon": "🎚",
      "color_key": "smartselect",
      "title": "Laisser SmartSelect choisir un fallback",
      "description": "Contenu adapté au niveau via GAB-224",
      "module_label": "SMARTSELECT",
      "action": "open_smartselect"
    }
  ],
  "distinction_note": "250 ≠ ErrorFallbackBlock : EmptyState = absence légitime d'évaluation (pas de bug). ErrorFallbackBlock = erreur technique (500, indexation cassée). Log QA séparé côté production. Si pool questions vide alors qu'attendu, c'est un bug à investiguer côté contenu, pas un EmptyState.",
  "primary_cta": { "label": "📖 Voir la fiche méthode", "action": "open_visual_fiche" },
  "secondary_cta": { "label": "⚒ Faire des exercices", "action": "open_exercises" }
}
