{
  "contract_version": "gab_285_contract_v1",
  "gab_id": "GAB-285",
  "canonical_name": "WritingLearningArgumentBuilder",
  "module_owner": "EdTechWritingLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "argument_builder_id",
    "claim",
    "evidence_requirements",
    "reasoning_structure",
    "validation_policy"
  ],
  "optional_fields": [
    "title",
    "subtitle",
    "evidence",
    "example_slot",
    "counterargument_slot",
    "connector_bank",
    "fallacy_warnings",
    "reason_block"
  ],
  "field_types": {
    "claim": "object{step:number,label:string,text:string}",
    "evidence": "object{step:number,label:string,text:string}",
    "example_slot": "object{step:number,label:string,text:string}",
    "reasoning_structure": "object{step:number,label:string,text:string}",
    "counterargument_slot": "object{step:number,label:string,text:string}",
    "connector_bank": "array<string>",
    "fallacy_warnings": "array<{name:string,example:string}>",
    "reason_block": "object{heading:string,text:string}",
    "validation_policy": "object{primary_cta_label,primary_cta_reveal,secondary_cta_label,secondary_cta_reveal}",
    "evidence_requirements": "object{min_steps:number,required_types:array<string>,optional_types:array<string>}"
  },
  "constraints": [
    "claim est le maillon de départ obligatoire de la chaîne argumentative.",
    "reasoning_structure fournit le lien logique entre claim et evidence — requis pour cohérence pédagogique.",
    "validation_policy contient les libellés des deux CTA primaire et secondaire.",
    "evidence_requirements documente le nombre minimum d'étapes et les types obligatoires.",
    "Les chaînons optionnels (example_slot, counterargument_slot) enrichissent la structure mais ne bloquent pas le rendu.",
    "connector_bank est un tableau de mots-charnières — au moins 1 élément si présent.",
    "fallacy_warnings : chaque entrée doit avoir name + example."
  ],
  "blocked_conditions": [
    "claim absent (BLOCKED)",
    "reasoning_structure absent (BLOCKED)",
    "evidence_requirements absent (BLOCKED)",
    "argument_builder_id absent (BLOCKED)",
    "validation_policy absent (BLOCKED)"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "fallback_text"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "chaîne complète rendue, CTAs actifs, 0 erreur" },
    { "case": "claim absent", "expected": "BLOCKED listant le champ manquant" },
    { "case": "reasoning_structure absent", "expected": "BLOCKED listant le champ manquant" },
    { "case": "connector_bank absent ou vide", "expected": "section connecteurs masquée, pas de crash" },
    { "case": "fallacy_warnings absent", "expected": "section sophismes masquée, pas de crash" },
    { "case": "instance externe injectée via init(ext)", "expected": "le rendu change sans modifier le HTML" },
    { "case": "CTA primaire cliqué", "expected": "panneau révèle primary_cta_reveal" },
    { "case": "CTA secondaire cliqué", "expected": "panneau révèle secondary_cta_reveal" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-285",
    "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)."
  }
}
