{
  "contract_version": "gab_379_contract_v1",
  "gab_id": "GAB-379",
  "canonical_name": "CareerLearningProfessionalInterviewPrep",
  "module_owner": "EdTechCareerLearning",
  "renderer_key": "quiz_scoring",
  "required_fields": [
    "gab_id",
    "interview_prep_id",
    "respectful_questions",
    "consent_required",
    "primary_cta"
  ],
  "optional_fields": [
    "title",
    "intro_note",
    "instruction",
    "progress_label_template",
    "confirmed_cta_label",
    "consent_feedback",
    "use_when",
    "do_not_use_when",
    "child_safety"
  ],
  "field_types": {
    "respectful_questions": "array<{id,text}>  — questions respectueuses pré-rédigées, jamais générées/inventées",
    "consent_required": "boolean (DOIT valoir true — interview d'un professionnel réel)",
    "primary_cta": "object{label,action,disabled_until_selection:boolean}",
    "progress_label_template": "string avec placeholders {n} et {total}",
    "use_when": "array<string>",
    "do_not_use_when": "array<string>",
    "child_safety": "object{consent_required,objective,confidentiality,boss_review_flag}"
  },
  "constraints": [
    "consent_required DOIT valoir true : aucune interview sans consentement du professionnel.",
    "respectful_questions : libellés issus de l'instance, jamais générés par l'élève ni inventés par le moteur.",
    "primary_cta est structurel (HTML) ; son libellé et son gating (disabled_until_selection) viennent du JSON.",
    "Le bouton de confirmation reste désactivé tant qu'aucune question n'est cochée (sauf disabled_until_selection=false)."
  ],
  "blocked_conditions": [
    "respectful_questions vides",
    "consent_required absent ou différent de true",
    "primary_cta.label absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "aria_pressed_on_items"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet, 0 erreur, bouton désactivé tant que 0 question cochée" },
    { "case": "respectful_questions vides", "expected": "BLOCKED listant le champ" },
    { "case": "consent_required != true", "expected": "BLOCKED — consentement obligatoire" },
    { "case": "cocher >= 1 question puis confirmer", "expected": "feedback consentement affiché, bouton verrouillé en 'prêt'" },
    { "case": "instance externe injectée", "expected": "le rendu change sans modifier le HTML" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-379",
    "note": "Ce schema VALIDE l'instance. GAB SENSIBLE (orientation/career, interview d'un pro réel) : revue Boss requise. Le contrat pédagogique complet (input_contract/validation_logic/feedback_scoring_logic) vit dans le CORE-GAB officiel, pas ici."
  }
}
