{
  "contract_version": "gab_080_contract_v1",
  "gab_id": "GAB-080",
  "canonical_name": "VisualComparisonHeavy2Col",
  "module_owner": "EdTechVisualLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "comparison_id",
    "column_a_label",
    "column_b_label",
    "rows"
  ],
  "optional_fields": [
    "title",
    "primary_cta",
    "accessibility",
    "child_safety"
  ],
  "field_types": {
    "comparison_id": "string — identifiant unique de l'instance",
    "column_a_label": "string — libellé de la colonne A (ex: 'Ancien Régime')",
    "column_b_label": "string — libellé de la colonne B (ex: 'Après 1789')",
    "rows": "array<{criterion:string, value_a:string, value_b:string}> — minimum 1 ligne",
    "primary_cta": "object{label:string, action:string}",
    "accessibility": "object{table_caption:string}"
  },
  "constraints": [
    "rows doit contenir au minimum 1 objet {criterion, value_a, value_b}.",
    "column_a_label et column_b_label : libellés distincts, non vides.",
    "primary_cta.label vient du JSON (jamais en dur dans le HTML).",
    "Anti-invention : tout contenu pédagogique extrait de la source — jamais inventé."
  ],
  "blocked_conditions": [
    "rows absent ou tableau vide",
    "column_a_label absent",
    "column_b_label absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "table_caption_fournie_par_instance"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "tableau rendu complet, 0 erreur" },
    { "case": "rows vide", "expected": "BLOCKED listant 'rows absent ou vide'" },
    { "case": "column_a_label absent", "expected": "BLOCKED listant 'column_a_label absent'" },
    { "case": "instance externe injectée via init(ext)", "expected": "rendu change sans modifier le HTML" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal, font-size adapté mobile" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-080",
    "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)."
  }
}
