{
  "contract_version": "gab_370_contract_v1",
  "gab_id": "GAB-370",
  "canonical_name": "OrientationLearningEmptyState",
  "module_owner": "EdTechOrientationLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "empty_state_id",
    "diagnostic",
    "starters"
  ],
  "optional_fields": [
    "title",
    "starter_label",
    "help_cta",
    "no_invented_verdict",
    "use_when",
    "do_not_use_when"
  ],
  "field_types": {
    "diagnostic": "string — message d'accueil doux, sans verdict",
    "starters": "array<{label,kind,feedback}> — pistes de départ proposées (jamais un verdict)",
    "starter.kind": "enum['simple_question','exploration_fallback']",
    "help_cta": "object{label,feedback} — demande d'aide à un humain (conseiller d'orientation)",
    "no_invented_verdict": "boolean — garde-fou : l'outil n'invente JAMAIS d'orientation",
    "use_when": "array<string>",
    "do_not_use_when": "array<string>"
  },
  "constraints": [
    "Aucun verdict d'orientation n'est généré par l'outil — uniquement un point de départ doux.",
    "Au moins une piste (starter) doit exister : l'élève n'est jamais laissé sans piste.",
    "help_cta = escalade vers un humain ; le détail technique part séparément à l'admin (pas de profilage exposé à l'élève).",
    "Si des pistes existent déjà, utiliser GAB-362 plutôt que cet état vide."
  ],
  "blocked_conditions": [
    "diagnostic absent",
    "starters vides (élève laissé sans piste)"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion"
  ],
  "child_safety": [
    "no_invented_verdict — aucun verdict d'orientation inventé par l'outil",
    "ton non-injonctif et sans pression",
    "fallback exploration + escalade vers un conseiller humain",
    "détail technique vers admin, séparé du message élève"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet (titre, diagnostic, chips), 0 erreur" },
    { "case": "diagnostic manquant", "expected": "BLOCKED listant le champ" },
    { "case": "starters vides", "expected": "BLOCKED — élève laissé sans piste" },
    { "case": "clic starter", "expected": "feedback doux affiché, aucun verdict d'orientation" },
    { "case": "clic demander de l'aide", "expected": "escalade humaine + note admin séparée" },
    { "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-370",
    "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."
  }
}
