Chapitre 8.4 — Les verbes cmi5
⏱️ TL;DR — cmi5 impose un cycle de verbes. Le LMS ouvre le bal avec
launched. Puis l’AU prend la main : il envoieinitializeden premier, fait son travail, émetcompletedet/oupassed/failedselon le cas, et clôt obligatoirement parterminateden dernier. Trois verbes restent la prérogative du LMS :abandoned(session coupée sansterminated),waived(AU dispensé) etsatisfied(condition demoveOnatteinte). Ces statements-là, structurés et marqués de la catégorie de contexte cmi5, sont dits « cmi5 defined » ; tout autre statement libre que l’AU envoie est « cmi5 allowed ». Ce chapitre te fait maîtriser l’ordre, les rôles, et la structure d’un statement conforme.
🎯 Objectifs
- Réciter le cycle de verbes cmi5 et savoir qui émet quoi (AU vs LMS).
- Respecter l’ordre imposé :
initializedpremier,terminateddernier. - Distinguer un statement « cmi5 defined » d’un « cmi5 allowed ».
- Reconnaître la catégorie de contexte cmi5 dans un statement et savoir pourquoi elle est là.
- Écrire un statement
passedconforme.
Le cycle : qui émet quoi
Neuf verbes structurent une session cmi5. La première chose à intégrer : certains sont émis par l’AU, d’autres par le LMS. Confondre les deux mène à des bugs (un AU qui tente d’émettre satisfied, par exemple, ce qui n’est pas son rôle).
| Verbe | Émis par | Quand |
|---|---|---|
launched | LMS | Le LMS ouvre l’AU (juste avant de passer la main) |
initialized | AU | L’AU démarre — toujours le premier statement de l’AU |
completed | AU | L’apprenant a terminé le contenu |
passed | AU | L’apprenant a réussi (score au moins égal au masteryScore) |
failed | AU | L’apprenant a échoué (score sous le masteryScore) |
terminated | AU | L’AU se ferme — toujours le dernier statement de l’AU |
abandoned | LMS | Session coupée sans terminated (fermeture brutale) |
waived | LMS | L’AU est dispensé (prérequis acquis, équivalence) |
satisfied | LMS | La condition de moveOn est atteinte (AU, block ou cours) |
Retiens la ligne de partage : l’AU émet initialized, completed, passed, failed, terminated. Le LMS émet launched, abandoned, waived, satisfied. L’AU ne décide pas de la satisfaction — il rapporte des faits (« terminé », « réussi ») ; c’est le LMS qui statue (chapitre 8.5).
L’ordre est imposé
cmi5 ne se contente pas de fournir un vocabulaire : il en contraint la séquence. Les règles à connaître :
initializedest le premier statement que l’AU envoie. Rien avant (pas decompleted« en avance »).terminatedest le dernier. Après lui, l’AU n’envoie plus rien.completed,passed,failedvivent entre les deux.- Un AU ne mélange pas
passedetfailedde façon incohérente : une foispassedenvoyé pour cette tentative, il n’envoie pasfailedderrière. - En mode
Browse/Review(chapitre 8.3), l’AU n’émet pas decompleted/passed/failedcomptés.
⚠️ Piège — Oublier
terminated. Un AU qui envoiepassedpuis dont l’apprenant ferme l’onglet sansterminatedlaisse la session « ouverte ». Le LMS finira par émettreabandonedà sa place — ce qui pollue les données et peut fausser le temps passé. Toujours câblerterminatedsur la fermeture (bouton « Quitter »,beforeunload, fin de contenu). C’est l’erreur d’intégration cmi5 la plus commune.
💡 Réflexe — Pense «
initialized…terminated» comme les accolades d’un bloc : tout ce que l’AU rapporte vit à l’intérieur. Ouvre parinitializeddès queLMS.LaunchDataest lu ; ferme parterminatedau tout dernier moment. Entre les deux, tu émets tescompleted/passed/failedet tes statements libres.
« cmi5 defined » vs « cmi5 allowed »
Deux catégories de statements coexistent dans une session cmi5. Les confondre, c’est rater la conformité.
- cmi5 defined — les statements structurés que la spec définit : les neuf verbes ci-dessus, avec la structure imposée (
result,context,registration,sessionid…) et, surtout, la catégorie de contexte cmi5. Ce sont eux que le LMS interprète pour le suivi officiel et la satisfaction. - cmi5 allowed — tout autre statement xAPI que l’AU a le droit d’émettre librement pour tracer finement : « a lancé la vidéo », « a répondu à la question 3 », « a mis en pause ». Ils utilisent le vocabulaire xAPI ordinaire (Partie 6), n’ont pas la catégorie cmi5, mais restent rattachés à la tentative (même
registration, mêmesessionid). Ils enrichissent l’analytics sans perturber la complétion.
La catégorie de contexte cmi5 est le marqueur qui distingue les deux. Un statement cmi5 defined porte, dans context.contextActivities.category, l’activité https://w3id.org/xapi/cmi5/context/categories/cmi5. C’est ce drapeau qui dit au LMS « ce statement est officiel, prends-le en compte ».
💡 Réflexe — La règle mentale : defined = ce que le LMS doit interpréter (les neuf verbes, catégorie cmi5) ; allowed = ce que tu traces en plus, pour toi (vocabulaire libre, pas de catégorie cmi5). Un module riche envoie peu de statements defined (le strict cycle) et beaucoup de statements allowed (le détail de l’expérience).
Anatomie d’un passed conforme
Voici un statement passed cmi5 defined complet, envoyé par l’AU « quiz » de FormaCampus. Repère la catégorie de contexte cmi5, le registration, le sessionid, le masteryScore rappelé, et le score qui justifie le passed.
{
"actor": {
"objectType": "Agent",
"account": { "homePage": "https://moodle.ecole.fr", "name": "u-2342" }
},
"verb": {
"id": "http://adlnet.gov/expapi/verbs/passed",
"display": { "en-US": "passed", "fr-FR": "a réussi" }
},
"object": {
"id": "https://formacampus.fr/au/quiz",
"objectType": "Activity",
"definition": { "name": { "fr-FR": "Quiz évalué" } }
},
"result": {
"score": { "scaled": 0.9 },
"success": true,
"completion": true,
"duration": "PT8M12S"
},
"context": {
"registration": "76c3f2b1-0f1a-4e2d-9a11-2b6c8e1d4f0a",
"contextActivities": {
"category": [
{ "id": "https://w3id.org/xapi/cmi5/context/categories/cmi5" },
{ "id": "https://w3id.org/xapi/cmi5/context/categories/moveon" }
],
"grouping": [
{ "id": "https://formacampus.fr/courses/securite-numerique" }
]
},
"extensions": {
"https://w3id.org/xapi/cmi5/context/extensions/sessionid": "s-4f8a12",
"https://w3id.org/xapi/cmi5/context/extensions/masteryscore": 0.8
}
},
"timestamp": "2026-07-15T10:22:41.512Z"
}Lecture guidée, champ par champ :
actor: exactement l’apprenant reçu dans le paramètreactorau lancement — on ne le réinvente pas.verb:passed, via l’IRI du vocabulaire ADLhttp://adlnet.gov/expapi/verbs/passed.object: l’AU lui-même, identifié par l’activityIdreçu au lancement.result.score.scaledvaut0.9— au-dessus dumasteryScore0.8, ce qui justifie lepassedet metsuccessàtrue. Ledurationest au format ISO 8601 (PT8M12S= 8 min 12 s).context.contextActivities.categorycontient la catégorie cmi5 (le drapeau « statement defined ») et la catégoriemoveon(ce statement compte pour la satisfaction).context.extensionsrappelle lesessionid(hérité ducontextTemplatedeLMS.LaunchData) et lemasteryScoreutilisé — traçabilité de la décision.
⚠️ Piège — Émettre
passedavec unresult.score.scaledinférieur aumasteryScore, ou sans score du tout, alors qu’unmasteryScorea été fourni au lancement. C’est non conforme : quand le LMS transmet unmasteryScore, unpassed/faileddoit porter unresult.score.scaledcohérent avec ce seuil. Unpassedsans preuve chiffrée sera rejeté par une suite de conformité (CATAPULT, chapitre 8.5).
🔌 Côté intégration — Ce qui fait « remonter » proprement dans le LMS d’un client, ce sont les statements defined correctement formés : bon verbe, catégorie cmi5,
registrationetsessionidcohérents. Un module qui trace beaucoup mais dont les statements defined sont malformés (catégorie manquante,terminatedabsent) passera les démos et échouera la certification. Le premier livrable vérifiable d’un contenu cmi5, c’est la conformité du cycle, pas la richesse de l’analytics.
🧭 Sur FormaCampus — L’AU « quiz » de FormaCampus émet, dans l’ordre :
initializedà l’ouverture, puis une salve de statements allowed (« a affiché la question 1 », « a répondu à la question 1 »… — le détail pour son tableau de bord), puis, une fois les 10 questions traitées, uncompletedet unpasseddefined (score0.9≥ seuil0.8), et enfinterminatedquand l’élève clique sur « Retour au cours » (returnURL). Côté Moodle, seuls les statements defined comptent : Moodle voitpassed, applique lemoveOnducmi5.xml, et débloque la suite. Le détail allowed, lui, alimente l’analytics interne de FormaCampus — invisible pour Moodle, précieux pour la pédagogie.
📚 La spec — Le vocabulaire des verbes, l’ordre imposé (
initializedpremier,terminateddernier), la distinction defined / allowed et les catégories de contexte (.../categories/cmi5,.../categories/moveon) sont définis dans la cmi5 Specification d’ADL, section « xAPI State, Agent Profile, and Statement Data ». Les IRI exactes des verbes et catégories, et les règles précises par verbe, sont à vérifier suradlnet.gov.
✏️ Exercices
Exercice 1 — Qui émet, dans quel ordre ? Remets ces événements d’une session normale dans l’ordre et indique l’émetteur : (A) terminated, (B) launched, (C) passed, (D) initialized, (E) completed.
✅ Solution
Ordre : B → D → E → C → A (ou B → D → C → E → A ; completed et passed peuvent s’inverser, mais tous deux entre initialized et terminated). Émetteurs : B launched = LMS ; D initialized = AU (premier) ; E completed = AU ; C passed = AU ; A terminated = AU (dernier). Le seul statement du LMS ici est launched ; tout le reste vient de l’AU. initialized ouvre, terminated ferme : c’est non négociable.
Exercice 2 — Defined ou allowed ? Classe ces statements d’un AU : (a) passed avec la catégorie .../categories/cmi5 ; (b) « a mis la vidéo en pause » avec un verbe maison ; (c) initialized ; (d) « a répondu à la question 4 » avec le verbe answered. Lesquels le LMS interprète-t-il pour la complétion ?
✅ Solution
Defined : (a) passed et (c) initialized — ce sont des verbes cmi5 avec la structure et la catégorie cmi5 attendues. Allowed : (b) « a mis en pause » et (d) « a répondu à la question 4 » — statements xAPI libres, sans catégorie cmi5, pour l’analytics fine. Le LMS n’interprète que les defined (a, c) pour la complétion et la satisfaction ; (b) et (d) enrichissent les données mais ne pèsent pas sur le statut de l’AU.
🧠 Quiz de révision
1. Quels verbes l’AU émet-il, et lesquels sont réservés au LMS ?
L’AU émet initialized, completed, passed, failed, terminated. Le LMS émet launched, abandoned, waived, satisfied. L’AU rapporte des faits ; le LMS statue (satisfaction) et gère les cas de coupure (abandoned) ou de dispense (waived).
2. Quelle est la règle d’ordre absolue du cycle ?
initialized en premier, terminated en dernier. Tout ce que l’AU rapporte (completed, passed, failed, statements allowed) vit entre les deux. Rien avant initialized, rien après terminated.
3. Qu’est-ce qu’un statement « cmi5 defined » ?
Un statement structuré défini par la spec : un des neuf verbes cmi5, avec la structure imposée (registration, sessionid…) et la catégorie de contexte cmi5 (.../categories/cmi5). C’est ce que le LMS interprète pour le suivi officiel et la satisfaction.
4. Qu’est-ce qu’un statement « cmi5 allowed », et à quoi sert-il ?
Tout autre statement xAPI que l’AU émet librement pour tracer finement (vocabulaire ordinaire, pas de catégorie cmi5), tout en restant rattaché à la tentative (même registration/sessionid). Il enrichit l’analytics sans peser sur la complétion.
5. Pourquoi un passed doit-il porter un score cohérent avec le masteryScore ?
passed doit-il porter un score cohérent avec le masteryScore ?Parce que si le LMS a fourni un masteryScore au lancement, un passed/failed doit inclure un result.score.scaled cohérent avec ce seuil (au moins égal au seuil pour passed, en dessous pour failed). Un passed sans preuve chiffrée est non conforme et sera rejeté par une suite de conformité comme CATAPULT.
Chapitre suivant : masteryScore, moveOn & satisfaction — comment le LMS transforme tes statements en décision « validé / pas validé ».