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
MathALÉA émet deux formats distincts pour validationConfig :
| Format | Exemple | Contexte |
|---|
| 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é.
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)
└───────────────────────────────┘
| Clé MathALÉA | caseSensitive | Note |
|---|
texteAvecCasse | true | Comparaison de chaîne LaTeX normalisée, sensible à la casse |
texteSansCasse | false | Comparaison de chaîne LaTeX normalisée, insensible à la casse |
| Clé MathALÉA | Contrainte Kutsum | Couverture si seule | Note |
|---|
fractionEgale + nombreDecimalSeulement (combinaison) | FRACTION_OR_DECIMAL | COMPLETE | Paire détectée en premier — fraction OU décimal de même valeur accepté |
fractionEgale (seul) | IS_FRACTION | COMPLETE | Décimaux rejetés |
nombreDecimalSeulement | IS_DECIMAL | COMPLETE | |
ecritureScientifique | SCIENTIFIC_NOTATION | COMPLETE | |
fractionIrreductible | IS_IRREDUCIBLE | COMPLETE | |
| Clé MathALÉA | Contrainte Kutsum | Note |
|---|
additionSeulementEtNonResultat | IS_ADDITION | |
soustractionSeulementEtNonResultat | IS_SUBTRACTION | |
multiplicationSeulementEtNonResultat | IS_MULTIPLICATION | |
divisionSeulementEtNonResultat | IS_DIVISION | |
| Clé MathALÉA | Contrainte Kutsum | Couverture |
|---|
calculFormel | IS_FORMAL_EXPRESSION | COMPLETE |
egaliteExpression | IS_EQUALITY | COMPLETE |
developpementEgal | IS_EXPANDED | COMPLETE |
expressionsForcementReduites | IS_REDUCED_POLYNOMIAL | COMPLETE |
| Clé MathALÉA | Contrainte Kutsum | Ordre / délimiteurs |
|---|
ensembleDeNombres | NUMERIC_SET | Non ordonné, accolades {} requises |
suiteDeNombres | NUMERIC_SET | Non ordonné, sans accolades |
kUplet | ORDERED_TUPLE | Ordonné, accolades {} requises |
suiteRangeeDeNombres | ORDERED_TUPLE | Ordonné, sans accolades |
| Clé MathALÉA | Contrainte Kutsum | Note |
|---|
HMS | HMS | Durée heure/minute/seconde |
unite | WITH_UNIT | precisionUnite: 0 = correspondance exacte |
| Valeur | Contrainte Kutsum | Couverture |
|---|
fractionEgale | IS_FRACTION (+ IS_IRREDUCIBLE si option fractionIrreductible) | COMPLETE ou PARTIAL selon options inconnues |
| autres valeurs reconnues | voir source | variable |
| Clé MathALÉA | Contrainte Kutsum |
|---|
factorisation | FACTORED_EXPRESSION |
exclusifFactorisation | FACTORISED_EXPRESSION (strict) |
nbFacteursIdentiquesFactorisation | FACTORISED_EXPRESSION (count strict) |
unSeulFacteurLitteral | FACTORISED_EXPRESSION (no scalar factor) |
| Clé MathALÉA | Contrainte Kutsum | Note |
|---|
avecSigneMultiplier | EXPRESSION (plain) | × explicite mais accepté par CE |
sansTimes | EXPRESSION (plain) | × optionnel |
avecFractions | EXPRESSION (plain) | Fractions naturellement acceptées par CE |
expanded | EXPANDED | Toutes multiplications explicites |
puissance | POWER | Forme puissance requise |
sansExposantUn | POWER | Puissance + rejette exposant = 1 |
seulementCertainesPuissances | POWER | Puissance + base doit correspondre |
nombreAvecEspace | FR_THOUSANDS_SPACE | Espace fine française obligatoire |
fonction | FUNCTION_SAMPLING | Échantillonnage numérique sur domaine |
| Clé MathALÉA | Contrainte Kutsum | Note |
|---|
fractionDecimale | DECIMAL_FRACTION | Dénominateur = puissance de 10 |
fractionSansRacineCarree | RATIONALIZED_FRACTION | Pas de radical au dénominateur |
fractionIdentique | IDENTICAL_FRACTION | Fraction structurellement identique |
fractionReduite | SIMPLIFIED_FRACTION | GCD strictement < cible |
fractionSimplifiee | SIMPLIFIED_FRACTION | Simplifié par un entier |
| Clé MathALÉA | Contrainte Kutsum | Note |
|---|
expressionNumerique | ARITHMETIC_EXPRESSION | Mêmes nombres feuilles + opérateurs |
estDansIntervalle | IN_INTERVAL | Valeur dans l'intervalle cible |
intervalle | IS_INTERVAL | Égalité de notation d'intervalle |
nonReponseAcceptee | — | Réponse vide acceptée comme CORRECT |
| Valeur | Signification | Comportement à l'import |
|---|
COMPLETE | Toutes les clés de la config ont été compilées | Question importée ✅ |
PARTIAL | Le sémantique principal est compilé, mais certaines options sont ignorées | Question importée ✅ |
UNSUPPORTED | Aucune 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é.
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 :
texteAvecCasse / texteSansCasse → type math, kind EXACT_LATEXfractionEgale + nombreDecimalSeulement (paire) → FRACTION_OR_DECIMAL / COMPLETEfractionEgale seul → IS_FRACTION / COMPLETEnombreDecimalSeulement → IS_DECIMAL / COMPLETEecritureScientifique, fractionIrreductible, …
Exemple réel (selection1.json) : ["fractionEgale","nombreDecimalSeulement"] → paire reconnue → FRACTION_OR_DECIMAL, couverture COMPLETE.
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.