{
  "gab_id": "GAB-230",
  "renderer_key": "text_cta",
  "empty_choice_id": "empty-pythagore-no-candidate-001",
  "_note_dev": "SOURCE DE VÉRITÉ. État vide honnête SmartSelect : aucun candidat fiable disponible. Le HTML (layout, carte, actions de secours, enum) ne change pas ; seuls ces champs changent le rendu. Anti-fake : on NE génère PAS de sélection inventée quand aucun candidat fiable n'existe.",
  "title": "Aucune ressource adaptée trouvée",
  "body": "Je ne vais pas te proposer une ressource au hasard. Tu peux choisir une fiche générale ou demander de l'aide.",
  "empty_reason": "no_candidate",
  "anti_fake_label": "Doctrine anti-fake content",
  "anti_fake_text": "SmartSelect refuse de générer une sélection inventée quand aucun candidat fiable n'existe. Mieux vaut un état vide honnête qu'une recommandation creuse qui ferait perdre du temps. Parallèle à GAB-209 SessionQualityGuard côté PlayEngine.",
  "fallback_options": [
    {
      "icon": "📖",
      "title": "Voir la fiche générale Pythagore",
      "description": "Contenu existant, plus large que ton besoin précis mais pédagogiquement valide.",
      "action": "open_general_sheet"
    },
    {
      "icon": "🦊",
      "title": "Demander à Ketty",
      "description": "L'IA mascotte peut t'expliquer le point bloquant en conversation.",
      "action": "open_ketty_chat"
    },
    {
      "icon": "🔍",
      "title": "Choisir un autre thème",
      "description": "Naviguer librement dans le catalogue brevet maths.",
      "action": "open_catalogue"
    }
  ],
  "distinction_note": "230 ≠ ErrorFallbackBlock : EmptyChoice = absence légitime de candidat fiable. ErrorFallbackBlock = erreur technique (bug, 500, indexation cassée). Log QA séparé pour distinguer les deux côté production. Si indexation aurait dû produire un candidat, c'est un bug à investiguer.",
  "primary_cta": {
    "label": "📖 Voir la fiche générale",
    "action": "open_general_sheet"
  },
  "secondary_cta": {
    "label": "🦊 Demander à Ketty",
    "action": "open_ketty_chat"
  }
}
