{
  "contract_version": "gab_265_contract_v1",
  "gab_id": "GAB-265",
  "canonical_name": "ComprehensionLearningSelfCheck",
  "module_owner": "EdTechComprehensionLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "selfcheck_id",
    "title",
    "zones",
    "check_modes"
  ],
  "optional_fields": [
    "subtitle",
    "check_mode",
    "next_action_header",
    "next_action_text",
    "metacognitive_header",
    "metacognitive_text",
    "primary_cta",
    "secondary_cta",
    "zone_confirm_feedback"
  ],
  "field_types": {
    "zones": "array<{key:string, icon:string, label:string, description:string}>  — 3 zones attendues : solid / shaky / unclear",
    "check_modes": "array<{key:string, title:string, subtitle:string, next_action:string, primary_cta:string}>  — 4 valeurs enum : zones_three / quick_quiz / explain_back / emoji_check",
    "check_mode": "enum['zones_three','quick_quiz','explain_back','emoji_check']  — mode actif à l'initialisation",
    "zone_confirm_feedback": "string  — message affiché après sélection d'une zone"
  },
  "constraints": [
    "zones doit contenir au moins 1 entrée ; source attendue = 3 zones (solid/shaky/unclear).",
    "check_modes doit contenir au moins 1 entrée correspondant au check_mode initial.",
    "primary_cta et secondary_cta : libellés venant du JSON, jamais hardcodés dans le HTML.",
    "next_action peut contenir du HTML inline (<b>) — le moteur l'injecte via innerHTML."
  ],
  "blocked_conditions": [
    "gab_id absent (BLOCKED)",
    "title absent (BLOCKED)",
    "zones absent ou vide (BLOCKED)",
    "check_modes absent ou vide (BLOCKED)"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "zone buttons have tabindex=0"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet avec 3 zones et 4 chips enum, 0 erreur" },
    { "case": "zones absent", "expected": "BLOCKED listant 'zones absent ou vide'" },
    { "case": "check_modes absent", "expected": "BLOCKED listant 'check_modes absent ou vide'" },
    { "case": "clic zone solid", "expected": "zone highlighted + feedback zone_confirm_feedback affiché" },
    { "case": "chip quick_quiz sélectionné", "expected": "titre/sous-titre/next_action/cta changent sans rechargement" },
    { "case": "instance externe injectée via ENGINE.init(ext)", "expected": "le rendu change sans modifier le HTML" },
    { "case": "responsive 375px", "expected": "zones en colonne, 0 débordement horizontal" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-265",
    "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). Canonical name dans la source : ComprehensionLearningSelfCheck (stage data-tpl=265)."
  }
}
