Skip to content

CC 1.3 — conformance status

Generated by bun run conformance:render — do not edit by hand.

Denominator: pinned Coverage Map docs/conformance/maps/common-cartridge-v1.3.json (generated 2026-06-22). See conform-ed ADR-0013 (map) and emergent ADR-0028 (overlay).

Profile Requirements Done Partial Other Progress
authorization 1 1 0 0 ████████████████ 100%
curriculum-standards-metadata 1 1 0 0 ████████████████ 100%
discussion-topic 2 2 0 0 ████████████████ 100%
lti-link 1 1 0 0 ████████████████ 100%
manifest 4 4 0 0 ████████████████ 100%
web-link 3 3 0 0 ████████████████ 100%
Req Level Status Evidence Statement
CC-AUTH-1 MUST ✅ done cc:1.3:conf:authorization/CC-AUTH-1 An authorizations document MUST contain at least one authorization describing how to access a resource.
Req Level Status Evidence Statement
CC-CSM-1 MUST ✅ done cc:1.3:conf:curriculum-standards-metadata/CC-CSM-1 A CurriculumStandardsMetadataSet MUST contain at least one curriculumStandardsMetadata, each with at least one setOfGUIDs.
Req Level Status Evidence Statement
CC-DT-1 MUST ✅ done cc:1.3:conf:discussion-topic/CC-DT-1 A Discussion Topic resource MUST carry exactly one title and exactly one text body.
CC-DT-2 MUST ✅ done cc:1.3:conf:discussion-topic/CC-DT-2 The text element MUST carry a texttype attribute whose value is ‘text/html’ or ‘text/plain’.
Req Level Status Evidence Statement
CC-LTI-1 MUST ✅ done cc:1.3:conf:lti-link/CC-LTI-1 A Basic LTI Link resource is carried as an IEEE LOM record whose general metadata identifies the link.
Req Level Status Evidence Statement
CC-MAN-1 MUST ✅ done cc:1.3:conf:manifest/CC-MAN-1 A Common Cartridge manifest MUST carry an identifier and exactly one organizations and one resources element.
CC-MAN-2 MUST ✅ done cc:1.3:conf:manifest/CC-MAN-2 The manifest metadata MUST declare schema = ‘IMS Common Cartridge’ and schemaversion = ‘1.3.0’, identifying the cartridge profile and version.
CC-MAN-3 MUST ✅ done cc:1.3:conf:manifest/CC-MAN-3 The organizations element MUST contain at most one organization (the predefined rooted-hierarchy); multiple organizations are not permitted.
CC-RES-1 MUST ✅ done cc:1.3:conf:manifest/CC-RES-1 Every resource MUST carry an identifier and a type; a file-backed resource MUST reference its content via an href attribute or a file child element.
Req Level Status Evidence Statement
CC-WL-1 MUST ✅ done cc:1.3:conf:web-link/CC-WL-1 A Web Link resource MUST contain a webLink element carrying exactly one title and exactly one url.
CC-WL-2 MUST ✅ done cc:1.3:conf:web-link/CC-WL-2 The url element MUST carry an href attribute identifying the link target.
CC-WL-3 MAY ✅ done cc:1.3:conf:web-link/CC-WL-3 The url element MAY carry a target attribute selecting the HTML anchor target window (e.g. _blank / _self) for the launched link.

Information-model coverage (vs conform-ed model)

Section titled “Information-model coverage (vs conform-ed model)”
  • 676 literal items — 413 modelled ✅, 0 partial 🟡, 0 gaps ❌
  • Silent gaps (in spec, not modelled): none
  • conform-ed extensions (modelled, not in spec): 96
  • documented conform-ed normalisations (renames, not gaps): 97 key(s) across:
    • XSD xs:any open-content wildcard → conform-ed extensions (an unnamed wildcard has no literal name to join).
    • XSD simpleContent text node → conform-ed value (the literal leaves the text node unnamed).
    • Foreign xml:base attribute (local name base) → conform-ed xmlBase (a named rename; the literal items are modelled).
  • cc:1.3:conf:authorization/CC-AUTH-1
    • Proven by an emit→parse round-trip (apps/api/…/cartridge-import/cc-authorization.ts): emergent builds a conformant imsccauth authorizations document (buildCartridgeAuthorizationsDocument) and the importer recognizes + validates it (parseCartridgeAuthorizationsDocument) instead of quarantining it — both directions validated against conform-ed’s literal CommonCartridgeAuthorizationsDocumentSchema, so the document always carries at least one authorization describing how to access the resource (cartridgeId + access scope + the authorization web service). The recognized authorization is recorded on the import report (imported.authorizations). Scope: emergent understands + validates the authorizations document; auto-emitting imsccauth from the offering export pipeline and enforcing the access control are a future capability (the requirement is the document’s validity, not enforcement).
  • cc:1.3:conf:curriculum-standards-metadata/CC-CSM-1
    • Curriculum Standards Metadata now binds natively. The decompose surfaces each resource’s curriculumStandardsMetadataSet GUIDs (setOfGUIDs → labelledGUID/GUID) as CcResource.standardsGuids upstream in @conform-ed/common-cartridge; the importer resolves every standard GUID to a durable CASE competency node (ADR-0018) and aligns the resource’s activity Learning Unit to that node via competency_alignment (target learning_unit). The conformance lane imports a real CSM resource and asserts the unit binds to the matching nodes.
    • ⚠️ A GUID matches a node by the node’s CASE identifier (node_key) OR the original CASE CFItem URI preserved on import (revision_meta ->> ‘uri’), covering both the bare-GUID and full-URI forms a cartridge may carry. A GUID matching no imported node — or CSM on a resource not placed in the course structure — is recorded on the import report (unresolvedStandards), not silently dropped.
  • cc:1.3:conf:discussion-topic/CC-DT-1
    • The discussion domain has landed (ADR-0029): Common Cartridge import now lands an imsdt Discussion Topic natively as a Discussion (Topic.Type{title, text}) anchored to its activity unit, rather than quarantining it. The conformance lane imports a real imsdt resource and asserts the Discussion persists with its title on the activity unit.
  • cc:1.3:conf:discussion-topic/CC-DT-2
    • The topic’s text body (text/@texttype text/html | text/plain) governs the landed Discussion prompt; the same conformance test asserts the topic’s content becomes the Discussion prompt. emergent reduces the HTML body to plain text (the thread renderer escapes it), which is conformant for a consumer.
  • cc:1.3:conf:lti-link/CC-LTI-1
    • emergent now plays the LTI 1.3 PLATFORM role (ADR-0040), so it consumes a Basic LTI Link out of an imported cartridge instead of quarantining it. The importer reads the lomccltilink’s launch URL (extractLtiLaunchUrl) and resolves it to a platform resource-link placement (CC-LTI-1): placeCartridgeLtiLinkWithDb matches the launch host against the registered tool catalog — a match yields an active placement (the importing org is entitled + a deployment minted lazily), no match parks it as a pending_registration resource link surfaced to the teacher to register the tool, never silently dropped. Proven in the CC conformance lane (a Basic LTI Link lands as an active placement bound to a registered tool; nothing dropped) and the import unit lane (the unmatched link parks pending_registration). The LTI platform map (lti-v1.3) tracks the platform role’s own requirements separately.
    • ⚠️ Matching is by launch-URL host against each active tool’s target_link_uri (falling back to its login-initiation URL). A launch URL on a host no registered tool serves parks the link pending_registration rather than dropping it; it activates once a matching tool is registered.
  • cc:1.3:conf:manifest/CC-MAN-1
    • The manifest is the import entry point: the decompose reads its identifier, organizations (the unit tree) and resources, landing the org tree as learning units with nothing silently dropped. The single-page conformance case asserts the organizations decompose and the resources land.
  • cc:1.3:conf:manifest/CC-MAN-2
    • The importer reads the manifest metadata schema/schemaversion to identify the cartridge (the conformance case asserts the decomposed version is detected).
    • ⚠️ emergent is deliberately version-tolerant: it routes by classified resource KIND, not by the exact schemaversion literal, so a 1.3.0 and a 1.4.x cartridge take the same code path. It consumes the declaration rather than rejecting a non-matching version.
  • cc:1.3:conf:manifest/CC-MAN-3
    • The single rooted-hierarchy organization decomposes into the learning-unit tree; the conformance case asserts the organizations decompose (the importer assumes the one permitted organization).
  • cc:1.3:conf:manifest/CC-RES-1
    • Every resource is classified by its identifier + type and landed (or quarantined-with-reason) via its href/file; the conformance case asserts each decomposed resource carries an identifier and a type and that nothing is silently dropped.
  • cc:1.3:conf:web-link/CC-WL-1
    • Common Cartridge import lands a Web Link resource (imswl) natively: its title and url are persisted as a learning_unit_external_link on the activity unit (ADR-0022 long-tail). The conformance lane imports a real imswl resource and asserts both the title and the url land.
    • ⚠️ The url is taken from the imswl attribute (single- or double-quoted both tolerated), not from element text — matching URL.Type/@href in the XSD. A web link with no resolvable href quarantines-with-reason rather than landing a row with an empty url.
  • cc:1.3:conf:web-link/CC-WL-2
    • The href attribute (URL.Type/@href, use=“required”) is the landed link target; the same conformance test asserts the persisted url equals the imswl href.
  • cc:1.3:conf:web-link/CC-WL-3
    • The optional url/@target window hint (_blank / _self, or a frame name) is now carried on the native external-link model rather than dropped: the importer reads it off the imswl <url @target> (URL.Type/@target) and persists it as learning_unit_external_link.window_target alongside the link target. The imswl conformance case asserts the hint lands on both the import result and the persisted row.
    • ⚠️ Stored as free text, not an enum: the CC binding permits frame names beyond the well-known _blank/_self/_parent/_top keywords. A web link whose declares no target lands with a null window_target (the hint is optional). Honouring the hint at render time (the learner materials list currently always opens links in a new tab) is a separate presentation concern.