{
  "contract_version": "gab_275_contract_v1",
  "gab_id": "GAB-275",
  "canonical_name": "MethodLearningExamChecklist",
  "module_owner": "EdTechMethodLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "checklist_id",
    "exam_context",
    "items",
    "completion_policy",
    "review_cta"
  ],
  "optional_fields": [
    "title",
    "subtitle",
    "timebox",
    "anti_decorative_rule",
    "reason_block",
    "teacher_variant"
  ],
  "field_types": {
    "checklist_id": "string — identifiant unique de la checklist (ex: ec275-dnb-maths-2024)",
    "exam_context": "string — libellé du contexte d'examen (ex: 'DNB Maths · épreuve écrite')",
    "items": "array<{id:string, level:enum['blocking','priority','normal','done'], text:string}> — items observables et hiérarchisés",
    "completion_policy": "string — règle de traitement des items (ordre blocking→priority→normal)",
    "review_cta": "object{label:string, action:string, check_items?:string} — CTA principal, check_items = items séparés par '|'",
    "timebox": "string — durée allouée pour la checklist (ex: '5 min')",
    "anti_decorative_rule": "string — règle anti-items vagues, exemple d'item observable",
    "reason_block": "string — explication pédagogique des 3 niveaux",
    "teacher_variant": "object{label:string, content:string} — version prof révélée au clic"
  },
  "constraints": [
    "items : chaque item doit avoir un level parmi ['blocking','priority','normal','done'].",
    "items : le texte doit être observable (vérifiable en un coup d'œil) — pas de formulation vague.",
    "review_cta.label est affiché tel quel dans le bouton HTML structurel.",
    "check_items (optionnel dans review_cta) : chaîne séparée par '|', chaque segment = item de la checklist interactive."
  ],
  "blocked_conditions": [
    "checklist_id absent",
    "exam_context absent",
    "items vides",
    "completion_policy absent",
    "review_cta absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "label_explicit_sur_checkboxes"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet, 0 erreur, items colorés selon level" },
    { "case": "champ requis manquant (ex: checklist_id)", "expected": "BLOCKED listant le champ absent" },
    { "case": "items vides ([])", "expected": "BLOCKED avec message 'items vides'" },
    { "case": "item level=blocking", "expected": "fond coral, icône '!', tag BLOCKING" },
    { "case": "item level=priority", "expected": "fond gold, icône '★', tag PRIORITY" },
    { "case": "item level=done", "expected": "fond mint, icône '✓', tag DONE" },
    { "case": "item level=normal", "expected": "fond surface neutre, pas de tag" },
    { "case": "CTA primaire cliqué", "expected": "checklist interactive avec compteur x/N vérifié(s)" },
    { "case": "instance externe injectée", "expected": "le rendu change sans modifier le HTML" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-275",
    "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)."
  }
}
