{
  "contract_version": "gab_388_contract_v1",
  "gab_id": "GAB-388",
  "canonical_name": "MediaLearningGeneratedAssetNotice",
  "module_owner": "EdTechMediaLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "asset_id",
    "asset_label",
    "asset_description",
    "provider",
    "status",
    "pedagogical_review_required"
  ],
  "optional_fields": [
    "notice_text",
    "cta_validate",
    "cta_reject",
    "cta_regenerate",
    "feedback_validated",
    "feedback_rejected",
    "feedback_regenerated"
  ],
  "field_types": {
    "asset_id": "string — identifiant unique de l'asset généré",
    "asset_label": "string — libellé affiché (ex: 'Image générée par IA · brouillon')",
    "asset_description": "string — description courte du visuel (sans inventer son contenu)",
    "provider": "string — nom du modèle ou du service générateur",
    "status": "enum['draft','validated','rejected','regenerate_needed'] — état de validation",
    "pedagogical_review_required": "boolean — toujours true pour un asset IA non encore validé",
    "notice_text": "string — message d'avertissement affiché à l'enseignant",
    "cta_validate": "object{label,action}",
    "cta_reject": "object{label,action}",
    "cta_regenerate": "object{label,action}",
    "feedback_validated": "string — message affiché après validation",
    "feedback_rejected": "string — message affiché après rejet",
    "feedback_regenerated": "string — message affiché après demande de régénération"
  },
  "constraints": [
    "pedagogical_review_required doit être true tant que status='draft' — un asset IA non vérifié ne peut pas être présenté comme fiable.",
    "Les boutons (validate/reject/regenerate) sont structurels (HTML) ; leurs libellés viennent du JSON.",
    "status 'validated' : bouton Valider désactivé après action.",
    "Interdiction de présenter l'asset comme une source fiable : le renderer affiche toujours la notice_text."
  ],
  "blocked_conditions": [
    "asset_id absent (BLOCKED)",
    "provider absent (BLOCKED)",
    "status absent (BLOCKED)"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "boutons labellisés (aria-label si emoji seul)"
  ],
  "child_safety": [
    "Un asset IA non validé ne doit jamais être rendu accessible aux élèves sans validation préalable du professeur.",
    "La notice d'avertissement est obligatoire et non masquable."
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet, notice visible, 3 boutons actifs" },
    { "case": "champ requis manquant (ex: provider absent)", "expected": "BLOCKED listant le champ" },
    { "case": "clic Valider", "expected": "feedback_validated affiché, bouton Valider désactivé" },
    { "case": "clic Rejeter", "expected": "feedback_rejected affiché (panel bad)" },
    { "case": "clic Régénérer", "expected": "feedback_regenerated affiché (panel note)" },
    { "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-388",
    "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)."
  }
}
