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).
Certification readiness (by profile)
Section titled “Certification readiness (by profile)”| Profile | Requirements | Done | Partial | Other | Progress |
|---|---|---|---|---|---|
| course-structure | 6 | 6 | 0 | 0 | ████████████████ 100% |
Conformance requirements
Section titled “Conformance requirements”course-structure
Section titled “course-structure”| 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 |
| 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
Gotchas & notes
Section titled “Gotchas & notes”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.
- The cmi5.xml importer records the
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).
- The importer reads the AU’s launchMethod (the
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.