@conform-ed/contracts 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/.turbo/turbo-build.log +2 -0
  2. package/.turbo/turbo-format.log +6 -0
  3. package/.turbo/turbo-lint.log +4 -0
  4. package/.turbo/turbo-test.log +196 -0
  5. package/.turbo/turbo-typecheck.log +2 -0
  6. package/README.md +52 -0
  7. package/caliper-v1_2-zod-templates.md +123 -0
  8. package/case-v1_1-zod-templates.md +290 -0
  9. package/cat-v1_0-zod-templates.md +73 -0
  10. package/cc-v1_3-zod-templates.md +531 -0
  11. package/cc-v1_4-zod-templates.md +247 -0
  12. package/clr-v2_0-zod-templates.md +117 -0
  13. package/cmi5-v1_0-zod-templates.md +9 -0
  14. package/lti-zod-templates.md +11 -0
  15. package/oneroster-v1_2-zod-templates.md +76 -0
  16. package/open-badges-v3_0-zod-templates.md +66 -0
  17. package/package.json +42 -0
  18. package/qti-v2_1-zod-templates.md +45 -0
  19. package/qti-v2_2-zod-templates.md +32 -0
  20. package/qti-v3_0_1-zod-templates.md +421 -0
  21. package/src/adapter.ts +83 -0
  22. package/src/caliper/v1_2/caliper_v1p2_bootcamp_schema.ts +781 -0
  23. package/src/caliper/v1_2/index.ts +37 -0
  24. package/src/caliper/v1_2/shared.ts +122 -0
  25. package/src/caliper/v1_2/textual_requirements.ts +219 -0
  26. package/src/case/v1_1/case_v1p1_cfassociation_jsonschema1.ts +1 -0
  27. package/src/case/v1_1/case_v1p1_cfassociationgrouping_jsonschema1.ts +1 -0
  28. package/src/case/v1_1/case_v1p1_cfassociationset_jsonschema1.ts +1 -0
  29. package/src/case/v1_1/case_v1p1_cfconceptset_jsonschema1.ts +1 -0
  30. package/src/case/v1_1/case_v1p1_cfdocument_jsonschema1.ts +1 -0
  31. package/src/case/v1_1/case_v1p1_cfdocumentset_jsonschema1.ts +1 -0
  32. package/src/case/v1_1/case_v1p1_cfitem_jsonschema1.ts +1 -0
  33. package/src/case/v1_1/case_v1p1_cfitemtypeset_jsonschema1.ts +1 -0
  34. package/src/case/v1_1/case_v1p1_cflicense_jsonschema1.ts +1 -0
  35. package/src/case/v1_1/case_v1p1_cfpackage_jsonschema1.ts +1 -0
  36. package/src/case/v1_1/case_v1p1_cfrubric_jsonschema1.ts +1 -0
  37. package/src/case/v1_1/case_v1p1_cfsubjectset_jsonschema1.ts +1 -0
  38. package/src/case/v1_1/case_v1p1_imsx_statusinfo_jsonschema1.ts +1 -0
  39. package/src/case/v1_1/case_v1p1_openapi3_restbinding_schema.ts +113 -0
  40. package/src/case/v1_1/index.ts +95 -0
  41. package/src/case/v1_1/shared.ts +384 -0
  42. package/src/cat/v1_0/cat_v1p0_restbinding_operations_schema.ts +75 -0
  43. package/src/cat/v1_0/index.ts +124 -0
  44. package/src/cat/v1_0/shared.ts +345 -0
  45. package/src/clr/v2_0/clr_v2p0_achievementcredential_schema.ts +16 -0
  46. package/src/clr/v2_0/clr_v2p0_clrcredential_schema.ts +9 -0
  47. package/src/clr/v2_0/clr_v2p0_endorsementcredential_schema.ts +11 -0
  48. package/src/clr/v2_0/clr_v2p0_getclrcredentialsresponse_schema.ts +1 -0
  49. package/src/clr/v2_0/clr_v2p0_imsx_statusinfo_schema.ts +8 -0
  50. package/src/clr/v2_0/clr_v2p0_profile_schema.ts +9 -0
  51. package/src/clr/v2_0/index.ts +22 -0
  52. package/src/clr/v2_0/shared.ts +206 -0
  53. package/src/cmi5/index.ts +3 -0
  54. package/src/cmi5/v1_0/index.ts +134 -0
  55. package/src/common-cartridge/v1_3/ccv1p3_imsccauth_v1p3.ts +26 -0
  56. package/src/common-cartridge/v1_3/ccv1p3_imscp_v1p2_v1p0.ts +352 -0
  57. package/src/common-cartridge/v1_3/ccv1p3_imscsmd_v1p0.ts +35 -0
  58. package/src/common-cartridge/v1_3/ccv1p3_imsdt_v1p3.ts +33 -0
  59. package/src/common-cartridge/v1_3/ccv1p3_imswl_v1p3.ts +23 -0
  60. package/src/common-cartridge/v1_3/ccv1p3_lomccltilink_v1p0.ts +14 -0
  61. package/src/common-cartridge/v1_3/ccv1p3_lommanifest_v1p0.ts +14 -0
  62. package/src/common-cartridge/v1_3/ccv1p3_lomresource_v1p0.ts +14 -0
  63. package/src/common-cartridge/v1_3/ccv1p3_qtiasiv1p2p1_v1p0.ts +964 -0
  64. package/src/common-cartridge/v1_3/index.ts +41 -0
  65. package/src/common-cartridge/v1_3/lom-internal.ts +396 -0
  66. package/src/common-cartridge/v1_3/shared.ts +68 -0
  67. package/src/common-cartridge/v1_4/core/ccv1p4_imscp_v1p2_v1p0.ts +360 -0
  68. package/src/common-cartridge/v1_4/core/ccv1p4_lommanifest_v1p0.ts +14 -0
  69. package/src/common-cartridge/v1_4/core/ccv1p4_lomresource_v1p0.ts +14 -0
  70. package/src/common-cartridge/v1_4/extension/cc_extresource_assignmentv1p0_v1p0.ts +61 -0
  71. package/src/common-cartridge/v1_4/extension/ccv1p4_cpextensionv1p2_v1p0.ts +20 -0
  72. package/src/common-cartridge/v1_4/extension/ims_openvideov1p0_v1p0.ts +325 -0
  73. package/src/common-cartridge/v1_4/index.ts +104 -0
  74. package/src/common-cartridge/v1_4/k12/ccv1p4_imscp_v1p2_v1p0.ts +19 -0
  75. package/src/common-cartridge/v1_4/k12/ccv1p4_imscp_v1p2_v1p0_thin.ts +17 -0
  76. package/src/common-cartridge/v1_4/k12/ccv1p4_lommanifest_v1p0.ts +14 -0
  77. package/src/common-cartridge/v1_4/k12/ccv1p4_lomresource_v1p0.ts +14 -0
  78. package/src/common-cartridge/v1_4/lom-internal.ts +476 -0
  79. package/src/common-cartridge/v1_4/shared/ccv1p4_imsccauth_v1p4.ts +26 -0
  80. package/src/common-cartridge/v1_4/shared/ccv1p4_imscsmd_v1p1.ts +36 -0
  81. package/src/common-cartridge/v1_4/shared/ccv1p4_imsdt_v1p4.ts +33 -0
  82. package/src/common-cartridge/v1_4/shared/ccv1p4_imslticc_v1p4.ts +45 -0
  83. package/src/common-cartridge/v1_4/shared/ccv1p4_imswl_v1p4.ts +23 -0
  84. package/src/common-cartridge/v1_4/shared/ccv1p4_lomccltilink_v1p0.ts +14 -0
  85. package/src/common-cartridge/v1_4/shared/ccv1p4_qtiasiv1p2p1_v1p0.ts +964 -0
  86. package/src/common-cartridge/v1_4/shared/imsbasiclti_v1p0p1.ts +24 -0
  87. package/src/common-cartridge/v1_4/shared/imslticm_v1p0.ts +23 -0
  88. package/src/common-cartridge/v1_4/shared/imslticp_v1p0.ts +57 -0
  89. package/src/common-cartridge/v1_4/shared/lineitem_v1p0.ts +35 -0
  90. package/src/common-cartridge/v1_4/shared/resourcea11ymetadata-20210915.ts +110 -0
  91. package/src/common-cartridge/v1_4/shared.ts +68 -0
  92. package/src/common-cartridge/v1_4/thin/ccv1p4_imscp_v1p2_v1p0.ts +243 -0
  93. package/src/common-cartridge/v1_4/thin/ccv1p4_lommanifest_v1p0.ts +14 -0
  94. package/src/common-cartridge/v1_4/thin/ccv1p4_lomresource_v1p0.ts +14 -0
  95. package/src/common-cartridge/v1_4/vdex/imsmd_loose_v1p3p2.ts +13 -0
  96. package/src/common-cartridge/v1_4/vdex/imsvdex_v1p0.ts +124 -0
  97. package/src/config.ts +121 -0
  98. package/src/index.ts +32 -0
  99. package/src/lti/ags/v2_0/index.ts +97 -0
  100. package/src/lti/deep-linking/v2_0/index.ts +100 -0
  101. package/src/lti/index.ts +26 -0
  102. package/src/lti/nrps/v2_0/index.ts +69 -0
  103. package/src/lti/proctoring/v1_0/index.ts +131 -0
  104. package/src/lti/shared.ts +66 -0
  105. package/src/lti/v1_3/index.ts +84 -0
  106. package/src/oneroster/v1_2/index.ts +156 -0
  107. package/src/oneroster/v1_2/or_v1p2_csv_binding_schema.ts +427 -0
  108. package/src/oneroster/v1_2/or_v1p2_gradebook_restbinding_schema.ts +120 -0
  109. package/src/oneroster/v1_2/or_v1p2_gradebook_service_schema.ts +243 -0
  110. package/src/oneroster/v1_2/or_v1p2_resource_restbinding_schema.ts +24 -0
  111. package/src/oneroster/v1_2/or_v1p2_resource_service_schema.ts +47 -0
  112. package/src/oneroster/v1_2/or_v1p2_rostering_restbinding_schema.ts +84 -0
  113. package/src/oneroster/v1_2/or_v1p2_rostering_service_schema.ts +288 -0
  114. package/src/oneroster/v1_2/shared.ts +90 -0
  115. package/src/open-badges/v3_0/index.ts +20 -0
  116. package/src/open-badges/v3_0/ob_v3p0_achievementcredential_schema.ts +17 -0
  117. package/src/open-badges/v3_0/ob_v3p0_endorsementcredential_schema.ts +11 -0
  118. package/src/open-badges/v3_0/ob_v3p0_getopenbadgecredentialsresponse_schema.ts +1 -0
  119. package/src/open-badges/v3_0/ob_v3p0_imsx_statusinfo_schema.ts +8 -0
  120. package/src/open-badges/v3_0/ob_v3p0_profile_schema.ts +9 -0
  121. package/src/open-badges/v3_0/shared.ts +458 -0
  122. package/src/qti/v2-internal.ts +1683 -0
  123. package/src/qti/v2_1/apipv1p0_qtiextv2p1_v1p0.ts +3 -0
  124. package/src/qti/v2_1/imsqti_metadata_v2p1.ts +3 -0
  125. package/src/qti/v2_1/imsqti_result_v2p1.ts +3 -0
  126. package/src/qti/v2_1/imsqti_usagedata_v2p1.ts +3 -0
  127. package/src/qti/v2_1/imsqti_v2p1p2.ts +71 -0
  128. package/src/qti/v2_1/index.ts +53 -0
  129. package/src/qti/v2_1/qtiv2p1_imscpv1p2_v1p0.ts +3 -0
  130. package/src/qti/v2_1/schemas.ts +15 -0
  131. package/src/qti/v2_1/shared.ts +3 -0
  132. package/src/qti/v2_2/apipv1p0_qtiextv2p2_v1p0p1.ts +3 -0
  133. package/src/qti/v2_2/imsqti_metadata_v2p2.ts +3 -0
  134. package/src/qti/v2_2/imsqti_result_v2p2.ts +3 -0
  135. package/src/qti/v2_2/imsqti_usagedata_v2p2.ts +3 -0
  136. package/src/qti/v2_2/imsqti_v2p2p4.ts +76 -0
  137. package/src/qti/v2_2/imsqtiv2p2p4_html5_v1p0.ts +8 -0
  138. package/src/qti/v2_2/index.ts +59 -0
  139. package/src/qti/v2_2/qtiv2p2_csm_v2p2.ts +4 -0
  140. package/src/qti/v2_2/qtiv2p2_imscpv1p2_v1p0.ts +3 -0
  141. package/src/qti/v2_2/schemas.ts +19 -0
  142. package/src/qti/v2_2/shared.ts +3 -0
  143. package/src/qti/v3_0_1/assessment-internal.ts +1509 -0
  144. package/src/qti/v3_0_1/imsqti_asiv3p0p1_v1p0.ts +57 -0
  145. package/src/qti/v3_0_1/imsqti_itemv3p0p1_v1p0.ts +60 -0
  146. package/src/qti/v3_0_1/imsqti_metadatav3p0_v1p0.ts +73 -0
  147. package/src/qti/v3_0_1/imsqti_outcomev3p0p1_v1p0.ts +11 -0
  148. package/src/qti/v3_0_1/imsqti_responseprocessingv3p0p1_v1p0.ts +17 -0
  149. package/src/qti/v3_0_1/imsqti_resultv3p0_v1p0.ts +222 -0
  150. package/src/qti/v3_0_1/imsqti_sectionv3p0p1_v1p0.ts +15 -0
  151. package/src/qti/v3_0_1/imsqti_stimulusv3p0p1_v1p0.ts +15 -0
  152. package/src/qti/v3_0_1/imsqti_testv3p0p1_v1p0.ts +49 -0
  153. package/src/qti/v3_0_1/imsqti_usagedatav3p0_v1p0.ts +77 -0
  154. package/src/qti/v3_0_1/imsqtiv3p0_afa3p0pnp_v1p0.ts +269 -0
  155. package/src/qti/v3_0_1/index.ts +50 -0
  156. package/src/qti/v3_0_1/processing-internal.ts +667 -0
  157. package/src/qti/v3_0_1/shared.ts +146 -0
  158. package/src/qti/v3_0_1/variables-internal.ts +274 -0
  159. package/src/shared/imsx-status.ts +49 -0
  160. package/src/summary.ts +70 -0
  161. package/src/vc-data-model/v2_0/index.ts +27 -0
  162. package/src/vc-data-model/v2_0/shared.ts +206 -0
  163. package/src/xapi/index.ts +12 -0
  164. package/src/xapi/shared.ts +444 -0
  165. package/src/xapi/v1_0_3/index.ts +169 -0
  166. package/src/xapi/v2_0/index.ts +256 -0
  167. package/test/caliper-v1_2.test.ts +270 -0
  168. package/test/case-v1_1.test.ts +147 -0
  169. package/test/cat-v1_0.test.ts +338 -0
  170. package/test/cc-v1_4.test.ts +239 -0
  171. package/test/clr-v2_0.test.ts +225 -0
  172. package/test/cmi5-v1_0.test.ts +196 -0
  173. package/test/contracts.test.ts +125 -0
  174. package/test/fixtures/cmi5/extended-cmi5.xml +72 -0
  175. package/test/fixtures/cmi5/simple-cmi5.xml +26 -0
  176. package/test/lti.test.ts +146 -0
  177. package/test/oneroster-v1_2.test.ts +234 -0
  178. package/test/open-badges-v3_0.test.ts +144 -0
  179. package/test/qti-v2_1.test.ts +146 -0
  180. package/test/qti-v2_2.test.ts +154 -0
  181. package/test/qti-v3_0_1.test.ts +576 -0
  182. package/test/schema-examples.test.ts +101 -0
  183. package/test/vc-data-model-v2_0.test.ts +63 -0
  184. package/test/xapi.test.ts +384 -0
  185. package/tsconfig.json +7 -0
  186. package/vc-data-model-v2_0-zod-templates.md +43 -0
  187. package/xapi-zod-templates.md +95 -0
@@ -0,0 +1,247 @@
1
+ # Common Cartridge 1.4 candidate-final XSD bundle → Zod template notes
2
+
3
+ ## Published specification
4
+
5
+ - Public implementation guide consulted for this port: `https://www.imsglobal.org/spec/cc/v1p4/impl/`
6
+ - Likely published-final landing page: `https://www.imsglobal.org/spec/cc/v1p4`
7
+
8
+ This note accompanies the split source under `packages/contracts/src/common-cartridge/v1_4/`.
9
+
10
+ The Common Cartridge 1.4 candidate-final bundle is materially broader than the existing 1.3 bundle: it includes multiple manifest profiles, additional shared resource schemas, imported LTI support schemas, extension schemas, and VDEX support files. This document records the choices made to keep the 1.4 port close to the existing `v1_3` style while still matching the shape of the real source set.
11
+
12
+ ---
13
+
14
+ ## 1. What was analyzed
15
+
16
+ The templates are based on the local source bundle under `tmp/cc/v1_4/`:
17
+
18
+ - `core/`
19
+ - `thin/`
20
+ - `k12/`
21
+ - `shared/`
22
+ - `extension/`
23
+ - `vdex/`
24
+
25
+ Representative entry-point XSDs:
26
+
27
+ - `core/ccv1p4_imscp_v1p2_v1p0.xsd`
28
+ - `thin/ccv1p4_imscp_v1p2_v1p0.xsd`
29
+ - `k12/ccv1p4_imscp_v1p2_v1p0.xsd`
30
+ - `k12/ccv1p4_imscp_v1p2_v1p0.xsd.thin`
31
+ - `shared/ccv1p4_imslticc_v1p4.xsd`
32
+ - `extension/cc_extresource_assignmentv1p0_v1p0.xsd`
33
+ - `extension/ims_openvideov1p0_v1p0.xsd`
34
+ - `vdex/imsvdex_v1p0.xsd`
35
+
36
+ The candidate final implementation guide at `https://www.imsglobal.org/spec/cc/v1p4/impl` was also consulted to confirm the intended profile split and the relationship between the standard, Thin CC, and K-12 variants.
37
+
38
+ ---
39
+
40
+ ## 2. The main structural decision: mirror the source bundle layout
41
+
42
+ ### Problem
43
+
44
+ Common Cartridge 1.3 fit comfortably in one flat implementation directory because the source bundle itself was flat. Common Cartridge 1.4 does not:
45
+
46
+ - `core`, `thin`, and `k12` reuse several of the same filenames
47
+ - the K-12 directory contains both a standard manifest XSD and a separate `.xsd.thin` variant
48
+ - the shared/extension/vdex areas introduce several new families that are not just minor renames of 1.3 files
49
+
50
+ Flattening all of that into a single directory would require invented file renames for source collisions.
51
+
52
+ ### Decision
53
+
54
+ The port mirrors the source bundle under `src/common-cartridge/v1_4/`:
55
+
56
+ - `core/`
57
+ - `thin/`
58
+ - `k12/`
59
+ - `shared/`
60
+ - `extension/`
61
+ - `vdex/`
62
+
63
+ Shared helper modules remain at the version root:
64
+
65
+ - `shared.ts`
66
+ - `lom-internal.ts`
67
+ - `index.ts`
68
+
69
+ ### Rationale
70
+
71
+ This preserves the strongest existing convention — one TypeScript module per source XSD — while making the 1.4 profile split obvious instead of hiding it behind ad hoc file renames.
72
+
73
+ ---
74
+
75
+ ## 3. The package-surface decision: versioned namespaces at the root
76
+
77
+ ### Problem
78
+
79
+ Once a second Common Cartridge version is exported from the package root, flat re-exports collide immediately:
80
+
81
+ - `CommonCartridgeManifestProfileDocumentSchema`
82
+ - `LomManifestDocumentSchema`
83
+ - `CurriculumStandardsMetadataSetSchema`
84
+ - and many more
85
+
86
+ ### Decision
87
+
88
+ The package root now exports versioned namespaces for Common Cartridge:
89
+
90
+ - `CommonCartridgeV1_3`
91
+ - `CommonCartridgeV1_4`
92
+
93
+ The version barrel at `src/common-cartridge/v1_4/index.ts` still exports a flat surface **within the version**, because that remains convenient and collision-free inside a versioned namespace.
94
+
95
+ ### Rationale
96
+
97
+ This is the least disruptive way to support side-by-side versions without renaming every existing schema export in `v1_3`.
98
+
99
+ ---
100
+
101
+ ## 4. Profile handling decisions
102
+
103
+ ## 4.1 Core manifest profile
104
+
105
+ The core manifest module stays very close to the 1.3 implementation:
106
+
107
+ - updated resource type enumeration for 1.4
108
+ - updated manifest schema labels and `schemaversion`
109
+ - updated QTI resource type strings from `imscc_xmlv1p3` to `imscc_xmlv1p4`
110
+ - existing Schematron-derived duplicate/dependency/item checks carried forward
111
+
112
+ The main 1.4 additions in the resource type vocabulary are:
113
+
114
+ - `imsov_xmlv1p0`
115
+ - `imsov_zipv1p0`
116
+ - `imsqti_zipv3p0`
117
+
118
+ ## 4.2 Thin manifest profile
119
+
120
+ The Thin CC manifest genuinely differs structurally, so it has its own dedicated module rather than just a renamed alias:
121
+
122
+ - only `imsbasiclti_xmlv1p4` and `imswl_xmlv1p4` resource types are allowed
123
+ - dependency support is removed
124
+ - manifest-level authorizations are removed
125
+ - the resource body can carry embedded `cartridge_basiclti_link` or `webLink` XML
126
+
127
+ The Zod model therefore makes those embedded resource payloads explicit and validates that the inline XML matches the declared resource `type`.
128
+
129
+ ## 4.3 K-12 manifest profiles
130
+
131
+ The provided K-12 packaging XSDs are the tricky part.
132
+
133
+ The local `k12/ccv1p4_imscp_v1p2_v1p0.xsd` is effectively the same packaging grammar as the core manifest, and `k12/ccv1p4_imscp_v1p2_v1p0.xsd.thin` is effectively the Thin CC grammar. The stricter K-12 rules in the local bundle live primarily in the standalone K-12 LOM profile XSDs, not in a materially different manifest grammar.
134
+
135
+ ### Decision
136
+
137
+ The port treats the K-12 manifest modules as profile-specific aliases of the core and thin manifest schemas:
138
+
139
+ - `K12CommonCartridge...` aliases the core manifest surface
140
+ - `K12ThinCommonCartridge...` aliases the thin manifest surface
141
+
142
+ The standalone K-12 LOM schemas carry the extra K-12 metadata requirements.
143
+
144
+ ### Rationale
145
+
146
+ This follows the actual local source set instead of inventing packaging constraints that are not expressed in the shipped `imscp` XSDs.
147
+
148
+ This is one of the places where a different choice would have been possible: we could have added extra K-12 manifest-level refinements based on prose expectations alone. The implementation deliberately did **not** do that because the local packaging XSDs do not wire those stricter LOM profiles into the manifest imports.
149
+
150
+ ---
151
+
152
+ ## 5. LOM profile decisions
153
+
154
+ The shared `lom-internal.ts` still generates normalized LOM object schemas, but 1.4 adds more than one practical LOM profile:
155
+
156
+ - core manifest/resource
157
+ - Thin CC manifest/resource
158
+ - K-12 manifest/resource
159
+ - CC LTI link metadata
160
+
161
+ ### Decision
162
+
163
+ - core and thin manifest/resource LOM profiles remain loose-value profiles
164
+ - K-12 manifest LOM adds required `general.keyword`
165
+ - K-12 resource LOM adds required:
166
+ - `general`
167
+ - `general.title`
168
+ - `general.keyword`
169
+ - at least one `educational`
170
+ - `educational.intendedEndUserRole`
171
+ - `educational.typicalAgeRange`
172
+ - LTI link metadata keeps the tighter vocabulary-checked profile carried forward from 1.3
173
+
174
+ ### Rationale
175
+
176
+ This keeps the general LOM modeling approach unchanged while giving the K-12 standalone metadata documents the stricter rules that actually differ in the 1.4 bundle.
177
+
178
+ ---
179
+
180
+ ## 6. Shared/additional schema decisions
181
+
182
+ ## 6.1 `ccv1p4_imscsmd_v1p1.xsd`
183
+
184
+ This is the 1.3 curriculum-standards model with one meaningful additive change:
185
+
186
+ - `LabelledGUID.Type` adds optional `caseItemURI`
187
+
188
+ That was modeled directly.
189
+
190
+ ## 6.2 LTI support schemas
191
+
192
+ Common Cartridge 1.4 bundles more of the LTI support stack locally:
193
+
194
+ - `imslticm_v1p0`
195
+ - `imslticp_v1p0`
196
+ - `imsbasiclti_v1p0p1`
197
+ - `ccv1p4_imslticc_v1p4`
198
+
199
+ These are modeled as normalized nested objects rather than generic XML trees so that Thin CC embedded resources and standalone LTI descriptors are usable directly.
200
+
201
+ ## 6.3 Assignment, line item, and accessibility metadata
202
+
203
+ These three families map cleanly to plain objects:
204
+
205
+ - assignment extension
206
+ - AGS line item
207
+ - accessibility metadata
208
+
209
+ They are represented directly with only the obvious scalar/enum normalization.
210
+
211
+ ## 6.4 VDEX support files
212
+
213
+ The 1.4 bundle includes:
214
+
215
+ - `imsmd_loose_v1p3p2.xsd`
216
+ - `imsvdex_v1p0.xsd`
217
+
218
+ `imsmd_loose` is modeled as a standalone loose LOM document. `imsvdex` is modeled as a normalized vocabulary tree with recursive `term` nodes and a small refinement to detect duplicate `termIdentifier` values.
219
+
220
+ ## 6.5 Open Video
221
+
222
+ Open Video is the largest new schema family in the bundle.
223
+
224
+ ### Decision
225
+
226
+ It is modeled as an explicit normalized object graph rather than collapsed to generic XML, but the semantic refinements stay intentionally focused:
227
+
228
+ - duplicate contributor IDs
229
+ - duplicate recorder IDs
230
+ - `stream.recorderID` must reference an existing recorder
231
+
232
+ ### Rationale
233
+
234
+ This keeps the schema useful while avoiding a large amount of fragile hand-coded prose validation that would go beyond the level of rigor used elsewhere in the package.
235
+
236
+ ---
237
+
238
+ ## 7. Remaining approximations
239
+
240
+ The 1.4 port still makes a few deliberate approximations:
241
+
242
+ 1. K-12 manifest modules alias the core/thin packaging grammars instead of inventing additional manifest-level metadata rules.
243
+ 2. Open Video does not attempt to encode every prose-level invariant from the candidate final text.
244
+ 3. Thin/resource embedded XML is normalized to explicit `cartridge_basiclti_link` / `webLink` object slots instead of preserving heterogeneous XML child order.
245
+ 4. Remote include files such as the shared extension helper XSDs are still represented through the existing `XmlExtensionNode` / foreign-attribute pattern rather than being ported as literal helper ASTs.
246
+
247
+ These are intentional consistency choices, not omissions.
@@ -0,0 +1,117 @@
1
+ # Comprehensive Learner Record 2.0 JSON schema bundle -> Zod template notes
2
+
3
+ ## Published specification
4
+
5
+ - Main specification: `https://www.imsglobal.org/spec/clr/v2p0/`
6
+ - Main spec document: `https://www.imsglobal.org/spec/clr/v2p0/main/`
7
+ - JSON-LD context: `https://purl.imsglobal.org/spec/clr/v2p0/context-2.0.1.json`
8
+ - Published JSON schemas used for this port:
9
+ - `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_clrcredential_schema.json`
10
+ - `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_achievementcredential_schema.json`
11
+ - `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_endorsementcredential_schema.json`
12
+ - `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_getclrcredentialsresponse_schema.json`
13
+ - `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_profile_schema.json`
14
+ - `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_imsx_statusinfo_schema.json`
15
+
16
+ This note accompanies the versioned source under `packages/contracts/src/clr/v2_0/`.
17
+
18
+ ---
19
+
20
+ ## 1. What was implemented
21
+
22
+ CLR 2.0 is not an XSD family like the QTI and Common Cartridge ports. The published source of truth here is the JSON Schema and JSON-LD credential model bundle.
23
+
24
+ The port therefore models the published JSON-schema entry points rather than inventing XML-style document wrappers:
25
+
26
+ - `ClrCredentialSchema`
27
+ - `AchievementCredentialSchema`
28
+ - `EndorsementCredentialSchema`
29
+ - `GetClrCredentialsResponseSchema`
30
+ - `ProfileSchema`
31
+ - `ImsxStatusInfoSchema`
32
+
33
+ The version barrel exports these as `ClrV2_0`, and `Clr20DerivedZodTemplates` collects the published entry points in one place.
34
+
35
+ ---
36
+
37
+ ## 2. Main structural choice: extract shared VC/credential primitives
38
+
39
+ CLR 2.0 clearly overlaps with the same broader digital-credential model family used by Open Badges 3.0:
40
+
41
+ - `AchievementCredential`
42
+ - `EndorsementCredential`
43
+ - `Profile`
44
+ - `Achievement`
45
+ - `Result`
46
+ - `Proof`
47
+ - and the surrounding verifiable-credential primitives
48
+
49
+ The implementation now uses a shared versioned layer for common primitives:
50
+
51
+ - `src/vc-data-model/v2_0/` for VC-level/shared primitives
52
+ - `src/open-badges/v3_0/shared.ts` for the shared OB/CLR credential model graph
53
+
54
+ CLR composes from that shared model and keeps only CLR-specific wrappers in `src/clr/v2_0/`.
55
+
56
+ ### Rationale
57
+
58
+ - it removes duplicated credential-model logic between CLR and Open Badges
59
+ - it keeps VC/credential semantics aligned across both standards
60
+ - it still preserves versioned, explicit standard surfaces at the package boundary
61
+
62
+ ---
63
+
64
+ ## 3. Main validation choice: prefer normative credential arrays over the JSON-LD compaction fallback
65
+
66
+ The published JSON Schema files are adapted for JSON-LD compaction, so several properties are more permissive than the underlying normative intent:
67
+
68
+ - credential `@context`
69
+ - credential `type`
70
+ - several single-or-array properties
71
+
72
+ For the Zod port, the repeated-value properties still accept either a single value or an array where that is useful for real payloads, but the key credential identity fields are intentionally made more semantic:
73
+
74
+ - `ClrCredential` requires a credential `type` array containing `VerifiableCredential` and `ClrCredential`
75
+ - `AchievementCredential` requires `VerifiableCredential` and one of `AchievementCredential` / `OpenBadgeCredential`
76
+ - `EndorsementCredential` requires `VerifiableCredential` and `EndorsementCredential`
77
+ - credential `@context` arrays are validated against the expected CLR / OB / VC ordering rather than accepting any arbitrary single context value
78
+
79
+ ### Rationale
80
+
81
+ The published JSON Schema bundle under-enforces some of those rules in order to support JSON-LD compaction patterns. For this repo, the more useful default is to validate the portable, explicit credential shapes that implementers are most likely to exchange.
82
+
83
+ ---
84
+
85
+ ## 4. Extensibility choice: preserve open object surfaces where the spec does
86
+
87
+ Most CLR credential-model objects are extensible in the published JSON Schema bundle.
88
+
89
+ The Zod port mirrors that with passthrough object schemas for the credential-model objects, while the stricter API-envelope schemas remain strict:
90
+
91
+ - passthrough for credential/profile/achievement-style objects
92
+ - strict for `GetClrCredentialsResponse`
93
+ - strict for `ImsxStatusInfo`
94
+
95
+ ### Rationale
96
+
97
+ This keeps the CLR credential objects usable for real JSON-LD / extension-heavy payloads without silently tightening the spec into a closed-world model.
98
+
99
+ ---
100
+
101
+ ## 5. Public surface and naming
102
+
103
+ The contracts package now exposes CLR 2.0 in the same style as the other standards:
104
+
105
+ - package-root namespace: `ClrV2_0`
106
+ - package subpath: `@conform-ed/contracts/clr/v2_0`
107
+
108
+ The source modules mirror the published schema artifact names where that remains useful:
109
+
110
+ - `clr_v2p0_clrcredential_schema.ts`
111
+ - `clr_v2p0_achievementcredential_schema.ts`
112
+ - `clr_v2p0_endorsementcredential_schema.ts`
113
+ - `clr_v2p0_profile_schema.ts`
114
+ - `clr_v2p0_getclrcredentialsresponse_schema.ts`
115
+ - `clr_v2p0_imsx_statusinfo_schema.ts`
116
+
117
+ with `shared.ts` holding the common credential-model pieces used across those entry points.
@@ -0,0 +1,9 @@
1
+ # cmi5 schema notes
2
+
3
+ The cmi5 contract bundle models the Quartz course-structure XML surface:
4
+
5
+ - `Cmi5V1_0.CourseStructureDocument` — combined courseStructure document and keyword extension
6
+ - `Cmi5V1_0.CourseStructure` — course, objectives, and recursive AU/block tree
7
+ - `Cmi5V1_0.KeywordExtension` — keyword dictionary used by the extension examples
8
+
9
+ This bundle intentionally covers the XML data model from the spec artifacts; runtime xAPI launch/state/statement behavior stays in the cmi5 apps.
@@ -0,0 +1,11 @@
1
+ # LTI schema notes
2
+
3
+ The LTI contract bundle is split by spec family:
4
+
5
+ - `LtiV1_3` — normalized LTI 1.3 core launch claims
6
+ - `LtiDeepLinkingV2_0` — deep linking request settings and response content items
7
+ - `LtiAgsV2_0` — assignment and grade services endpoint, line item, score, and result payloads
8
+ - `LtiNrpsV2_0` — names and roles service claim plus membership container
9
+ - `LtiProctoringV1_0` — proctoring launch messages and assessment-control payloads
10
+
11
+ The schemas use normalized camelCase field names so they are easy to use from the adapter reference app and runner fixtures.
@@ -0,0 +1,76 @@
1
+ # OneRoster 1.2 JSON schema/OpenAPI bundle -> Zod template notes
2
+
3
+ ## Published specification
4
+
5
+ - Main specification: `https://www.imsglobal.org/spec/oneroster/v1p2/`
6
+ - Rostering service information model: `https://www.imsglobal.org/spec/oneroster/v1p2/rostering/info`
7
+ - Rostering service REST binding: `https://www.imsglobal.org/spec/oneroster/v1p2/rostering/bind/rest`
8
+ - Rostering REST binding permalink: `https://www.imsglobal.org/spec/oneroster/v1p2/rostering-restbinding/`
9
+ - Gradebook service information model: `https://www.imsglobal.org/spec/oneroster/v1p2/gradebook/info`
10
+ - Gradebook service REST binding: `https://www.imsglobal.org/spec/oneroster/v1p2/gradebook/bind/rest`
11
+ - Gradebook REST binding permalink: `https://www.imsglobal.org/spec/oneroster/v1p2/gradebook-restbinding/`
12
+ - Resource service information model: `https://www.imsglobal.org/spec/oneroster/v1p2/resource/info`
13
+ - Resource service REST binding: `https://www.imsglobal.org/spec/oneroster/v1p2/resource/bind/rest`
14
+ - Resource REST binding permalink: `https://www.imsglobal.org/spec/oneroster/v1p2/resources-restbinding/`
15
+ - CSV binding: `https://www.imsglobal.org/spec/oneroster/v1p2/bind/csv/`
16
+ - OpenAPI 3 JSON sources used directly:
17
+ - `https://purl.imsglobal.org/spec/or/v1p2/schema/openapi/onerosterv1p2rostersservice_openapi3_v1p0.json`
18
+ - `https://purl.imsglobal.org/spec/or/v1p2/schema/openapi/onerosterv1p2gradebookservice_openapi3_v1p0.json`
19
+ - `https://purl.imsglobal.org/spec/or/v1p2/schema/openapi/onerosterv1p2resourcesservice_openapi3_v1p0.json`
20
+
21
+ This note accompanies `packages/contracts/src/oneroster/v1_2/`.
22
+
23
+ ---
24
+
25
+ ## 1. What was implemented
26
+
27
+ This port models:
28
+
29
+ - rostering
30
+ - gradebook
31
+ - resource
32
+ - endpoint-specific REST binding operation payload contracts for all published operations
33
+ - CSV binding row/document/package contracts for the published CSV files
34
+
35
+ The public package surface is:
36
+
37
+ - root namespace: `OneRosterV1_2`
38
+ - subpath export: `@conform-ed/contracts/oneroster/v1_2`
39
+
40
+ The version barrel publishes the service schemas and `OneRoster12DerivedZodTemplates`.
41
+
42
+ ---
43
+
44
+ ## 2. Structural choices
45
+
46
+ The implementation is split into:
47
+
48
+ - `shared.ts` for common primitives (`metadata`, status vocabularies, GUID refs, IMSX status envelope)
49
+ - `or_v1p2_rostering_service_schema.ts`
50
+ - `or_v1p2_gradebook_service_schema.ts`
51
+ - `or_v1p2_resource_service_schema.ts`
52
+ - `or_v1p2_rostering_restbinding_schema.ts`
53
+ - `or_v1p2_gradebook_restbinding_schema.ts`
54
+ - `or_v1p2_resource_restbinding_schema.ts`
55
+ - `or_v1p2_csv_binding_schema.ts`
56
+
57
+ This mirrors the OneRoster 1.2 service split and avoids duplicating shared shapes across services.
58
+
59
+ ---
60
+
61
+ ## 3. Validation choices
62
+
63
+ - objects marked `additionalProperties: false` in the published OpenAPI schemas are modeled as strict Zod objects
64
+ - `MetadataDType` and `CredentialDType` stay open where the source model is open
65
+ - extensible vocabularies are modeled as:
66
+ - defined enum values
67
+ - plus `ext:*` custom values where the specification allows extension tokens
68
+ - date/date-time and URI fields use explicit ISO/URL validators
69
+
70
+ ---
71
+
72
+ ## 4. CSV binding modeling choice
73
+
74
+ The CSV layer is modeled as raw row/document schemas (string cell values) keyed by published column headers, plus a package-level aggregate schema.
75
+
76
+ For manifest keys that appear in the spec with trailing `*` markers, the schema accepts both starred and unstarred variants and requires at least one to be present.
@@ -0,0 +1,66 @@
1
+ # Open Badges 3.0 JSON schema bundle -> Zod template notes
2
+
3
+ ## Published specification
4
+
5
+ - Main specification: `https://www.imsglobal.org/spec/ob/v3p0/`
6
+ - Main spec document: `https://www.imsglobal.org/spec/ob/v3p0/main/`
7
+ - Implementation guide: `https://www.imsglobal.org/spec/ob/v3p0/impl/`
8
+ - JSON-LD context: `https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json`
9
+ - Published JSON schemas used for this port:
10
+ - `https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_achievementcredential_schema.json`
11
+ - `https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_endorsementcredential_schema.json`
12
+ - `https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_getopenbadgecredentialsresponse_schema.json`
13
+ - `https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_profile_schema.json`
14
+ - `https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_imsx_statusinfo_schema.json`
15
+
16
+ This note accompanies `packages/contracts/src/open-badges/v3_0/`.
17
+
18
+ ---
19
+
20
+ ## 1. What was implemented
21
+
22
+ The Open Badges 3.0 port models the published JSON-schema entry points directly:
23
+
24
+ - `AchievementCredentialSchema` (`OpenBadgeCredentialSchema` alias)
25
+ - `EndorsementCredentialSchema`
26
+ - `GetOpenBadgeCredentialsResponseSchema`
27
+ - `ProfileSchema`
28
+ - `ImsxStatusInfoSchema`
29
+
30
+ The version barrel exports these as `OpenBadgesV3_0`, and `OpenBadges30DerivedZodTemplates` groups the top-level published entries.
31
+
32
+ ---
33
+
34
+ ## 2. Shared-model choice
35
+
36
+ Open Badges 3.0 and CLR 2.0 reuse almost the same credential model graph (Achievement, Profile, EndorsementCredential, Result, Proof, and related primitives). Rather than duplicating those pieces again, this port centralizes the cross-standard primitives in:
37
+
38
+ - `src/vc-data-model/v2_0/` for VC-level/shared credential primitives
39
+ - `src/open-badges/v3_0/shared.ts` for OB-specific profile/achievement structures
40
+
41
+ CLR now composes from this same OB/VC model layer.
42
+
43
+ ---
44
+
45
+ ## 3. Validation strictness choice
46
+
47
+ Like CLR, the OB 3.0 schemas are JSON-LD-compaction-friendly and permissive in places. The Zod port keeps extension-friendly object surfaces, but tightens core credential identity semantics:
48
+
49
+ - `AchievementCredential` requires `VerifiableCredential` plus one of `AchievementCredential` / `OpenBadgeCredential`
50
+ - `EndorsementCredential` requires `VerifiableCredential` plus `EndorsementCredential`
51
+ - `@context` ordering enforces expected OB 3.0 context prefixes while still allowing additional context entries
52
+
53
+ ---
54
+
55
+ ## 4. Public surface and naming
56
+
57
+ - package-root namespace: `OpenBadgesV3_0`
58
+ - package subpath: `@conform-ed/contracts/open-badges/v3_0`
59
+
60
+ Source modules mirror the published artifact names:
61
+
62
+ - `ob_v3p0_achievementcredential_schema.ts`
63
+ - `ob_v3p0_endorsementcredential_schema.ts`
64
+ - `ob_v3p0_getopenbadgecredentialsresponse_schema.ts`
65
+ - `ob_v3p0_profile_schema.ts`
66
+ - `ob_v3p0_imsx_statusinfo_schema.ts`
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@conform-ed/contracts",
3
+ "version": "0.0.3",
4
+ "type": "module",
5
+ "module": "src/index.ts",
6
+ "exports": {
7
+ ".": "./src/index.ts",
8
+ "./caliper/v1_2": "./src/caliper/v1_2/index.ts",
9
+ "./case/v1_1": "./src/case/v1_1/index.ts",
10
+ "./cat/v1_0": "./src/cat/v1_0/index.ts",
11
+ "./clr/v2_0": "./src/clr/v2_0/index.ts",
12
+ "./common-cartridge/v1_3": "./src/common-cartridge/v1_3/index.ts",
13
+ "./common-cartridge/v1_4": "./src/common-cartridge/v1_4/index.ts",
14
+ "./cmi5": "./src/cmi5/index.ts",
15
+ "./cmi5/v1_0": "./src/cmi5/v1_0/index.ts",
16
+ "./xapi": "./src/xapi/index.ts",
17
+ "./xapi/v1_0_3": "./src/xapi/v1_0_3/index.ts",
18
+ "./xapi/v2_0": "./src/xapi/v2_0/index.ts",
19
+ "./lti": "./src/lti/index.ts",
20
+ "./lti/ags/v2_0": "./src/lti/ags/v2_0/index.ts",
21
+ "./lti/deep-linking/v2_0": "./src/lti/deep-linking/v2_0/index.ts",
22
+ "./lti/nrps/v2_0": "./src/lti/nrps/v2_0/index.ts",
23
+ "./lti/proctoring/v1_0": "./src/lti/proctoring/v1_0/index.ts",
24
+ "./lti/v1_3": "./src/lti/v1_3/index.ts",
25
+ "./open-badges/v3_0": "./src/open-badges/v3_0/index.ts",
26
+ "./oneroster/v1_2": "./src/oneroster/v1_2/index.ts",
27
+ "./qti/v2_1": "./src/qti/v2_1/index.ts",
28
+ "./qti/v2_2": "./src/qti/v2_2/index.ts",
29
+ "./qti/v3_0_1": "./src/qti/v3_0_1/index.ts",
30
+ "./vc-data-model/v2_0": "./src/vc-data-model/v2_0/index.ts"
31
+ },
32
+ "scripts": {
33
+ "build": "tsgo --noEmit",
34
+ "typecheck": "tsgo --noEmit",
35
+ "lint": "oxlint --config ../../.oxlintrc.jsonc .",
36
+ "format": "oxfmt --config ../../.oxfmtrc.jsonc --check .",
37
+ "test": "bun test"
38
+ },
39
+ "devDependencies": {
40
+ "fast-xml-parser": "^5.3.1"
41
+ }
42
+ }
@@ -0,0 +1,45 @@
1
+ # QTI 2.1 Zod templates
2
+
3
+ ## Published specification
4
+
5
+ - Overview: `https://www.imsglobal.org/question/qtiv2p1/imsqti_oviewv2p1.html`
6
+ - Assessment/item/test information model: `https://www.imsglobal.org/question/qtiv2p1/imsqti_infov2p1.html`
7
+ - Results Reporting v2.1: `https://www.imsglobal.org/question/qtiv2p1/imsqti_resultv2p1.html`
8
+
9
+ `tmp/qti/2.1/` ships a small bundle of entry-point XSDs plus imported helper trees (`metadata/`, `other/`). The implementation lives in `packages/contracts/src/qti/v2_1/` and follows the same normalized parsed-XML style as the existing QTI 3.0.1 port: arrays are pluralized, embedded XML extension points are normalized into explicit `extensions` / `foreignAttributes`, and public entry points are exposed as document schemas plus a version registry.
10
+
11
+ ## Implementation shape
12
+
13
+ - `imsqti_v2p1p2.ts` covers the main assessment object family:
14
+ - `assessmentItem`
15
+ - `assessmentSection`
16
+ - `assessmentTest`
17
+ - declarations
18
+ - processing fragments
19
+ - item body / feedback / interaction nodes
20
+ - `imsqti_metadata_v2p1.ts` covers `qtiMetadata`
21
+ - `imsqti_result_v2p1.ts` covers `assessmentResult`
22
+ - `imsqti_usagedata_v2p1.ts` covers `usageData`
23
+ - `qtiv2p1_imscpv1p2_v1p0.ts` covers the QTI 2.1 content-package profile
24
+ - `apipv1p0_qtiextv2p1_v1p0.ts` covers the APIP accessibility extension surface used from items/feedback
25
+
26
+ ## Key choices
27
+
28
+ 1. QTI 2.1 and QTI 2.2 share one internal 2.x implementation core because the source domain model is structurally the same; the version directories only specialize the places where the bundles materially differ.
29
+ 2. HTML / XHTML / MathML body content is normalized as generic recursive content nodes instead of one exported Zod schema per markup tag. The domain objects still stay explicit, but the huge markup vocabulary remains tractable.
30
+ 3. APIP is modeled as a focused normalized accessibility surface rather than a full schema-for-schema transcription of every auxiliary APIP type. The item-facing accessibility structures are explicit; deeper companion-material payload details stay permissive.
31
+ 4. The bundled MathML helper tree is incomplete locally. That does not block the port because those imported vocabularies are treated as generic normalized content subtrees rather than locally-resolved schema dependencies.
32
+
33
+ ## QTI Results Reporting assessment (v2.1)
34
+
35
+ QTI Results Reporting is published as a distinct document set within the QTI family, but for implementation purposes in this repo it is already covered in the versioned QTI contract surface:
36
+
37
+ - `imsqti_result_v2p1.ts` exposes `QtiAssessmentResultDocumentSchema`
38
+ - `imsqti_usagedata_v2p1.ts` exposes `QtiUsageDataDocumentSchema`
39
+ - `src/qti/v2_1/index.ts` includes both under `Qti21DerivedZodTemplates`
40
+
41
+ Assessment outcome for v2.1:
42
+
43
+ 1. It is a separate spec document family, but not a separate package requirement in this repo.
44
+ 2. Current coverage is functionally in place for results (`assessmentResult`) and usage (`usageData`) document entry points.
45
+ 3. No additional standalone `qti-results-reporting` package is required unless we later want a cross-version aggregate facade.
@@ -0,0 +1,32 @@
1
+ # QTI 2.2 Zod templates
2
+
3
+ ## Published specification
4
+
5
+ - Overview: `https://www.imsglobal.org/question/qtiv2p2/imsqti_v2p2_oview.html`
6
+
7
+ `tmp/qti/2.2/` extends the 2.1 model with stimulus documents, HTML5 helper XSDs, curriculum standards metadata, richer APIP accessibility, and a larger QTI content-package profile. The implementation lives in `packages/contracts/src/qti/v2_2/` and keeps the same normalized public style as the rest of this package.
8
+
9
+ ## Implementation shape
10
+
11
+ - `imsqti_v2p2p4.ts` covers the main assessment object family:
12
+ - `assessmentItem`
13
+ - `assessmentSection`
14
+ - `assessmentStimulus`
15
+ - `assessmentTest`
16
+ - declarations
17
+ - processing fragments
18
+ - item / stimulus body / feedback / interaction nodes
19
+ - `imsqtiv2p2p4_html5_v1p0.ts` exports the normalized HTML5-oriented content helpers used by the main schemas
20
+ - `imsqti_metadata_v2p2.ts` covers `qtiMetadata`
21
+ - `imsqti_result_v2p2.ts` covers `assessmentResult`
22
+ - `imsqti_usagedata_v2p2.ts` covers `usageData`
23
+ - `qtiv2p2_csm_v2p2.ts` covers curriculum standards metadata
24
+ - `qtiv2p2_imscpv1p2_v1p0.ts` covers the QTI 2.2 packaging profile
25
+ - `apipv1p0_qtiextv2p2_v1p0p1.ts` covers the APIP accessibility extension surface
26
+
27
+ ## Key choices
28
+
29
+ 1. QTI 2.2 reuses the shared 2.x internal implementation with version-specific switches for stimulus support, scoring-mode metadata, curriculum standards metadata, APIP supplemental accessibility, and packaging resource types.
30
+ 2. The HTML5 XSD is represented by normalized generic content nodes instead of hundreds of exported per-tag schemas. This matches the practical role of those types in the source bundle: markup containers, not core assessment domain objects.
31
+ 3. `assessmentStimulus` and `assessmentStimulusRef` are modeled explicitly because they are a real 2.2 domain addition, not merely more markup.
32
+ 4. The local bundle is also missing the full imported MathML / SSML support trees. As with 2.1, that is treated as a content-vocabulary concern rather than a blocker for the QTI domain/object schemas.