{
  "gab_id": "GAB-209",
  "renderer_key": "text_cta",
  "session_quality_guard_id": "sqg-playengine-session-example-v1",
  "_note_dev": "SOURCE DE VÉRITÉ. Garde qualité anti-fake session : shield icon, titre, sous-titre, scénarios (good/broken/fake), checks de qualité par scénario, verdict par scénario, log note QA, CTA primaire et secondaire. Le moteur JS pilote le rendu selon active_scenario. Aucun texte en dur dans le HTML.",
  "icon": "🛡",
  "title": "Session quality guard",
  "subtitle": "Avant chaque session composite, PlayEngine vérifie l'intégrité du contenu. Voici un check simulé.",
  "simulator_label": "🧪 Simule un scénario",
  "scenarios": [
    {
      "key": "good",
      "label": "session saine",
      "checks": [
        { "title": "Refs validées par allowlist", "detail": "4 refs · toutes en famille autorisée", "status": "pass" },
        { "title": "Existence des contenus côté DB", "detail": "4/4 contenus existent", "status": "pass" },
        { "title": "Ordre pédagogique cohérent", "detail": "story → visual → interactive → exercise", "status": "pass" },
        { "title": "Objectifs pédagogiques présents", "detail": "4 blocs avec objective défini", "status": "pass" },
        { "title": "Permissions cohérentes", "detail": "AccessGate validé pour user_id", "status": "pass" }
      ],
      "verdict": {
        "status": "pass",
        "heading": "✓ Session valide",
        "text": "<b>Session OK</b> · 5/5 checks passés · PlayEngine peut afficher cette session en toute sécurité."
      }
    },
    {
      "key": "broken",
      "label": "refs manquantes",
      "checks": [
        { "title": "Refs validées par allowlist", "detail": "4 refs · toutes en famille autorisée", "status": "pass" },
        { "title": "Existence des contenus côté DB", "detail": "2/4 contenus introuvables (404)", "status": "fail" },
        { "title": "Ordre pédagogique cohérent", "detail": "séquence brisée par refs manquantes", "status": "fail" },
        { "title": "Objectifs pédagogiques présents", "detail": "4 blocs avec objective défini", "status": "pass" },
        { "title": "Permissions cohérentes", "detail": "AccessGate validé pour user_id", "status": "pass" }
      ],
      "verdict": {
        "status": "fail",
        "heading": "⚠ Session bloquée",
        "text": "<b>Session refusée</b> · 2 refs sur 4 sont introuvables côté DB. Affichage interdit. Log émis pour audit. L'élève reçoit un fallback honnête, jamais une page vide trompeuse."
      }
    },
    {
      "key": "fake",
      "label": "objectifs absents",
      "checks": [
        { "title": "Refs validées par allowlist", "detail": "4 refs · toutes en famille autorisée", "status": "pass" },
        { "title": "Existence des contenus côté DB", "detail": "4/4 contenus existent", "status": "pass" },
        { "title": "Ordre pédagogique cohérent", "detail": "séquence acceptable", "status": "warn" },
        { "title": "Objectifs pédagogiques présents", "detail": "0/4 blocs avec objective défini", "status": "fail" },
        { "title": "Permissions cohérentes", "detail": "AccessGate validé pour user_id", "status": "pass" }
      ],
      "verdict": {
        "status": "fail",
        "heading": "⚠ Session \"fake\" détectée",
        "text": "<b>Aucun objectif pédagogique</b> sur les 4 blocs · session vide de sens. Blocked + log critique émis. Type d'incident à corriger côté pipeline content production avant déploiement."
      }
    }
  ],
  "checks_section_label": "🔍 Checks de qualité (en série)",
  "log_note": {
    "icon": "📋",
    "text": "<b>Logs QA non négociables :</b> chaque guard bloqué émet un événement <code>playengine:quality-guard-block</code> avec session_id, type d'échec et timestamp. Pour audit production hebdomadaire."
  },
  "primary_cta": { "label": "← Retour au parcours", "action": "return_to_path" },
  "secondary_cta": { "label": "Essayer plus tard", "action": "defer_activity" }
}
