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/caliper-v1.2.json (generated 2026-06-25), sha256 513572b4b05bab4d4c9f95f9c666e00089e0cbbbc7958323de6b1e9ca6820995.
- Requirements: 23/24 done across 8 profile(s) — endpoint, entity, envelope, event, identifier, sender, serialization, vocabulary.
- Information model: 1693/2052 literal items modelled.
- 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 |
| CAL-EP-1 |
MUST |
✅ done |
A Caliper Endpoint MUST be capable of receiving Caliper data sent over HTTP POST by a Sensor over a TLS-secured connection with a valid certificate, and MUST support Bearer (RFC 6750) authentication on the HTTP Authorization request header. |
caliper:1.2:conf:endpoint/CAL-EP-1 |
Caliper 1.2 §6 Endpoint — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-EP-2 |
MUST |
✅ done |
Following receipt of a Sensor request the Endpoint MUST reply with an HTTP response message, and to signal successful receipt MUST reply with a 2xx class status code. |
caliper:1.2:conf:endpoint/CAL-EP-2 |
Caliper 1.2 §6.1 HTTP Responses — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-EP-3 |
SHOULD |
✅ done |
On success the Endpoint SHOULD use the 200 OK response and SHOULD send back successful responses with an empty body. |
caliper:1.2:conf:endpoint/CAL-EP-3 |
Caliper 1.2 §6.1 HTTP Responses — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-EP-4 |
MUST |
✅ done |
When an Endpoint replies with a non-2xx response it MUST adhere to the defined status codes: 400 Bad Request for a missing or malformed Envelope, 401 Unauthorized for an unauthorized request, 415 Unsupported Media Type for a non-application/json content type, and 422 Unprocessable Entity when it cannot support the Envelope’s dataVersion. |
caliper:1.2:conf:endpoint/CAL-EP-4 |
Caliper 1.2 §6.1 HTTP Responses (error status codes) — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-EP-5 |
MUST |
✅ done |
On receiving a GET status (ping) request with appropriate authorization, an Endpoint MUST respond with 200 OK and a JSON body containing its configuration parameters, including the required caliperSupportedVersions list; each configuration property MUST be included no more than once and no custom properties are permitted. |
caliper:1.2:conf:endpoint/CAL-EP-5 |
Caliper 1.2 §6.2 Configuration Information — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-EP-6 |
SHOULD |
✅ done |
If a status (ping) request arrives without an Authorization header of the RECOMMENDED form, or with a token the Endpoint cannot validate or that lacks sufficient privilege, the Endpoint SHOULD reply with a 401 Unauthorized response. |
caliper:1.2:conf:endpoint/CAL-EP-6 |
Caliper 1.2 §6.2 Configuration Information — https://www.imsglobal.org/spec/caliper/v1p2 |
Modelled schema anchors
- CAL-EP-1 →
caliper:1.2:def:Envelope/sensor, caliper:1.2:def:Envelope/data
- CAL-EP-2 →
caliper:1.2:def:Envelope/data
- CAL-EP-3 →
caliper:1.2:def:Envelope/data
- CAL-EP-4 →
caliper:1.2:def:Envelope/data, caliper:1.2:def:Envelope/dataVersion
- CAL-EP-5 →
caliper:1.2:def:Envelope/dataVersion, caliper:1.2:def:Envelope/sensor
- CAL-EP-6 →
caliper:1.2:def:Envelope/sensor
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| CAL-ENT-1 |
MUST |
✅ done |
Every Caliper Entity MUST carry a type matching the Caliper term for the entity (e.g. Person) and an id that is a unique, persistent IRI. |
caliper:1.2:conf:entity/CAL-ENT-1 |
Caliper 1.2 §Entity (type/id) — https://www.imsglobal.org/spec/caliper/v1p2 |
Modelled schema anchors
- CAL-ENT-1 →
caliper:1.2:def:Entity/type, caliper:1.2:def:Entity/id
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| CAL-ENV-1 |
MUST |
✅ done |
A Caliper Envelope MUST carry the emitting sensor, the dataVersion IRI, a sendTime, and the data payload. |
caliper:1.2:conf:envelope/CAL-ENV-1 |
Caliper 1.2 §Envelope — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-ENV-2 |
MUST |
✅ done |
The Envelope sendTime MUST be expressed in UTC with millisecond precision (YYYY-MM-DDTHH:mm:ss.SSSZ, no offset); the dataVersion MUST be set to the 1EdTech Caliper context IRI governing the payload; the data array MUST carry one or more Event/Entity describe objects; and each Envelope property MUST be referenced only once with no custom properties permitted. |
caliper:1.2:conf:envelope/CAL-ENV-2 |
Caliper 1.2 §5.2 Envelope (Properties) — https://www.imsglobal.org/spec/caliper/v1p2 |
Modelled schema anchors
- CAL-ENV-1 →
caliper:1.2:def:Envelope/sensor, caliper:1.2:def:Envelope/dataVersion, caliper:1.2:def:Envelope/sendTime, caliper:1.2:def:Envelope/data
- CAL-ENV-2 →
caliper:1.2:def:Envelope/sendTime, caliper:1.2:def:Envelope/dataVersion, caliper:1.2:def:Envelope/data
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| CAL-EVT-1 |
MUST |
✅ done |
Every Caliper Event MUST identify the actor, the action performed, and the object it was performed on. |
caliper:1.2:conf:event/CAL-EVT-1 |
Caliper 1.2 §Event — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-EVT-2 |
MUST |
✅ done |
Every Caliper Event MUST also carry its id, a type matching the Caliper term for the event, and an eventTime expressed in UTC (YYYY-MM-DDTHH:mm:ss.SSSZ). |
caliper:1.2:conf:event/CAL-EVT-2 |
Caliper 1.2 §Event (id/type/eventTime) — https://www.imsglobal.org/spec/caliper/v1p2 |
Modelled schema anchors
- CAL-EVT-1 →
caliper:1.2:def:Event/actor, caliper:1.2:def:Event/action, caliper:1.2:def:Event/object
- CAL-EVT-2 →
caliper:1.2:def:Event/id, caliper:1.2:def:Event/type, caliper:1.2:def:Event/eventTime
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| CAL-ID-1 |
MUST |
✅ done |
Every Caliper Event id MUST be a UUID expressed as a urn:uuid: (RFC 4122); every Entity id MUST be a unique, persistent IRI. |
caliper:1.2:conf:identifier/CAL-ID-1 |
Caliper 1.2 §Event / §Entity identifier — https://www.imsglobal.org/spec/caliper/v1p2 |
Modelled schema anchors
- CAL-ID-1 →
caliper:1.2:def:Agent/id, caliper:1.2:def:AggregateMeasure/id, caliper:1.2:def:AggregateMeasureCollection/id, caliper:1.2:def:Annotation/id, caliper:1.2:def:AnnotationEvent/id, caliper:1.2:def:Assessment/id, caliper:1.2:def:AssessmentEvent/id, caliper:1.2:def:AssessmentItem/id, caliper:1.2:def:AssessmentItemEvent/id, caliper:1.2:def:AssignableDigitalResource/id, caliper:1.2:def:AssignableEvent/id, caliper:1.2:def:Attempt/id, caliper:1.2:def:AudioObject/id, caliper:1.2:def:BookmarkAnnotation/id, caliper:1.2:def:Chapter/id, caliper:1.2:def:Collection/id, caliper:1.2:def:Comment/id, caliper:1.2:def:CourseOffering/id, caliper:1.2:def:CourseSection/id, caliper:1.2:def:DateTimeQuestion/id, caliper:1.2:def:DateTimeResponse/id, caliper:1.2:def:DigitalResource/id, caliper:1.2:def:DigitalResourceCollection/id, caliper:1.2:def:Document/id, caliper:1.2:def:Entity/id, caliper:1.2:def:Event/id, caliper:1.2:def:FeedbackEvent/id, caliper:1.2:def:FillinBlankResponse/id, caliper:1.2:def:Forum/id, caliper:1.2:def:ForumEvent/id, caliper:1.2:def:Frame/id, caliper:1.2:def:GradeEvent/id, caliper:1.2:def:Group/id, caliper:1.2:def:HighlightAnnotation/id, caliper:1.2:def:ImageObject/id, caliper:1.2:def:LearningObjective/id, caliper:1.2:def:LikertScale/id, caliper:1.2:def:Link/id, caliper:1.2:def:LtiLink/id, caliper:1.2:def:LtiSession/id, caliper:1.2:def:MediaEvent/id, caliper:1.2:def:MediaLocation/id, caliper:1.2:def:MediaObject/id, caliper:1.2:def:Membership/id, caliper:1.2:def:Message/id, caliper:1.2:def:MessageEvent/id, caliper:1.2:def:MultipleChoiceResponse/id, caliper:1.2:def:MultipleResponseResponse/id, caliper:1.2:def:MultiselectQuestion/id, caliper:1.2:def:MultiselectResponse/id, caliper:1.2:def:MultiselectScale/id, caliper:1.2:def:NavigationEvent/id, caliper:1.2:def:NumericScale/id, caliper:1.2:def:OpenEndedQuestion/id, caliper:1.2:def:OpenEndedResponse/id, caliper:1.2:def:Organization/id, caliper:1.2:def:OutcomeEvent/id, caliper:1.2:def:Page/id, caliper:1.2:def:Person/id, caliper:1.2:def:Query/id, caliper:1.2:def:Question/id, caliper:1.2:def:Questionnaire/id, caliper:1.2:def:QuestionnaireEvent/id, caliper:1.2:def:QuestionnaireItem/id, caliper:1.2:def:QuestionnaireItemEvent/id, caliper:1.2:def:Rating/id, caliper:1.2:def:RatingScaleQuestion/id, caliper:1.2:def:RatingScaleResponse/id, caliper:1.2:def:Reading/id, caliper:1.2:def:ReadingEvent/id, caliper:1.2:def:ResourceManagementEvent/id, caliper:1.2:def:Response/id, caliper:1.2:def:Result/id, caliper:1.2:def:Scale/id, caliper:1.2:def:Score/id, caliper:1.2:def:SearchEvent/id, caliper:1.2:def:SearchResponse/id, caliper:1.2:def:SelectTextResponse/id, caliper:1.2:def:Session/id, caliper:1.2:def:SessionEvent/id, caliper:1.2:def:SharedAnnotation/id, caliper:1.2:def:SoftwareApplication/id, caliper:1.2:def:Survey/id, caliper:1.2:def:SurveyEvent/id, caliper:1.2:def:SurveyInvitation/id, caliper:1.2:def:SurveyInvitationEvent/id, caliper:1.2:def:TagAnnotation/id, caliper:1.2:def:Thread/id, caliper:1.2:def:ThreadEvent/id, caliper:1.2:def:ToolLaunchEvent/id, caliper:1.2:def:ToolUseEvent/id, caliper:1.2:def:TrueFalseResponse/id, caliper:1.2:def:VideoObject/id, caliper:1.2:def:ViewEvent/id, caliper:1.2:def:WebPage/id, caliper:1.2:def:epubChapter/id, caliper:1.2:def:epubPart/id, caliper:1.2:def:epubSubChapter/id, caliper:1.2:def:epubVolume/id
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| CAL-SND-1 |
MUST |
🔲 todo |
A Caliper Sensor MUST be capable of transmitting Caliper data successfully to a Caliper Endpoint over HTTP with the connection encrypted using Transport Layer Security (TLS). |
Real TLS is a deployment property — the Sensor transmits over an https endpoint URL and the runtime negotiates the secure connection — not something the in-process interop lane exercises. The transmission TLS secures (single Envelope POST, headers, version negotiation) IS proven (CAL-SND-2..6), and the config-time guard (assertEndpointTransportSecure) already refuses a non-internal endpoint that is not https, so plaintext export can never reach the wire. Flips to done under a deployed-endpoint smoke check (pending the worker-host decision). |
Caliper 1.2 §5.4 HTTP Requests — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-SND-2 |
MUST |
✅ done |
Each message request a Sensor sends MUST consist of a single JSON representation of a Caliper Envelope, and messages MUST be sent using the HTTP POST request method. |
caliper:1.2:conf:sender/CAL-SND-2 |
Caliper 1.2 §5.4 HTTP Requests — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-SND-3 |
MUST |
✅ done |
A Sensor MUST set the HTTP Host and Content-Type request header fields; the Content-Type value MUST be the IANA media type “application/json”. |
caliper:1.2:conf:sender/CAL-SND-3 |
Caliper 1.2 §5.4 HTTP Requests (request headers) — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-SND-4 |
SHOULD |
✅ done |
A Sensor SHOULD set the Authorization request header field using the “Bearer” authentication scheme (RFC 6750 §2.1); the b64token credential sent MUST be one the Endpoint can validate, although it MAY be opaque to the Sensor. |
caliper:1.2:conf:sender/CAL-SND-4 |
Caliper 1.2 §5.4 HTTP Requests (Authorization) — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-SND-5 |
MUST |
✅ done |
A Sensor MUST serialize each Event and Entity describe as a JSON-LD document, and Caliper Event and Entity data MUST be transmitted inside a Caliper Envelope (never outside one). |
caliper:1.2:conf:sender/CAL-SND-5 |
Caliper 1.2 §5.1 Behavior / §5.3 JSON-LD Payload — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-SND-6 |
MUST |
✅ done |
A Sensor MUST ensure that the Caliper data it sends is based on one of the Caliper JSON-LD context document versions listed in the Endpoint’s caliperSupportedVersions configuration. |
caliper:1.2:conf:sender/CAL-SND-6 |
Caliper 1.2 §6.2 Configuration Information (caliperSupportedVersions) — https://www.imsglobal.org/spec/caliper/v1p2 |
Modelled schema anchors
- CAL-SND-1 →
caliper:1.2:def:Envelope/sensor, caliper:1.2:def:Envelope/data
- CAL-SND-2 →
caliper:1.2:def:Envelope/data, caliper:1.2:def:Envelope/dataVersion
- CAL-SND-3 →
caliper:1.2:def:Envelope/dataVersion
- CAL-SND-4 →
caliper:1.2:def:Envelope/sensor
- CAL-SND-5 →
caliper:1.2:def:Envelope/data
- CAL-SND-6 →
caliper:1.2:def:Envelope/dataVersion
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| CAL-SER-1 |
MUST |
✅ done |
Each Caliper Event and Entity describe document MUST carry a top-level @context property defined as a string or an array. If a string it MUST be the Caliper remote context URL “http://purl.imsglobal.org/ctx/caliper/v1p2”; if an array the remote Caliper context MUST be listed last. The remote context’s terms MUST NOT be redefined inline as an object, nor overridden by nested local contexts. |
caliper:1.2:conf:serialization/CAL-SER-1 |
Caliper 1.2 §4.1 JSON-LD Context (Requirements) — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-SER-2 |
MUST |
✅ done |
An Event’s entity-valued properties — the actor and object, and any edApp, generated, target, referrer or group — MUST each be expressed either as an object or as a string corresponding to the resource’s IRI (Caliper’s reference-or-inline duality). |
caliper:1.2:conf:serialization/CAL-SER-2 |
Caliper 1.2 §2.1 Event (Properties) / §5.1 Behavior — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-SER-3 |
MUST |
✅ done |
Within an Event or Entity each property MUST be referenced only once, and any custom attribute not described by the Caliper model MUST be added to the extensions property rather than as an ad-hoc top-level term. |
caliper:1.2:conf:serialization/CAL-SER-3 |
Caliper 1.2 §2.1 Event / §2.2 Entity (extensions) — https://www.imsglobal.org/spec/caliper/v1p2 |
Modelled schema anchors
- CAL-SER-1 →
caliper:1.2:def:Event/@context, caliper:1.2:def:Entity/@context
- CAL-SER-2 →
caliper:1.2:def:Event/actor, caliper:1.2:def:Event/object, caliper:1.2:def:Event/edApp, caliper:1.2:def:Event/generated, caliper:1.2:def:Event/target, caliper:1.2:def:Event/referrer, caliper:1.2:def:Event/group
- CAL-SER-3 →
caliper:1.2:def:Event/extensions, caliper:1.2:def:Entity/extensions
| Req |
Level |
Status |
Statement |
Verified by / justification |
Spec source |
| CAL-VOCAB-1 |
MUST |
✅ done |
An Event’s action MUST be a term drawn from the Caliper action vocabulary (the term appropriate to the event’s metric profile). |
caliper:1.2:conf:vocabulary/CAL-VOCAB-1 |
Caliper 1.2 §Actions / metric profiles — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-VOCAB-2 |
MUST |
✅ done |
Caliper’s controlled vocabularies MUST be honoured: an AggregateMeasure metric is a Caliper metric term, an entity status is Active or Inactive, and a sensor declares the metric profiles it supports as Caliper profile terms. |
caliper:1.2:conf:vocabulary/CAL-VOCAB-2 |
Caliper 1.2 §Metric / §Status / metric profiles — https://www.imsglobal.org/spec/caliper/v1p2 |
| CAL-VOCAB-3 |
MUST |
✅ done |
A Membership’s roles MUST be drawn from the Caliper role vocabulary — the eight base roles (Learner, Instructor, …) and their Base#Subrole specialisations. |
caliper:1.2:conf:vocabulary/CAL-VOCAB-3 |
Caliper 1.2 §Role vocabulary / Membership — https://www.imsglobal.org/spec/caliper/v1p2 |
Modelled schema anchors
- CAL-VOCAB-1 →
caliper:1.2:def:Action, caliper:1.2:def:Event/action
- CAL-VOCAB-2 →
caliper:1.2:def:Metric, caliper:1.2:def:AggregateMeasure/metric, caliper:1.2:def:Status, caliper:1.2:def:Membership/status, caliper:1.2:def:Profile
- CAL-VOCAB-3 →
caliper:1.2:def:Membership/roles, caliper:1.2:def:Membership/roles/[]