{
  "gab_id": "GAB-202",
  "renderer_key": "text_cta",
  "block_stack_id": "bs-session-revolution-causes",
  "_note_dev": "SOURCE DE VÉRITÉ. PlayEngineBlockStack : pile ordonnée de blocs multi-modules avec fallback isolé par bloc. PlayEngine orchestre sans posséder la logique de chaque module_owner. Le HTML (structure, états, barre de progression) ne change pas ; seuls les champs de cette instance changent le rendu.",
  "title": "Pile de blocs · session active",
  "subtitle": "Ordre pédagogique pré-défini · fallback isolé par bloc",
  "doctrine_note": "Orchestre les blocs mais ne possède pas leur logique. Chaque bloc reste contrôlé par son module_owner. Erreur isolée = la session continue.",
  "blocks": [
    {
      "num": 1,
      "label": "Histoire guidée",
      "module_type": "story",
      "module_label": "STORY",
      "ref": "story/brevet-3e/revolution-crise-ancien-regime",
      "status": "completed"
    },
    {
      "num": 2,
      "label": "Fiche visuelle",
      "module_type": "visual",
      "module_label": "VISUAL",
      "ref": "visual/brevet-3e/revolution-causes",
      "status": "active"
    },
    {
      "num": 3,
      "label": "Mini-lab interactif",
      "module_type": "interactive",
      "module_label": "INTERACTIVE",
      "ref": "interactive/brevet-3e/revolution-cause-effect-lab",
      "status": "pending"
    },
    {
      "num": 4,
      "label": "Carte mémoire (démo d'erreur)",
      "module_type": "memory",
      "module_label": "MEMORY",
      "ref": "memory/brevet-3e/revolution-flashcards-V2",
      "status": "error",
      "error_msg": "Module Memory indisponible · fallback contrôlé · la session continue, ce bloc est sauté avec log."
    }
  ],
  "progress_label": "1/3 fait",
  "progress_pct": 33,
  "primary_cta": {
    "label": "Continuer la session",
    "action": "continue_session"
  }
}
