{
  "contract_version": "gab_365_contract_v1",
  "gab_id": "GAB-365",
  "canonical_name": "OrientationLearningCareerCard",
  "module_owner": "EdTechOrientationLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "career_card_id",
    "source",
    "job_title",
    "no_job_promise",
    "rubrics"
  ],
  "optional_fields": [
    "title",
    "job_summary",
    "skills",
    "nuanced_reality",
    "primary_cta"
  ],
  "field_types": {
    "source": "object{label,kind} — origine de la fiche, obligatoire (jamais de fiche sans source)",
    "job_title": "string",
    "job_summary": "string",
    "skills": "array<string>",
    "rubrics": "array<{icon,key,label,detail}> — rubriques dépliables (salaire prudent, formations, évolutions...)",
    "nuanced_reality": "string — réalité nuancée, jamais un chiffre garanti",
    "no_job_promise": "string — avertissement obligatoire : une fiche informe, elle ne promet pas un emploi",
    "primary_cta": "object{label,action}"
  },
  "constraints": [
    "Aucune fiche sans source : le champ source.label est obligatoire.",
    "Salaire toujours prudent : aucun chiffre garanti, formulation nuancée (ex: « variable selon expérience/région »).",
    "Plusieurs formations possibles : ne jamais présenter une voie comme « la seule ».",
    "no_job_promise obligatoire : une fiche métier informe, elle ne promet PAS un emploi.",
    "Anti-invention : ne pas inventer de salaire, de débouché garanti ni de promesse d'embauche.",
    "primary_cta : bouton structurel (HTML), libellé venant du JSON."
  ],
  "blocked_conditions": [
    "source absente",
    "job_title absent",
    "no_job_promise absent",
    "rubrics vides"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "fallback_text"
  ],
  "child_safety": [
    "orientation_non_directive : informe sans orienter de force vers un métier",
    "no_job_promise toujours visible au dépliage d'une rubrique",
    "salaire prudent, jamais de chiffre présenté comme garanti",
    "source affichée pour permettre le recoupement"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet, 0 erreur" },
    { "case": "source manquante", "expected": "BLOCKED listant source" },
    { "case": "no_job_promise manquant", "expected": "BLOCKED listant no_job_promise" },
    { "case": "dépliage d'une rubrique", "expected": "détail honnête affiché + avertissement no_job_promise visible" },
    { "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-365",
    "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). GAB SENSIBLE orientation/career — revue Boss requise avant prod."
  }
}
