{
  "contract_version": "gab_206_contract_v1",
  "gab_id": "GAB-206",
  "canonical_name": "PlayEngineSessionResumeComposite",
  "module_owner": "EdTechPlayEngine",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "session_resume_id",
    "title",
    "summary",
    "progress",
    "primary_cta"
  ],
  "optional_fields": [
    "subtitle",
    "variant",
    "variant_note",
    "session_name",
    "last_step",
    "version_note",
    "secondary_cta",
    "tertiary_cta"
  ],
  "field_types": {
    "progress": "object{current_step:number, total_steps:number, percent:number, label:string}",
    "last_step": "object{icon:string, label:string, text:string, module_chip:{type,label}}",
    "version_note": "object{icon:string, text:string}",
    "primary_cta": "object{label:string, action:string, confirm_msg:string}",
    "secondary_cta": "object{label:string, action:string, confirm_msg:string}",
    "tertiary_cta": "object{label:string, action:string, note_msg:string}",
    "variant": "enum['bottom_sheet']"
  },
  "constraints": [
    "progress.percent doit être cohérent avec current_step/total_steps (current_step/total_steps*100).",
    "primary_cta est obligatoire — action de reprise ou de redémarrage.",
    "Ce GAB ne s'affiche que si la session composite est vraiment commencée et que l'état serveur est fiable.",
    "Si la version session est incompatible côté serveur, PlayEngine route vers VersionMismatch — pas vers ce GAB."
  ],
  "blocked_conditions": [
    "session_resume_id absent",
    "title absent",
    "summary absent",
    "progress absent",
    "primary_cta absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "aria_labels_on_ctas"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet, 3 CTAs visibles, barre de progression à 40%, 0 erreur" },
    { "case": "champ requis manquant (ex: progress)", "expected": "BLOCKED listant le champ" },
    { "case": "primary_cta absent", "expected": "BLOCKED — bouton de reprise obligatoire" },
    { "case": "instance externe injectée via init(ext)", "expected": "le rendu change sans modifier le HTML" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal, bottom_sheet correctement dimensionné" },
    { "case": "clic CTA primary", "expected": "message de confirmation confirm_msg affiché" },
    { "case": "clic CTA tertiary", "expected": "message note_msg affiché (ton neutre/pause)" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-206",
    "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)."
  }
}
