{
  "contract_version": "gab_034_contract_v1",
  "gab_id": "GAB-034",
  "canonical_name": "MiniCertificateBlock",
  "module_owner": "EdTechPlayKit",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "certificate_id",
    "title",
    "body",
    "result"
  ],
  "optional_fields": [
    "icon",
    "kicker",
    "disclaimer",
    "cta",
    "accessibility",
    "child_safety"
  ],
  "field_types": {
    "certificate_id": "string — identifiant unique de l'instance de certificat",
    "icon": "string — emoji affiché dans le sceau central (défaut : 🏅)",
    "kicker": "string — surtitre au-dessus du titre principal (défaut : 'Attestation')",
    "title": "string — titre principal de l'attestation",
    "body": "string — corps descriptif (à qui / pourquoi décerné)",
    "result": "string — score ou niveau atteint (affichage formaté librement)",
    "disclaimer": "string — avertissement non-officiel obligatoire",
    "cta": "object{label:string, action:string}"
  },
  "constraints": [
    "L'attestation est TOUJOURS non officielle : le disclaimer DOIT être présent ou le moteur en insère un de secours.",
    "Le titre et le résultat viennent exclusivement du JSON, jamais en dur dans le HTML.",
    "L'animation du sceau est rejoué via le bouton CTA — le libellé du bouton vient du JSON.",
    "Le champ 'icon' est optionnel ; défaut 🏅 si absent.",
    "Interdit de laisser penser que ce certificat a une valeur officielle ou légale."
  ],
  "blocked_conditions": [
    "title absent (BLOCKED)",
    "body absent (BLOCKED)",
    "result absent (BLOCKED)"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "aria-label sur le bouton CTA"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet avec sceau animé, 0 erreur" },
    { "case": "title absent", "expected": "BLOCKED avec message lisible" },
    { "case": "body absent", "expected": "BLOCKED avec message lisible" },
    { "case": "result absent", "expected": "BLOCKED avec message lisible" },
    { "case": "cta absent", "expected": "bouton avec libellé de secours affiché" },
    { "case": "clic bouton CTA", "expected": "animation du sceau rejouée" },
    { "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" },
    { "case": "prefers-reduced-motion", "expected": "animation réduite à 0.01ms" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-034",
    "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)."
  }
}
