KutsumKutsum
Accueil
Utilisation de l'appli
Création de questions
Installation
Détails techniques
Accueil
Utilisation de l'appli
Création de questions
Installation
Détails techniques
  • Détails techniques (utilisateurs avancés seulement)

    • Détails techniques (utilisateurs avancés seulement)
    • Architecture générale
    • 🖼️ Gestion des images
    • Base de données
    • Système de scoring
    • Services backend
    • API REST
    • Configuration et environnement
    • Tests et qualité
    • Tests E2E (Playwright) — runbook
    • Tests backend (Jest)
    • Tests frontend (Jest)
    • Déploiement et DevOps
    • Security Documentation
    • Performance & Monitoring
    • Troubleshooting Guide
    • Moodle et LTI 1.3
    • Multi-tenant Kutsum
    • Éditeur de Questions pour Enseignants
    • Landing Page Variants (App)
    • Types de questions et flux de correction
    • Compilation du validationConfig MathALÉA

Compilation du validationConfig MathALÉA

Cette page documente le pipeline de compilation du champ validationConfig présent dans les exports MathALÉA, et comment il est traduit en type de question et en validationConfig Kutsum lors de l'import via ExternalDraftMaterializationService.

Fichier source de référence :app/backend/src/core/services/math/compileMathaleaValidationConfig.ts


Formats d'entrée

MathALÉA émet deux formats distincts pour validationConfig :

FormatExempleContexte
Objet (Kutsum interne){ formatInteractif: 'fractionEgale' }Export MathALÉA via formatInteractif
Tableau de chaînes (natif MathALÉA)["nombreDecimalSeulement"]Export MathALÉA moderne — format le plus courant dans les fixtures réelles
null / absent—Question numeric ou singleChoice / multipleChoice

Le compilateur normalise les tableaux en objets avant traitement : ["clé1", "clé2"] devient { clé1: true, clé2: true }, puis le compilateur récurse.

Le champ providerValidationSource.rawConfig conserve toujours la valeur d'origine (tableau ou objet) pour traçabilité.


Pipeline de compilation

validationConfig (MathALÉA)
        │
        ▼
┌───────────────────────────────┐
│ null/absent ?                 │─── oui ──▶ config par défaut (EXPRESSION / SINGLE)
└───────────────────────────────┘
        │ non
        ▼
┌───────────────────────────────┐
│ Array.isArray ?               │─── non-string éléments ──▶ UNSUPPORTED
│ ["clé1","clé2"]               │─── ok ──▶ normalise en { clé1:true, clé2:true }
└───────────────────────────────┘            récurse
        │
        ▼
┌───────────────────────────────┐
│ texteAvecCasse / texteSansCasse│─── oui ──▶ questionType: 'math', kind: EXACT_LATEX
└───────────────────────────────┘
        │ non
        ▼
┌───────────────────────────────┐
│ fractionEgale + nombreDecimal │─── oui ──▶ kind: FRACTION_OR_DECIMAL / COMPLETE
│ Seulement (combinaison)       │            (fraction OU décimal égal accepté)
└───────────────────────────────┘
        │ non
        ▼
┌───────────────────────────────┐
│ fractionEgale (seul)          │─── oui ──▶ EXPRESSION / IS_FRACTION / COMPLETE
└───────────────────────────────┘
        │ non
        ▼
┌───────────────────────────────┐
│ nombreDecimalSeulement        │─── oui ──▶ EXPRESSION / IS_DECIMAL / COMPLETE
└───────────────────────────────┘
        │ non
        ▼
      ... (voir tableau complet ci-dessous)
        │
        ▼
┌───────────────────────────────┐
│ formatInteractif === 'xxx' ?  │─── oui ──▶ règle spécifique formatInteractif
└───────────────────────────────┘
        │ non
        ▼
┌───────────────────────────────┐
│ Aucune règle applicable       │─── ──▶ UNSUPPORTED (question filtrée à l'import)
└───────────────────────────────┘

Table des clés compilées

Correspondance LaTeX exacte (→ questionType: 'math', kind: 'EXACT_LATEX')

Clé MathALÉAcaseSensitiveNote
texteAvecCassetrueComparaison de chaîne LaTeX normalisée, sensible à la casse
texteSansCassefalseComparaison de chaîne LaTeX normalisée, insensible à la casse

Expressions mathématiques (→ questionType: 'math')

Priorité haute

Clé MathALÉAContrainte KutsumCouverture si seuleNote
fractionEgale + nombreDecimalSeulement (combinaison)FRACTION_OR_DECIMALCOMPLETEPaire détectée en premier — fraction OU décimal de même valeur accepté
fractionEgale (seul)IS_FRACTIONCOMPLETEDécimaux rejetés
nombreDecimalSeulementIS_DECIMALCOMPLETE
ecritureScientifiqueSCIENTIFIC_NOTATIONCOMPLETE
fractionIrreductibleIS_IRREDUCIBLECOMPLETE

Opérations élémentaires

Clé MathALÉAContrainte KutsumNote
additionSeulementEtNonResultatIS_ADDITION
soustractionSeulementEtNonResultatIS_SUBTRACTION
multiplicationSeulementEtNonResultatIS_MULTIPLICATION
divisionSeulementEtNonResultatIS_DIVISION

Égalité / réduction / développement

Clé MathALÉAContrainte KutsumCouverture
calculFormelIS_FORMAL_EXPRESSIONCOMPLETE
egaliteExpressionIS_EQUALITYCOMPLETE
developpementEgalIS_EXPANDEDCOMPLETE
expressionsForcementReduitesIS_REDUCED_POLYNOMIALCOMPLETE

Collections numériques

Clé MathALÉAContrainte KutsumOrdre / délimiteurs
ensembleDeNombresNUMERIC_SETNon ordonné, accolades {} requises
suiteDeNombresNUMERIC_SETNon ordonné, sans accolades
kUpletORDERED_TUPLEOrdonné, accolades {} requises
suiteRangeeDeNombresORDERED_TUPLEOrdonné, sans accolades

Durée, unités

Clé MathALÉAContrainte KutsumNote
HMSHMSDurée heure/minute/seconde
uniteWITH_UNITprecisionUnite: 0 = correspondance exacte

formatInteractif (objet uniquement)

ValeurContrainte KutsumCouverture
fractionEgaleIS_FRACTION (+ IS_IRREDUCIBLE si option fractionIrreductible)COMPLETE ou PARTIAL selon options inconnues
autres valeurs reconnuesvoir sourcevariable

Factorisation

Clé MathALÉAContrainte Kutsum
factorisationFACTORED_EXPRESSION
exclusifFactorisationFACTORISED_EXPRESSION (strict)
nbFacteursIdentiquesFactorisationFACTORISED_EXPRESSION (count strict)
unSeulFacteurLitteralFACTORISED_EXPRESSION (no scalar factor)

Formes niches

Clé MathALÉAContrainte KutsumNote
avecSigneMultiplierEXPRESSION (plain)× explicite mais accepté par CE
sansTimesEXPRESSION (plain)× optionnel
avecFractionsEXPRESSION (plain)Fractions naturellement acceptées par CE
expandedEXPANDEDToutes multiplications explicites
puissancePOWERForme puissance requise
sansExposantUnPOWERPuissance + rejette exposant = 1
seulementCertainesPuissancesPOWERPuissance + base doit correspondre
nombreAvecEspaceFR_THOUSANDS_SPACEEspace fine française obligatoire
fonctionFUNCTION_SAMPLINGÉchantillonnage numérique sur domaine

Fractions avancées

Clé MathALÉAContrainte KutsumNote
fractionDecimaleDECIMAL_FRACTIONDénominateur = puissance de 10
fractionSansRacineCarreeRATIONALIZED_FRACTIONPas de radical au dénominateur
fractionIdentiqueIDENTICAL_FRACTIONFraction structurellement identique
fractionReduiteSIMPLIFIED_FRACTIONGCD strictement < cible
fractionSimplifieeSIMPLIFIED_FRACTIONSimplifié par un entier

Expressions numériques et intervalles

Clé MathALÉAContrainte KutsumNote
expressionNumeriqueARITHMETIC_EXPRESSIONMêmes nombres feuilles + opérateurs
estDansIntervalleIN_INTERVALValeur dans l'intervalle cible
intervalleIS_INTERVALÉgalité de notation d'intervalle
nonReponseAcceptee—Réponse vide acceptée comme CORRECT

compiledCoverage

ValeurSignificationComportement à l'import
COMPLETEToutes les clés de la config ont été compiléesQuestion importée ✅
PARTIALLe sémantique principal est compilé, mais certaines options sont ignoréesQuestion importée ✅
UNSUPPORTEDAucune règle ne correspond (clé inconnue ou tableau non-string)Question filtrée ❌

Le filtre se situe dans isDraftQuestionCompatible dans ExternalDraftMaterializationService : seul compiledCoverage === 'UNSUPPORTED' provoque le rejet ; PARTIAL est accepté.


Priorité des clés (cas multi-clés)

Quand un tableau contient plusieurs clés, la première règle qui correspond dans l'ordre du compilateur l'emporte. Les clés restantes sont reportées comme diagnostics (IGNORED_PROVIDER_OPTION) et font passer la couverture à PARTIAL.

Ordre de priorité à retenir :

  1. texteAvecCasse / texteSansCasse → type math, kind EXACT_LATEX
  2. fractionEgale + nombreDecimalSeulement (paire) → FRACTION_OR_DECIMAL / COMPLETE
  3. fractionEgale seul → IS_FRACTION / COMPLETE
  4. nombreDecimalSeulement → IS_DECIMAL / COMPLETE
  5. ecritureScientifique, fractionIrreductible, …

Exemple réel (selection1.json) : ["fractionEgale","nombreDecimalSeulement"] → paire reconnue → FRACTION_OR_DECIMAL, couverture COMPLETE.


Traçabilité (providerValidationSource)

Chaque question math importée depuis MathALÉA stocke dans son validationConfig :

{
  "providerValidationSource": {
    "provider": "mathalea",
    "providerVersion": null,
    "rawConfig": ["nombreDecimalSeulement"],
    "compiledCoverage": "COMPLETE",
    "compilerDiagnostics": []
  }
}
  • rawConfig : la valeur d'origine exacte (tableau ou objet) avant normalisation.
  • compilerDiagnostics : liste des clés ignorées avec leur chemin (IGNORED_PROVIDER_OPTION).
  • compiledCoverage : COMPLETE | PARTIAL | UNSUPPORTED.
Dernière mise à jour: 15/05/2026 15:42
Contributors: alexisflesch
Prev
Types de questions et flux de correction