{
  "contract_version": "gab_061_contract_v1",
  "gab_id": "GAB-061",
  "canonical_name": "StoryCommonMistake",
  "module_owner": "EdTechStoryLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "mistake_id",
    "wrong_statement",
    "right_explanation",
    "cta_label"
  ],
  "optional_fields": [
    "title",
    "wrong_label",
    "right_label"
  ],
  "field_types": {
    "gab_id": "string — valeur fixe 'GAB-061'",
    "mistake_id": "string — identifiant unique de l'instance (slug kebab-case)",
    "wrong_statement": "string — l'énoncé erroné affiché barré ; peut contenir des guillemets",
    "right_explanation": "string — la correction complète révélée après clic",
    "cta_label": "string — libellé du bouton de révélation (ex: 'Voir la correction')",
    "title": "string — titre de la carte affiché dans le hero (optionnel, défaut: 'Erreur fréquente')",
    "wrong_label": "string — libellé de la zone erreur (optionnel, défaut: '🚫 Erreur fréquente')",
    "right_label": "string — libellé de la zone correction (optionnel, défaut: '✓ La bonne compréhension')"
  },
  "constraints": [
    "wrong_statement ne doit pas être vide.",
    "right_explanation ne doit pas être vide.",
    "cta_label ne doit pas être vide.",
    "Le rendu est progressif : wrong_statement visible d'emblée, right_explanation masquée jusqu'au clic du bouton.",
    "L'icône 🚫 et la structure deux-zones (erreur / correction) sont structurelles : elles ne viennent PAS du JSON."
  ],
  "blocked_conditions": [
    "wrong_statement absent ou vide",
    "right_explanation absent ou vide",
    "cta_label absent ou vide"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "bouton structurel avec libellé depuis JSON"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet, wrong_statement barré visible, bouton révèle right_explanation" },
    { "case": "wrong_statement absent", "expected": "BLOCKED listant le champ" },
    { "case": "right_explanation absent", "expected": "BLOCKED listant le champ" },
    { "case": "cta_label absent", "expected": "BLOCKED listant le champ" },
    { "case": "instance externe injectée via ENGINE.init(data)", "expected": "le rendu change sans modifier le HTML" },
    { "case": "clic bouton", "expected": "zone correction révélée, bouton masqué" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-061",
    "note": "Ce schema valide l'instance. Le contrat pédagogique complet (input_contract/validation_logic/feedback_scoring_logic) vit dans le CORE-GAB officiel, pas ici (évite la duplication)."
  }
}
