Chapitre 5.1 — Complétion vs réussite
⏱️ TL;DR — Le plus grand apport de SCORM 2004, ce n’est pas le séquencement : c’est d’avoir coupé en deux une notion que 1.2 mélangeait. En 1.2, tout un module se résume à un seul champ,
cmi.core.lesson_status, qui doit choisir entrepassed,completed,failed,incomplete,browsedounot attempted— impossible d’exprimer proprement « il a fini le test mais l’a raté ». SCORM 2004 sépare deux questions indépendantes : « a-t-il tout parcouru ? » →cmi.completion_status(completed/incomplete/not attempted/unknown), et « a-t-il réussi ? » →cmi.success_status(passed/failed/unknown). Le score se normalise danscmi.score.scaled, de-1à1. Comprendre cette séparation, c’est la clé de tout le reste de la partie : le séquencement et le rollup raisonnent sur ces deux axes.
🎯 Objectifs
- Expliquer pourquoi un seul champ de statut ne suffit pas, avec le cas du test « terminé mais échoué ».
- Utiliser correctement
cmi.completion_statusetcmi.success_status— deux axes indépendants. - Comprendre
cmi.score.scaled(de-1à1) et son rôle face au seuil de réussite. - Traduire un statut 1.2 vers 2004 et repérer les pièges de migration.
Le péché originel de SCORM 1.2 : un seul champ pour deux idées
En SCORM 1.2, un SCO résume toute sa vie dans un élément : cmi.core.lesson_status. Ses valeurs possibles sont passed, completed, failed, incomplete, browsed, not attempted. Le problème saute aux yeux dès qu’on les aligne : passed et failed parlent de réussite, completed et incomplete parlent d’avancement, et le champ te force à n’en garder qu’une.
Prends le cas le plus banal d’une formation : un test final que l’apprenant passe en entier mais rate (7/20). Que met le SCO ?
- Si tu écris
failed, tu perds l’information « il a tout fait » — le LMS peut afficher le module comme « non terminé » et relancer l’apprenant à l’infini. - Si tu écris
completed, tu perds le « il a raté » — le module compte comme acquis alors qu’il ne l’est pas.
Il n’y a pas de bonne réponse avec un seul champ. En pratique, les SCO 1.2 bricolent : certains dérivent le statut d’un cmi.core.score.raw comparé au cmi.student_data.mastery_score, d’autres écrivent completed puis stockent le vrai verdict à la main dans cmi.suspend_data. Résultat : chaque LMS interprète différemment, et le « module réussi » de l’un devient le « module en cours » de l’autre.
⚠️ Piège — En 1.2, croire que
completedetpassedsont synonymes. Ils ne le sont pas, même dans le même champ :completeddit « arrivé au bout »,passeddit « au-dessus du seuil ». Un module de lecture sans note se termine encompleted(jamaispassed) ; un test raté mais rendu ne peut se dire proprement du tout. C’est exactement ce trou que 2004 vient combler.
SCORM 2004 : deux axes, deux champs
SCORM 2004 pose une question à la fois, dans deux éléments distincts et indépendants :
| Question | Élément 2004 | Valeurs |
|---|---|---|
| A-t-il parcouru tout le contenu ? | cmi.completion_status | completed, incomplete, not attempted, unknown |
| A-t-il réussi l’évaluation ? | cmi.success_status | passed, failed, unknown |
Le cas du test terminé mais raté devient exprimable sans compromis :
// SCORM 2004 — l'objet API s'appelle API_1484_11
var api = /* ...trouvé en remontant window.parent... */;
api.Initialize("");
// L'apprenant est allé au bout du test :
api.SetValue("cmi.completion_status", "completed");
// ...mais il a échoué :
api.SetValue("cmi.success_status", "failed");
api.SetValue("cmi.score.raw", "7");
api.SetValue("cmi.score.min", "0");
api.SetValue("cmi.score.max", "20");
api.SetValue("cmi.score.scaled", "0.35"); // 7/20 normalisé
api.Commit("");
api.Terminate("");Le LMS voit maintenant clairement : terminé et échoué. Il peut afficher « test rendu, note insuffisante », proposer une nouvelle tentative, et — surtout pour la suite de cette partie — le séquencement peut raisonner dessus : « débloque le chapitre suivant seulement si success_status vaut passed ». Cette précision est ce qui rend le SN de 2004 possible.
💡 Réflexe — Pose-toi deux questions, pas une, à chaque fin de SCO : « l’a-t-il parcouru ? » et « l’a-t-il réussi ? ». Un module sans évaluation (une vidéo, une fiche de lecture) répond complétion seulement : mets
completed, et laissesuccess_statusàunknown— ne mets surtout paspassedpar réflexe, sinon tu déclares réussi ce qui n’a jamais été évalué.
Le score scalé : cmi.score.scaled de -1 à 1
SCORM 2004 ajoute un score normalisé : cmi.score.scaled, un nombre entre -1 et 1. Contrairement au cmi.core.score.raw de 1.2 (souvent sur 100, mais en réalité sur n’importe quelle échelle), scaled est comparable d’un module à l’autre : 1 = parfait, 0 = zéro, et les valeurs négatives (jusqu’à -1) servent aux barèmes à pénalité (une mauvaise réponse retire des points).
Pourquoi c’est utile : le séquencement et le rollup travaillent sur une mesure normalisée (objectiveMeasure), et cette mesure vient typiquement de cmi.score.scaled. Le seuil de réussite d’une activité s’exprime lui aussi sur cette échelle 0–1 (par exemple « il faut au moins 0.8 »). Un score brut « 82 sur 120 » ne veut rien dire hors contexte ; « 0.68 » est directement exploitable par la machine.
// Barème /120, avec conversion propre en score scalé :
var raw = 82, min = 0, max = 120;
var scaled = (raw - min) / (max - min); // 0.6833...
api.SetValue("cmi.score.raw", String(raw));
api.SetValue("cmi.score.min", String(min));
api.SetValue("cmi.score.max", String(max));
api.SetValue("cmi.score.scaled", scaled.toFixed(4)); // "0.6833"⚠️ Piège — Envoyer un
cmi.score.scaledhors de[-1, 1](par exemple82parce qu’on a confondu avecraw). Le LMS rejette la valeur (erreur de type) et ton score n’est jamais enregistré — le SCO croit avoir rapporté sa note, le carnet reste vide.scaledest toujours une fraction normalisée, jamais le score brut.
📚 La spec — Complétion, réussite et score relèvent du livre RTE (Run-Time Environment) de SCORM 2004, le modèle de données CMI — l’objet d’API
API_1484_11. Le lien entre la mesure d’un objectif etcmi.score.scaled, ainsi que les seuils (cmi.scaled_passing_score,cmi.completion_thresholdlus depuis le manifeste), sont décrits par le RTE et le livre SN. Pour les règles exactes de dérivation automatique du statut par le LMS, réfère-toi au modèle de données courant sur adlnet.gov .
Table de correspondance 1.2 ↔ 2004
Quand tu migres un module ou que tu lis un LMS bilingue, garde cette traduction en tête :
SCORM 1.2 (cmi.core.lesson_status) | SCORM 2004 (completion_status + success_status) |
|---|---|
passed | completion_status = completed et success_status = passed |
failed | completion_status = completed et success_status = failed |
completed | completion_status = completed (success_status reste unknown) |
incomplete | completion_status = incomplete |
not attempted | completion_status = not attempted |
browsed | pas d’équivalent direct (mode consultation ; ~ incomplete/unknown) |
Et pour le reste du runtime :
| SCORM 1.2 | SCORM 2004 |
|---|---|
Objet d’API API, méthodes LMSInitialize / LMSFinish / LMSGetValue / LMSSetValue | Objet API_1484_11, méthodes Initialize / Terminate / GetValue / SetValue |
cmi.core.score.raw (échelle libre) | cmi.score.raw + cmi.score.scaled (-1 à 1) |
cmi.core.lesson_status (un champ fourre-tout) | cmi.completion_status + cmi.success_status (deux axes) |
cmi.suspend_data (4096 caractères) | cmi.suspend_data (64000 caractères) |
🧭 Sur FormaCampus — FormaCampus publie ses modules en SCORM depuis des années, la plupart en 1.2. En analysant les remontées, l’équipe découvre le classique : le module « Gestes de premiers secours » finit en
completedpour tout le monde, même quand le quiz est raté — parce que le SCO 1.2 écrivaitcompletedà la dernière diapo, faute de pouvoir dire « fini mais raté ». En repackageant en 2004, elle sépare enfin les deux axes :completion_status = completedà la fin du parcours,success_status = passed/failedselon le quiz. Le tableau de bord distingue désormais « ont tout vu » de « ont validé » — deux chiffres que les clients réclamaient depuis longtemps.
🔌 Côté intégration — Une école qui importe ton SCORM 2004 dans son Moodle attend que les deux colonnes soient exploitables : la « progression » (complétion) et la « réussite » (note/validation). Si ton SCO ne pose que
completion_statuset laissesuccess_statusàunknownsur un module évalué, le carnet de notes affiche un vide et l’enseignant te renvoie le ticket « la note ne remonte pas ». Renseigne explicitement l’axe qui correspond à la nature du module — et seulement celui-là pour un contenu non évalué.
✏️ Exercices
Exercice 1 — Le bon couple de valeurs. Pour chacun de ces modules, donne les valeurs de cmi.completion_status et cmi.success_status à poser en fin de session : (a) une vidéo de sensibilisation regardée jusqu’au bout ; (b) un test final passé en entier avec 9/20, seuil à 12/20 ; (c) une simulation abandonnée à mi-parcours.
✅ Solution
- (a) Vidéo vue :
completion_status = completed,success_status = unknown. Il n’y a rien à réussir : ne pose paspassed. Ce serait mentir sur une évaluation qui n’existe pas. - (b) Test raté mais rendu :
completion_status = completed(il est allé au bout) etsuccess_status = failed(sous le seuil). Score :cmi.score.scaled = "0.45"(9/20). C’est le cas emblématique qu’1.2 ne savait pas dire. - (c) Simulation abandonnée :
completion_status = incomplete,success_status = unknown. Ni terminé, ni évaluable.
Exercice 2 — Score scalé. Un SCO calcule un barème sur 250 points, avec pénalités possibles (le minimum atteignable est -50). L’apprenant obtient 150. Quel cmi.score.scaled envoyer ? Que se passe-t-il si le dev envoie "150" ?
✅ Solution
scaled = (raw - min) / (max - min) = (150 - (-50)) / (250 - (-50)) = 200 / 300 = 0.6667. On envoie cmi.score.scaled = "0.6667" (avec aussi raw = "150", min = "-50", max = "250").
Envoyer "150" : c’est hors de [-1, 1] → le LMS rejette la valeur (erreur de type de données). Le score scalé n’est jamais enregistré, alors que le SCO croit l’avoir transmis. Le rollup et le séquencement, qui s’appuient sur la mesure normalisée, se retrouvent sans donnée.
Exercice 3 — Migration 1.2 → 2004. Un vieux SCO 1.2 termine en cmi.core.lesson_status = "passed". Tu le repackages en 2004. Quelles valeurs 2004 poses-tu, et quel piège guette si tu te contentes de « traduire » passed par success_status = passed ?
✅ Solution
passed en 1.2 portait deux informations à la fois. En 2004 il faut poser les deux axes : cmi.completion_status = "completed" et cmi.success_status = "passed". Le piège : ne poser que success_status = passed en oubliant completion_status. Ce dernier resterait alors à unknown/not attempted, et le rollup (chapitre 5.4) pourrait laisser le cours « incomplet » alors que l’apprenant a réussi. Réussir n’implique pas automatiquement « avoir tout parcouru » aux yeux de la machine : les deux axes se posent séparément.
🧠 Quiz de révision
1. Quel est le grand apport de SCORM 2004 par rapport à la 1.2 en matière de statut ?
La séparation de la complétion et de la réussite en deux éléments indépendants — cmi.completion_status (completed/incomplete/not attempted/unknown) et cmi.success_status (passed/failed/unknown) — là où 1.2 entassait tout dans le seul cmi.core.lesson_status.
2. Comment exprimer « a terminé le test mais l’a raté » en SCORM 2004 ?
cmi.completion_status = "completed" et cmi.success_status = "failed". En SCORM 1.2, c’était impossible à dire proprement avec l’unique champ cmi.core.lesson_status.
3. Quelle est la plage de valeurs de cmi.score.scaled et à quoi sert-elle ?
cmi.score.scaled et à quoi sert-elle ?De -1 à 1 : un score normalisé (les négatifs pour les barèmes à pénalité). Il est comparable d’un module à l’autre et sert de mesure au séquencement et au rollup ; le seuil de réussite s’exprime sur la même échelle 0–1.
4. Pour une simple vidéo sans évaluation, que met-on dans cmi.success_status ?
cmi.success_status ?unknown — on ne l’évalue pas. On pose seulement cmi.completion_status = "completed". Poser passed déclarerait réussie une évaluation qui n’existe pas.
5. À quoi correspond cmi.core.lesson_status = "passed" de 1.2 une fois migré en 2004 ?
cmi.core.lesson_status = "passed" de 1.2 une fois migré en 2004 ?À deux valeurs : cmi.completion_status = "completed" et cmi.success_status = "passed". passed portait les deux informations à la fois ; il faut les répartir sur les deux axes, sous peine de laisser la complétion à unknown.
Chapitre suivant : L’arbre d’activités & les objectifs — comment l’organization cesse d’être un simple menu pour devenir un arbre séquencé.