{
  "contract_version": "gab_225_contract_v1",
  "gab_id": "GAB-225",
  "canonical_name": "SmartSelectReasonCard",
  "module_owner": "EdTechSmartSelect",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "reason_card_id",
    "title",
    "body",
    "reason",
    "reason_type",
    "meta_source",
    "meta_target"
  ],
  "optional_fields": [
    "primary_cta",
    "info_pill_label",
    "reason_block_label",
    "ack_notice"
  ],
  "field_types": {
    "reason_type": "enum['content','level','format','fallback','teacher_assigned','adaptive_signal']",
    "primary_cta": "object{label,action}",
    "body": "string (HTML inline autorisé : <b> uniquement)",
    "reason": "string (HTML inline autorisé : <b> uniquement)",
    "meta_source": "string — ref au GAB source (ex: 'SmartSelectFormatChoice (GAB-223)')",
    "meta_target": "string — identifiant ressource sélectionnée (ex: 'visual/pythagore-hypotenuse-schema')"
  },
  "constraints": [
    "reason_type doit appartenir à l'enum des 6 valeurs définies.",
    "ReasonCard est read-only : le primary_cta est un acknowledge, jamais une action de progression.",
    "Pas de raw data exposée à l'élève : meta_source et meta_target sont des identifiants techniques.",
    "body et reason ne doivent pas culpabiliser l'élève ni exposer des scores/logs bruts.",
    "Ce GAB est complémentaire de 221/222/223/224 — il ne se substitue pas à eux."
  ],
  "blocked_conditions": [
    "title absent",
    "body absent",
    "reason absent",
    "reason_type absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "aria_labels_on_cta"
  ],
  "qa_cases": [
    { "case": "instance conforme (reason_type=format)", "expected": "rendu complet, 0 erreur" },
    { "case": "champ requis manquant (ex: body absent)", "expected": "BLOCKED listant le champ manquant" },
    { "case": "instance externe injectée via init(ext)", "expected": "rendu change sans modifier le HTML" },
    { "case": "reason_type=teacher_assigned", "expected": "title/body/reason de l'instance affichés correctement" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-225",
    "note": "Ce schema valide l'instance. Le contrat pédagogique complet (input_contract/validation_logic/feedback_scoring_logic) vit dans le CORE-GAB officiel. Ce GAB est la méta-carte des 4 autres SmartSelect (221/222/223/224) — il explique une sélection en langage élève sans exposer de raw data."
  },
  "external_refs": {
    "dependencies": [
      "GAB-221 (SmartSelectContentMatch) — reason_type=content",
      "GAB-222 (SmartSelectLevelFit) — reason_type=level",
      "GAB-223 (SmartSelectFormatChoice) — reason_type=format",
      "GAB-224 (SmartSelectFallbackChoice) — reason_type=fallback"
    ]
  }
}
