{
  "contract_version": "gab_355_contract_v1",
  "gab_id": "GAB-355",
  "canonical_name": "MotivationLearningComeBackLater",
  "module_owner": "EdTechMotivationLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "come_back_later_id",
    "saved_context_label",
    "reminder_prompt",
    "reminder_options",
    "short_alternative_cta"
  ],
  "optional_fields": [
    "heading",
    "short_alternative_feedback",
    "use_when",
    "do_not_use_when"
  ],
  "field_types": {
    "saved_context_label": "string — message de confirmation sauvegarde, affiché en panel ok",
    "reminder_prompt": "string — question affichée au-dessus des options de rappel",
    "reminder_options": "array<{id:string, label:string, icon:string, feedback:string}> — min 2 entrées dont une option 'Pas de rappel'",
    "short_alternative_cta": "string — libellé du bouton ghost d'alternative courte",
    "short_alternative_feedback": "string — texte affiché après clic sur l'alternative courte"
  },
  "constraints": [
    "reminder_options doit contenir au moins une option id='none' (pas de rappel) pour respecter le choix de l'élève.",
    "Chaque option reminder doit avoir un champ feedback non vide.",
    "Aucun rappel ne peut être envoyé sans sélection explicite de l'élève (non_intrusive = toujours respecté).",
    "short_alternative_cta est requis pour offrir une alternative immédiate sans engagement."
  ],
  "blocked_conditions": [
    "reminder_options absentes ou vides",
    "saved_context_label absent",
    "come_back_later_id absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "fallback_text"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet, 0 erreur" },
    { "case": "champ requis manquant", "expected": "BLOCKED listant le champ" },
    { "case": "clic 'Me rappeler demain'", "expected": "feedback correspondant affiché, état scheduled" },
    { "case": "clic 'Pas de rappel'", "expected": "feedback 'Aucun rappel — respecté', état declined" },
    { "case": "clic 'Faire vite une activité courte'", "expected": "short_alternative_feedback affiché" },
    { "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-355",
    "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)."
  }
}
