{
  "contract_version": "gab_002_contract_v1",
  "gab_id": "GAB-002",
  "canonical_name": "SessionStartIntro",
  "module_owner": "EdTechPlayEngine",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "session_intro_id",
    "title",
    "subtitle",
    "primary_cta"
  ],
  "optional_fields": [
    "renderer_key",
    "title_emphasis",
    "badge_label",
    "chips",
    "_note_dev"
  ],
  "field_types": {
    "session_intro_id": "string — identifiant unique de cette intro de session",
    "title": "string — titre principal affiché dans la carte (obligatoire)",
    "title_emphasis": "string | null — mot ou groupe de mots du titre à mettre en relief (couleur violet) ; doit être une sous-chaîne exacte de title",
    "subtitle": "string — texte descriptif sous le titre",
    "badge_label": "string — libellé du badge de statut (ex : 'Nouvelle session')",
    "chips": "array<{icon:string, value:string, label:string}> — méta-informations affichées en chips (durée, étapes, niveau…)",
    "primary_cta": "object{label:string, icon?:string, action?:string} — bouton de démarrage"
  },
  "constraints": [
    "title_emphasis doit être une sous-chaîne exacte de title si fourni.",
    "chips peut être absent ou vide ; le renderer gère gracieusement.",
    "primary_cta.label est obligatoire ; icon et action sont optionnels.",
    "Le libellé du bouton vient uniquement de primary_cta.label, jamais codé en dur dans le HTML."
  ],
  "blocked_conditions": [
    "gab_id absent",
    "title absent",
    "subtitle absent",
    "primary_cta.label absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "button aria-disabled si BLOCKED"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet, badge + titre + sous-titre + chips + CTA, 0 erreur" },
    { "case": "title absent", "expected": "BLOCKED listé dans le panel d'erreur, CTA désactivé" },
    { "case": "primary_cta.label absent", "expected": "BLOCKED listé dans le panel d'erreur, CTA désactivé" },
    { "case": "chips vides ou absents", "expected": "section chips vide, reste du rendu intact" },
    { "case": "title_emphasis absent", "expected": "titre rendu en texte brut sans mise en relief" },
    { "case": "instance externe injectée via init(ext)", "expected": "le rendu change sans modifier le HTML" },
    { "case": "clic CTA", "expected": "panel de confirmation vert affiché, CTA désactivé" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal, chips en grille 2 col sur mobile" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-002",
    "note": "Ce schema VALIDE l'instance. Le contrat pédagogique complet (input_contract/validation_logic) vit dans le CORE-GAB officiel, pas ici (évite la duplication)."
  }
}
