{
  "contract_version": "gab_183_contract_v1",
  "gab_id": "GAB-183",
  "canonical_name": "LevelTestParentSummary",
  "module_owner": "EdTechLevelTest",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "parent_summary_id",
    "title",
    "child_name",
    "session_date",
    "strengths",
    "focus_areas",
    "advice"
  ],
  "optional_fields": [
    "renderer_key",
    "_note_dev",
    "warn_label",
    "warn_text",
    "greeting",
    "strengths_label",
    "focus_label",
    "advice_label",
    "primary_cta"
  ],
  "field_types": {
    "parent_summary_id": "string — identifiant unique de ce résumé parent",
    "title": "string — intitulé du diagnostic (ex: 'Diagnostic Maths · 3ᵉ')",
    "child_name": "string — prénom de l'élève, affiché de façon constructive",
    "session_date": "string — date lisible de la session (format libre, ex: '28 mai 2026')",
    "greeting": "string — message introductif à destination du parent, ton positif",
    "warn_label": "string — libellé du bandeau d'avertissement éditorial",
    "warn_text": "string — texte du bandeau d'avertissement éditorial",
    "strengths_label": "string — libellé de la colonne points forts (défaut: '💪 Points forts')",
    "strengths": "array<string> — liste de points forts de l'élève, non vide",
    "focus_label": "string — libellé de la colonne à renforcer (défaut: '🎯 À renforcer')",
    "focus_areas": "array<string> — liste de notions à renforcer, non vide",
    "advice_label": "string — libellé du bloc conseil (défaut: 'Conseil d’accompagnement')",
    "advice": "string — conseil d'accompagnement concret pour le parent",
    "primary_cta": "object{label:string, action:string} — bouton structurel, libellé venant du JSON"
  },
  "constraints": [
    "Ton UNIQUEMENT constructif — jamais punitif, jamais de classement, jamais de note officielle.",
    "child_name affiché à titre d'accompagnement, jamais pour juger.",
    "strengths et focus_areas doivent chacun contenir au moins 1 entrée (sinon BLOCKED).",
    "advice doit être concret et actionnable, sans pression sur l'enfant.",
    "primary_cta : bouton structurel (HTML), libellé venant du JSON."
  ],
  "blocked_conditions": [
    "gab_id absent",
    "title absent",
    "child_name absent",
    "strengths vides ou manquants",
    "focus_areas vides ou manquants",
    "advice absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "responsive_single_col_375px"
  ],
  "child_safety": [
    "Aucune note officielle, aucun classement, aucune comparaison aux autres élèves.",
    "Diagnostic interne uniquement — usage accompagnement parental.",
    "Données affichées avec consentement parent implicite dans le flow LevelTest."
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet, warn + tête + salutation + 2 colonnes + conseil + CTA, 0 erreur" },
    { "case": "champ requis manquant (ex: advice absent)", "expected": "BLOCKED listant le champ manquant" },
    { "case": "strengths vide []", "expected": "BLOCKED strengths vides" },
    { "case": "instance externe injectée via ENGINE.init(ext)", "expected": "le rendu change sans modifier le HTML" },
    { "case": "responsive 375px", "expected": "colonnes empilées, aucun débordement horizontal" },
    { "case": "clic CTA", "expected": "message de confirmation vert affiché" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-183",
    "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). Source HTML : INDEX-300-leveltest-GAB-181-185-PLAYABLE.html, stage data-tpl='183'."
  }
}
