Skip to content

CMI5 1.0 — conformance status

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

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

Profile Requirements Done Partial Other Progress
course-structure 6 6 0 0 ████████████████ 100%
Req Level Status Evidence Statement
CMI5-CS-1 MUST ✅ done cmi5:1.0:conf:course-structure/CMI5-CS-1 A course-structure document has exactly one , identified by an id (an IRI).
CMI5-CS-2 MUST ✅ done cmi5:1.0:conf:course-structure/CMI5-CS-2 Each assignable unit (AU) MUST carry an id (an IRI, unique within the course) and a launchable url.
CMI5-CS-3 MUST ✅ done cmi5:1.0:conf:course-structure/CMI5-CS-3 An AU’s moveOn MUST be one of NotApplicable, Passed, Completed, CompletedAndPassed or CompletedOrPassed (default NotApplicable).
CMI5-CS-4 MUST ✅ done cmi5:1.0:conf:course-structure/CMI5-CS-4 masteryScore, when present, MUST be a decimal between 0 and 1 inclusive.
CMI5-CS-5 MUST ✅ done cmi5:1.0:conf:course-structure/CMI5-CS-5 An AU’s launchMethod MUST be AnyWindow or OwnWindow (default AnyWindow).
CMI5-CS-6 MUST ✅ done cmi5:1.0:conf:course-structure/CMI5-CS-6 A block groups AUs and nested blocks, MUST carry an id, and references objectives by idref.

Information-model coverage (vs conform-ed model)

Section titled “Information-model coverage (vs conform-ed model)”
  • 45 literal items — 30 modelled ✅, 0 partial 🟡, 0 gaps ❌
  • Silent gaps (in spec, not modelled): none
  • conform-ed extensions (modelled, not in spec): 1
  • documented conform-ed normalisations (renames, not gaps): 1 key(s) across:
    • cmi5 simpleContent text → conform-ed value
  • cmi5:1.0:conf:course-structure/CMI5-CS-1
    • The cmi5.xml importer records the identifier and rejects the package (throws invalidPackageArchive) unless it is an absolute IRI — proven offline in tests/conformance/cmi5.conformance.test.ts driving the real parseCmi5PackageArchive with a non-IRI course id.
  • cmi5:1.0:conf:course-structure/CMI5-CS-2
    • Each AU must carry a unique absolute-IRI id (duplicate ids are rejected) and a resolvable launchable url (an AU with no valid launch url is rejected). Proven offline by driving the real parser with a duplicate-AU-id and a missing-launchable-url document.
  • cmi5:1.0:conf:course-structure/CMI5-CS-3
    • emergent validates an AU’s moveOn against conform-ed’s Cmi5MoveOnSchema — the exact five-member value-set this map pins — when normalizing AU metadata (external-package/cmi5.ts): a moveOn outside the vocabulary is dropped, not passed through. Proven offline driving the real normalizer.
  • cmi5:1.0:conf:course-structure/CMI5-CS-4
    • Each AU’s masteryScore is validated against the [0,1]-inclusive decimal bound on import: a value outside the range makes the AU non-conformant and the package is rejected (throws invalidPackageArchive), while a conformant value is carried into the cmi5 launch state + the masteryScore statement extension. The bound is conform-ed’s modelled Cmi5AuSchema.masteryScore (z.number().min(0).max(1)), shared by the importer (reject) and the AU-metadata normalizer (drop) via isConformantCmi5MasteryScore (external-package/cmi5.ts). Proven offline driving the real parseCmi5PackageArchive with both an out-of-range and a boundary masteryScore.
  • cmi5:1.0:conf:course-structure/CMI5-CS-5
    • The importer reads the AU’s launchMethod (the @_launchMethod attribute) and validates it against conform-ed’s Cmi5LaunchMethodSchema — the exact two-member value-set { AnyWindow, OwnWindow } this map pins — when normalizing AU metadata (external-package/cmi5.ts): a conformant value is carried into the AU metadata, a non-conformant one is dropped, and resolveCmi5LaunchMethod applies the spec default (AnyWindow) wherever the field is absent. Proven offline in tests/conformance/cmi5.conformance.test.ts (the normalizer keeps AnyWindow/OwnWindow, drops a non-enum value, the resolver returns the AnyWindow default, and the real parseCmi5PackageArchive carries an @_launchMethod attribute into the AU metadata).
  • cmi5:1.0:conf:course-structure/CMI5-CS-6
    • Blocks must carry a unique absolute-IRI id, and objectives must reference by idref (an objective carrying both an id and an idref, or a non-IRI idref, is rejected). Proven offline by driving the real parser with an objective carrying both id and idref.