Chapitre 13.1 — Cheatsheets
⏱️ TL;DR — Le condensé de tout le cours, en tableaux et blocs de code à balayer d’un regard : le modèle de données SCORM 1.2 et 2004 avec leurs méthodes d’API (
LMSInitializevsInitialize), le squelette d’un statement xAPI (actor/verb/object/result/context), les cinq paramètres de lancement cmi5 et ses verbes imposés, enfin les claims d’unid_tokenLTI 1.3 et l’objet Score d’AGS. Tout est résumé : pour la valeur exacte ou la version courante, remonte àadlnet.gov(ADL) ou1edtech.org(1EdTech).
🎯 Objectifs
- Retrouver en un coup d’œil le bon champ, la bonne méthode, le bon verbe.
- Comparer côte à côte SCORM 1.2 et 2004 (données + API).
- Réciter le squelette d’un statement et les claims d’un lancement LTI.
- Garder sous la main les valeurs autorisées (statuts,
moveOn,activityProgress…).
(a) SCORM — modèle de données & API
SCORM 1.2 — modèle de données (extraits)
| Élément CMI | Rôle | Valeurs / format |
|---|---|---|
cmi.core.lesson_status | Statut de la leçon (complétion et réussite mélangées) | passed, completed, failed, incomplete, browsed, not attempted |
cmi.core.score.raw | Score brut obtenu | nombre |
cmi.core.student_id | Identifiant de l’apprenant (lecture) | chaîne |
cmi.core.student_name | Nom de l’apprenant (lecture) | chaîne |
cmi.core.lesson_location | Signet : où l’apprenant s’est arrêté | chaîne |
cmi.core.session_time | Durée de cette session | format de durée SCORM |
cmi.suspend_data | Données de reprise libres | chaîne, 4096 caractères max |
SCORM 2004 — modèle de données (extraits)
| Élément CMI | Rôle | Valeurs / format |
|---|---|---|
cmi.completion_status | Complétion (séparée de la réussite) | completed, incomplete, not attempted, unknown |
cmi.success_status | Réussite (séparée de la complétion) | passed, failed, unknown |
cmi.score.scaled | Score normalisé (celui qui compte) | de -1 à 1 |
cmi.score.raw / cmi.score.min / cmi.score.max | Score brut et bornes du barème | nombres |
cmi.suspend_data | Données de reprise libres | chaîne, 64000 caractères max |
cmi.interactions.n.* | Interactions détaillées (question par question) | tableau indexé |
cmi.objectives.n.* | Objectifs et leur état | tableau indexé |
adl.nav.request | Demande de navigation (séquencement 2004) | requête de navigation |
⚠️ Piège — La différence structurelle entre 1.2 et 2004 : en 1.2,
cmi.core.lesson_statusmélange « fini » et « réussi » ; en 2004, complétion (cmi.completion_status) et réussite (cmi.success_status) sont deux champs distincts. Porter un contenu 1.2 vers 2004 sans dédoubler ce statut est le bug de migration classique (voir Partie 5).
Méthodes d’API — 1.2 vs 2004
L’objet JavaScript exposé par le LMS s’appelle API en 1.2 et API_1484_11 en 2004. On le trouve en remontant window.parent puis window.opener (« find the API »).
| Rôle | SCORM 1.2 (objet API) | SCORM 2004 (objet API_1484_11) |
|---|---|---|
| Ouvrir la session | LMSInitialize("") | Initialize("") |
| Fermer la session | LMSFinish("") | Terminate("") |
| Lire une valeur | LMSGetValue(elt) | GetValue(elt) |
| Écrire une valeur | LMSSetValue(elt, val) | SetValue(elt, val) |
| Forcer l’enregistrement | LMSCommit("") | Commit("") |
| Dernier code d’erreur | LMSGetLastError() | GetLastError() |
| Libellé d’une erreur | LMSGetErrorString(code) | GetErrorString(code) |
| Diagnostic d’une erreur | LMSGetDiagnostic(code) | GetDiagnostic(code) |
💡 Réflexe — Toutes les méthodes qui n’ont « rien » à transmettre prennent une chaîne vide
"", pasnullni rien du tout :LMSInitialize(""),Commit(""). Et on termine toujours parLMSFinish("")/Terminate(""): c’est l’appel qui déclenche l’enregistrement final côté LMS. L’oublier = un SCO qui « marche » mais ne remonte rien (Partie 4).
(b) xAPI — squelette d’un statement
Trois champs obligatoires — actor, verb, object — le reste est optionnel ou posé par le LRS.
{
"actor": {
"objectType": "Agent",
"mbox": "mailto:apprenant@exemple.fr"
},
"verb": {
"id": "http://adlnet.gov/expapi/verbs/completed",
"display": { "fr-FR": "a terminé" }
},
"object": {
"objectType": "Activity",
"id": "https://exemple.fr/xapi/activities/module-1",
"definition": {
"name": { "fr-FR": "Module 1" },
"type": "http://adlnet.gov/expapi/activities/course"
}
},
"result": {
"score": { "scaled": 0.9, "raw": 45, "min": 0, "max": 50 },
"success": true,
"completion": true,
"duration": "PT30M"
},
"context": {
"registration": "UUID-de-la-tentative",
"contextActivities": {
"parent": [{ "id": "https://exemple.fr/xapi/activities/parcours" }]
}
},
"timestamp": "2026-03-14T10:45:00+01:00"
}| Champ | Obligatoire ? | Contenu clé |
|---|---|---|
actor | Oui | mbox / mbox_sha1sum / account (homePage+name) / openid ; Agent ou Group |
verb | Oui | id = IRI (identité réelle) + display (décoratif) |
object | Oui | le plus souvent une Activity (id IRI + definition) ; ou Agent / StatementRef / SubStatement |
result | Non | score (scaled -1..1, raw/min/max), success, completion, duration (ISO 8601), response |
context | Non | registration, contextActivities (parent/grouping/category), extensions |
timestamp | Non | quand l’expérience a eu lieu (ISO 8601) |
authority | Non | qui atteste — souvent posé par le LRS |
id, stored | Non | posés par le LRS (stored = quand il l’a enregistré) |
Verbes ADL fréquents (à réutiliser, jamais inventer) : http://adlnet.gov/expapi/verbs/ suivi de completed, experienced, attempted, passed, failed, answered.
API du LRS (REST) : statements (PUT/POST/GET), activities/state, activities/profile, agents/profile, about. En-tête obligatoire : X-Experience-API-Version. Auth : Basic ou OAuth.
⚠️ Piège — C’est l’
id(l’IRI) du verbe qui l’identifie, pas ledisplay. Deux statements de mêmeverb.idparlent du même verbe, que l’un affiche « a terminé » et l’autre « completed ». Ne bricole jamais l’identité d’un verbe via son libellé.
(c) cmi5 — lancement & verbes
Les cinq paramètres d’URL de lancement
Le LMS ouvre l’URL de l’AU en y greffant ces paramètres (URL-encodés) :
| Paramètre | Rôle |
|---|---|
endpoint | URL du LRS où l’AU enverra ses statements |
fetch | URL à POSTer (une seule fois) pour obtenir le jeton d’auth |
actor | L’apprenant, en JSON xAPI (un Agent) |
registration | UUID de la tentative (relie tous les statements de la session) |
activityId | id de cet AU (celui déclaré dans cmi5.xml) |
L’AU POSTe fetch → reçoit { "auth-token": "…" }, puis lit ses données de lancement dans le state LMS.LaunchData (State API) : launchMode (Normal / Browse / Review), masteryScore, moveOn, returnURL, contextTemplate.
Les verbes cmi5
| Verbe | Émis par | Rôle |
|---|---|---|
launched | le LMS | signale le lancement de l’AU |
initialized | l’AU | premier statement de l’AU (obligatoire) |
terminated | l’AU | dernier statement de l’AU (obligatoire) |
completed | l’AU | l’AU est terminé |
passed | l’AU | l’AU est réussi (au regard du masteryScore) |
failed | l’AU | l’AU est échoué |
abandoned | l’AU / LMS | session interrompue |
waived | le LMS | l’AU est dispensé |
satisfied | le LMS | condition de satisfaction atteinte |
Les statements ci-dessus sont « cmi5 defined » ; les autres statements libres émis par l’AU sont « cmi5 allowed ».
Les valeurs de moveOn
Condition qui décide quand l’apprenant a « satisfait » l’AU :
Valeur moveOn | Satisfait quand… |
|---|---|
Passed | passed reçu |
Completed | completed reçu |
CompletedAndPassed | completed et passed reçus |
CompletedOrPassed | completed ou passed reçu |
NotApplicable | aucune condition (AU informatif) |
💡 Réflexe — Ordre non négociable au lancement : (1) lire les paramètres d’URL, (2) POSTer
fetch→ jeton, (3) lireLMS.LaunchData, (4) ensuite envoyerinitialized. Et l’AU ne « satisfait » (completed/passed/failed) que enlaunchMode: "Normal"— jamais enBrowseniReview(Partie 8).
(d) LTI 1.3 — claims & objet Score (AGS)
Claims d’un id_token de lancement
Claims LTI namespacés sous https://purl.imsglobal.org/spec/lti/claim/ (ici avec le suffixe seul) :
| Claim (suffixe) | Contenu |
|---|---|
message_type | LtiResourceLinkRequest (lancement normal) ou LtiDeepLinkingRequest (choix de contenu) |
version | 1.3.0 |
deployment_id | identifie un déploiement (à recouper avec ta config) |
roles | tableau d’URIs LIS : …membership#Learner, …membership#Instructor, …membership#ContentDeveloper… |
context | le cours : id, label, title, type |
resource_link | l’activité d’où part le lancement : id, title |
launch_presentation | cadre d’affichage : document_target, return_url, locale |
custom | paramètres personnalisés définis à la configuration |
Claims OIDC standard (hors namespace LTI) : iss (la plateforme), aud (= ton client_id), sub (identité stable de l’utilisateur), exp, iat, nonce, et si partagés name, email.
⚠️ Piège — La clé d’un apprenant, c’est
sub+iss, pas l’e-mail (facultatif, changeant, parfois non partagé). Et on lit ces claims après avoir validé la signature du JWT via le JWKS de la plateforme.
Objet Score d’AGS — POST {lineitem}/scores
Type de média : application/vnd.ims.lis.v1.score+json. Scope requis : https://purl.imsglobal.org/spec/lti-ags/scope/score.
{
"userId": "u-2342",
"scoreGiven": 17,
"scoreMaximum": 20,
"activityProgress": "Completed",
"gradingProgress": "FullyGraded",
"timestamp": "2026-05-12T14:32:05.000Z",
"comment": "Bravo. Revois la question 7."
}| Champ | Rôle | Valeurs |
|---|---|---|
userId | l’élève = le sub du lancement | chaîne |
scoreGiven | note obtenue (impose scoreMaximum) | nombre |
scoreMaximum | barème | nombre |
activityProgress | avancement de l’élève | Initialized, Started, InProgress, Submitted, Completed |
gradingProgress | avancement de la correction | NotReady, Failed, Pending, PendingManual, FullyGraded |
timestamp | ISO 8601 — ordonne les scores | date |
comment | retour textuel (optionnel) | chaîne |
Endpoint AGS (claim https://purl.imsglobal.org/spec/lti-ags/claim/endpoint) : lineitems (conteneur, GET/POST), lineitem (une colonne), et scope. Trois scopes : .../lti-ags/scope/lineitem (gérer les colonnes), .../lti-ags/scope/score (publier), .../lti-ags/scope/result.readonly (lire les results).
| Action AGS | Verbe | URL | Scope |
|---|---|---|---|
| Créer / lister une colonne | POST / GET | {lineitems} | .../scope/lineitem |
| Publier une note | POST | {lineitem}/scores | .../scope/score |
| Lire les notes | GET | {lineitem}/results | .../scope/result.readonly |
🧭 Sur FormaCampus — Ces quatre encadrés sont exactement les mémos que le studio de FormaCampus garde ouverts pendant une intégration : un pour débuguer un SCO (colonne API 1.2/2004), un pour vérifier un statement, un pour un lancement cmi5, un pour un renvoi de note. Copie, adapte, livre.
📚 La spec — SCORM (RTE, modèle CMI, API), xAPI (structure du statement, LRS) et cmi5 (lancement, verbes,
moveOn) suradlnet.gov(xAPI 2.0 = norme IEEE 9274.1.1). LTI 1.3, ses claims et AGS sur1edtech.org. Les cheatsheets résument — la source tranche.
Chapitre suivant : 13.2 — Modèles prêts à l’emploi — les squelettes complets à copier-coller et adapter.