{
  "contract_version": "gab_008_contract_v1",
  "gab_id": "GAB-008",
  "canonical_name": "SessionCheckpointSave",
  "module_owner": "EdTechPlayEngine",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "checkpoint_id",
    "body",
    "save_state"
  ],
  "optional_fields": [
    "icon",
    "toast_auto_dismiss_ms",
    "trigger_label",
    "context_note"
  ],
  "field_types": {
    "body": "string — message affiché dans le toast (ex: 'Progression sauvegardée')",
    "save_state": "enum['saved','saving','error'] — état de sauvegarde",
    "icon": "string — emoji ou caractère d'icône (défaut: '✓')",
    "toast_auto_dismiss_ms": "number — délai auto-dismiss en millisecondes (défaut: 2500)",
    "trigger_label": "string — libellé du bouton de simulation (optionnel, mode démo)",
    "context_note": "string — note de contexte affichée sous le toast (optionnel)"
  },
  "constraints": [
    "save_state doit valoir 'saved', 'saving' ou 'error'.",
    "body est le seul texte affiché dans le toast — jamais inventé, toujours fourni par l'instance.",
    "Le toast est non bloquant : il n'interrompt pas le flow de l'élève.",
    "Auto-dismiss piloté par toast_auto_dismiss_ms (défaut 2500 si absent)."
  ],
  "blocked_conditions": [
    "body absent ou vide",
    "save_state absent",
    "checkpoint_id absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "aria_live_polite_toast"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "toast mint apparaît, disparaît après 2,5 s, 0 erreur" },
    { "case": "body absent", "expected": "BLOCKED listant 'body absent ou vide'" },
    { "case": "save_state absent", "expected": "BLOCKED listant 'save_state absent'" },
    { "case": "checkpoint_id absent", "expected": "BLOCKED listant 'checkpoint_id absent'" },
    { "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" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-008",
    "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)."
  }
}
