{
  "contract_version": "gab_274_contract_v1",
  "gab_id": "GAB-274",
  "canonical_name": "MethodLearningJustificationBuilder",
  "module_owner": "EdTechMethodLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "justification_id",
    "claim",
    "evidence_required",
    "reasoning_steps",
    "final_answer_format"
  ],
  "optional_fields": [
    "title",
    "subtitle",
    "reasoning_type",
    "rule_ref",
    "because_connectors",
    "common_bad_justifications",
    "anti_circular_traps",
    "primary_cta",
    "secondary_cta",
    "why_chain",
    "accessibility",
    "child_safety"
  ],
  "field_types": {
    "claim": "string — affirmation à justifier (non triviale, doit nécessiter une preuve)",
    "evidence_required": "string — faits vérifiables indépendants de la claim",
    "reasoning_steps": "string — lien logique mobilisant une règle ou un théorème",
    "final_answer_format": "string — conclusion répondant explicitement à la question posée",
    "because_connectors": "array<string> — connecteurs logiques conseillés (d'après, or, donc…)",
    "common_bad_justifications": "string — description du piège circulaire ou contre-exemple fautif",
    "anti_circular_traps": "integer — nombre de pièges anti-circularité détectés dans le contenu",
    "primary_cta": "object{label,action}",
    "secondary_cta": "object{label,action}",
    "reasoning_type": "enum['math_proof_chain','historical_argument','scientific_reasoning','literary_analysis','logical_deduction']"
  },
  "constraints": [
    "evidence_required doit contenir des données factuelles INDÉPENDANTES de la claim (anti-circularité).",
    "claim ne doit pas être re-formulée dans evidence_required (c'est la définition du raisonnement circulaire).",
    "primary_cta.label vient du JSON — bouton structurel HTML.",
    "because_connectors : au moins 2 connecteurs si fourni."
  ],
  "blocked_conditions": [
    "claim absent (BLOCKED)",
    "evidence_required absent (BLOCKED)",
    "reasoning_steps absent (BLOCKED)",
    "final_answer_format absent (BLOCKED)"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "fallback_text"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet chaîne 4 maillons, 0 erreur" },
    { "case": "claim absent", "expected": "BLOCKED listant le champ manquant" },
    { "case": "evidence_required absent", "expected": "BLOCKED listant le champ manquant" },
    { "case": "reasoning_steps absent", "expected": "BLOCKED listant le champ manquant" },
    { "case": "final_answer_format absent", "expected": "BLOCKED listant le champ manquant" },
    { "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-274",
    "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)."
  }
}
