Skip to Content

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 (LMSInitialize vs Initialize), 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’un id_token LTI 1.3 et l’objet Score d’AGS. Tout est résumé : pour la valeur exacte ou la version courante, remonte à adlnet.gov (ADL) ou 1edtech.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 CMIRôleValeurs / format
cmi.core.lesson_statusStatut de la leçon (complétion et réussite mélangées)passed, completed, failed, incomplete, browsed, not attempted
cmi.core.score.rawScore brut obtenunombre
cmi.core.student_idIdentifiant de l’apprenant (lecture)chaîne
cmi.core.student_nameNom de l’apprenant (lecture)chaîne
cmi.core.lesson_locationSignet : où l’apprenant s’est arrêtéchaîne
cmi.core.session_timeDurée de cette sessionformat de durée SCORM
cmi.suspend_dataDonnées de reprise libreschaîne, 4096 caractères max

SCORM 2004 — modèle de données (extraits)

Élément CMIRôleValeurs / format
cmi.completion_statusComplétion (séparée de la réussite)completed, incomplete, not attempted, unknown
cmi.success_statusRéussite (séparée de la complétion)passed, failed, unknown
cmi.score.scaledScore normalisé (celui qui compte)de -1 à 1
cmi.score.raw / cmi.score.min / cmi.score.maxScore brut et bornes du barèmenombres
cmi.suspend_dataDonnées de reprise libreschaîne, 64000 caractères max
cmi.interactions.n.*Interactions détaillées (question par question)tableau indexé
cmi.objectives.n.*Objectifs et leur étattableau indexé
adl.nav.requestDemande 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_status mé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.openerfind the API »).

RôleSCORM 1.2 (objet API)SCORM 2004 (objet API_1484_11)
Ouvrir la sessionLMSInitialize("")Initialize("")
Fermer la sessionLMSFinish("")Terminate("")
Lire une valeurLMSGetValue(elt)GetValue(elt)
Écrire une valeurLMSSetValue(elt, val)SetValue(elt, val)
Forcer l’enregistrementLMSCommit("")Commit("")
Dernier code d’erreurLMSGetLastError()GetLastError()
Libellé d’une erreurLMSGetErrorString(code)GetErrorString(code)
Diagnostic d’une erreurLMSGetDiagnostic(code)GetDiagnostic(code)

💡 Réflexe — Toutes les méthodes qui n’ont « rien » à transmettre prennent une chaîne vide "", pas null ni rien du tout : LMSInitialize(""), Commit(""). Et on termine toujours par LMSFinish("") / 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 obligatoiresactor, 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" }
ChampObligatoire ?Contenu clé
actorOuimbox / mbox_sha1sum / account (homePage+name) / openid ; Agent ou Group
verbOuiid = IRI (identité réelle) + display (décoratif)
objectOuile plus souvent une Activity (id IRI + definition) ; ou Agent / StatementRef / SubStatement
resultNonscore (scaled -1..1, raw/min/max), success, completion, duration (ISO 8601), response
contextNonregistration, contextActivities (parent/grouping/category), extensions
timestampNonquand l’expérience a eu lieu (ISO 8601)
authorityNonqui atteste — souvent posé par le LRS
id, storedNonposé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 le display. Deux statements de même verb.id parlent 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ètreRôle
endpointURL du LRS où l’AU enverra ses statements
fetchURL à POSTer (une seule fois) pour obtenir le jeton d’auth
actorL’apprenant, en JSON xAPI (un Agent)
registrationUUID de la tentative (relie tous les statements de la session)
activityIdid 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 parRôle
launchedle LMSsignale le lancement de l’AU
initializedl’AUpremier statement de l’AU (obligatoire)
terminatedl’AUdernier statement de l’AU (obligatoire)
completedl’AUl’AU est terminé
passedl’AUl’AU est réussi (au regard du masteryScore)
failedl’AUl’AU est échoué
abandonedl’AU / LMSsession interrompue
waivedle LMSl’AU est dispensé
satisfiedle LMScondition 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 moveOnSatisfait quand…
Passedpassed reçu
Completedcompleted reçu
CompletedAndPassedcompleted et passed reçus
CompletedOrPassedcompleted ou passed reçu
NotApplicableaucune condition (AU informatif)

💡 Réflexe — Ordre non négociable au lancement : (1) lire les paramètres d’URL, (2) POSTer fetch → jeton, (3) lire LMS.LaunchData, (4) ensuite envoyer initialized. Et l’AU ne « satisfait » (completed/passed/failed) que en launchMode: "Normal" — jamais en Browse ni Review (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_typeLtiResourceLinkRequest (lancement normal) ou LtiDeepLinkingRequest (choix de contenu)
version1.3.0
deployment_ididentifie un déploiement (à recouper avec ta config)
rolestableau d’URIs LIS : …membership#Learner, …membership#Instructor, …membership#ContentDeveloper
contextle cours : id, label, title, type
resource_linkl’activité d’où part le lancement : id, title
launch_presentationcadre d’affichage : document_target, return_url, locale
customparamè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." }
ChampRôleValeurs
userIdl’élève = le sub du lancementchaîne
scoreGivennote obtenue (impose scoreMaximum)nombre
scoreMaximumbarèmenombre
activityProgressavancement de l’élèveInitialized, Started, InProgress, Submitted, Completed
gradingProgressavancement de la correctionNotReady, Failed, Pending, PendingManual, FullyGraded
timestampISO 8601 — ordonne les scoresdate
commentretour 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 AGSVerbeURLScope
Créer / lister une colonnePOST / GET{lineitems}.../scope/lineitem
Publier une notePOST{lineitem}/scores.../scope/score
Lire les notesGET{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) sur adlnet.gov (xAPI 2.0 = norme IEEE 9274.1.1). LTI 1.3, ses claims et AGS sur 1edtech.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.

Last updated on