coursecode 0.1.0

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 (362) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +322 -0
  3. package/THIRD_PARTY_NOTICES.md +22 -0
  4. package/bin/cli.js +331 -0
  5. package/framework/assets/logo-coursecode-black.svg +14 -0
  6. package/framework/assets/logo-coursecode-white.svg +14 -0
  7. package/framework/assets/logo-coursecode.svg +14 -0
  8. package/framework/css/01-base.css +160 -0
  9. package/framework/css/02-layout.css +499 -0
  10. package/framework/css/accessibility.css +834 -0
  11. package/framework/css/components/accordions.css +710 -0
  12. package/framework/css/components/assessments.css +520 -0
  13. package/framework/css/components/audio-player.css +570 -0
  14. package/framework/css/components/badges.css +80 -0
  15. package/framework/css/components/breadcrumbs.css +87 -0
  16. package/framework/css/components/buttons.css +707 -0
  17. package/framework/css/components/callouts.css +1280 -0
  18. package/framework/css/components/cards.css +475 -0
  19. package/framework/css/components/carousel.css +193 -0
  20. package/framework/css/components/checkbox-group.css +123 -0
  21. package/framework/css/components/checklist.css +203 -0
  22. package/framework/css/components/collapse.css +96 -0
  23. package/framework/css/components/comparison.css +33 -0
  24. package/framework/css/components/content-image.css +36 -0
  25. package/framework/css/components/document-gallery.css +425 -0
  26. package/framework/css/components/dropdown.css +115 -0
  27. package/framework/css/components/embed-frame.css +142 -0
  28. package/framework/css/components/engagement.css +412 -0
  29. package/framework/css/components/features.css +35 -0
  30. package/framework/css/components/flip-cards.css +253 -0
  31. package/framework/css/components/footer.css +353 -0
  32. package/framework/css/components/forms.css +294 -0
  33. package/framework/css/components/hero.css +216 -0
  34. package/framework/css/components/images.css +528 -0
  35. package/framework/css/components/interactive-timeline.css +274 -0
  36. package/framework/css/components/intro-cards.css +30 -0
  37. package/framework/css/components/lightbox.css +666 -0
  38. package/framework/css/components/loading.css +65 -0
  39. package/framework/css/components/modals.css +235 -0
  40. package/framework/css/components/notifications.css +107 -0
  41. package/framework/css/components/quote.css +150 -0
  42. package/framework/css/components/sidebar.css +684 -0
  43. package/framework/css/components/slide-header.css +52 -0
  44. package/framework/css/components/spinner.css +62 -0
  45. package/framework/css/components/stats.css +44 -0
  46. package/framework/css/components/steps.css +232 -0
  47. package/framework/css/components/tables.css +90 -0
  48. package/framework/css/components/tabs.css +347 -0
  49. package/framework/css/components/timeline.css +154 -0
  50. package/framework/css/components/toggle.css +95 -0
  51. package/framework/css/components/tooltip.css +226 -0
  52. package/framework/css/components/video-player.css +438 -0
  53. package/framework/css/design-tokens.css +707 -0
  54. package/framework/css/framework.css +86 -0
  55. package/framework/css/interactions/accessibility.css +75 -0
  56. package/framework/css/interactions/base.css +92 -0
  57. package/framework/css/interactions/drag-drop.css +295 -0
  58. package/framework/css/interactions/fill-in-the-blank.css +236 -0
  59. package/framework/css/interactions/hotspots.css +69 -0
  60. package/framework/css/interactions/index.css +45 -0
  61. package/framework/css/interactions/interactive-image.css +359 -0
  62. package/framework/css/interactions/likert.css +126 -0
  63. package/framework/css/interactions/matching.css +354 -0
  64. package/framework/css/interactions/numeric-input.css +78 -0
  65. package/framework/css/interactions/sequencing.css +378 -0
  66. package/framework/css/interactions/true-false.css +177 -0
  67. package/framework/css/layouts/article.css +258 -0
  68. package/framework/css/layouts/base.css +30 -0
  69. package/framework/css/layouts/canvas.css +38 -0
  70. package/framework/css/layouts/focused.css +236 -0
  71. package/framework/css/layouts/index.css +29 -0
  72. package/framework/css/layouts/presentation.css +191 -0
  73. package/framework/css/layouts/traditional.css +52 -0
  74. package/framework/css/responsive.css +439 -0
  75. package/framework/css/utilities/accessibility-utils.css +59 -0
  76. package/framework/css/utilities/animations.css +419 -0
  77. package/framework/css/utilities/borders.css +72 -0
  78. package/framework/css/utilities/colors.css +76 -0
  79. package/framework/css/utilities/container.css +46 -0
  80. package/framework/css/utilities/decorative.css +442 -0
  81. package/framework/css/utilities/display.css +257 -0
  82. package/framework/css/utilities/flexbox.css +80 -0
  83. package/framework/css/utilities/grid.css +69 -0
  84. package/framework/css/utilities/icons.css +534 -0
  85. package/framework/css/utilities/lists.css +190 -0
  86. package/framework/css/utilities/spacing.css +167 -0
  87. package/framework/css/utilities/tables.css +81 -0
  88. package/framework/css/utilities/typography.css +159 -0
  89. package/framework/css/utilities/visibility.css +117 -0
  90. package/framework/docs/COURSE_AUTHORING_GUIDE.md +1773 -0
  91. package/framework/docs/COURSE_OUTLINE_GUIDE.md +725 -0
  92. package/framework/docs/COURSE_OUTLINE_TEMPLATE.md +161 -0
  93. package/framework/docs/DATA_MODEL.md +409 -0
  94. package/framework/docs/FRAMEWORK_GUIDE.md +1088 -0
  95. package/framework/docs/USER_GUIDE.md +583 -0
  96. package/framework/docs/examples/cloudflare-channel-relay.js +169 -0
  97. package/framework/docs/examples/cloudflare-data-worker.js +102 -0
  98. package/framework/docs/examples/cloudflare-error-worker.js +228 -0
  99. package/framework/index.html +175 -0
  100. package/framework/js/app/AppActions.js +410 -0
  101. package/framework/js/app/AppState.js +225 -0
  102. package/framework/js/app/AppUI.js +616 -0
  103. package/framework/js/assessment/AssessmentActions.js +615 -0
  104. package/framework/js/assessment/AssessmentFactory.js +471 -0
  105. package/framework/js/assessment/AssessmentState.js +322 -0
  106. package/framework/js/assessment/AssessmentUI.js +451 -0
  107. package/framework/js/automation/api-engagement.js +196 -0
  108. package/framework/js/automation/api-interactions.js +167 -0
  109. package/framework/js/automation/api.js +242 -0
  110. package/framework/js/automation/index.js +41 -0
  111. package/framework/js/components/interactions/drag-drop.js +884 -0
  112. package/framework/js/components/interactions/fill-in.js +535 -0
  113. package/framework/js/components/interactions/hotspot.js +702 -0
  114. package/framework/js/components/interactions/interaction-base.js +511 -0
  115. package/framework/js/components/interactions/likert.js +301 -0
  116. package/framework/js/components/interactions/matching.js +699 -0
  117. package/framework/js/components/interactions/multiple-choice.js +377 -0
  118. package/framework/js/components/interactions/numeric.js +271 -0
  119. package/framework/js/components/interactions/sequencing.js +423 -0
  120. package/framework/js/components/interactions/true-false.js +241 -0
  121. package/framework/js/components/ui-components/accordion.js +442 -0
  122. package/framework/js/components/ui-components/alert.js +88 -0
  123. package/framework/js/components/ui-components/audio-player.js +1193 -0
  124. package/framework/js/components/ui-components/callout.js +121 -0
  125. package/framework/js/components/ui-components/carousel.js +145 -0
  126. package/framework/js/components/ui-components/checkbox-group.js +87 -0
  127. package/framework/js/components/ui-components/checklist.js +40 -0
  128. package/framework/js/components/ui-components/collapse.js +114 -0
  129. package/framework/js/components/ui-components/comparison.js +30 -0
  130. package/framework/js/components/ui-components/conditional-display.js +150 -0
  131. package/framework/js/components/ui-components/content-image.js +41 -0
  132. package/framework/js/components/ui-components/dropdown.js +262 -0
  133. package/framework/js/components/ui-components/embed-frame.js +274 -0
  134. package/framework/js/components/ui-components/features.js +33 -0
  135. package/framework/js/components/ui-components/flip-card.js +230 -0
  136. package/framework/js/components/ui-components/form-validator.js +76 -0
  137. package/framework/js/components/ui-components/hero.js +49 -0
  138. package/framework/js/components/ui-components/index.js +12 -0
  139. package/framework/js/components/ui-components/interactive-image.js +235 -0
  140. package/framework/js/components/ui-components/interactive-timeline.js +285 -0
  141. package/framework/js/components/ui-components/intro-cards.js +35 -0
  142. package/framework/js/components/ui-components/lightbox.js +652 -0
  143. package/framework/js/components/ui-components/modal.js +386 -0
  144. package/framework/js/components/ui-components/notifications.js +145 -0
  145. package/framework/js/components/ui-components/progress.js +88 -0
  146. package/framework/js/components/ui-components/quote.js +41 -0
  147. package/framework/js/components/ui-components/stats.js +33 -0
  148. package/framework/js/components/ui-components/steps.js +41 -0
  149. package/framework/js/components/ui-components/tabs.js +255 -0
  150. package/framework/js/components/ui-components/timeline.js +42 -0
  151. package/framework/js/components/ui-components/toggle-group.js +73 -0
  152. package/framework/js/components/ui-components/tooltip.js +458 -0
  153. package/framework/js/components/ui-components/value-display.js +133 -0
  154. package/framework/js/components/ui-components/video-player.js +686 -0
  155. package/framework/js/core/component-catalog.js +121 -0
  156. package/framework/js/core/event-bus.js +178 -0
  157. package/framework/js/core/interaction-catalog.js +149 -0
  158. package/framework/js/dev/runtime-linter.js +1725 -0
  159. package/framework/js/drivers/cmi5-driver.js +768 -0
  160. package/framework/js/drivers/driver-factory.js +77 -0
  161. package/framework/js/drivers/driver-interface.js +110 -0
  162. package/framework/js/drivers/http-driver-base.js +241 -0
  163. package/framework/js/drivers/lti-driver.js +508 -0
  164. package/framework/js/drivers/proxy-driver.js +444 -0
  165. package/framework/js/drivers/scorm-12-driver.js +560 -0
  166. package/framework/js/drivers/scorm-2004-driver.js +775 -0
  167. package/framework/js/drivers/scorm-driver-base.js +112 -0
  168. package/framework/js/engagement/engagement-manager.js +404 -0
  169. package/framework/js/engagement/engagement-progress.js +191 -0
  170. package/framework/js/engagement/engagement-trackers.js +215 -0
  171. package/framework/js/engagement/requirement-strategies.js +268 -0
  172. package/framework/js/main.js +727 -0
  173. package/framework/js/managers/accessibility-manager.js +499 -0
  174. package/framework/js/managers/assessment-manager.js +230 -0
  175. package/framework/js/managers/audio-manager.js +944 -0
  176. package/framework/js/managers/comment-manager.js +88 -0
  177. package/framework/js/managers/flag-manager.js +86 -0
  178. package/framework/js/managers/interaction-manager.js +254 -0
  179. package/framework/js/managers/interaction-registry.js +96 -0
  180. package/framework/js/managers/objective-manager.js +423 -0
  181. package/framework/js/managers/score-manager.js +441 -0
  182. package/framework/js/managers/video-manager.js +536 -0
  183. package/framework/js/navigation/Breadcrumbs.js +234 -0
  184. package/framework/js/navigation/NavigationActions.js +1132 -0
  185. package/framework/js/navigation/NavigationState.js +276 -0
  186. package/framework/js/navigation/NavigationUI.js +574 -0
  187. package/framework/js/navigation/document-gallery.js +357 -0
  188. package/framework/js/navigation/navigation-helpers.js +175 -0
  189. package/framework/js/navigation/navigation-validators.js +174 -0
  190. package/framework/js/state/index.js +8 -0
  191. package/framework/js/state/lms-connection.js +482 -0
  192. package/framework/js/state/lms-error-utils.js +58 -0
  193. package/framework/js/state/state-commits.js +200 -0
  194. package/framework/js/state/state-domains.js +86 -0
  195. package/framework/js/state/state-manager.js +502 -0
  196. package/framework/js/state/state-validation.js +311 -0
  197. package/framework/js/state/transaction-log.js +41 -0
  198. package/framework/js/state/xapi-statement-service.js +325 -0
  199. package/framework/js/utilities/access-control.js +99 -0
  200. package/framework/js/utilities/breakpoint-manager.js +315 -0
  201. package/framework/js/utilities/canvas-slide.js +35 -0
  202. package/framework/js/utilities/conditional-display.js +388 -0
  203. package/framework/js/utilities/course-channel.js +214 -0
  204. package/framework/js/utilities/course-helpers.js +420 -0
  205. package/framework/js/utilities/data-reporter.js +273 -0
  206. package/framework/js/utilities/error-reporter.js +313 -0
  207. package/framework/js/utilities/hotspot-helper.js +341 -0
  208. package/framework/js/utilities/icons.js +348 -0
  209. package/framework/js/utilities/logger.js +92 -0
  210. package/framework/js/utilities/markdown-renderer.js +45 -0
  211. package/framework/js/utilities/scroll-tracker.js +68 -0
  212. package/framework/js/utilities/ui-initializer.js +146 -0
  213. package/framework/js/utilities/utilities.js +293 -0
  214. package/framework/js/utilities/view-manager.js +227 -0
  215. package/framework/js/validation/html-validators.js +422 -0
  216. package/framework/js/validation/scorm-validators.js +438 -0
  217. package/framework/js/vendor/pipwerks.js +931 -0
  218. package/framework/scripts/generate-narration.js +629 -0
  219. package/framework/scripts/tts-providers/azure-provider.js +178 -0
  220. package/framework/scripts/tts-providers/base-provider.js +81 -0
  221. package/framework/scripts/tts-providers/deepgram-provider.js +135 -0
  222. package/framework/scripts/tts-providers/elevenlabs-provider.js +148 -0
  223. package/framework/scripts/tts-providers/google-provider.js +272 -0
  224. package/framework/scripts/tts-providers/index.js +158 -0
  225. package/framework/scripts/tts-providers/openai-provider.js +143 -0
  226. package/framework/version.json +63 -0
  227. package/lib/authoring-api.js +919 -0
  228. package/lib/build-linter.js +450 -0
  229. package/lib/build-packaging.js +186 -0
  230. package/lib/build.js +88 -0
  231. package/lib/cloud.js +691 -0
  232. package/lib/convert.js +341 -0
  233. package/lib/course-parser.js +936 -0
  234. package/lib/course-writer.js +258 -0
  235. package/lib/create.js +248 -0
  236. package/lib/css-index.js +237 -0
  237. package/lib/dev.js +51 -0
  238. package/lib/export-content.js +1246 -0
  239. package/lib/headless-browser.js +413 -0
  240. package/lib/import.js +377 -0
  241. package/lib/index.js +80 -0
  242. package/lib/info.js +79 -0
  243. package/lib/interaction-formatters.js +568 -0
  244. package/lib/manifest/cmi5-manifest.js +63 -0
  245. package/lib/manifest/lti-tool-config.js +53 -0
  246. package/lib/manifest/manifest-factory.js +99 -0
  247. package/lib/manifest/scorm-12-manifest.js +61 -0
  248. package/lib/manifest/scorm-2004-manifest.js +94 -0
  249. package/lib/manifest/scorm-proxy-manifest.js +104 -0
  250. package/lib/manifest-parser.js +96 -0
  251. package/lib/mcp-prompts.js +753 -0
  252. package/lib/mcp-server.js +316 -0
  253. package/lib/narration.js +53 -0
  254. package/lib/pdf-structure.js +142 -0
  255. package/lib/preview-export.js +231 -0
  256. package/lib/preview-routes-api.js +662 -0
  257. package/lib/preview-routes-editing.js +159 -0
  258. package/lib/preview-routes-lms.js +230 -0
  259. package/lib/preview-server.js +564 -0
  260. package/lib/project-utils.js +269 -0
  261. package/lib/proxy-templates/proxy.html +68 -0
  262. package/lib/proxy-templates/scorm-bridge.js +112 -0
  263. package/lib/scaffold.js +193 -0
  264. package/lib/schema-extractor.js +361 -0
  265. package/lib/slide-source-editor.js +586 -0
  266. package/lib/stub-player/app-viewer.js +195 -0
  267. package/lib/stub-player/app.js +370 -0
  268. package/lib/stub-player/catalog-panel.js +312 -0
  269. package/lib/stub-player/config-panel.js +1303 -0
  270. package/lib/stub-player/content-generator.js +586 -0
  271. package/lib/stub-player/content-viewer.js +173 -0
  272. package/lib/stub-player/debug-panel.js +420 -0
  273. package/lib/stub-player/edit-mode.js +922 -0
  274. package/lib/stub-player/edit-utils.js +400 -0
  275. package/lib/stub-player/header-bar.js +354 -0
  276. package/lib/stub-player/interaction-editor.js +210 -0
  277. package/lib/stub-player/interactions-panel.js +565 -0
  278. package/lib/stub-player/lms-api.js +1094 -0
  279. package/lib/stub-player/login-screen.js +74 -0
  280. package/lib/stub-player/outline-mode.js +689 -0
  281. package/lib/stub-player/styles/_assessments-panel.css +245 -0
  282. package/lib/stub-player/styles/_base.css +89 -0
  283. package/lib/stub-player/styles/_catalog-icons.css +96 -0
  284. package/lib/stub-player/styles/_catalog-panel.css +291 -0
  285. package/lib/stub-player/styles/_config-panel.css +636 -0
  286. package/lib/stub-player/styles/_content-viewer.css +834 -0
  287. package/lib/stub-player/styles/_debug-panel.css +576 -0
  288. package/lib/stub-player/styles/_edit-mode.css +128 -0
  289. package/lib/stub-player/styles/_header-bar.css +343 -0
  290. package/lib/stub-player/styles/_interaction-editor.css +140 -0
  291. package/lib/stub-player/styles/_interactions-panel.css +1038 -0
  292. package/lib/stub-player/styles/_login-screen.css +102 -0
  293. package/lib/stub-player/styles/_outline-mode.css +752 -0
  294. package/lib/stub-player/styles.css +15 -0
  295. package/lib/stub-player.js +160 -0
  296. package/lib/test-data-reporting.js +176 -0
  297. package/lib/test-error-reporting.js +146 -0
  298. package/lib/token.js +86 -0
  299. package/lib/upgrade.js +257 -0
  300. package/lib/validation-rules.js +517 -0
  301. package/lib/vite-plugin-content-discovery.js +296 -0
  302. package/package.json +108 -0
  303. package/schemas/XMLSchema.dtd +402 -0
  304. package/schemas/adlcp_v1p3.xsd +111 -0
  305. package/schemas/adlnav_v1p3.xsd +61 -0
  306. package/schemas/adlseq_v1p3.xsd +93 -0
  307. package/schemas/common/anyElement.xsd +27 -0
  308. package/schemas/common/dataTypes.xsd +138 -0
  309. package/schemas/common/elementNames.xsd +767 -0
  310. package/schemas/common/elementTypes.xsd +786 -0
  311. package/schemas/common/rootElement.xsd +31 -0
  312. package/schemas/common/vocabTypes.xsd +345 -0
  313. package/schemas/common/vocabValues.xsd +257 -0
  314. package/schemas/datatypes.dtd +203 -0
  315. package/schemas/ims_xml.xsd +35 -0
  316. package/schemas/imscp_v1p1.xsd +368 -0
  317. package/schemas/imsss_v1p0.xsd +67 -0
  318. package/schemas/imsss_v1p0auxresource.xsd +19 -0
  319. package/schemas/imsss_v1p0control.xsd +20 -0
  320. package/schemas/imsss_v1p0delivery.xsd +17 -0
  321. package/schemas/imsss_v1p0limit.xsd +47 -0
  322. package/schemas/imsss_v1p0objective.xsd +67 -0
  323. package/schemas/imsss_v1p0random.xsd +16 -0
  324. package/schemas/imsss_v1p0rollup.xsd +46 -0
  325. package/schemas/imsss_v1p0seqrule.xsd +108 -0
  326. package/schemas/imsss_v1p0util.xsd +94 -0
  327. package/schemas/license.txt +17 -0
  328. package/schemas/lom.xsd +102 -0
  329. package/schemas/lomCustom.xsd +62 -0
  330. package/schemas/lomLoose.xsd +62 -0
  331. package/schemas/lomStrict.xsd +62 -0
  332. package/schemas/xml.xsd +81 -0
  333. package/template/.env.example +92 -0
  334. package/template/course/assets/audio/example-intro.mp3 +0 -0
  335. package/template/course/assets/audio/example-ui-demo--compact-player.mp3 +0 -0
  336. package/template/course/assets/audio/example-ui-demo--demo-modal.mp3 +0 -0
  337. package/template/course/assets/audio/example-ui-demo--full-player.mp3 +0 -0
  338. package/template/course/assets/docs/example_md_1.md +39 -0
  339. package/template/course/assets/docs/example_md_2.md +41 -0
  340. package/template/course/assets/docs/example_pdf_1_thumbnail.png +0 -0
  341. package/template/course/assets/docs/example_pdf_2.pdf +0 -0
  342. package/template/course/assets/images/course-architecture.svg +36 -0
  343. package/template/course/assets/images/logo.svg +14 -0
  344. package/template/course/assets/widgets/counter-demo.html +190 -0
  345. package/template/course/assets/widgets/gravity-painter.html +384 -0
  346. package/template/course/course-config.js +539 -0
  347. package/template/course/icons.js +19 -0
  348. package/template/course/interactions/PLUGIN_GUIDE.md +97 -0
  349. package/template/course/slides/example-course-structure.js +138 -0
  350. package/template/course/slides/example-final-exam.js +144 -0
  351. package/template/course/slides/example-finishing.js +127 -0
  352. package/template/course/slides/example-interactions-showcase.js +615 -0
  353. package/template/course/slides/example-preview-tour.js +129 -0
  354. package/template/course/slides/example-remedial.js +143 -0
  355. package/template/course/slides/example-summary.js +103 -0
  356. package/template/course/slides/example-ui-showcase.js +1805 -0
  357. package/template/course/slides/example-welcome.js +123 -0
  358. package/template/course/slides/example-workflow.js +140 -0
  359. package/template/course/theme.css +165 -0
  360. package/template/eslint.config.js +47 -0
  361. package/template/package.json +28 -0
  362. package/template/vite.config.js +339 -0
@@ -0,0 +1,725 @@
1
+ # Course Outline Writing Guide
2
+
3
+ > **Intended Audience: AI Agents** — This document is a machine-readable reference for AI agents creating course outlines. For human-readable documentation, see `USER_GUIDE.md`.
4
+
5
+ ## 1. Purpose & Core Principles
6
+
7
+ The outline is the **complete design and content specification** — everything except implementation code. A separate agent uses this outline + `COURSE_AUTHORING_GUIDE.md` to build the course.
8
+
9
+ **Prerequisite:** Familiarity with `COURSE_AUTHORING_GUIDE.md`.
10
+
11
+ ### Rules
12
+
13
+ 1. **Complete specification:** All final content (text, questions, feedback), navigation logic, objectives, assessments, interactions, and engagement. Nothing left to assumption.
14
+ 2. **Design intent, not code:** Define WHAT happens, not HOW. Use template component names but never code or config syntax.
15
+ - ✅ "A `multipleChoice` interaction with 4 options about safety hazards."
16
+ - ❌ "`multipleChoice.create(root, {id: 'q1', ...})`"
17
+ 3. **Use exact framework names:** Component types, manager names, criteria types — enables direct outline → code mapping.
18
+ - ✅ "Locked by `stateFlag: 'module-1-complete'`" | "Engagement: `viewAllTabs` required"
19
+ - ❌ "Make it available after completing module 1" | "User must view all tabs"
20
+ 4. **AI-to-AI communication:** Write for an implementation agent that has `COURSE_AUTHORING_GUIDE.md` but not your source materials.
21
+
22
+ ---
23
+
24
+ ## 2. What to EXCLUDE
25
+
26
+ **NEVER include in the outline:**
27
+
28
+ | Category | Examples of what NOT to include |
29
+ |----------|-------------------------------|
30
+ | Code / Config | `export const slide = {...}`, config objects, JSON, code blocks |
31
+ | Manager APIs / SCORM | `stateManager.set()`, `cmi.objectives.0.id` — framework handles this |
32
+ | Implementation | "Import the component", "Add a click handler", file paths |
33
+ | Framework internals | DOM selectors, event handlers, utility class lists |
34
+ | Unavailable assets | Videos/audio/files that don't exist (diagrams that can be generated are OK) |
35
+
36
+ ---
37
+
38
+ ## 3. Outline Structure & Required Sections
39
+
40
+ An outline must contain the following sections.
41
+
42
+ ### 3.1. Course Metadata
43
+
44
+ - **Course Title:** Full descriptive title.
45
+ - **Course ID:** A unique identifier (e.g., `DEPT-COURSE-001`).
46
+ - **Target Audience:** Specific role, department, or learner group.
47
+ - **Estimated Duration:** Realistic time in minutes.
48
+ - **Layout Type:** `article` (default) | `traditional` | `focused` | `presentation` | `canvas`
49
+ - **Completion Criteria:** High-level summary (e.g., "Visit all required slides and pass the final assessment with 80% or higher").
50
+ - **Scoring Strategy (Optional):** How final course score is calculated.
51
+ - *Example:* "Course score = 100% if Final Exam passed, otherwise 0%."
52
+ - *Example:* "Course score = weighted average: 30% Quiz 1 + 30% Quiz 2 + 40% Final Exam."
53
+ - *Example:* "No course score tracked - completion based only on objectives."
54
+
55
+ ### 3.2. Learning Objectives
56
+
57
+ List the key skills or knowledge the learner will gain. These are for human understanding and should align with the tracked objectives.
58
+
59
+ - *Example: "Identify the three main components of the X process."*
60
+ - *Example: "Apply the risk assessment matrix to a given scenario."*
61
+
62
+ ### 3.3. Course Structure & Navigation Logic
63
+
64
+ All courses are **single-SCO** — one SCORM package, one set of tracking data. Sections/modules are UI-only (sidebar groupings), not SCORM boundaries.
65
+
66
+ **State Management:**
67
+ - **Flags** (`FlagManager`): Boolean values for custom logic and gating
68
+ - **Objectives** (`ObjectiveManager`): SCORM `cmi.objectives.n.*` for LMS reporting, completion, and gating
69
+ - **Assessments** (`AssessmentManager`): Graded evaluations with pass/fail, can gate navigation and auto-set objectives
70
+ - **Engagement** (`EngagementManager`): Slide-level completion (tabs viewed, interactions, scroll, time). Validated by runtime-linter.
71
+
72
+ **Gating Conditions** (`navigation.gating.conditions`): `objectiveStatus`, `assessmentStatus`, `stateFlag`, `timeOnSlide`. Mode: `all` (AND) | `any` (OR).
73
+
74
+ #### Structure
75
+
76
+ List all slides with IDs, titles, and rules. Group into sections for sidebar organization.
77
+
78
+ **Example Structure:**
79
+ ```
80
+ - Module 1: Introduction
81
+ - intro-01: Welcome (Engagement: viewAllTabs)
82
+ - intro-02: Learning Objectives
83
+
84
+ - Module 2: Core Concepts
85
+ - content-01: What is Job Briefing? (Gating: objectiveStatus 'completed-introduction')
86
+ - content-02: The 5 Key Elements (Engagement: scrollDepth 80% + timeOnSlide 60s, mode: all)
87
+
88
+ - Module 3: Knowledge Check
89
+ - kc-01: Knowledge Check (Gating: objectiveStatus 'reviewed-core-content')
90
+
91
+ - Module 4: Advanced Content
92
+ - advanced-01: Case Studies (Gating: assessmentStatus 'kc-01' passed)
93
+
94
+ - Module 5: Remedial (Conditional)
95
+ - remedial-01: Review (includeByDefault: false, insertAfter: 'kc-01', when: kc-01 failed)
96
+
97
+ - Module 6: Final
98
+ - final-assessment: Final Exam (Gating: assessmentStatus 'kc-01' passed)
99
+ - summary-01: Summary (Gating: assessmentStatus 'final-assessment' passed)
100
+ ```
101
+
102
+ #### Navigation Gating Specifications
103
+
104
+ For each slide that has access restrictions, define the gating logic using the template's condition types.
105
+
106
+ **Gating Condition Types:**
107
+
108
+ | Type | Properties | Example |
109
+ |------|-----------|---------|
110
+ | `objectiveStatus` | `objectiveId`, `completion_status`, `success_status` | `objectiveId: 'completed-intro'`, `completion_status: 'completed'` |
111
+ | `assessmentStatus` | `assessmentId`, `requires` ('passed'/'failed') | `assessmentId: 'kc-01'`, `requires: 'passed'` |
112
+ | `stateFlag` | `key`, `value` (true/false) | `key: 'demo-complete'`, `value: true` |
113
+ | `timeOnSlide` | `slideId`, `minSeconds` | `slideId: 'content-01'`, `minSeconds: 120` |
114
+
115
+ **Gating Modes:** `all` (AND) or `any` (OR)
116
+
117
+ **Example Specifications:**
118
+
119
+ ```
120
+ Slide: content-01
121
+ Gating: objectiveStatus 'completed-introduction' completion_status='completed'
122
+ Locked Message: "Complete the introduction first."
123
+
124
+ Slide: advanced-01 (Multiple conditions)
125
+ Gating Mode: all
126
+ Conditions: objectiveStatus 'reviewed-all-content' + assessmentStatus 'kc-01' passed
127
+ Locked Message: "Complete all content and pass KC1."
128
+
129
+ Slide: remedial-01 (Reverse gating)
130
+ Gating: assessmentStatus 'kc-01' requires='failed'
131
+ Sequence: includeByDefault=false, insertAfter='kc-01'
132
+ ```
133
+
134
+ #### Conditional Slide Insertion (Remedial/Branching)
135
+
136
+ The template supports dynamic slide insertion based on conditions (e.g., remedial content after failing an assessment).
137
+
138
+ **Specify for conditional slides:**
139
+ - **Include by default:** `false` (slide not in default navigation sequence)
140
+ - **Include when:** Condition that triggers insertion (same format as gating conditions)
141
+ - **Insert position:** `before` or `after` a specific `slideId`
142
+
143
+ **Example:**
144
+ - **Slide:** `remedial-01`
145
+ - **Conditional Insertion:**
146
+ - Include by default: No
147
+ - Include when: Assessment `kc-01` failed
148
+ - Insert position: After slide `kc-01`
149
+
150
+ **Note on Conditional Content:**
151
+ The template supports advanced branching (role-based paths, optional enrichment). Keep specifications concise—conditional slides should only review/reinforce content already presented, never introduce required information that some learners won't see.
152
+
153
+ ### 3.4. Slide-by-Slide Breakdown
154
+
155
+ Every slide must be fully specified with complete content, interactions, engagement, and tracking.
156
+
157
+ **Every slide MUST specify layout.** Describe structure, not code. Reference components explicitly.
158
+
159
+ Layout patterns: Single-column | Two-column (split) | Card grid (NxM) | Tabbed | Interactive Image | Hero+details | Assessment. Width: narrow | medium (default) | wide | full.
160
+
161
+ - ✅ "Two-column: left H2 + bullet list, right tabs component ('Overview', 'Steps', 'Examples')"
162
+ - ❌ "Content about safety procedures" (no structure)
163
+ - ❌ Code blocks or class names
164
+
165
+ #### Slide Template
166
+
167
+ ```markdown
168
+ ### [Slide ID]: [Slide Title]
169
+
170
+ **Layout:** (REQUIRED)
171
+ - Structure: Single-column | Two-column | Card grid (NxM) | Hero+details
172
+ - Components: tabs, accordion, modals (be explicit)
173
+ - Content width: narrow | medium (default) | wide | full
174
+
175
+ **Content:**
176
+ - ALL final text verbatim (headings, paragraphs, lists, callouts)
177
+ - Callouts: type (info/warning/error/success) + full text
178
+ - Images: "[Image: description]"
179
+
180
+ **Interaction:** (if interactive)
181
+ - Component type + full config (see Section 4)
182
+
183
+ **Engagement:** (REQUIRED)
184
+ - Required: true/false
185
+ - Mode: all/any
186
+ - Requirements: [types from table above]
187
+ - Show Indicator: true/false
188
+
189
+ **Narration:** (if audio narration is used)
190
+ - Full narration script (see Section 3.4.2 for writing guidelines)
191
+
192
+ **Tracking:** (if applicable)
193
+ - Flags Set: "flag-name on [trigger]"
194
+ - Objectives: "objective-id via [criteria]"
195
+
196
+ **Navigation Notes:** (optional, if non-standard)
197
+ ```
198
+
199
+ #### 3.4.1. Engagement Requirements (CRITICAL)
200
+
201
+ **EVERY slide MUST specify engagement requirements.** runtime-linter validates at dev-time. Default: `required: false`.
202
+
203
+ **Engagement Types:**
204
+
205
+ | Type | Config | Validates |
206
+ |------|--------|-----------|
207
+ | `viewAllTabs` | - | `[data-component="tabs"]` exists |
208
+ | `viewAllPanels` | - | `[data-component="accordion"]` exists |
209
+ | `viewAllFlipCards` | - | `data-flip-card-id` elements exist |
210
+ | `viewAllTimelineEvents` | - | `[data-component="interactive-timeline"]` exists |
211
+ | `viewAllHotspots` | - | `[data-component="interactive-image"]` exists |
212
+ | `interactionComplete` | `interactionId`, `label` (optional) | Matching interaction ID exists |
213
+ | `allInteractionsComplete` | - | `[data-interaction-id]` elements exist |
214
+ | `scrollDepth` | `percentage` (0-100) | - |
215
+ | `timeOnSlide` | `minSeconds` | - |
216
+ | `flag` | `key`, `equals` (optional) | - |
217
+ | `allFlags` | `flags` array | - |
218
+ | `embedComplete` | `key` (flag set by embed) | `[data-component="embed-frame"]` exists |
219
+
220
+ **Modes:** `all` (AND) or `any` (OR)
221
+
222
+ **Progress Indicator:** Shows automatically when `required: true`. Set `showIndicator: false` to hide.
223
+
224
+ **Examples:**
225
+ - `Required: true, Mode: all, Requirements: viewAllTabs + timeOnSlide(60s)`
226
+ - `Required: true, Mode: any, Requirements: scrollDepth(90%) OR timeOnSlide(120s)`
227
+ - `Required: true, Requirements: allFlags(['zone-1-clicked', 'zone-2-clicked'])`
228
+ - `Required: false` (Next always enabled)
229
+
230
+ **Custom Flag-Based Activities:** For non-standard interactions (clickable diagram regions, multi-step workflows), use flags with `allFlags` requirement.
231
+
232
+ #### Content Completeness
233
+
234
+ **Content must be verbatim.** No placeholders or summaries.
235
+
236
+ ✅ **Complete:**
237
+ > ## What is a Job Briefing?
238
+ > A job briefing is a structured communication session held before starting work. It ensures all team members understand:
239
+ > - The scope of work
240
+ > - Identified hazards
241
+ > - Safety procedures
242
+ > - Individual responsibilities
243
+ >
244
+ > **Why it matters:** Job briefings reduce incidents by 60% when conducted properly (NIOSH, 2023).
245
+
246
+ ❌ **Incomplete:** "Explain what a job briefing is and why it's important."
247
+
248
+ #### 3.4.2. Narration Writing Guidelines
249
+
250
+ Narration should **complement** on-screen content, not duplicate it. Learners read faster than narration plays.
251
+
252
+ - ✅ Expand on key points with context, examples, or expert insight not shown on screen
253
+ - ✅ Guide attention and provide transitions between concepts
254
+ - ✅ Use conversational tone — rephrase formal text into natural speech
255
+ - ❌ Never read bullet points, headings, or on-screen text verbatim
256
+
257
+ ### 3.5. Objectives & Tracking Logic
258
+
259
+ SCORM-compliant objectives (`cmi.objectives.n.*`) for LMS reporting, course completion, and navigation gating. Evaluated automatically (built-in criteria) or via assessment results.
260
+
261
+ **Objectives vs Flags:** Objectives = SCORM tracking with LMS integration. Flags = lightweight booleans for custom gating. Both gate navigation.
262
+
263
+ #### Built-In Objective Criteria Types
264
+
265
+ | Criteria Type | Config | Use Case |
266
+ |--------------|--------|----------|
267
+ | `slideVisited` | `slideId` | Track specific slide visit |
268
+ | `allSlidesVisited` | `slideIds` array | Ensure all module slides viewed |
269
+ | `timeOnSlide` | `slideId`, `minSeconds` | Ensure engagement with content |
270
+ | `flag` | `key`, `equals` | Bridge flags → SCORM objectives |
271
+ | `allFlags` | `flags` array | Multi-step flag-based processes |
272
+ | Assessment-Linked | Set `assessmentObjective` in assessment config | Auto-managed pass/fail objectives |
273
+
274
+ #### Objective Definitions
275
+
276
+ List each objective with: **ID**, **Description**, **Criteria Type**, **Use** (what it gates or reports).
277
+
278
+ **Example Objectives:**
279
+
280
+ ```
281
+ Auto-Evaluated:
282
+ - completed-introduction: slideVisited 'intro-02' → Gates Module 2
283
+ - reviewed-all-core-content: allSlidesVisited ['content-01','content-02','content-03'] → Required for KC1
284
+ - engaged-with-case-study: timeOnSlide 'advanced-02' 180s → Ensures deep engagement
285
+
286
+ Assessment-Linked:
287
+ - passed-knowledge-check-1: assessmentObjective in kc-01 → Gates advanced content
288
+ On pass (≥80%): completion='completed', success='passed'
289
+ On fail (<80%): completion='completed', success='failed'
290
+ - passed-final-assessment: assessmentObjective in final-assessment → Course success criterion
291
+ ```
292
+
293
+ #### Course Completion & Success Logic
294
+
295
+ Define which objectives (or combinations) determine:
296
+ 1. **Course Completion** (`cmi.completion_status`)
297
+ 2. **Course Success** (`cmi.success_status`)
298
+
299
+ **Example:**
300
+ - **Completion Requirements:**
301
+ - Objective `reviewed-all-core-content` must be completed AND
302
+ - Objective `passed-final-assessment` completion_status must be 'completed'
303
+
304
+ - **Success Requirements:**
305
+ - Objective `passed-final-assessment` success_status must be 'passed'
306
+
307
+ **SCORM Note:**
308
+ - `completion_status`: 'completed', 'incomplete', 'not attempted', 'unknown'
309
+ - `success_status`: 'passed', 'failed', 'unknown'
310
+ - Assessments typically set both: completion when attempted, success based on score
311
+
312
+ ### 3.6. Assessment Strategy
313
+
314
+ Practice interactions use standalone components (no scoring). Graded assessments use `AssessmentManager` for scoring, retries, and SCORM tracking. Assessments can auto-set objectives (`assessmentObjective`) and gate navigation (`assessmentStatus`). Course scoring strategy specified in §3.1.
315
+
316
+ #### Scoring Within an Assessment
317
+
318
+ Score = `(sum of correct weights) / (sum of all weights)` × 100. Default weight per question = 1. Score determines pass/fail against `passingScore`.
319
+
320
+ #### Assessment Types
321
+
322
+ | Type | Purpose | Location | Scoring | SCORM | Gating |
323
+ |------|---------|----------|---------|-------|--------|
324
+ | **Practice** (formative) | Reinforce with feedback | Embedded in content | None | Records interactions only | No |
325
+ | **Knowledge Check** (formative, graded) | Verify comprehension | End of module | Scored independently | Auto-sets objective via `assessmentObjective` | Can gate next module |
326
+ | **Final Assessment** (summative) | Certify mastery | Near course end | Scored independently | Sets primary success objective | Can gate completion |
327
+
328
+ #### Retake & Progressive Intervention
329
+
330
+ Define retake settings and intervention thresholds for each assessment.
331
+
332
+ **Settings:**
333
+ - **`allowRetake`**: Enable/disable retake flow
334
+ - **`randomizeQuestions`**: Shuffle question order on first attempt (default: false)
335
+ - **`randomizeOnRetake`**: Re-randomize questions on each retry (default: true when banks or shuffle enabled)
336
+ - **`allowUnansweredSubmission`**: Allow submit with unanswered questions (default: false)
337
+ - If false: Submit button disabled until all answered; shows confirmation modal
338
+ - If true: Allow immediate submission; unanswered = incorrect
339
+ - **`attemptsBeforeRemedial`**: Present remedial content after N failures (null = disabled)
340
+ - **`attemptsBeforeRestart`**: Require course restart after M failures (null = disabled, must be > attemptsBeforeRemedial)
341
+ - **`remedialSlideIds`**: Slide IDs for remedial review (required when attemptsBeforeRemedial is set)
342
+
343
+ **Example - Knowledge Check:**
344
+ - Unlimited retakes, remedial after 2 failures: `allowRetake: true, attemptsBeforeRemedial: 2, remedialSlideIds: ['remedial-01'], allowUnansweredSubmission: false`
345
+
346
+ **Example - Final Assessment:**
347
+ - Restart after 3 failures: `allowRetake: true, attemptsBeforeRestart: 3, attemptsBeforeRemedial: null, allowUnansweredSubmission: false`
348
+
349
+ #### Assessment-Objective Integration
350
+
351
+ Specify `assessmentObjective` in each assessment config. Framework auto-updates objective on submission:
352
+ - Score ≥ passingScore: `completion='completed'`, `success='passed'`
353
+ - Score < passingScore: `completion='completed'`, `success='failed'`
354
+ - Practice assessments: `assessmentObjective: null`
355
+
356
+ #### Assessment Configuration Summary
357
+
358
+ For each graded assessment, specify:
359
+
360
+ ```
361
+ Assessment: kc-01
362
+ Title: "Knowledge Check 1"
363
+ Questions: 5 (from bank of 7)
364
+ Passing: 80%
365
+ Attempts: Unlimited
366
+ Randomization: Shuffle + re-randomize on retake
367
+ Unanswered: Block submission
368
+ Objective: passed-knowledge-check-1
369
+ Gates: advanced-01, advanced-02
370
+ Remedial: After 2 failures → remedial-01
371
+
372
+ Assessment: final-assessment
373
+ Title: "Final Exam"
374
+ Questions: 10 (fixed)
375
+ Passing: 80%
376
+ Attempts: Max 3 (restart after)
377
+ Randomization: None
378
+ Unanswered: Block submission
379
+ Objective: passed-final-assessment (determines course success)
380
+ Gates: summary-01
381
+ ```
382
+
383
+ #### Question Banks & Randomization
384
+
385
+ **Bank Configuration:** Define category-based banks with selection rules.
386
+ ```
387
+ Assessment: kc-01
388
+ Banks:
389
+ - Safety Procedures: 4 defined, select 2
390
+ - Hazard Identification: 3 defined, select 2
391
+ - Communication: 3 defined, select 1
392
+ Total: 10 defined, learner sees 5
393
+ ```
394
+
395
+ **Randomization Settings:**
396
+ - `randomizeQuestions`: Shuffle order (default: false)
397
+ - `randomizeOnRetake`: New selection + shuffle on retry (default: true when banks enabled)
398
+
399
+ **Design Guidelines:**
400
+ - Banks for formative (variety across retakes)
401
+ - Fixed questions for summative (consistency)
402
+ - Shuffle to reduce memorization
403
+ - Fixed order when questions build on each other
404
+
405
+ ### 3.7. Flags vs Objectives: Decision Guide
406
+
407
+ | Use Case | Flags | Objectives |
408
+ |----------|-------|------------|
409
+ | Simple boolean state | ✓ | |
410
+ | Navigation gating (no LMS reporting) | ✓ | |
411
+ | Custom UI tracking (hotspots, workflows) | ✓ | |
412
+ | SCORM-compliant LMS reporting | | ✓ |
413
+ | Formal learning outcomes | | ✓ |
414
+ | Pass/fail status needed | | ✓ |
415
+ | Flag logic needs LMS reporting | ✓ → objective via `flag`/`allFlags` criteria |
416
+
417
+ **Pattern:**
418
+ 1. **Objectives** for formal outcomes + assessments
419
+ 2. **Flags** for internal logic + custom interactions
420
+ 3. **Flag-based objectives** to elevate flags to LMS
421
+ 4. **Assessment-linked objectives** for graded assessments
422
+ 5. Gate via `objectiveStatus`/`assessmentStatus` (SCORM-aligned), use `stateFlag` only for custom logic
423
+
424
+ ### 3.8. Visual Layout & Course Cohesion
425
+
426
+ 1. Describe structure, not CSS: "Two-column with image left, list right"
427
+ 2. Use consistent terminology: cards, callouts, columns, tabs
428
+ 3. Indicate hierarchy: primary headings, supporting text, warning callouts
429
+ 4. Consistent elements: same callout colors, same button verbs, same heading hierarchy (H1=slide title, H2=section, H3=subsection)
430
+ 5. Progressive disclosure: start simple, use tabs/accordions for advanced content
431
+
432
+ **Standard Patterns:**
433
+ - Content: Tabs (multi-path), Accordion (collapsible), Cards (equal-weight), Columns (side-by-side)
434
+ - Emphasis: Callouts (info/warning/error/success), Buttons (primary/secondary)
435
+ - Interaction Layouts: Question + vertical choices, Drag → drop zones, Image + hotspots
436
+
437
+ ### 3.9. Reference Documents
438
+
439
+ List all source documents, SOPs, policies, standards, or SME resources used. Provides traceability for future content updates.
440
+ - SOP 1556 - Some Task SOP (Revision 3, dated 2024-08-15)
441
+ - OSHA 1910.269 - Electric Power Generation, Transmission, and Distribution
442
+ - NFPA 70E - Standard for Electrical Safety in the Workplace (2024 Edition)
443
+ - Internal training deck: "Effective Job Briefings" by J. Smith (2023)
444
+ - Subject matter expert interviews: Site Safety Manager, Regional Operations Director
445
+
446
+ **Note:** This section will be expanded in future iterations to include detailed source-to-content mappings and version control for regulatory compliance.
447
+
448
+ ### 3.10. Document Gallery (Optional)
449
+
450
+ If the course should include downloadable/viewable reference documents (PDFs, markdown, images), list them here. The framework auto-discovers files from `course/assets/docs/` and displays them in a collapsible sidebar gallery.
451
+
452
+ **Specify:**
453
+ - Which documents to include and their filenames
454
+ - Whether downloads should be allowed (`allowDownloads: true/false`)
455
+ - Custom thumbnail images for PDFs (place `<filename>_thumbnail.png` alongside the PDF)
456
+
457
+ ### 3.11. Technical Limitations
458
+
459
+ **DO NOT design these features** - they are not supported by the framework:
460
+
461
+ - ❌ **No AI Grading:** Cannot grade essays or open-ended text.
462
+ - ❌ **No Multiplayer:** No chat, leaderboards, or live collaboration.
463
+ - ❌ **No Microphone/Webcam:** No voice recording or video capture.
464
+ - ❌ **No External Links:** Avoid linking out (breaks SCORM tracking/security).
465
+ - ❌ **No Sticky/Fixed Positioning:** Cannot create sticky headers or floating navigation (SCORM iframe restriction). Use in-content navigation instead.
466
+ - ❌ **No position:fixed Elements:** Floating elements would escape iframe boundaries.
467
+
468
+ ---
469
+
470
+ ## 4. Interaction Specifications
471
+
472
+ When a slide includes an interactive element, fully specify it using the formats below. The implementation agent will map these to the corresponding framework components.
473
+
474
+ ### Interaction Categories
475
+
476
+ **Assessment Components** (SCORM-tracked, with answer checking):
477
+ - `multipleChoice`, `trueFalse`, `fillIn`, `matching`, `dragDrop`, `numeric`, `hotspot`, `sequencing`, `likert`
478
+
479
+ **UI Components** (non-assessed, organizational):
480
+ - `tabs`, `dropdown`, click-to-reveal, expandable cards, accordions, flip cards
481
+
482
+ **Practice vs. Graded:**
483
+ - **Practice:** Uses assessment components but exists on content slides. Immediate feedback, no scoring.
484
+ - **Graded:** Managed by `AssessmentManager`. Scoring, retries, and SCORM reporting apply.
485
+
486
+ ### Specification Format
487
+
488
+ For each interaction, provide:
489
+ 1. **Component type** (matches template component name)
490
+ 2. **Unique ID** (used for SCORM tracking and DOM references)
491
+ 3. **Complete configuration** (question, choices, correct answers, feedback, etc.)
492
+ 4. **Context** (practice or graded, where it appears)
493
+
494
+ **Feedback Quality Standard:**
495
+ - **Correct Feedback:** Reinforce WHY it is right. Connect to learning objectives.
496
+ - *Example:* "Correct! Assessing hazards first is the foundational principle of workplace safety."
497
+ - **Incorrect Feedback:** Explain WHY it is wrong and point to the correct concept. Be specific.
498
+ - *Example:* "Not quite. While calling a supervisor is important, you must first assess immediate hazards to ensure your own safety."
499
+ - **Avoid:** Generic "Correct!" or "Try again" feedback
500
+
501
+ ---
502
+
503
+ ### Assessment Component Examples
504
+
505
+ Provide: **ID**, **Weight** (if graded), **Question/Prompt**, **Choices/Config**, **Correct Answer**, **Feedback** (correct + incorrect), **Context**.
506
+
507
+ #### `multipleChoice`
508
+ ```
509
+ ID: kc1-q1, Weight: 1
510
+ Question: "What is the first step in conducting a job briefing?"
511
+ Choices: a) Assign tasks, b) Review scope of work, c) Identify hazards, d) Discuss emergency procedures
512
+ Correct: b
513
+ Feedback-Correct: "Correct! Reviewing scope ensures shared understanding."
514
+ Feedback-Incorrect: "Not quite. First step is reviewing scope of work."
515
+ Context: Knowledge Check 1
516
+ ```
517
+
518
+ #### `trueFalse`
519
+ ```
520
+ ID: practice-tf-1
521
+ Question: "Job briefings are only required for high-risk work."
522
+ Correct: false
523
+ Feedback-Correct: "Correct. Job briefings benefit all work activities."
524
+ Feedback-Incorrect: "Incorrect. All activities benefit from structured briefings."
525
+ Context: Practice on content-02
526
+ ```
527
+
528
+ #### `fillIn`
529
+
530
+ Two modes: **inline** (cloze with `{{placeholder}}`) or **stacked** (Q&A with prompt).
531
+
532
+ ```
533
+ ID: final-q3, Weight: 1
534
+ Mode: inline
535
+ Template: "The hazard categories are electrical, mechanical, and {{blank1}}."
536
+ Blank 1: Accepts ["chemical", "chemicals"], typoTolerance: 1
537
+ Feedback: [correct/incorrect messages]
538
+ Context: Final Assessment Q3
539
+
540
+ ID: practice-qa
541
+ Mode: stacked
542
+ Prompt: "What is the third hazard category?"
543
+ Blank 1: Accepts ["chemical"], placeholder: "Enter answer..."
544
+ Feedback: [correct/incorrect messages]
545
+ Context: Practice on content-02
546
+ ```
547
+
548
+ #### `matching`
549
+ ```
550
+ ID: match-roles
551
+ Prompt: "Match each role to its primary responsibility."
552
+ Pairs:
553
+ - "Site Supervisor" → "Leads the briefing"
554
+ - "Safety Officer" → "Reviews hazard controls"
555
+ - "Crew Member" → "Confirms understanding of tasks"
556
+ Feedback-AllCorrect: "Excellent! You understand role responsibilities."
557
+ Feedback-SomeIncorrect: "Review the roles and try again."
558
+ Context: Practice on apply-01
559
+ ```
560
+
561
+ #### `dragDrop`
562
+ ```
563
+ ID: categorize-elements
564
+ Prompt: "Drag each item to the correct job briefing category."
565
+ Items: PPE requirements, Voltage levels, First aid location, Work sequence
566
+ Drop Zones: Safety Procedures, Work Scope, Hazard Identification
567
+ Correct Placements:
568
+ - Safety Procedures: [PPE requirements, First aid location]
569
+ - Work Scope: [Work sequence]
570
+ - Hazard Identification: [Voltage levels]
571
+ Feedback: Immediate visual (green=correct, red=incorrect)
572
+ Context: Interactive on content-03
573
+ ```
574
+
575
+ #### `numeric`
576
+ ```
577
+ ID: calc-q1, Weight: 1
578
+ Question: "6 people × 15 min briefing = how many person-hours? (2 decimal places)"
579
+ Correct: 1.5, Tolerance: ±0.05
580
+ Feedback-Correct: "Correct! 6×15min = 90min = 1.5hrs"
581
+ Feedback-Incorrect: "Incorrect. Calculate: (6×15)/60"
582
+ Context: Final Assessment Q7
583
+ ```
584
+
585
+ #### `hotspot`
586
+ ```
587
+ ID: identify-hazard
588
+ Prompt: "Click on the primary electrical hazard."
589
+ Image: [Worksite diagram with exposed wiring, ladder, tools]
590
+ Hotspots:
591
+ - exposed-wire: [120,80,200,140] rectangle (CORRECT)
592
+ - ladder: [300,50,350,180] rectangle
593
+ - toolbox: [450,200,520,250] rectangle
594
+ Feedback:
595
+ - exposed-wire: "Correct! Exposed wiring is the electrical hazard."
596
+ - ladder: "Ladder is a fall hazard, not electrical."
597
+ - toolbox: "Toolbox is not a hazard here."
598
+ Context: Interactive on content-04
599
+ ```
600
+
601
+ #### `sequencing`
602
+ ```
603
+ ID: order-steps, Weight: 1
604
+ Prompt: "Arrange job briefing steps in correct order."
605
+ Items: Review scope, Identify hazards, Discuss safety, Assign responsibilities, Confirm understanding
606
+ Correct Order: [as listed above]
607
+ Feedback-Correct: "Correct! This is the proper sequence."
608
+ Feedback-Incorrect: "Not quite. Review the job briefing process."
609
+ Context: Knowledge Check 1 Q5
610
+ ```
611
+
612
+ #### `likert`
613
+ ```
614
+ ID: confidence-check
615
+ Prompt: "Rate your confidence:"
616
+ Questions: 1) Hazard assessment, 2) Selecting PPE, 3) Communicating risks
617
+ Scale: 1 (Not Confident) to 5 (Very Confident)
618
+ Context: Self-assessment on reflection-01 (no grading)
619
+ ```
620
+
621
+ ---
622
+
623
+ ### UI Component Examples
624
+
625
+ #### `tabs`
626
+ ```
627
+ ID: overview-tabs
628
+ Tabs:
629
+ 1. "Purpose": Job briefings ensure shared understanding of work, hazards, and safety.
630
+ 2. "Benefits": Reduce incidents by 60%, improve efficiency by 25%.
631
+ 3. "When Required": Before shifts, when tasks/hazards/team change.
632
+ Engagement: viewAllTabs required
633
+ ```
634
+
635
+ #### `dropdown`
636
+ ```
637
+ ID: select-role
638
+ Prompt: "Select your role for tailored responsibilities:"
639
+ Options: supervisor (Site Supervisor), safety (Safety Officer), crew (Crew Member)
640
+ On Change: Display role-specific content below
641
+ ```
642
+
643
+ #### Click-to-Reveal / Accordion
644
+ ```
645
+ ID: hazard-details
646
+ Items:
647
+ - "Electrical Hazards" → Exposed conductors, overhead lines, arc flash risks
648
+ - "Mechanical Hazards" → Rotating equipment, pinch points, struck-by hazards
649
+ - "Environmental Hazards" → Extreme temps, weather, confined spaces
650
+ Behavior: Single-expand (others collapse)
651
+ Engagement: viewAllPanels required
652
+ ```
653
+
654
+ ---
655
+
656
+ ### Graded Assessment Question Bank Format
657
+
658
+ ```
659
+ ### kc-01: Knowledge Check 1
660
+
661
+ Config:
662
+ Type: Graded
663
+ Passing: 80%
664
+ Questions: 5 from bank of 7
665
+ Randomization: Shuffle + re-randomize on retake
666
+ Retries: Unlimited
667
+ Unanswered: Block submission
668
+ Objective: passed-knowledge-check-1
669
+
670
+ Question Bank:
671
+ 1. [multipleChoice: ID, Weight, Question, Choices, Correct, Feedback]
672
+ 2. [trueFalse: ID, Weight, Question, Correct, Feedback]
673
+ 3. [fillIn: ID, Weight:2, Prompt, Blanks, Feedback]
674
+ ...
675
+ ```
676
+
677
+ ---
678
+
679
+ ## 5. Quality Checklist
680
+
681
+ Before finalizing the outline, verify completeness and adherence to the design/implementation boundary:
682
+
683
+ ### Content Completeness
684
+ - [ ] Every slide has **complete, final text**—no placeholders or summaries
685
+ - [ ] All questions, answer choices, and feedback are **verbatim** as they should appear to learners
686
+ - [ ] Visual elements are described clearly (images, diagrams, callouts, layout structures)
687
+ - [ ] All interactive elements are **fully specified** with component type and complete configuration
688
+ - [ ] **Every interaction** has specific correct AND incorrect feedback (not generic)
689
+
690
+ ### Navigation & Flow
691
+ - [ ] All slides listed with IDs, titles, grouped logically
692
+ - [ ] All `stateFlag`s defined with name, trigger, and what they unlock
693
+ - [ ] Locked slides reference their gating conditions
694
+ - [ ] Learner progression path is unambiguous
695
+
696
+ ### Engagement Requirements (CRITICAL)
697
+ - [ ] **EVERY slide** specifies engagement or "Required: false"
698
+ - [ ] Types match Section 3.4.1; mode (`all`/`any`) specified for multi-requirement slides
699
+ - [ ] Requirements match slide content (tabs exist for viewAllTabs, etc.)
700
+
701
+ ### Objectives & Tracking
702
+ - [ ] All objectives have unique IDs with criteria type and purpose
703
+ - [ ] Assessment-linked objectives specify `assessmentObjective` config
704
+ - [ ] Course completion logic explicitly stated
705
+
706
+ ### Assessment Architecture
707
+ - [ ] Practice vs. graded clearly distinguished
708
+ - [ ] All graded assessments specify: question count, passing score, retry policy, randomization, unanswered handling, `assessmentObjective`
709
+ - [ ] Pass/fail → objective link is explicit
710
+
711
+ ### Design/Implementation Boundary
712
+ - [ ] NO code, config syntax, JSON, manager APIs, file paths, or import statements
713
+ - [ ] ONLY template concept references (component names, manager names, criteria types)
714
+
715
+ ### Usability
716
+ - [ ] An agent with only this outline + `COURSE_AUTHORING_GUIDE.md` could build the course
717
+ - [ ] No assumptions — all design decisions documented, no blanks to fill
718
+ - [ ] Framework terminology used throughout
719
+
720
+ ### Reference Materials
721
+ - [ ] Source documents listed in Section 3.9
722
+
723
+ ---
724
+
725
+ **[End of Guide]**