{
  "contract_version": "gab_195_contract_v1",
  "gab_id": "GAB-195",
  "canonical_name": "PathMapReturnPrompt",
  "module_owner": "EdTechPathMap",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "return_prompt_id",
    "title",
    "primary_cta"
  ],
  "optional_fields": [
    "subtitle",
    "summary",
    "progress",
    "secondary_cta",
    "back_cta"
  ],
  "field_types": {
    "title": "string — question principale affichée dans le header du bottom_sheet",
    "subtitle": "string — ligne secondaire sous le titre",
    "summary": "string (HTML autorisé : <b>) — description de la prochaine étape",
    "progress": "object{label:string, current:integer, total:integer, percent:integer(0..100)}",
    "primary_cta": "object{label:string, action:string, feedback:string}",
    "secondary_cta": "object{label:string, action:string, feedback:string}",
    "back_cta": "object{label:string, action:string, feedback:string}"
  },
  "constraints": [
    "primary_cta est obligatoire ; secondary_cta et back_cta sont optionnels mais fortement recommandés.",
    "progress.percent dans [0, 100] si présent.",
    "summary peut contenir des balises <b> pour la mise en emphase du nom de la prochaine étape.",
    "Le renderer est un bottom_sheet contextuel (fin d'activité ou reprise après pause), jamais une interruption d'activité en cours.",
    "Les actions reconnues sont : 'continue', 'map', 'later'. Toute autre valeur est traitée comme 'continue'."
  ],
  "blocked_conditions": [
    "title absent",
    "primary_cta absent",
    "instance absente"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "aria_labels_on_buttons"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "bottom_sheet complet avec titre, résumé, barre progression et 3 boutons" },
    { "case": "primary_cta absent", "expected": "BLOCKED affiché, rendu bloqué" },
    { "case": "title absent", "expected": "BLOCKED affiché, rendu bloqué" },
    { "case": "clic primary_cta (continue)", "expected": "boutons désactivés, feedback '✓ Tu reprends le parcours', restauration après 2.2s" },
    { "case": "clic secondary_cta (map)", "expected": "feedback '🗺️ Tu retournes à la carte', restauration après 2.2s" },
    { "case": "clic back_cta (later)", "expected": "feedback '⏰ Pas de souci, tu reviendras quand tu voudras', restauration après 2.2s" },
    { "case": "progress absent", "expected": "barre de progression masquée, reste du rendu intact" },
    { "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-195",
    "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)."
  }
}
