{
  "contract_version": "gab_270_contract_v1",
  "gab_id": "GAB-270",
  "canonical_name": "ComprehensionLearningSummaryCheck",
  "module_owner": "EdTechComprehensionLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "summary_card_id",
    "title",
    "tldr_one",
    "tldr_medium",
    "density_variants"
  ],
  "optional_fields": [
    "subtitle",
    "icon",
    "tldr_density",
    "tldr_emoji",
    "reason_block",
    "primary_cta",
    "secondary_cta",
    "fallback_text_summary"
  ],
  "field_types": {
    "tldr_density": "enum['multi_3','one_sentence','paragraph_50w','emoji_flash']",
    "tldr_one": "object{label,word_count_display,text}",
    "tldr_medium": "object{label,word_count_display,text}",
    "tldr_emoji": "object{label,count_display,text}",
    "reason_block": "object{heading,text}",
    "density_variants": "array<{key,title,subtitle,primary_cta_label}> — 4 entrées (une par valeur enum tldr_density)",
    "primary_cta": "object{label,action}",
    "secondary_cta": "object{label,action}"
  },
  "constraints": [
    "density_variants doit contenir exactement 4 entrées correspondant aux 4 valeurs de tldr_density.",
    "tldr_one.text : résumé en une seule phrase, max ~15 mots.",
    "tldr_medium.text : résumé en ~50 mots (contexte).",
    "tldr_emoji.text : séquence d'emojis uniquement, sans texte prose.",
    "primary_cta.label vient du JSON — libellé structurel, pas en dur dans le HTML.",
    "tldr_density doit correspondre à l'une des clés de density_variants."
  ],
  "blocked_conditions": [
    "title absent",
    "tldr_one absent",
    "tldr_medium absent",
    "density_variants vide ou absent",
    "summary_card_id absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "fallback_text"
  ],
  "qa_cases": [
    { "case": "instance conforme (multi_3)", "expected": "rendu complet 3 formats, 0 erreur" },
    { "case": "champ requis manquant (title)", "expected": "BLOCKED listant le champ absent" },
    { "case": "density_variants vide", "expected": "BLOCKED — density_variants absent ou vide" },
    { "case": "instance externe injectée (one_sentence)", "expected": "affichage format unique, sans modifier le HTML" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-270",
    "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)."
  }
}
