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.
- package/LICENSE +21 -0
- package/README.md +322 -0
- package/THIRD_PARTY_NOTICES.md +22 -0
- package/bin/cli.js +331 -0
- package/framework/assets/logo-coursecode-black.svg +14 -0
- package/framework/assets/logo-coursecode-white.svg +14 -0
- package/framework/assets/logo-coursecode.svg +14 -0
- package/framework/css/01-base.css +160 -0
- package/framework/css/02-layout.css +499 -0
- package/framework/css/accessibility.css +834 -0
- package/framework/css/components/accordions.css +710 -0
- package/framework/css/components/assessments.css +520 -0
- package/framework/css/components/audio-player.css +570 -0
- package/framework/css/components/badges.css +80 -0
- package/framework/css/components/breadcrumbs.css +87 -0
- package/framework/css/components/buttons.css +707 -0
- package/framework/css/components/callouts.css +1280 -0
- package/framework/css/components/cards.css +475 -0
- package/framework/css/components/carousel.css +193 -0
- package/framework/css/components/checkbox-group.css +123 -0
- package/framework/css/components/checklist.css +203 -0
- package/framework/css/components/collapse.css +96 -0
- package/framework/css/components/comparison.css +33 -0
- package/framework/css/components/content-image.css +36 -0
- package/framework/css/components/document-gallery.css +425 -0
- package/framework/css/components/dropdown.css +115 -0
- package/framework/css/components/embed-frame.css +142 -0
- package/framework/css/components/engagement.css +412 -0
- package/framework/css/components/features.css +35 -0
- package/framework/css/components/flip-cards.css +253 -0
- package/framework/css/components/footer.css +353 -0
- package/framework/css/components/forms.css +294 -0
- package/framework/css/components/hero.css +216 -0
- package/framework/css/components/images.css +528 -0
- package/framework/css/components/interactive-timeline.css +274 -0
- package/framework/css/components/intro-cards.css +30 -0
- package/framework/css/components/lightbox.css +666 -0
- package/framework/css/components/loading.css +65 -0
- package/framework/css/components/modals.css +235 -0
- package/framework/css/components/notifications.css +107 -0
- package/framework/css/components/quote.css +150 -0
- package/framework/css/components/sidebar.css +684 -0
- package/framework/css/components/slide-header.css +52 -0
- package/framework/css/components/spinner.css +62 -0
- package/framework/css/components/stats.css +44 -0
- package/framework/css/components/steps.css +232 -0
- package/framework/css/components/tables.css +90 -0
- package/framework/css/components/tabs.css +347 -0
- package/framework/css/components/timeline.css +154 -0
- package/framework/css/components/toggle.css +95 -0
- package/framework/css/components/tooltip.css +226 -0
- package/framework/css/components/video-player.css +438 -0
- package/framework/css/design-tokens.css +707 -0
- package/framework/css/framework.css +86 -0
- package/framework/css/interactions/accessibility.css +75 -0
- package/framework/css/interactions/base.css +92 -0
- package/framework/css/interactions/drag-drop.css +295 -0
- package/framework/css/interactions/fill-in-the-blank.css +236 -0
- package/framework/css/interactions/hotspots.css +69 -0
- package/framework/css/interactions/index.css +45 -0
- package/framework/css/interactions/interactive-image.css +359 -0
- package/framework/css/interactions/likert.css +126 -0
- package/framework/css/interactions/matching.css +354 -0
- package/framework/css/interactions/numeric-input.css +78 -0
- package/framework/css/interactions/sequencing.css +378 -0
- package/framework/css/interactions/true-false.css +177 -0
- package/framework/css/layouts/article.css +258 -0
- package/framework/css/layouts/base.css +30 -0
- package/framework/css/layouts/canvas.css +38 -0
- package/framework/css/layouts/focused.css +236 -0
- package/framework/css/layouts/index.css +29 -0
- package/framework/css/layouts/presentation.css +191 -0
- package/framework/css/layouts/traditional.css +52 -0
- package/framework/css/responsive.css +439 -0
- package/framework/css/utilities/accessibility-utils.css +59 -0
- package/framework/css/utilities/animations.css +419 -0
- package/framework/css/utilities/borders.css +72 -0
- package/framework/css/utilities/colors.css +76 -0
- package/framework/css/utilities/container.css +46 -0
- package/framework/css/utilities/decorative.css +442 -0
- package/framework/css/utilities/display.css +257 -0
- package/framework/css/utilities/flexbox.css +80 -0
- package/framework/css/utilities/grid.css +69 -0
- package/framework/css/utilities/icons.css +534 -0
- package/framework/css/utilities/lists.css +190 -0
- package/framework/css/utilities/spacing.css +167 -0
- package/framework/css/utilities/tables.css +81 -0
- package/framework/css/utilities/typography.css +159 -0
- package/framework/css/utilities/visibility.css +117 -0
- package/framework/docs/COURSE_AUTHORING_GUIDE.md +1773 -0
- package/framework/docs/COURSE_OUTLINE_GUIDE.md +725 -0
- package/framework/docs/COURSE_OUTLINE_TEMPLATE.md +161 -0
- package/framework/docs/DATA_MODEL.md +409 -0
- package/framework/docs/FRAMEWORK_GUIDE.md +1088 -0
- package/framework/docs/USER_GUIDE.md +583 -0
- package/framework/docs/examples/cloudflare-channel-relay.js +169 -0
- package/framework/docs/examples/cloudflare-data-worker.js +102 -0
- package/framework/docs/examples/cloudflare-error-worker.js +228 -0
- package/framework/index.html +175 -0
- package/framework/js/app/AppActions.js +410 -0
- package/framework/js/app/AppState.js +225 -0
- package/framework/js/app/AppUI.js +616 -0
- package/framework/js/assessment/AssessmentActions.js +615 -0
- package/framework/js/assessment/AssessmentFactory.js +471 -0
- package/framework/js/assessment/AssessmentState.js +322 -0
- package/framework/js/assessment/AssessmentUI.js +451 -0
- package/framework/js/automation/api-engagement.js +196 -0
- package/framework/js/automation/api-interactions.js +167 -0
- package/framework/js/automation/api.js +242 -0
- package/framework/js/automation/index.js +41 -0
- package/framework/js/components/interactions/drag-drop.js +884 -0
- package/framework/js/components/interactions/fill-in.js +535 -0
- package/framework/js/components/interactions/hotspot.js +702 -0
- package/framework/js/components/interactions/interaction-base.js +511 -0
- package/framework/js/components/interactions/likert.js +301 -0
- package/framework/js/components/interactions/matching.js +699 -0
- package/framework/js/components/interactions/multiple-choice.js +377 -0
- package/framework/js/components/interactions/numeric.js +271 -0
- package/framework/js/components/interactions/sequencing.js +423 -0
- package/framework/js/components/interactions/true-false.js +241 -0
- package/framework/js/components/ui-components/accordion.js +442 -0
- package/framework/js/components/ui-components/alert.js +88 -0
- package/framework/js/components/ui-components/audio-player.js +1193 -0
- package/framework/js/components/ui-components/callout.js +121 -0
- package/framework/js/components/ui-components/carousel.js +145 -0
- package/framework/js/components/ui-components/checkbox-group.js +87 -0
- package/framework/js/components/ui-components/checklist.js +40 -0
- package/framework/js/components/ui-components/collapse.js +114 -0
- package/framework/js/components/ui-components/comparison.js +30 -0
- package/framework/js/components/ui-components/conditional-display.js +150 -0
- package/framework/js/components/ui-components/content-image.js +41 -0
- package/framework/js/components/ui-components/dropdown.js +262 -0
- package/framework/js/components/ui-components/embed-frame.js +274 -0
- package/framework/js/components/ui-components/features.js +33 -0
- package/framework/js/components/ui-components/flip-card.js +230 -0
- package/framework/js/components/ui-components/form-validator.js +76 -0
- package/framework/js/components/ui-components/hero.js +49 -0
- package/framework/js/components/ui-components/index.js +12 -0
- package/framework/js/components/ui-components/interactive-image.js +235 -0
- package/framework/js/components/ui-components/interactive-timeline.js +285 -0
- package/framework/js/components/ui-components/intro-cards.js +35 -0
- package/framework/js/components/ui-components/lightbox.js +652 -0
- package/framework/js/components/ui-components/modal.js +386 -0
- package/framework/js/components/ui-components/notifications.js +145 -0
- package/framework/js/components/ui-components/progress.js +88 -0
- package/framework/js/components/ui-components/quote.js +41 -0
- package/framework/js/components/ui-components/stats.js +33 -0
- package/framework/js/components/ui-components/steps.js +41 -0
- package/framework/js/components/ui-components/tabs.js +255 -0
- package/framework/js/components/ui-components/timeline.js +42 -0
- package/framework/js/components/ui-components/toggle-group.js +73 -0
- package/framework/js/components/ui-components/tooltip.js +458 -0
- package/framework/js/components/ui-components/value-display.js +133 -0
- package/framework/js/components/ui-components/video-player.js +686 -0
- package/framework/js/core/component-catalog.js +121 -0
- package/framework/js/core/event-bus.js +178 -0
- package/framework/js/core/interaction-catalog.js +149 -0
- package/framework/js/dev/runtime-linter.js +1725 -0
- package/framework/js/drivers/cmi5-driver.js +768 -0
- package/framework/js/drivers/driver-factory.js +77 -0
- package/framework/js/drivers/driver-interface.js +110 -0
- package/framework/js/drivers/http-driver-base.js +241 -0
- package/framework/js/drivers/lti-driver.js +508 -0
- package/framework/js/drivers/proxy-driver.js +444 -0
- package/framework/js/drivers/scorm-12-driver.js +560 -0
- package/framework/js/drivers/scorm-2004-driver.js +775 -0
- package/framework/js/drivers/scorm-driver-base.js +112 -0
- package/framework/js/engagement/engagement-manager.js +404 -0
- package/framework/js/engagement/engagement-progress.js +191 -0
- package/framework/js/engagement/engagement-trackers.js +215 -0
- package/framework/js/engagement/requirement-strategies.js +268 -0
- package/framework/js/main.js +727 -0
- package/framework/js/managers/accessibility-manager.js +499 -0
- package/framework/js/managers/assessment-manager.js +230 -0
- package/framework/js/managers/audio-manager.js +944 -0
- package/framework/js/managers/comment-manager.js +88 -0
- package/framework/js/managers/flag-manager.js +86 -0
- package/framework/js/managers/interaction-manager.js +254 -0
- package/framework/js/managers/interaction-registry.js +96 -0
- package/framework/js/managers/objective-manager.js +423 -0
- package/framework/js/managers/score-manager.js +441 -0
- package/framework/js/managers/video-manager.js +536 -0
- package/framework/js/navigation/Breadcrumbs.js +234 -0
- package/framework/js/navigation/NavigationActions.js +1132 -0
- package/framework/js/navigation/NavigationState.js +276 -0
- package/framework/js/navigation/NavigationUI.js +574 -0
- package/framework/js/navigation/document-gallery.js +357 -0
- package/framework/js/navigation/navigation-helpers.js +175 -0
- package/framework/js/navigation/navigation-validators.js +174 -0
- package/framework/js/state/index.js +8 -0
- package/framework/js/state/lms-connection.js +482 -0
- package/framework/js/state/lms-error-utils.js +58 -0
- package/framework/js/state/state-commits.js +200 -0
- package/framework/js/state/state-domains.js +86 -0
- package/framework/js/state/state-manager.js +502 -0
- package/framework/js/state/state-validation.js +311 -0
- package/framework/js/state/transaction-log.js +41 -0
- package/framework/js/state/xapi-statement-service.js +325 -0
- package/framework/js/utilities/access-control.js +99 -0
- package/framework/js/utilities/breakpoint-manager.js +315 -0
- package/framework/js/utilities/canvas-slide.js +35 -0
- package/framework/js/utilities/conditional-display.js +388 -0
- package/framework/js/utilities/course-channel.js +214 -0
- package/framework/js/utilities/course-helpers.js +420 -0
- package/framework/js/utilities/data-reporter.js +273 -0
- package/framework/js/utilities/error-reporter.js +313 -0
- package/framework/js/utilities/hotspot-helper.js +341 -0
- package/framework/js/utilities/icons.js +348 -0
- package/framework/js/utilities/logger.js +92 -0
- package/framework/js/utilities/markdown-renderer.js +45 -0
- package/framework/js/utilities/scroll-tracker.js +68 -0
- package/framework/js/utilities/ui-initializer.js +146 -0
- package/framework/js/utilities/utilities.js +293 -0
- package/framework/js/utilities/view-manager.js +227 -0
- package/framework/js/validation/html-validators.js +422 -0
- package/framework/js/validation/scorm-validators.js +438 -0
- package/framework/js/vendor/pipwerks.js +931 -0
- package/framework/scripts/generate-narration.js +629 -0
- package/framework/scripts/tts-providers/azure-provider.js +178 -0
- package/framework/scripts/tts-providers/base-provider.js +81 -0
- package/framework/scripts/tts-providers/deepgram-provider.js +135 -0
- package/framework/scripts/tts-providers/elevenlabs-provider.js +148 -0
- package/framework/scripts/tts-providers/google-provider.js +272 -0
- package/framework/scripts/tts-providers/index.js +158 -0
- package/framework/scripts/tts-providers/openai-provider.js +143 -0
- package/framework/version.json +63 -0
- package/lib/authoring-api.js +919 -0
- package/lib/build-linter.js +450 -0
- package/lib/build-packaging.js +186 -0
- package/lib/build.js +88 -0
- package/lib/cloud.js +691 -0
- package/lib/convert.js +341 -0
- package/lib/course-parser.js +936 -0
- package/lib/course-writer.js +258 -0
- package/lib/create.js +248 -0
- package/lib/css-index.js +237 -0
- package/lib/dev.js +51 -0
- package/lib/export-content.js +1246 -0
- package/lib/headless-browser.js +413 -0
- package/lib/import.js +377 -0
- package/lib/index.js +80 -0
- package/lib/info.js +79 -0
- package/lib/interaction-formatters.js +568 -0
- package/lib/manifest/cmi5-manifest.js +63 -0
- package/lib/manifest/lti-tool-config.js +53 -0
- package/lib/manifest/manifest-factory.js +99 -0
- package/lib/manifest/scorm-12-manifest.js +61 -0
- package/lib/manifest/scorm-2004-manifest.js +94 -0
- package/lib/manifest/scorm-proxy-manifest.js +104 -0
- package/lib/manifest-parser.js +96 -0
- package/lib/mcp-prompts.js +753 -0
- package/lib/mcp-server.js +316 -0
- package/lib/narration.js +53 -0
- package/lib/pdf-structure.js +142 -0
- package/lib/preview-export.js +231 -0
- package/lib/preview-routes-api.js +662 -0
- package/lib/preview-routes-editing.js +159 -0
- package/lib/preview-routes-lms.js +230 -0
- package/lib/preview-server.js +564 -0
- package/lib/project-utils.js +269 -0
- package/lib/proxy-templates/proxy.html +68 -0
- package/lib/proxy-templates/scorm-bridge.js +112 -0
- package/lib/scaffold.js +193 -0
- package/lib/schema-extractor.js +361 -0
- package/lib/slide-source-editor.js +586 -0
- package/lib/stub-player/app-viewer.js +195 -0
- package/lib/stub-player/app.js +370 -0
- package/lib/stub-player/catalog-panel.js +312 -0
- package/lib/stub-player/config-panel.js +1303 -0
- package/lib/stub-player/content-generator.js +586 -0
- package/lib/stub-player/content-viewer.js +173 -0
- package/lib/stub-player/debug-panel.js +420 -0
- package/lib/stub-player/edit-mode.js +922 -0
- package/lib/stub-player/edit-utils.js +400 -0
- package/lib/stub-player/header-bar.js +354 -0
- package/lib/stub-player/interaction-editor.js +210 -0
- package/lib/stub-player/interactions-panel.js +565 -0
- package/lib/stub-player/lms-api.js +1094 -0
- package/lib/stub-player/login-screen.js +74 -0
- package/lib/stub-player/outline-mode.js +689 -0
- package/lib/stub-player/styles/_assessments-panel.css +245 -0
- package/lib/stub-player/styles/_base.css +89 -0
- package/lib/stub-player/styles/_catalog-icons.css +96 -0
- package/lib/stub-player/styles/_catalog-panel.css +291 -0
- package/lib/stub-player/styles/_config-panel.css +636 -0
- package/lib/stub-player/styles/_content-viewer.css +834 -0
- package/lib/stub-player/styles/_debug-panel.css +576 -0
- package/lib/stub-player/styles/_edit-mode.css +128 -0
- package/lib/stub-player/styles/_header-bar.css +343 -0
- package/lib/stub-player/styles/_interaction-editor.css +140 -0
- package/lib/stub-player/styles/_interactions-panel.css +1038 -0
- package/lib/stub-player/styles/_login-screen.css +102 -0
- package/lib/stub-player/styles/_outline-mode.css +752 -0
- package/lib/stub-player/styles.css +15 -0
- package/lib/stub-player.js +160 -0
- package/lib/test-data-reporting.js +176 -0
- package/lib/test-error-reporting.js +146 -0
- package/lib/token.js +86 -0
- package/lib/upgrade.js +257 -0
- package/lib/validation-rules.js +517 -0
- package/lib/vite-plugin-content-discovery.js +296 -0
- package/package.json +108 -0
- package/schemas/XMLSchema.dtd +402 -0
- package/schemas/adlcp_v1p3.xsd +111 -0
- package/schemas/adlnav_v1p3.xsd +61 -0
- package/schemas/adlseq_v1p3.xsd +93 -0
- package/schemas/common/anyElement.xsd +27 -0
- package/schemas/common/dataTypes.xsd +138 -0
- package/schemas/common/elementNames.xsd +767 -0
- package/schemas/common/elementTypes.xsd +786 -0
- package/schemas/common/rootElement.xsd +31 -0
- package/schemas/common/vocabTypes.xsd +345 -0
- package/schemas/common/vocabValues.xsd +257 -0
- package/schemas/datatypes.dtd +203 -0
- package/schemas/ims_xml.xsd +35 -0
- package/schemas/imscp_v1p1.xsd +368 -0
- package/schemas/imsss_v1p0.xsd +67 -0
- package/schemas/imsss_v1p0auxresource.xsd +19 -0
- package/schemas/imsss_v1p0control.xsd +20 -0
- package/schemas/imsss_v1p0delivery.xsd +17 -0
- package/schemas/imsss_v1p0limit.xsd +47 -0
- package/schemas/imsss_v1p0objective.xsd +67 -0
- package/schemas/imsss_v1p0random.xsd +16 -0
- package/schemas/imsss_v1p0rollup.xsd +46 -0
- package/schemas/imsss_v1p0seqrule.xsd +108 -0
- package/schemas/imsss_v1p0util.xsd +94 -0
- package/schemas/license.txt +17 -0
- package/schemas/lom.xsd +102 -0
- package/schemas/lomCustom.xsd +62 -0
- package/schemas/lomLoose.xsd +62 -0
- package/schemas/lomStrict.xsd +62 -0
- package/schemas/xml.xsd +81 -0
- package/template/.env.example +92 -0
- package/template/course/assets/audio/example-intro.mp3 +0 -0
- package/template/course/assets/audio/example-ui-demo--compact-player.mp3 +0 -0
- package/template/course/assets/audio/example-ui-demo--demo-modal.mp3 +0 -0
- package/template/course/assets/audio/example-ui-demo--full-player.mp3 +0 -0
- package/template/course/assets/docs/example_md_1.md +39 -0
- package/template/course/assets/docs/example_md_2.md +41 -0
- package/template/course/assets/docs/example_pdf_1_thumbnail.png +0 -0
- package/template/course/assets/docs/example_pdf_2.pdf +0 -0
- package/template/course/assets/images/course-architecture.svg +36 -0
- package/template/course/assets/images/logo.svg +14 -0
- package/template/course/assets/widgets/counter-demo.html +190 -0
- package/template/course/assets/widgets/gravity-painter.html +384 -0
- package/template/course/course-config.js +539 -0
- package/template/course/icons.js +19 -0
- package/template/course/interactions/PLUGIN_GUIDE.md +97 -0
- package/template/course/slides/example-course-structure.js +138 -0
- package/template/course/slides/example-final-exam.js +144 -0
- package/template/course/slides/example-finishing.js +127 -0
- package/template/course/slides/example-interactions-showcase.js +615 -0
- package/template/course/slides/example-preview-tour.js +129 -0
- package/template/course/slides/example-remedial.js +143 -0
- package/template/course/slides/example-summary.js +103 -0
- package/template/course/slides/example-ui-showcase.js +1805 -0
- package/template/course/slides/example-welcome.js +123 -0
- package/template/course/slides/example-workflow.js +140 -0
- package/template/course/theme.css +165 -0
- package/template/eslint.config.js +47 -0
- package/template/package.json +28 -0
- 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]**
|