{
  "contract_version": "gab_340_contract_v1",
  "gab_id": "GAB-340",
  "canonical_name": "MetacognitionLearningProgressIdentity",
  "module_owner": "EdTechMetacognitionLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "progress_identity_id",
    "intro_note",
    "prompt",
    "formulations",
    "keep_options"
  ],
  "optional_fields": [
    "title",
    "child_safety"
  ],
  "field_types": {
    "intro_note": "string — rappel anti-étiquette, droit à l'évolution",
    "prompt": "string — consigne de choix",
    "formulations": "array<{kind:enum['fixed','growth'],label,icon,feedback}> — au moins une 'growth'",
    "keep_options": "array<{mode:enum['private','share'],label,style:enum['primary','ghost'],feedback}>",
    "child_safety": "object{no_fixed_label,no_psych_profile,right_to_evolve,privacy_default,share_requires_authorization}"
  },
  "constraints": [
    "Aucune étiquette figée (« bon »/« mauvais ») n'est générée : seules les formulations de l'instance s'affichent.",
    "Aucun profil psychologique : on décrit un progrès, pas une identité figée.",
    "Le partage est conditionnel à une autorisation active ; sinon le contenu reste privé (privacy_default).",
    "keep_options : boutons structurels (HTML), libellés venant du JSON."
  ],
  "blocked_conditions": [
    "formulations vides ou absentes",
    "aucune formulation kind='growth'",
    "keep_options vides ou absentes",
    "prompt absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "fallback_text"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet, 0 erreur" },
    { "case": "formulations vides", "expected": "BLOCKED listant le champ" },
    { "case": "aucune formulation growth", "expected": "BLOCKED — il faut une formulation de progrès" },
    { "case": "choix 'growth'", "expected": "feedback positif + rangée de partage affichée" },
    { "case": "choix 'fixed'", "expected": "feedback anti-étiquette, rangée de partage masquée" },
    { "case": "partager sans autorisation", "expected": "reste privé (share_requires_authorization)" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-340",
    "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)."
  }
}
