Generated by bun run conformance:render — do not edit by hand.
Point-by-point certification submission: every conformance requirement against the literal published schema (conform-ed ADR-0013), with emergent’s implementation status, the spec citation, the modelled schema anchors, and the verifying evidence (emergent ADR-0028).
- Denominator: pinned Coverage Map
docs/conformance/maps/lti-v1.3.json (generated 2026-06-25), sha256 87e91f61bdca01da1f583d10da7bb72e5d77ef25836ca24f1352144997b8c06a.
- Requirements: 54/56 done across 13 profile(s) — ags, core, deep-linking, nrps, platform-ags, platform-core, platform-deep-linking, platform-dynamic-registration, platform-nrps, platform-proctoring, platform-security, proctoring, security.
- Information model: 189/270 literal items modelled; 13 transport-axis items (operations / parameters / security).
- Evidence: each claim cites its
[covers:] evidence key; run bun run conformance:prove to resolve these to the proving test names for a submission copy.
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| LTI-AGS-1 |
MUST |
✅ done |
A tool reads the AGS endpoint claim — the lineitems URL and the scopes it was granted (lineitem, lineitem.readonly, result.readonly, score) — and restricts itself to those scopes. (The claim is an LTI launch claim, not part of the AGS OpenAPI, so it has no schema anchor here.) |
lti:1.3:conf:ags/LTI-AGS-1 |
LTI AGS 2.0 §3.1 (the AGS claim) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| LTI-AGS-2 |
MUST |
✅ done |
A line item MUST carry a label (the gradebook-column title) and a scoreMaximum. |
lti:1.3:conf:ags/LTI-AGS-2 |
LTI AGS 2.0 §3.2.7 (label) / §3.2.8 (scoreMaximum) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| LTI-AGS-3 |
MUST |
✅ done |
A line item is identified by an id URL present on all responses, and MAY bind to a resource link (resourceLinkId) and a tool resource (resourceId). |
lti:1.3:conf:ags/LTI-AGS-3 |
LTI AGS 2.0 §3.2.3 (line item id) / §3.2.9 / §3.2.10 — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| LTI-AGS-4 |
MUST |
✅ done |
The line item container (GET /lineitems) returns a paged array of line items, filterable by resource_link_id, resource_id and tag and paged by limit/page. |
lti:1.3:conf:ags/LTI-AGS-4 |
LTI AGS 2.0 §3.2 / §3.2.4 (container request filters) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| LTI-AGS-5 |
MUST |
✅ done |
A tool publishes a score by POSTing to the scores endpoint; the Score MUST carry userId, activityProgress, gradingProgress and timestamp. |
lti:1.3:conf:ags/LTI-AGS-5 |
LTI AGS 2.0 §3.4 (score publish service) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| LTI-AGS-6 |
MUST |
✅ done |
When scoreGiven is present it MUST be accompanied by scoreMaximum (the scale it is given in). |
lti:1.3:conf:ags/LTI-AGS-6 |
LTI AGS 2.0 §3.4.4 (scoreGiven and scoreMaximum) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| LTI-AGS-7 |
MUST |
✅ done |
The result container (GET …/results, filterable by user_id) returns results; a Result references its line item (scoreOf), the user (userId) and the achieved and maximum scores (resultScore / resultMaximum). |
lti:1.3:conf:ags/LTI-AGS-7 |
LTI AGS 2.0 §3.3 (result service) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| LTI-AGS-8 |
MUST |
✅ done |
A tool manages line items over the full REST surface: create (POST /lineitems) and read/update/delete the single line item (GET/PUT/DELETE …/lineitems/{lineItemId}). |
lti:1.3:conf:ags/LTI-AGS-8 |
LTI AGS 2.0 §3.2.3 / §3.2.5 / §3.2.6 (line item endpoints) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
Modelled schema anchors
- LTI-AGS-1 →
- LTI-AGS-2 →
lti:1.3:def:LineItem/label, lti:1.3:def:LineItem/scoreMaximum
- LTI-AGS-3 →
lti:1.3:def:LineItem/id, lti:1.3:def:LineItem/resourceLinkId, lti:1.3:def:LineItem/resourceId
- LTI-AGS-4 →
lti:1.3:def:LineItemContainer, lti:1.3:path:ags/GET /{contextId}/lineitems, lti:1.3:param:resource_link_id, lti:1.3:param:resource_id, lti:1.3:param:tag, lti:1.3:param:limit, lti:1.3:param:page
- LTI-AGS-5 →
lti:1.3:def:Score/userId, lti:1.3:def:Score/activityProgress, lti:1.3:def:Score/gradingProgress, lti:1.3:def:Score/timestamp, lti:1.3:path:ags/POST /{contextId}/lineitems/{lineItemId}/scores
- LTI-AGS-6 →
lti:1.3:def:Score/scoreGiven, lti:1.3:def:Score/scoreMaximum
- LTI-AGS-7 →
lti:1.3:def:ResultContainer, lti:1.3:def:Result/scoreOf, lti:1.3:def:Result/userId, lti:1.3:def:Result/resultScore, lti:1.3:def:Result/resultMaximum, lti:1.3:path:ags/GET /{contextId}/lineitems/{lineItemId}/results, lti:1.3:param:user_id
- LTI-AGS-8 →
lti:1.3:path:ags/POST /{contextId}/lineitems, lti:1.3:path:ags/GET /{contextId}/lineitems/{lineItemId}, lti:1.3:path:ags/PUT /{contextId}/lineitems/{lineItemId}, lti:1.3:path:ags/DELETE /{contextId}/lineitems/{lineItemId}
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| LTI-CORE-1 |
MUST |
✅ done |
A tool MUST implement the OpenID Connect third-party-initiated login: on the login initiation it returns an authentication request to the platform’s authorization endpoint. Every launch follows OIDC — there are no exceptions. |
lti:1.3:conf:core/LTI-CORE-1 |
LTI Core 1.3 §5.1.1 (OIDC login) / Advantage Cert §4.2.2 — https://www.imsglobal.org/spec/lti/v1p3/cert/ |
| LTI-CORE-2 |
MUST |
✅ done |
A tool MUST validate the id_token: a JWT signed (RS256) with the platform key resolved via its JWKS, with valid iss, aud, exp and iat, and the nonce the tool issued — rejecting any that fail. |
lti:1.3:conf:core/LTI-CORE-2 |
1EdTech Security Framework 1.1 §5.1.3 / LTI Core 1.3 §5.1.3 — https://www.imsglobal.org/spec/security/v1p1 |
| LTI-CORE-3 |
MUST |
✅ done |
A resource-link launch MUST carry the required claims: message_type=LtiResourceLinkRequest, version=1.3.0, the deployment_id, the target_link_uri, and the resource_link claim with an id. |
lti:1.3:conf:core/LTI-CORE-3 |
LTI Core 1.3 §4.2 (required message claims) / §5 — https://www.imsglobal.org/spec/lti/v1p3/ |
| LTI-CORE-4 |
MUST |
✅ done |
The launch MUST carry the roles claim (an array of role URIs) binding the user to the context; the tool authorizes from it. |
lti:1.3:conf:core/LTI-CORE-4 |
LTI Core 1.3 §5.3.3 (roles claim) — https://www.imsglobal.org/spec/lti/v1p3/ |
| LTI-CORE-5 |
MUST |
✅ done |
A tool MUST reject a launch missing a required claim, carrying the wrong LTI version, with an invalid iat/exp, or whose JWT signature or kid does not verify. |
lti:1.3:conf:core/LTI-CORE-5 |
LTI Advantage Cert §6.1.1 (known-bad payloads) — https://www.imsglobal.org/spec/lti/v1p3/cert/ |
Modelled schema anchors
- LTI-CORE-1 →
- LTI-CORE-2 →
- LTI-CORE-3 →
lti:1.3:doc:CoreLaunchRequest/messageType, lti:1.3:doc:CoreLaunchRequest/version, lti:1.3:doc:CoreLaunchRequest/deploymentId, lti:1.3:doc:CoreLaunchRequest/targetLinkUri, lti:1.3:def:ClResourceLink/id
- LTI-CORE-4 →
lti:1.3:doc:RoleVocabulary/role
- LTI-CORE-5 →
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| LTI-DL-1 |
MUST |
✅ done |
A LtiDeepLinkingRequest carries the deep_linking_settings claim with deep_link_return_url, accept_types and accept_presentation_document_targets. |
lti:1.3:conf:deep-linking/LTI-DL-1 |
LTI Deep Linking 2.0 §4.4 (deep linking settings) — https://www.imsglobal.org/spec/lti-dl/v2p0 |
| LTI-DL-2 |
MUST |
✅ done |
The request lti_message_type MUST be LtiDeepLinkingRequest and the tool’s reply LtiDeepLinkingResponse. |
lti:1.3:conf:deep-linking/LTI-DL-2 |
LTI Deep Linking 2.0 §4.4.2 / §4.5 (message types) — https://www.imsglobal.org/spec/lti-dl/v2p0 |
| LTI-DL-3 |
MUST |
✅ done |
The tool returns the selection as a signed JWT carrying the content_items claim (a JSON array of the selected content items: ltiResourceLink, link, file, html or image). |
lti:1.3:conf:deep-linking/LTI-DL-3 |
LTI Deep Linking 2.0 §3 / §4.5.6 (content items) — https://www.imsglobal.org/spec/lti-dl/v2p0 |
| LTI-DL-4 |
MUST |
✅ done |
After encoding the response JWT the tool MUST redirect the workflow to the deep_link_return_url via an auto-submitted form. |
lti:1.3:conf:deep-linking/LTI-DL-4 |
LTI Deep Linking 2.0 §2.3 (redirect back) — https://www.imsglobal.org/spec/lti-dl/v2p0 |
Modelled schema anchors
- LTI-DL-1 →
lti:1.3:doc:DeepLinkingSettings/deepLinkReturnUrl, lti:1.3:doc:DeepLinkingSettings/acceptTypes, lti:1.3:doc:DeepLinkingSettings/acceptPresentationDocumentTargets
- LTI-DL-2 →
- LTI-DL-3 →
lti:1.3:doc:DeepLinkingContentItem, lti:1.3:def:DlHtml/html, lti:1.3:def:DlImage/width, lti:1.3:def:DlImage/height, lti:1.3:def:DlFile/mediaType, lti:1.3:def:DlFile/expiresAt
- LTI-DL-4 →
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| LTI-NRPS-1 |
MUST |
✅ done |
A tool consumes the NRPS claim (context_memberships_url + service_versions) from the launch to locate the membership service. |
lti:1.3:conf:nrps/LTI-NRPS-1 |
LTI NRPS 2.0 §2 (the names and role service claim) — https://www.imsglobal.org/spec/lti-nrps/v2p0 |
| LTI-NRPS-2 |
MUST |
✅ done |
A tool retrieves the membership container (media type application/vnd.ims.lti-nrps.v2.membershipcontainer+json) via GET on the context membership URL, following Link-header paging. |
lti:1.3:conf:nrps/LTI-NRPS-2 |
LTI NRPS 2.0 §2.1 (membership container) — https://www.imsglobal.org/spec/lti-nrps/v2p0 |
| LTI-NRPS-3 |
MUST |
✅ done |
Each member carries a user_id (the launch sub) and a roles array; a member with status Inactive/Deleted MUST be honoured (not treated as active). |
lti:1.3:conf:nrps/LTI-NRPS-3 |
LTI NRPS 2.0 §4.2 (membership / member status) — https://www.imsglobal.org/spec/lti-nrps/v2p0 |
| LTI-NRPS-4 |
MUST |
✅ done |
The membership request MUST be authorized by an OAuth 2.0 access token bearing the scope https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly. |
lti:1.3:conf:nrps/LTI-NRPS-4 |
LTI NRPS 2.0 §3 (accessing the service) — https://www.imsglobal.org/spec/lti-nrps/v2p0 |
Modelled schema anchors
- LTI-NRPS-1 →
- LTI-NRPS-2 →
lti:1.3:doc:NrpsMembershipContainer, lti:1.3:doc:NrpsMembershipContainer/members
- LTI-NRPS-3 →
lti:1.3:def:NrpsMember/userId, lti:1.3:def:NrpsMember/roles, lti:1.3:def:NrpsMember/status
- LTI-NRPS-4 →
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| PLAT-AGS-1 |
MUST |
✅ done |
A platform MUST include the AGS endpoint claim (the lineitems URL and the granted scopes) in launches, and MUST enforce that a tool’s service calls stay within the scopes it was granted. |
lti:1.3:conf:platform-ags/PLAT-AGS-1 |
LTI AGS 2.0 §3.1 (the AGS claim) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| PLAT-AGS-2 |
MUST |
✅ done |
A platform MUST accept line item creation (POST /lineitems), requiring a label (the gradebook-column title) and a scoreMaximum. |
lti:1.3:conf:platform-ags/PLAT-AGS-2 |
LTI AGS 2.0 §3.2 (line item create) / §3.2.7 / §3.2.8 — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| PLAT-AGS-3 |
MUST |
✅ done |
A platform MUST assign each line item an id URL returned on every response, and MUST honour a binding to a resource link (resourceLinkId) and a tool resource (resourceId). |
lti:1.3:conf:platform-ags/PLAT-AGS-3 |
LTI AGS 2.0 §3.2.3 / §3.2.9 / §3.2.10 — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| PLAT-AGS-4 |
MUST |
✅ done |
A platform MUST serve the line item container (GET /lineitems) as a paged array, filterable by resource_link_id, resource_id and tag and paged by limit/page. |
lti:1.3:conf:platform-ags/PLAT-AGS-4 |
LTI AGS 2.0 §3.2 / §3.2.4 (container request filters) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| PLAT-AGS-5 |
MUST |
✅ done |
A platform MUST accept a score POSTed to the scores endpoint, requiring userId, activityProgress, gradingProgress and timestamp. |
lti:1.3:conf:platform-ags/PLAT-AGS-5 |
LTI AGS 2.0 §3.4 (score publish service) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| PLAT-AGS-6 |
MUST |
✅ done |
When an accepted score carries scoreGiven the platform MUST require scoreMaximum (the scale it is given in) alongside it. |
lti:1.3:conf:platform-ags/PLAT-AGS-6 |
LTI AGS 2.0 §3.4.4 (scoreGiven and scoreMaximum) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| PLAT-AGS-7 |
MUST |
✅ done |
A platform MUST serve the result container (GET …/results, filterable by user_id); each Result references its line item (scoreOf), the user (userId) and the achieved and maximum scores (resultScore / resultMaximum). |
lti:1.3:conf:platform-ags/PLAT-AGS-7 |
LTI AGS 2.0 §3.3 (result service) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
| PLAT-AGS-8 |
MUST |
✅ done |
A platform MUST serve the full single-line-item REST surface: read, update and delete the line item (GET/PUT/DELETE …/lineitems/{lineItemId}). |
lti:1.3:conf:platform-ags/PLAT-AGS-8 |
LTI AGS 2.0 §3.2.3 / §3.2.5 / §3.2.6 (line item endpoints) — https://www.imsglobal.org/spec/lti-ags/v2p0 |
Modelled schema anchors
- PLAT-AGS-1 →
- PLAT-AGS-2 →
lti:1.3:def:LineItem/label, lti:1.3:def:LineItem/scoreMaximum, lti:1.3:path:ags/POST /{contextId}/lineitems
- PLAT-AGS-3 →
lti:1.3:def:LineItem/id, lti:1.3:def:LineItem/resourceLinkId, lti:1.3:def:LineItem/resourceId
- PLAT-AGS-4 →
lti:1.3:def:LineItemContainer, lti:1.3:path:ags/GET /{contextId}/lineitems, lti:1.3:param:resource_link_id, lti:1.3:param:resource_id, lti:1.3:param:tag, lti:1.3:param:limit, lti:1.3:param:page
- PLAT-AGS-5 →
lti:1.3:def:Score/userId, lti:1.3:def:Score/activityProgress, lti:1.3:def:Score/gradingProgress, lti:1.3:def:Score/timestamp, lti:1.3:path:ags/POST /{contextId}/lineitems/{lineItemId}/scores
- PLAT-AGS-6 →
lti:1.3:def:Score/scoreGiven, lti:1.3:def:Score/scoreMaximum
- PLAT-AGS-7 →
lti:1.3:def:ResultContainer, lti:1.3:def:Result/scoreOf, lti:1.3:def:Result/userId, lti:1.3:def:Result/resultScore, lti:1.3:def:Result/resultMaximum, lti:1.3:path:ags/GET /{contextId}/lineitems/{lineItemId}/results, lti:1.3:param:user_id
- PLAT-AGS-8 →
lti:1.3:path:ags/GET /{contextId}/lineitems/{lineItemId}, lti:1.3:path:ags/PUT /{contextId}/lineitems/{lineItemId}, lti:1.3:path:ags/DELETE /{contextId}/lineitems/{lineItemId}
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| PLAT-CORE-1 |
MUST |
✅ done |
A platform MUST implement the OpenID Connect third-party-initiated login flow: it exposes a login-initiation endpoint and, on the tool’s authentication request, returns the signed id_token launch to the tool’s registered redirect_uri. |
lti:1.3:conf:platform-core/PLAT-CORE-1 |
LTI Core 1.3 §5.1.1 (OIDC login) / Advantage Cert §4.2.2 — https://www.imsglobal.org/spec/lti/v1p3/cert/ |
| PLAT-CORE-2 |
MUST |
✅ done |
A platform MUST mint the id_token as a JWT signed RS256 with the platform key (resolvable via the platform’s JWKS), carrying iss (the platform issuer), aud (the tool’s client_id), sub (the user), exp and iat, and the nonce from the authentication request. |
lti:1.3:conf:platform-core/PLAT-CORE-2 |
1EdTech Security Framework 1.1 §5.1.3 / LTI Core 1.3 §5.1.3 — https://www.imsglobal.org/spec/security/v1p1 |
| PLAT-CORE-3 |
MUST |
✅ done |
A resource-link launch the platform issues MUST carry the required claims: message_type=LtiResourceLinkRequest, version=1.3.0, the deployment_id, the target_link_uri, and the resource_link claim with an id. |
lti:1.3:conf:platform-core/PLAT-CORE-3 |
LTI Core 1.3 §4.2 (required message claims) / §5 — https://www.imsglobal.org/spec/lti/v1p3/ |
| PLAT-CORE-4 |
MUST |
✅ done |
The launch the platform issues MUST carry the roles claim (an array of role URIs from the LTI vocabulary) binding the user to the context. |
lti:1.3:conf:platform-core/PLAT-CORE-4 |
LTI Core 1.3 §5.3.3 (roles claim) — https://www.imsglobal.org/spec/lti/v1p3/ |
| PLAT-CORE-5 |
MUST |
✅ done |
A platform MUST issue only well-formed launches — never one missing a required claim, carrying the wrong LTI version, or with an invalid iat/exp — and MUST sign every launch with its private key. |
lti:1.3:conf:platform-core/PLAT-CORE-5 |
LTI Advantage Cert §4.2 / §6.1 (well-formed launches) — https://www.imsglobal.org/spec/lti/v1p3/cert/ |
Modelled schema anchors
- PLAT-CORE-1 →
- PLAT-CORE-2 →
- PLAT-CORE-3 →
lti:1.3:doc:CoreLaunchRequest/messageType, lti:1.3:doc:CoreLaunchRequest/version, lti:1.3:doc:CoreLaunchRequest/deploymentId, lti:1.3:doc:CoreLaunchRequest/targetLinkUri, lti:1.3:def:ClResourceLink/id
- PLAT-CORE-4 →
lti:1.3:doc:RoleVocabulary/role
- PLAT-CORE-5 →
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| PLAT-DL-1 |
MUST |
✅ done |
A platform MUST issue a LtiDeepLinkingRequest carrying the deep_linking_settings claim with deep_link_return_url, accept_types and accept_presentation_document_targets. |
lti:1.3:conf:platform-deep-linking/PLAT-DL-1 |
LTI Deep Linking 2.0 §4.4 (deep linking settings) — https://www.imsglobal.org/spec/lti-dl/v2p0 |
| PLAT-DL-2 |
MUST |
✅ done |
The platform’s request lti_message_type MUST be LtiDeepLinkingRequest and it MUST accept the tool’s reply as LtiDeepLinkingResponse. |
lti:1.3:conf:platform-deep-linking/PLAT-DL-2 |
LTI Deep Linking 2.0 §4.4.2 / §4.5 (message types) — https://www.imsglobal.org/spec/lti-dl/v2p0 |
| PLAT-DL-3 |
MUST |
✅ done |
A platform MUST accept the tool’s signed response JWT, validating the content_items claim and each selected content item (ltiResourceLink, link, file, html or image) before placing it. |
lti:1.3:conf:platform-deep-linking/PLAT-DL-3 |
LTI Deep Linking 2.0 §3 / §4.5.6 (content items) — https://www.imsglobal.org/spec/lti-dl/v2p0 |
| PLAT-DL-4 |
MUST |
✅ done |
A platform MUST receive the tool’s deep-linking response at the deep_link_return_url it advertised and persist the selected content items as placements in the originating context. |
lti:1.3:conf:platform-deep-linking/PLAT-DL-4 |
LTI Deep Linking 2.0 §2.3 (return to platform) — https://www.imsglobal.org/spec/lti-dl/v2p0 |
Modelled schema anchors
- PLAT-DL-1 →
lti:1.3:doc:DeepLinkingSettings/deepLinkReturnUrl, lti:1.3:doc:DeepLinkingSettings/acceptTypes, lti:1.3:doc:DeepLinkingSettings/acceptPresentationDocumentTargets
- PLAT-DL-2 →
- PLAT-DL-3 →
lti:1.3:doc:DeepLinkingContentItem, lti:1.3:def:DlHtml/html, lti:1.3:def:DlImage/width, lti:1.3:def:DlImage/height, lti:1.3:def:DlFile/mediaType, lti:1.3:def:DlFile/expiresAt
- PLAT-DL-4 →
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| PLAT-DR-1 |
MUST |
✅ done |
A platform supporting Dynamic Registration MUST expose an OpenID Connect openid-configuration document advertising its issuer, the authorization/token/JWKS endpoints, the registration endpoint and the LTI platform capabilities it offers. |
lti:1.3:conf:platform-dynamic-registration/PLAT-DR-1 |
LTI Dynamic Registration 1.0 §3.2 (platform configuration) — https://www.imsglobal.org/spec/lti-dr/v1p0 |
| PLAT-DR-2 |
MUST |
✅ done |
A platform MUST accept a tool’s registration request at the registration endpoint (bearer registration access token) and return the registered client configuration — the assigned client_id and the negotiated LTI tool configuration. |
lti:1.3:conf:platform-dynamic-registration/PLAT-DR-2 |
LTI Dynamic Registration 1.0 §3.5 / §3.6 (registration request/response) — https://www.imsglobal.org/spec/lti-dr/v1p0 |
Modelled schema anchors
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| PLAT-NRPS-1 |
MUST |
✅ done |
A platform MUST include the NRPS claim (context_memberships_url + service_versions) in launches for contexts where the membership service is available. |
lti:1.3:conf:platform-nrps/PLAT-NRPS-1 |
LTI NRPS 2.0 §2 (the names and role service claim) — https://www.imsglobal.org/spec/lti-nrps/v2p0 |
| PLAT-NRPS-2 |
MUST |
✅ done |
A platform MUST serve the membership container (media type application/vnd.ims.lti-nrps.v2.membershipcontainer+json) on GET of the context membership URL, paging with the Link header when the roster spans pages. |
lti:1.3:conf:platform-nrps/PLAT-NRPS-2 |
LTI NRPS 2.0 §2.1 (membership container) — https://www.imsglobal.org/spec/lti-nrps/v2p0 |
| PLAT-NRPS-3 |
MUST |
✅ done |
Each member the platform serves MUST carry a user_id (the same value as the launch sub) and a roles array, and an inactive/withdrawn member MUST be marked with the appropriate status rather than omitted silently. |
lti:1.3:conf:platform-nrps/PLAT-NRPS-3 |
LTI NRPS 2.0 §4.2 (membership / member status) — https://www.imsglobal.org/spec/lti-nrps/v2p0 |
| PLAT-NRPS-4 |
MUST |
✅ done |
A platform MUST require the membership request to bear an OAuth 2.0 access token with the scope https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly, rejecting an unscoped or unauthorized read. |
lti:1.3:conf:platform-nrps/PLAT-NRPS-4 |
LTI NRPS 2.0 §3 (accessing the service) — https://www.imsglobal.org/spec/lti-nrps/v2p0 |
Modelled schema anchors
- PLAT-NRPS-1 →
- PLAT-NRPS-2 →
lti:1.3:doc:NrpsMembershipContainer, lti:1.3:doc:NrpsMembershipContainer/members
- PLAT-NRPS-3 →
lti:1.3:def:NrpsMember/userId, lti:1.3:def:NrpsMember/roles, lti:1.3:def:NrpsMember/status
- PLAT-NRPS-4 →
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| PLAT-PROC-1 |
MUST |
✅ done |
A platform MUST send the LtiStartProctoring message (with the proctoring settings and the start_assessment_url) to the proctoring tool, and accept the tool’s launch of the assessment via that start_assessment_url. |
lti:1.3:conf:platform-proctoring/PLAT-PROC-1 |
LTI Proctoring Services 1.0 §4 (start proctoring) — https://www.imsglobal.org/spec/proctoring/v1p0 |
| PLAT-PROC-2 |
MUST |
✅ done |
A platform MUST accept the LtiEndAssessment message returning control at the end of the attempt (and MAY honour an Assessment Control Service verdict during it). |
lti:1.3:conf:platform-proctoring/PLAT-PROC-2 |
LTI Proctoring Services 1.0 §5 (end assessment / ACS) — https://www.imsglobal.org/spec/proctoring/v1p0 |
Modelled schema anchors
- PLAT-PROC-1 →
lti:1.3:doc:StartProctoringMessage/startAssessmentUrl, lti:1.3:doc:StartProctoringMessage/assessmentProctoringSettings
- PLAT-PROC-2 →
lti:1.3:doc:EndAssessmentMessage/messageType, lti:1.3:doc:EndAssessmentMessage/attemptNumber
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| PLAT-SEC-1 |
MUST |
✅ done |
All JWT signing MUST use asymmetric RSA-256; the platform signs the id_token only with its private key (symmetric cryptosystems are forbidden). |
lti:1.3:conf:platform-security/PLAT-SEC-1 |
LTI Advantage Cert §4.2 (security requirements) — https://www.imsglobal.org/spec/lti/v1p3/cert/ |
| PLAT-SEC-2 |
MUST |
➖ n/a |
All communication endpoints MUST be secured with TLS (SSL alone is forbidden). |
TLS termination/enforcement is handled at the Istio ingress / Gateway API tier (infra), not in app code — there is no application-level conformance surface to prove here (identical to the tool-role LTI-SEC-2). Revisit if the platform ever terminates TLS itself. |
LTI Advantage Cert §4.2 (TLS) — https://www.imsglobal.org/spec/lti/v1p3/cert/ |
| PLAT-SEC-3 |
MUST |
✅ done |
A platform MUST expose its public keys for tools to verify the id_token signature — a JWKS URL resolving the kid of every issued launch. |
lti:1.3:conf:platform-security/PLAT-SEC-3 |
LTI Advantage Cert §4.2.2.1 (JWKS exchange) — https://www.imsglobal.org/spec/lti/v1p3/cert/ |
| PLAT-SEC-4 |
MUST |
✅ done |
A platform MUST operate an OAuth 2.0 token endpoint accepting the client-credentials grant with private_key_jwt client authentication: it verifies the tool’s signed client-assertion against the tool’s registered JWKS, checks the requested scopes, and issues a scoped access token. |
lti:1.3:conf:platform-security/PLAT-SEC-4 |
1EdTech Security Framework 1.1 §4 (client-credentials grant / private_key_jwt) — https://www.imsglobal.org/spec/security/v1p1 |
Modelled schema anchors
- PLAT-SEC-1 →
- PLAT-SEC-2 →
- PLAT-SEC-3 →
- PLAT-SEC-4 →
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| LTI-PROC-1 |
MUST |
✅ done |
A proctoring tool receives the LtiStartProctoring message (with the proctoring_settings and the start_assessment_url) and only launches the assessment via the start_assessment_url once proctoring setup completes. |
lti:1.3:conf:proctoring/LTI-PROC-1 |
LTI Proctoring Services 1.0 §4 (start proctoring) — https://www.imsglobal.org/spec/proctoring/v1p0 |
| LTI-PROC-2 |
MUST |
✅ done |
The tool returns control to the platform with an LtiEndAssessment message at the end of the attempt (and MAY surface an Assessment Control Service verdict during it). |
lti:1.3:conf:proctoring/LTI-PROC-2 |
LTI Proctoring Services 1.0 §5 (end assessment / ACS) — https://www.imsglobal.org/spec/proctoring/v1p0 |
Modelled schema anchors
- LTI-PROC-1 →
lti:1.3:doc:StartProctoringMessage/startAssessmentUrl, lti:1.3:doc:StartProctoringMessage/assessmentProctoringSettings
- LTI-PROC-2 →
lti:1.3:doc:EndAssessmentMessage/messageType, lti:1.3:doc:EndAssessmentMessage/attemptNumber
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| LTI-SEC-1 |
MUST |
✅ done |
All JWT signing and verification MUST use asymmetric RSA-256; symmetric cryptosystems are forbidden and a JWT MUST be signed only with the holder’s private key. |
lti:1.3:conf:security/LTI-SEC-1 |
LTI Advantage Cert §4.2 (security requirements) — https://www.imsglobal.org/spec/lti/v1p3/cert/ |
| LTI-SEC-2 |
MUST |
➖ n/a |
All communication endpoints MUST be secured with TLS (SSL alone is forbidden). |
TLS termination/enforcement is handled at the Istio ingress / Gateway API tier (infra), not in app code — there is no application-level conformance surface to prove here. Revisit if the tool ever terminates TLS itself. |
LTI Advantage Cert §4.2 (TLS) — https://www.imsglobal.org/spec/lti/v1p3/cert/ |
| LTI-SEC-3 |
MUST |
✅ done |
A tool MUST expose its public keys for the platform to verify the tool’s JWTs — a JWKS URL (recommended) or a registered public key. |
lti:1.3:conf:security/LTI-SEC-3 |
LTI Advantage Cert §4.2.2.1 (JWKS exchange) — https://www.imsglobal.org/spec/lti/v1p3/cert/ |
| LTI-SEC-4 |
MUST |
✅ done |
To call a service (NRPS / AGS) a tool MUST obtain an OAuth 2.0 access token via the client-credentials grant, presenting a signed client-assertion JWT and requesting the service scope. |
lti:1.3:conf:security/LTI-SEC-4 |
1EdTech Security Framework 1.1 §4 (client-credentials grant) — https://www.imsglobal.org/spec/security/v1p1 |
Modelled schema anchors
- LTI-SEC-1 →
- LTI-SEC-2 →
- LTI-SEC-3 →
- LTI-SEC-4 →