# Info Score — Règles v0.1.0
# ============================================================================
# Référentiels déontologiques et pédagogiques :
#   - Charte de Munich (1971) — devoirs et droits du journaliste
#   - Socle commun de connaissances, compétences et de culture (MEN)
#   - Programmes EMI cycle 4 et lycée (CLEMI / Éduscol)
#
# Principe : le LLM extrait les variables observables listées ci-dessous ;
# le moteur Python (app/scoring.py) applique des fonctions déterministes
# pour calculer un sous-score par critère, puis la note A–E.
# ============================================================================

version: "0.1.0"
published_at: "2026-04-20"
languages_supported: ["fr", "es", "en"]

# ----------------------------------------------------------------------------
#  CRITÈRES DE NOTATION
# ----------------------------------------------------------------------------
# Chaque clé correspond à une fonction dans SCORING_FUNCTIONS (app/scoring.py).
# Poids totalisant 1.0.
# ----------------------------------------------------------------------------
criteria:

  separation_fait_commentaire:
    weight: 0.20
    munich_article: 1
    competence_emi: "Distinguer une information, un commentaire, une opinion (cycle 4, lycée)"
    socle_domaine: "D1 — langages pour penser et communiquer"
    label_fr: "Séparation fait / commentaire"
    label_es: "Separación hecho / comentario"
    label_en: "Fact / commentary separation"
    description: >
      Dans quelle mesure le texte distingue-t-il clairement les faits
      rapportés des opinions, évaluations et interprétations ?
    extraction_variables:
      - name: "claims_total"
        type: "integer"
        description: "Nombre d'affirmations factuelles distinctes identifiables"
      - name: "claims_with_attribution"
        type: "integer"
        description: "Parmi ces affirmations, combien sont attribuées à une source nommée"
      - name: "opinion_markers_count"
        type: "integer"
        description: "Marqueurs d'opinion clairs : « selon moi », « à mon avis », « il est regrettable »…"
      - name: "unmarked_opinions_presented_as_facts"
        type: "integer"
        description: "Énoncés évaluatifs présentés sans marqueur, comme des faits"
      - name: "word_count"
        type: "integer"
        description: "Nombre total de mots du texte analysé"

  tracabilite_sources:
    weight: 0.20
    munich_article: 3
    competence_emi: "Identifier la source d'une information et en évaluer la fiabilité"
    socle_domaine: "D2 — méthodes et outils pour apprendre"
    label_fr: "Traçabilité des sources"
    label_es: "Trazabilidad de las fuentes"
    label_en: "Source traceability"
    description: >
      Les sources sont-elles identifiables, primaires, et liées à des
      documents vérifiables ?
    extraction_variables:
      - name: "sources_named_count"
        type: "integer"
        description: "Sources nommément identifiables (personne, organisation, document)"
      - name: "sources_anonymous_count"
        type: "integer"
        description: "Sources anonymes ou vaguement désignées (« une source proche du dossier »)"
      - name: "sources_primary_count"
        type: "integer"
        description: "Sources primaires citées (document officiel, témoin direct, étude originelle)"
      - name: "external_links_count"
        type: "integer"
        description: "Liens hypertextes vers des documents externes vérifiables"

  contradictoire_pluralite:
    weight: 0.18
    munich_article: 7
    competence_emi: "Repérer la pluralité des points de vue dans un document"
    socle_domaine: "D3 — formation de la personne et du citoyen"
    label_fr: "Contradictoire et pluralité"
    label_es: "Contradictorio y pluralidad"
    label_en: "Contrast and plurality"
    description: >
      Les points de vue adverses sont-ils représentés ? Les claims contestés
      font-ils l'objet d'un contrepoint ?
    extraction_variables:
      - name: "subject_type"
        type: "string"
        enum: ["factuel_incontesté", "factuel_contesté", "opinion_pure", "mixte"]
        description: >
          Nature du sujet : un fait scientifique établi, une controverse
          active, une opinion personnelle, ou un mélange.
      - name: "distinct_viewpoints_count"
        type: "integer"
        description: "Nombre de points de vue clairement distincts représentés"
      - name: "contested_claims_count"
        type: "integer"
        description: "Affirmations qui pourraient être contestées"
      - name: "contested_claims_with_counterpoint"
        type: "integer"
        description: "Parmi celles-ci, combien reçoivent un contrepoint dans le texte"

  expression_incertitude:
    weight: 0.14
    munich_article: 5
    competence_emi: "Comprendre qu'une information peut être incomplète, provisoire ou réfutable"
    socle_domaine: "D4 — systèmes naturels et techniques"
    label_fr: "Expression de l'incertitude"
    label_es: "Expresión de la incertidumbre"
    label_en: "Expression of uncertainty"
    description: >
      Le texte calibre-t-il sa confiance avec ses preuves ? Reconnaît-il
      les limites, les hypothèses, les marges d'erreur ?
    extraction_variables:
      - name: "confidence_calibration"
        type: "string"
        enum: ["bien_calibré", "surconfiant", "sousconfiant", "incohérent"]
        description: >
          Alignement entre la force des affirmations et les preuves présentées.
      - name: "hedging_present"
        type: "boolean"
        description: >
          Présence de marqueurs épistémiques : « semble », « selon les
          données disponibles », « il est possible que »…
      - name: "premature_conclusions_count"
        type: "integer"
        description: "Conclusions catégoriques non étayées par les preuves fournies"

  ton_lexique:
    weight: 0.14
    munich_article: 8
    competence_emi: "Identifier les procédés de persuasion et de manipulation"
    socle_domaine: "D1 — langages / D3 — citoyenneté"
    label_fr: "Ton et lexique"
    label_es: "Tono y léxico"
    label_en: "Tone and lexicon"
    description: >
      Le registre est-il professionnel et mesuré, ou cherche-t-il à
      provoquer, indigner, ridiculiser ?
    extraction_variables:
      - name: "emotional_charge_intensity"
        type: "string"
        enum: ["neutre", "mesurée", "forte", "très_forte"]
        description: >
          Intensité globale de la charge émotionnelle du texte.
      - name: "loaded_words_count"
        type: "integer"
        description: >
          Occurrences de termes connotés fortement — ex FR : « scandaleux »,
          « honteux » ; ES : « escandaloso », « vergonzoso » ;
          EN : « outrageous », « shameful ».
      - name: "ad_hominem_attacks_count"
        type: "integer"
        description: "Attaques personnelles (contre la personne plutôt que l'argument)"
      - name: "sensationalist_headline"
        type: "boolean"
        description: "Le titre relève-t-il du clickbait ou de l'appel à l'émotion ?"
      - name: "rhetorical_questions_count"
        type: "integer"
        description: "Questions rhétoriques orientées (effet persuasif)"

  mise_en_contexte:
    weight: 0.14
    munich_article: 1
    competence_emi: "Situer une information dans son contexte historique et géographique"
    socle_domaine: "D5 — représentations du monde et activité humaine"
    label_fr: "Mise en contexte"
    label_es: "Puesta en contexto"
    label_en: "Contextualisation"
    description: >
      Le lecteur reçoit-il le contexte nécessaire pour interpréter
      l'information (historique, géographique, comparatif) ?
    extraction_variables:
      - name: "relevant_background_complete"
        type: "string"
        enum: ["complet", "partiel", "absent", "non_nécessaire"]
        description: >
          Le contexte indispensable à la compréhension est-il fourni ?
      - name: "historical_context_provided"
        type: "boolean"
        description: "Une mise en perspective historique est-elle donnée ?"
      - name: "geographic_context_provided"
        type: "boolean"
        description: "Une mise en perspective géographique est-elle donnée ?"
      - name: "dates_and_figures_verifiable"
        type: "boolean"
        description: "Les dates et chiffres mentionnés sont-ils vérifiables par le lecteur ?"
      - name: "missing_essential_info_count"
        type: "integer"
        description: "Éléments essentiels omis qui empêchent une compréhension solide"


# ----------------------------------------------------------------------------
#  VARIABLES GLOBALES (toujours extraites, non notées directement)
# ----------------------------------------------------------------------------
global_variables:
  - name: "content_type"
    type: "string"
    enum: ["information", "analyse", "opinion", "satire", "inconnu"]
    description: "Nature dominante du contenu"
  - name: "detected_language"
    type: "string"
    enum: ["fr", "es", "en", "other"]
    description: "Langue principale du texte"
  - name: "overall_summary"
    type: "string"
    description: "Résumé neutre en 2 phrases, en français."
  - name: "representative_quotes"
    type: "array"
    items_type: "string"
    description: "2 à 4 citations littérales représentatives pour illustrer l'analyse"
  - name: "methodological_notes"
    type: "string"
    description: "Notes méthodologiques brèves (sources absentes, ambiguïtés, limites)"


# ----------------------------------------------------------------------------
#  ÉCHELLE DE NOTATION
# ----------------------------------------------------------------------------
# Seuils appliqués par ordre A → E. Le premier seuil atteint gagne.
# ----------------------------------------------------------------------------
grading:
  A:
    min: 0.85
    label_fr: "Très fiable"
    label_es: "Muy fiable"
    label_en: "Highly reliable"
  B:
    min: 0.70
    label_fr: "Plutôt fiable"
    label_es: "Bastante fiable"
    label_en: "Generally reliable"
  C:
    min: 0.50
    label_fr: "À vérifier"
    label_es: "Por verificar"
    label_en: "Needs verification"
  D:
    min: 0.30
    label_fr: "Peu fiable"
    label_es: "Poco fiable"
    label_en: "Low reliability"
  E:
    min: 0.00
    label_fr: "Très subjectif"
    label_es: "Muy subjetivo"
    label_en: "Highly subjective"


# ----------------------------------------------------------------------------
#  VARIANTES LINGUISTIQUES (indications pour le prompt)
# ----------------------------------------------------------------------------
language_hints:
  fr:
    emphatic_markers: ["scandaleux", "honteux", "choquant", "inadmissible", "révoltant"]
    hedging_markers:  ["semble", "selon", "vraisemblablement", "il est possible que", "il apparaît que"]
  es:
    emphatic_markers: ["escandaloso", "vergonzoso", "inaudito", "inadmisible", "indignante"]
    hedging_markers:  ["al parecer", "según", "posiblemente", "es posible que", "parece que"]
  en:
    emphatic_markers: ["shocking", "outrageous", "disgraceful", "unbelievable", "appalling"]
    hedging_markers:  ["reportedly", "according to", "apparently", "it is possible that", "seems"]


# ----------------------------------------------------------------------------
#  GOUVERNANCE
# ----------------------------------------------------------------------------
governance:
  public_repository: true
  appeal_channel: "contact@info-score.example.org"
  review_cycle_days: 90
  comite_pluriel:
    - "journaliste en exercice"
    - "professeur-documentaliste AEFE"
    - "formateur CLEMI"
    - "juriste média"
    - "chercheur en SIC"
