{
  "contract_version": "gab_337_contract_v1",
  "gab_id": "GAB-337",
  "canonical_name": "MetacognitionLearningLearningJournal",
  "module_owner": "EdTechMetacognitionLearning",
  "renderer_key": "reflection_input",
  "required_fields": [
    "gab_id",
    "journal_id",
    "daily_prompt",
    "privacy",
    "right_not_to_save",
    "actions"
  ],
  "optional_fields": [
    "title",
    "privacy_notice",
    "input_placeholder",
    "visibility",
    "non_sensitive",
    "feedback",
    "export_allowed",
    "fallback_text_summary"
  ],
  "field_types": {
    "daily_prompt": "string — prompt court du jour, affiché en clair",
    "privacy": "enum['private'] — DOIT être 'private' (journal jamais public)",
    "visibility": "enum['self_only'] — visible par l'élève seul",
    "right_not_to_save": "boolean — DOIT être true (droit de ne pas sauvegarder)",
    "non_sensitive": "boolean — engagement : aucune donnée sensible collectée",
    "actions": "array<{label,action}> — boutons CTA (save_private, do_not_save)",
    "feedback": "object{empty,saved,not_saved} — messages de retour",
    "export_allowed": "boolean — l'élève peut exporter/supprimer"
  },
  "constraints": [
    "privacy DOIT valoir 'private' — un journal d'apprentissage n'est jamais public par défaut.",
    "right_not_to_save DOIT valoir true — l'élève n'est jamais obligé de sauvegarder.",
    "Aucune réflexion d'élève préremplie : la zone de saisie est vide au démarrage (anti-invention).",
    "non_sensitive : ne jamais inviter à saisir une donnée sensible (santé, vie privée, opinions).",
    "Le contenu saisi par l'élève reste local/privé ; ce gabarit ne le transmet pas."
  ],
  "blocked_conditions": [
    "daily_prompt absent",
    "actions vides",
    "privacy != 'private'",
    "right_not_to_save != true"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "textarea_labelled_by_prompt",
    "fallback_text"
  ],
  "child_safety": [
    "private_by_default",
    "never_public",
    "right_not_to_save",
    "no_sensitive_data_collection",
    "exportable_deletable_by_student"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "prompt + zone + 2 boutons, 0 erreur" },
    { "case": "daily_prompt manquant", "expected": "BLOCKED listant le champ" },
    { "case": "privacy != private", "expected": "BLOCKED (journal jamais public)" },
    { "case": "right_not_to_save != true", "expected": "BLOCKED (droit garanti)" },
    { "case": "sauvegarde sans texte", "expected": "message 'écris une phrase', rien sauvegardé" },
    { "case": "ne pas sauvegarder", "expected": "zone vidée + message droit respecté" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-337",
    "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. GAB SENSIBLE child-safety/RGPD : revue Boss requise (voir README)."
  }
}
