{
  "contract_version": "gab_264_contract_v1",
  "gab_id": "GAB-264",
  "canonical_name": "ComprehensionLearningQuestionIntent",
  "module_owner": "EdTechComprehensionLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "question_intent_id",
    "title",
    "subtitle",
    "question_type",
    "questions",
    "primary_cta"
  ],
  "optional_fields": [
    "secondary_cta",
    "source_passage",
    "instruction",
    "icon"
  ],
  "field_types": {
    "question_type": "enum['literal','inference','opinion']",
    "questions": "array<{id,type,type_label,type_icon,text,hint,answers[]}>",
    "answers": "array<{letter,text,correct:boolean}>",
    "primary_cta": "object{label,action}",
    "secondary_cta": "object{label,action}"
  },
  "constraints": [
    "question_type doit correspondre au type de la première question (ou au type majoritaire).",
    "Les questions de type 'opinion' peuvent avoir answers:[] (pas de bonne réponse unique).",
    "primary_cta : bouton structurel (HTML), libellé et action viennent du JSON.",
    "Chaque question doit avoir un id unique au sein du tableau.",
    "hint est optionnel par question mais recommandé pour les types literal et inference."
  ],
  "blocked_conditions": [
    "questions absentes ou tableau vide",
    "question_intent_id absent",
    "title absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "aria_labels_on_answers"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet avec 3 questions, 0 erreur" },
    { "case": "champ requis manquant (questions vides)", "expected": "BLOCKED listant le champ" },
    { "case": "question opinion sans answers", "expected": "rendu sans choix, hint visible" },
    { "case": "instance externe injectée", "expected": "le rendu change sans modifier le HTML" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal" },
    { "case": "question_type switchée via enum", "expected": "titre/sous-titre/CTA mis à jour depuis JS" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-264",
    "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)."
  }
}
