Changelog¶
Changelog¶
All notable changes to the LessonKit monorepo are documented here.
@lessonkit/*— core platform (tagv*.*.*)
[Unreleased]¶
[1.7.4] - 2026-07-13¶
Framework 1.7.x patch — version alignment. All seven @lessonkit/* packages ship at 1.7.4. Additive release (no breaking API changes).
Changed¶
@lessonkit/cli:lessonkit inittemplate pins^1.7.4on all@lessonkit/*dependencies
[1.7.3] - 2026-06-12¶
Framework 1.7.x patch — autoCheck retry feedback fixes, assessment resume telemetry replay, and terminal-attempt semantics. All seven @lessonkit/* packages ship at 1.7.3. Additive release (no breaking API changes).
Fixed¶
FillInTheBlanks—autoCheck+enableRetryno longer keeps stale Correct UI after editing a blank to a wrong value (#185)DragTheWords— same stalepassedstate fix when replacing zone words after a pass (#186)Assessment resume replay —
tracking.replayResumeEventsnow replaysassessment_answered/assessment_completedfor failed terminal attempts (not pass-only) onTrueFalse,ArithmeticQuiz,SortParagraphs, andImageSequencing(#122, #123, #129, #172)FindMultipleHotspots— resume replaycorrectusespassingScorethreshold semantics (partial pass replays as correct when threshold met) (#92)GuessTheAnswer/ImagePairing— same terminal replay pattern for consistency (drive-by)Regression tests —
autocheck-stale-pass.test.tsx, resume replay coverage incompound.test.tsx,blocks-1.7.test.tsx, andblocks-tier-bcd.test.tsx
Changed¶
@lessonkit/cli:lessonkit inittemplate pins^1.7.3on all@lessonkit/*dependencies
[1.7.2] - 2026-06-11¶
Framework 1.7.x patch — shared touch primitives, compound navigation, P1 block touch hardening, and mobile E2E coverage. All seven @lessonkit/* packages ship at 1.7.2. Additive release (no breaking API changes).
Added¶
CompoundNav— shared Prev/Next navigation withlk-buttonsizing forSlideDeck,InteractiveBook,AssessmentSequence, andSingleChoiceSetTouchHint— reusable coarse-pointer pick-and-place hint for drag blocksuseDualModeDrag— composesuseCoarsePointer,usePickAndPlace, andusePointerDragfor dual-mode drag assessmentsmockMatchMedia— exported from@lessonkit/react/testingfor coarse-pointer unit testsTheme classes —
.lk-compound-nav,.lk-accordion-trigger,.lk-image-sequence-thumb,.lk-flip-card,.lk-memory-cardMobile E2E — Playwright projects for compound nav, framework-12 showcase (
FindHotspot), and expanded assessments-p0 touch flowsBlock catalog v3 —
a11y.touchmetadata on touch-hardened blocksDocs — Touch behavior sections on component reference pages; touch-and-mobile guide aligned to 1.7+
Changed¶
DragAndDrop/DragTheWords— refactored touseDualModeDrag+TouchHintP1 blocks — touch targets and coarse-pointer patterns on
FindMultipleHotspots,ImageSequencing,ImageSlider,Accordion,Questionnaire,AudioRecorder,ImageSequence,Flashcards,DialogCards,MemoryGame,ImagePairing, andImageHotspotsTrueFalse/MultimediaChoice—lk-quiz-choicerow sizing;GuessTheAnswer—lk-buttonon actions@lessonkit/cli:lessonkit inittemplate pins^1.7.2on all@lessonkit/*dependencies
Fixed¶
FindHotspot— toolbarpointer-eventslets bottom-row hotspot targets receive taps through the overlay chromeInteraction tests — expanded hook and block integration coverage with
mockMatchMedia
[1.7.1] - 2026-06-10¶
Framework 1.7.x patch — touch-friendly web interactions, component documentation completions, and mobile E2E coverage. All seven @lessonkit/* packages ship at 1.7.1. Additive release (no breaking API changes).
Added¶
@lessonkit/reactinteraction hooks —useCoarsePointer,usePickAndPlace,usePointerDrag, andresolveDropTargetAtPointfor pointer-first drag on touch devicesTouch theme tokens —
--lk-touch-target-min,--lk-touch-spacing, and global.lk-button/ control sizing in@lessonkit/themesMobile E2E — Playwright
mobile-assessments-p0project (Pixel 7) for drag-and-drop and assessment flows on coarse pointersDocs — Touch and mobile guide; Try it tabs and variant examples on
SortParagraphs,GuessTheAnswer,MultimediaChoice, andSingleChoiceSetcomponent pages
Changed¶
DragAndDrop/DragTheWords— pointer drag with coarse pick-and-place hints; HTML5 drag disabled on coarse pointers; keyboard resume key preservedAssessment and content blocks — enlarged touch targets on grids, hotspots, quiz choices, summary controls,
MarkTheWords,ImageHotspots,AdventCalendar,SortParagraphs, andTimedCue(allowOutsideClickon coarse)@lessonkit/cli:lessonkit inittemplate pins^1.7.1on all@lessonkit/*dependencies
Fixed¶
Docs build —
touch-and-mobileadded to Sphinx toctree (warnings-as-errors)E2E — mobile drag assertion uses
[aria-live="polite"]to avoid ambiguousrole="status"matches
[1.7.0] - 2026-06-08¶
Framework 1.7.x — four Tier B P1 assessment blocks plus Quiz multi-select/shuffle/feedback variants. All seven @lessonkit/* packages ship at 1.7.0. Additive release (no breaking API changes).
Added¶
SortParagraphs— reorder paragraphs with keyboard Up/Down;interactionType: "sortParagraphs"; SPA-only LXPack descriptorGuessTheAnswer— scored text guess or unscored reveal-only mode;interactionType: "guessTheAnswer"MultimediaChoice— MCQ with image/audio choices; requiresaltTexton every option; injectable via MCQ shell (kind: "multimediaChoice")SingleChoiceSet— sequential MCQ compound (Quiz/KnowledgeCheckchildren only); aggregatedCompoundHandlescoringQuiz/KnowledgeCheckvariants —answersmulti-select,shuffleChoices/shuffleSeed,choiceFeedback; sharedMcqAssessmentPropsin@lessonkit/core@lessonkit/core—sortParagraphsandguessTheAnswerinteraction types; MCQ scoring helpers (scoreMcqSelection,shuffleChoiceIndices);SINGLE_CHOICE_SET_ALLOWED_CHILD_TYPES; compound allowlist updates@lessonkit/lxpack— descriptor kindssortParagraphs,guessTheAnswer,multimediaChoice; MCQanswersdescriptor validation; multi-select MCQ is SPA-only for LMS shell until LXPack multi-correct support; manifest schema$defsBlock catalog v3 — four Tier B entries with H5P machine names
Storybook — stories for all four blocks plus Quiz variant stories (multi-select, shuffle, feedback)
Golden example —
examples/assessments-p0extended with 1.7.0 blocksTests — unit, compound, lxpack, integration SCORM, e2e smoke; Playwright
assessments-p0-scorm12projectDocs — MIGRATION-1.6-to-1.7; capability map ✅ for four blocks; authors guide updates
Docs — LMS Go-Live as canonical shipping guide; backend proxy cookbook;
npm run docs:build; TypeDoc@exampleon high-traffic APIs; adoption-path navigation cleanup
Changed¶
@lessonkit/lxpack: bump@lxpack/*dependencies to 0.7.0; inject multi-select MCQ (answerslength > 1) andshuffleChoicesinto LMS shell quizzes viaselectionMode: "multiple"; mapchoiceFeedbackto shellshowFeedback: "immediate"(per-choice feedback text remains SPA-only)@lessonkit/cli:lessonkit inittemplate pins^1.7.0on all@lessonkit/*dependencies
Fixed¶
@lessonkit/cli: reject unsafedist/contents (e.g.node_modules) inlessonkit devandlessonkit package;initreplaces stalenode_modules/ lockfiles before promote;--here --forcebacks up conflicting dotfiles to.lessonkit-init-backup/@lessonkit/lxpack:validateManifestName()and reserved export path checks; reject absolute or out-of-outDirpackageoutputpaths at validation (#55, #56)@lessonkit/react: gatepipelineDeliveredon xAPI outcome forcourse_started; compoundgetAnswerGivenrespectsanswerPageIndex;ArithmeticQuiztimer no longer tied torunCheck; multi-selectQuizuses plugin scoring; TrueFalse telemetry reports factual correctness@lessonkit/react: xAPI bootstrapflush()failures invokeonXapiTransportError; provider queue wires dead-letter persistence and overflow hooks@lessonkit/xapi:persistDeadLetterStatementreports storage failures viaonDeadLetterPersistError@lessonkit/core:onInvalidSessionIdobservability when session ids are replaced
[1.6.0] - 2026-06-08¶
Framework 1.6.x — portable .lkcourse interchange, block registry CLI, Tier C–E content blocks, GameMap compound, and release-stabilization fixes across LMS scoring, packaging, telemetry, and assessments. All seven @lessonkit/* packages ship at 1.6.0. Additive release (no breaking API changes).
Added¶
.lkcoursearchive —lessonkit exportproduces zip withmanifest.json(envelope),interchange.json,dist/, optionalblock-tree.json@lessonkit/lxpack—exportLkcourse(),validateLkcourse(),importLkcourse(),extractBlockTree(); schemaslkcourse-format.v1.json,block-tree.v1.json;fflatezip helpers with zip-slip guardsCLI —
lessonkit blocks list(--json,--category,--tier) overblock-catalog.v3.json;lessonkit package --strictexposes lxpackstrictBuildTier C/D blocks —
Table,ImageJuxtaposition,Timeline,ImageSequence,Collage,AudioRecorderTier E puzzles —
CombinationLock,QrContent,Crossword,WordSearch,AdventCalendarGameMapcompound —MapStage,MapExit; spatial map UI;map_stage_viewed,map_exit_selectedtelemetryBlock catalog v3 — 14 new entries;
WordSearchpage-level only (excluded from compound allowlists);tierfield restoreslessonkit blocks list --tierObservability —
onCompoundDuplicateCheckIdandonStoragePortChangeIgnoredhooks; compound score contract documentedDocs — interchange reference, MIGRATION-1.5-to-1.6, plugin marketplace research; manifest layers in manifest reference; capability map ✅ for all 1.6.x blocks
Examples —
framework-12-showcasecontent-wave lesson;presetAnalyticsPackplugin presetIntegration test —
lxpack-goldenexport → validate → import round-trip withlessonkit.jsonparityTests & CI — framework-12 e2e smoke; assessments-p0 FillInTheBlanks compound gating e2e; xAPI/cmi5 lesson completion assertions; golden axe-core a11y gate;
blockTiers.tscanonical tier source
Fixed¶
LMS scoring —
normalizeScoreno longer mis-scales{ score: 2, maxScore: 1 };notifyLxpackAssessmentnormalizes raw points; LMS shell and bridge defaultpassingScoreis 1.0 (100%) when omitted, matching React SPA; bridge routes invalidassessment_completedscores throughonBridgeMiss; Quiz UI/telemetry use factual answer correctness separate from plugin pass thresholdPackaging paths —
spaDistDirand packagingoutDirreject reserved directories (.git,node_modules,.github); descriptorspaDistDirvalidated at parse time;outputmust resolve insideoutDirPackaging pipeline —
writeLxpackProjectno longer blocks SPA-only assessment kinds; rejects non-injectable assessments;packageLessonkitCoursereturns structured errors on staging failures;validation.okaligned on warning builds; promote lock timeout increased; SPA-only assessment packaging errors include actionable hintsCLI —
lessonkit buildrejects symlinkeddist; init rollback surfaces failures;lessonkit devstrips passthrough--outDirCore runtime — stable auto-resolved session IDs; explicit learner session swaps re-emit
course_started; telemetry batch re-queues full batch on partial sink failure; course-started dedupe uses tracking mark; compound resume clampsactivePageIndexwhenpageCountprovided; telemetrytrack()dedupes during in-flight flush; course-started marks not cached when durablesetItemfailsReact assessments — Fill/Drag blocks require Check before Next in compounds; plugin scoring wired;
scoreFromCustomfails closed onmaxScore <= 0; duplicatecheckIdrejected in compounds;config.embed.strictHostsoption; storage port cannot change after mount; assessment feedback/telemetry parity across Fill/Drag/DnD/FindMultipleHotspots/Quiz/Summary resume pathsSubtle audit (2nd pass) — MCQ shell injection marks trimmed answers correct;
fillInBlanksrejects invalid blank entries; emptytracking.xapi: {}no longer forcesactivityIri; SCORM e2e requires LMS store status; CI e2e forces artifact rebuild
[1.5.0] - 2026-06-06¶
Framework 1.5.x — BranchingScenario graph compound, Embed and Chart content blocks, branch telemetry, and useBranchingScenario(). All seven @lessonkit/* packages ship at 1.5.0.
Added¶
BranchingScenario,BranchNode,BranchChoice— H5P Branching Scenario–aligned graph navigation with visited-path scoring, session resume, optional path recap UI, anduseBranchingScenario()hookEmbed— sandboxed iframe block (H5P.IFrameEmbed) with restrictive defaultsChart— bar/pie chart with accessible data table fallback (H5P.Chart)Telemetry —
branch_node_viewed,branch_selected(catalog v3 + xAPI node IRIs)Golden example —
examples/branching-scenario;customer-serviceuses declarative branchingDocs — MIGRATION-1.4-to-1.5.md; H5P capability map updates
Docs — MIGRATION-1.x-to-2.0.md deprecation preview; LMS bridge mapping in telemetry docs
Fixed¶
@lessonkit/lxpack: forward
assessment_answered(andquiz_answered) to the LMS bridge viabridge.track;assessment_completedregression coverage@lessonkit/react: wire
onLxpackBridgeErrorandonXapiMappingErrorthrough telemetry, course-started bootstrap, and init template observability@lessonkit/xapi: stable statement IDs for
assessment_completed/quiz_completedretries (idempotent LRS delivery)@lessonkit/core:
onCompoundResumeCorruptobservability when compound child resume state is stripped or corrupt@lessonkit/lxpack: distinct manifest parity error when React source is missing but descriptor defines IDs
Release stabilization — provider dispose/StrictMode regressions, SCORM 1.2 parity, bridge origin allowlist hardening, compound resume integrity, telemetry pipeline observability, and packaging validation fixes from the 1.5.0 release audit pass
[1.4.0] - 2026-06-06¶
Framework 1.4.x — InteractiveVideo (H5P Interactive Video), bundled Tier B/C/D blocks, Studio removal, production-hardening audit pass, and dependency/toolchain refresh. All seven @lessonkit/* packages ship at 1.4.0.
Added¶
@lessonkit/react:
Video,TimedCue,InteractiveVideo; assessmentsSummary,ImagePairing,ImageSequencing,ArithmeticQuiz,Essay; contentQuestionnaire,MemoryGame,InformationWall,ParallaxSlideshow.@lessonkit/core: compound allowlists for
InteractiveVideo/TimedCue; telemetry catalog v3 events (video_cue_reached,video_segment_completed,memory_card_flipped,information_wall_search,parallax_slide_viewed,questionnaire_submitted); assessment interaction types for 1.4 blocks;McqAssessmentProps,LmsBridgeMode;./testingsubpath export for test reset helpers.@lessonkit/react:
assertProductionCourseConfig();shouldEnforceProductionGuard();onXapiTransportErrorobservability hook;./blocksand./testingsubpath exports; optional@lessonkit/lxpackpeer dependency.@lessonkit/xapi: xAPI mappers for new telemetry events;
FetchHttpError; fetch transport skips retry on 4xx except 429.@lessonkit/lxpack:
LessonkitExportTargetalias for packaging targets.CLI init template:
src/courseConfig.tswith production transports, observability,.env.example, andlxpack.bridge: "off".Examples:
examples/interactive-videogolden path; integration SCORM packaging test; Playwright smoke.
Changed¶
Block catalog v3: 38 entries (was 26);
Slideallowlist includesVideoand 1.4 blocks.@lessonkit/react:
QuizPropsandKnowledgeCheckPropsnow useMcqAssessmentPropsfrom@lessonkit/core(wasMcqAssessmentDescriptorfrom lxpack).@lessonkit/lxpack:
@lxpack/*dependencies pinned to exact0.6.4; LXPack compatibility matrix in LXPack interoperability;activityIrimust be HTTPS for xAPI/cmi5 packaging targets.@lessonkit/cli:
exportsfield now includes TypeScript types;lessonkit initrewritescourseConfig.tsandactivityIri; init template uses React 19, Vite 8, and@vitejs/plugin-react6.Dependencies:
@lessonkit/reacttransitively installs@lessonkit/lxpack(and@lxpack/*) for LMS bridge telemetry at runtime; use@lessonkit/clias a devDependency for packaging only; monorepo bumps ESLint 10, jsdom 29,@types/node25, commander 15, and GitHub Actions (checkout/setup-node/setup-python v6, CodeQL v4, deploy-pages/upload-pages-artifact); npm overrides for React types and@testing-library/domfor RTL 16.CI: checks run on Node 20 only (Vite 8 engine requirement); Dependabot for npm and GitHub Actions.
Docs: MIGRATION-1.3-to-1.4.md; H5P capability map rows marked ✅ at 1.4.0;
SECURITY.mdlists 1.4.x; README clarifies lxpack bundles@lxpack/*; onboarding docs (API subpaths, example READMEs, init template packaging scripts); production checklist documents conditional observability hooks (including requiredonXapiTransportError),shouldEnforceProductionGuard(), init templatelxpack.bridge: "off", and.env.example.Test reset helpers on main package entries are deprecated; use
@lessonkit/core/testingand@lessonkit/react/testing.
Removed¶
Studio: Visual Studio authoring packages (
packages/studio-*,apps/studio-web,examples/studio-minimal) removed from the monorepo. LessonKit is React-first only; historicalstudio-v*git tags remain for archaeology.
Fixed¶
@lessonkit/core:
TrackingClient.deliver()settles non-batch sinks;scoreAssessmentmergesinput.lessonIdwith thelessonIdargument;deferPluginSetuphonored when replacing plugins increateLessonkitRuntime.@lessonkit/react:
course_starteddelivery dedupe uses reference-equality flight cleanup; filtered telemetry counts as settled; production guard rejectstracking.enabledwithout a sink; xAPI queue reads fresh observability refs; removed redundant production observability warning from provider.@lessonkit/xapi: fresh
AbortSignalper fetch retry; pagehide aborts in-flight direct sends and delivers queued statements including flush head;skipXapirace fixed when tracking enables mid-flush.@lessonkit/lxpack: SPA dist validation resolves symlinks via
realpath; injectable assessments validated in staging; duplicate MCQ choice labels rejected;packageCourseinjectable scope aligned withvalidateDescriptorForTarget; validation issue path usestracking.xapi.activityIri; ESLint 10preserve-caught-errorin promote/spa dist validation.
[1.3.1] - 2026-06-05¶
Framework 1.3.x patch — production hardening and documentation. All seven @lessonkit/* packages ship at 1.3.1.
Added¶
@lessonkit/xapi:
createFetchTransportandcreateFetchBatchSink(timeout, retry backoff, keepalive pagehide delivery);XAPIClient.flushOnExit().@lessonkit/core:
TrackingClient.flushOnExit()via optionalexitBatchSink;wrapBatchSinkroutes batch failures toonTelemetrySinkError.@lessonkit/lxpack:
validateReactManifestParity—lessonkit packagefails when Reactsrc/omits manifestcourseIdorcheckIdvalues.@lessonkit/react: production observability warning when hooks are missing; pagehide calls
flushOnExitbefore async flush.
Changed¶
@lessonkit/react:
course_startedtracking dedupe mark is written only after a successful flush.@lessonkit/cli:
lessonkit devhas no subprocess timeout; init template uses noop telemetry sinks (noconsole.logPII).Docs: production checklist, telemetry/xAPI guides, Sphinx reference pages updated for 1.3.x observability and transport helpers.
Fixed¶
@lessonkit/react:
batchSinkfailures now invokeonTelemetrySinkError.@lessonkit/react:
course_starteddedupe is atomic under concurrent emit; backup path skips xAPI when primary flush fails; compound persistence waits for resume hydration before saving.@lessonkit/react:
autoCheckretry no longer locks out learners in DragTheWords and FillInTheBlanks; resume telemetry replay for drag, fill, and hotspot blocks.@lessonkit/core:
markCourseStartedreturns a boolean; in-flight telemetry batches included influshOnExit.@lessonkit/xapi: successful queue delivery removes statements by id;
flushOnExitskips in-flight head; fetch transport with timeout, retry, and keepalive pagehide delivery.@lessonkit/lxpack: strict React manifest parity (comment stripping,
.jsx/.jsscan, constant indirection, fail on missing source); promote lock checks PID liveness before TTL expiry.@lessonkit/accessibility / @lessonkit/themes: CSS selector escaping hardening, cloned theme presets, roving focus and trap filtering improvements.
[1.3.0] - 2026-06-04¶
Framework 1.3.x — SlideDeck (H5P Course Presentation). @lessonkit/core, @lessonkit/react, @lessonkit/lxpack, @lessonkit/xapi, @lessonkit/themes, @lessonkit/accessibility, and @lessonkit/cli ship at 1.3.0.
Added¶
@lessonkit/core:
SLIDE_ALLOWED_CHILD_TYPES,SLIDE_DECK_ALLOWED_CHILD_TYPES;slide_viewedin telemetry catalog v3.@lessonkit/react:
Slide,SlideDeck;useCompoundKeyboardNav(Arrow keys, Home, End); block catalog v3 entries for Course Presentation.@lessonkit/xapi: xAPI mapping for
slide_viewed.Example:
examples/slide-deck— golden path for slide navigation, scoring, and session resume.Docs: MIGRATION-1.2-to-1.3.md; H5P capability map marks
H5P.CoursePresentation→SlideDeckas shipped.
Fixed¶
@lessonkit/core: compound resume accepts one-level string-key maps in child state (DragTheWords, FillInTheBlanks, DragAndDrop round-trip); shared volatile session ID across provider and compound hooks;
course_starteddedupe when session storage write fails; batched telemetry partial-flush redelivery andonTelemetryBufferDropobservability.@lessonkit/react: duplicate
assessment_answeredon resume for drag/fill blocks; compound persistence merges live handle state on save; FindHotspot resets when props change; compound containers use providerStoragePort.@lessonkit/xapi: queue no longer drops the oldest non-head event during flush; interaction xAPI mapping guards missing
blockId.@lessonkit/lxpack: symlink-aware path containment for packaging inputs; fail closed on error-severity build issues in CLI
package;remapArtifactPathsthrows on escape.@lessonkit/cli: packaging warnings filter respects issue severity.
1.2.0 - 2026-06-03¶
Framework 1.2.x — Compound containers, resume state, and Tier C/D P0 blocks. @lessonkit/core, @lessonkit/react, @lessonkit/lxpack, @lessonkit/xapi, @lessonkit/themes, and @lessonkit/accessibility ship at 1.2.0.
Added¶
@lessonkit/core:
CompoundHandle,CompoundResumeState, compound session storage v2,compoundAllowlists, telemetry catalog v3 (book_page_viewed, content interaction events).@lessonkit/react:
Page,InteractiveBook,Text,Heading,Image; Tier C/D blocks (Accordion,DialogCards,Flashcards,ImageHotspots,ImageSlider,FindHotspot,FindMultipleHotspots);AssessmentSequenceimplementsCompoundHandle;block-catalog.v3.json(defaultbuildBlockCatalog({ version: 3 })).@lessonkit/lxpack:
findHotspot/findMultipleHotspotsassessment descriptor kinds.Example:
examples/interactive-book,examples/framework-12-showcase(full 1.2 catalog),examples/framework-11-showcase(full 1.1 foundation + P0 assessments).Docs: MIGRATION-1.1-to-1.2.md; ROADMAP 1.2.x milestone; H5P capability map updates; onboarding funnel (Getting started in 5 minutes, Glossary, API reference index, ARCHITECTURE.md, CODE_OF_CONDUCT.md, good first contributions).
Library Skills remote installer:
library-skills/install-remote.sh.GitHub Actions workflow to publish Storybook to GitHub Pages (
.github/workflows/storybook-pages.yml).@lessonkit/core: Headless
createLessonkitRuntimeruns plugin telemetry hooks andscoreAssessment;buildPluginContextexported.
Changed¶
buildBlockCatalog()defaults to catalog v3 (use{ version: 2 }to keep the 1.1.x shape).AssessmentSequenceimplementsCompoundHandleand may surface parent-level scores when using a ref.persistCompoundStatedefaults totrue; provide a uniqueblockIdon each compound container to avoid sharedsessionStoragekeys.runtimeVersion: "v1"logs a development deprecation warning; v2 remains the default.README and quickstart: npm-first funnel,
npm run dev, package install table, examples index.npm package
homepagefields point to Read the Docs.lessonkit inittemplate pins^1.2.0for@lessonkit/*; CLI template Vitest aligned to v4.x.
1.1.0 - 2026-06-03¶
Framework 1.1.x — Assessment contract and Tier B P0 blocks. All seven @lessonkit/* packages ship at 1.1.0.
Added¶
@lessonkit/core:
AssessmentHandle,AssessmentBehaviour,AssessmentXAPIData,AssessmentInteractionType; telemetry eventsassessment_answeredandassessment_completed;telemetry-catalog.v2.jsonandbuildTelemetryCatalogV2().@lessonkit/react:
TrueFalse,FillInTheBlanks,DragAndDrop,DragTheWords,MarkTheWords,AssessmentSequence;useAssessmentState;block-catalog.v2.jsonandblock-contract.v2.json(blockCatalogVersion2 viabuildBlockCatalog({ version: 2 }), default).@lessonkit/xapi: xAPI mapping for
assessment_answered/assessment_completed.@lessonkit/lxpack: Discriminated
AssessmentDescriptor(mcq,trueFalse,fillInBlanks);trueFalseconverts to MCQ for LMS shell packaging;assessment_completedforwards to LXPack bridge.Example:
examples/assessments-p0— golden path for P0 blocks and SCORM 1.2 packaging.Docs: MIGRATION-1.0-to-1.1.md.
Changed¶
lessonkit inittemplate pins^1.1.0for@lessonkit/*.Quiz/KnowledgeCheckprops remainMcqAssessmentDescriptor(unchanged MCQ shape).
Fixed¶
@lessonkit/react:
TrueFalsefeedback respects pluginpassed;passingScoreapplied inscoreFromCustom;autoCheckdedupesassessment_answered; empty FIB/DragTheWords templates and zero-tokenMarkTheWordsshow author-facing errors.Docs / policy: Version badges, SECURITY supported versions, README migration link, broken CHANGELOG paths.
[1.0.2] - 2026-06-01¶
Patch release: telemetry and course-lifecycle correctness, contributor DX, integration test determinism, session storage hardening, and Vitest 4 security upgrade.
Fixed¶
@lessonkit/react:
course_startedtracking dedupe is marked only aftertracking.flush()so batchedbatchSinkdelivery cannot be lost while session storage blocks retry.@lessonkit/react:
Lessonauto-complete on unmount no longer emitslesson_completedunder the wrongcourseIdwhen the provider switches courses (conditional lesson trees /key={courseId}).@lessonkit/react:
course_startednon-tracking pipeline awaits asyncextraSinksbefore marking pipeline delivery (failures retry).@lessonkit/react: Dev-only
<Quiz>outside<Lesson>no longer violates Rules of Hooks (wrapper +QuizInner).@lessonkit/react:
completeLessonaccepts optional{ courseId }and ignores completions when the live provider course differs.@lessonkit/xapi: Duplicate
send()while an in-flight statement fails schedules a retry after the flight completes (success path still dedupes in-flight sends).@lessonkit/core:
createTrackingClient()throws whenbatchSinkis set withbatch.enabled: false.@lessonkit/core:
createSessionStoragePort()falls back to in-memory storage whensessionStorageisnullor throws on access (embedded / restricted contexts).@lessonkit/lxpack: Bridge resolution falls back to
parent.lxpackBridge.v1when the SDK helper returns null.@lessonkit/lxpack: Descriptor validation failures report
courseDiras the staged course directory (outDir), not the packaging output path.Integration tests:
package --no-buildfailure test removes copieddist/so a local fixture build cannot make the test pass spuriously.
Changed¶
Monorepo: Root
pretestrunsbuild:packagesbeforenpm testso workspace tests use current@lessonkit/*dist artifacts.DevDependencies: Vitest and
@vitest/coverage-v8upgraded to 4.1.8 (addresses GHSA-5xrq-8626); removed deprecatedcoverage.allfrom Vitest configs.lessonkit inittemplate: Pins^1.0.2for@lessonkit/*.
[1.0.1] - 2026-05-31¶
Patch release: stronger TypeScript typing across the monorepo with no intended runtime API breaks.
Fixed¶
@lessonkit/react: Do not mark
course_startedas delivered to the tracking sink when a telemetry plugin filters the event; retries when tracking enables after xAPI bootstrap or when the filter is removed.@lessonkit/react: Strict
course_starteddelivery for lxpack bridge andextraSinkswith a pipeline dedupe flag; retry bridge/extraSinkswhen session and tracking marks are set but pipeline delivery failed; honor telemetry plugins in xAPI bootstrap; avoid duplicate xAPI bootstrap after pipeline delivery.@lessonkit/xapi:
flush()awaits in-flight direct transport sends, not only the queued batch.@lessonkit/lxpack: Validate
outDir, manifest paths,output, and absolute--outoverrides withrealpath(blocks symlink escapes); harden promote with unique temp dirs and clear errors for legacy.bak/.tmp-promoteartifacts.@lessonkit/lxpack: Reject Windows drive-relative SPA paths (
C:foo); coerce manifestschemaVersion: "1"(string); trim manifestname; rejectpaths.spaDistDirof.only.@lessonkit/lxpack: Case-insensitive path-under-root checks and
path.relativeremapping for Windows-style artifact paths.@lessonkit/cli: Forward extra Vite CLI args on
lessonkit build;package --no-buildfails fast whendist/is missing;--forcerequires--here.@lessonkit/core:
hasCourseStartedPipelineDelivered/markCourseStartedPipelineDeliveredsession helpers (used by React provider retries).Integration tests: Await golden-example Vite build in
beforeAllsolessonkit package --target standalonedoes not race a missingdist/.
Changed¶
All
@lessonkit/*packages: Discriminated telemetry/CLI result types, ID parse helpers,validateDescriptor(unknown), stricter theme validation, exported component prop types, and@typescript-eslint/no-explicit-anyenforcement.lessonkit inittemplate: Pins^1.0.1for@lessonkit/*.
[1.0.0] - 2026-05-30¶
Stable public API. See MIGRATION-0.x-to-1.0.md.
Fixed¶
@lessonkit/react: Emit
course_startedto the tracking sink when xAPI bootstraps first and tracking is enabled later (without duplicating xAPI statements).@lessonkit/core: Track
course_starteddelivery to the tracking sink separately from xAPI/session dedupe marks.@lessonkit/xapi: Coalesce concurrent
flush()calls so queued statements are not sent twice.@lessonkit/react: Default
QuizpassingScoreto the assessment pluginmaxScorewhen the prop is omitted.@lessonkit/lxpack: Fix cross-platform
remapArtifactPathsprefix checks and Windows output path joining.@lessonkit/lxpack: Restore staged package content when promote fails and
outDirdid not exist yet.library-skills: Fix
install.shdefault (global only),validate.shpath inlessonkit-author, and packaging output path notes.Tooling: Add ESLint (flat config) with CI lint step and library-skills install/validate smoke in packaging CI.
Post-release maintenance (1.0.0 line)¶
Shipped on main without a semver bump (packages remain 1.0.0): Node 18+ for LMS packaging; quiz/lesson/provider hardening; LXPack staging validation; library-skills and CI template parity; items previously listed here through the first 1.0.0 release.
Fixed (1.0.0 maintenance)¶
@lessonkit/core: Isolate sync and async telemetry sink failures so one sink cannot block others or crash callers.
@lessonkit/core: Catch async rejections from non-batch
tracking.sink(dev warning).@lessonkit/core: Skip duplicate
lesson_startedwhen re-activating an already completed lesson (headless runtime).@lessonkit/react: Bootstrap xAPI
course_startedon new clients after remount (Strict Mode / transport swap).@lessonkit/react: Reset headless runtime and progress when
runtimeVersiontoggles between v1 and v2.@lessonkit/react: Skip duplicate
lesson_startedwhen remounting a completed lesson (v1 progress path).@lessonkit/lxpack: Reject
coursearrays inparseLessonkitManifest(clear validation message).@lessonkit/lxpack: Preserve failed promote builds as
.lk-failed-promote-*whenoutDiralready exists.@lessonkit/lxpack: Resolve SPA and
outputBaseDirpaths withrealpathunderprojectRoot.@lessonkit/lxpack: Swallow host bridge throws when forwarding telemetry (dev warning).
@lessonkit/xapi: Map
quiz_answered.correctto xAPIresult.success.@lessonkit/xapi: Skip duplicate in-flight
send()calls for the same statementid.@lessonkit/cli: Clarify
--forcehelp text; README points at bundled template source.@lessonkit/xapi: Add Node 18+
engines; README notes header aligned with 1.0.0.@lessonkit/react: Split
course_startedbootstrap so tracking dedupe is marked before xAPI/bridge pipeline retries (no duplicate tracking events on partial failure).@lessonkit/react: Forward
course_startedto lxpack bridge andextraSinkswhen tracking enables after xAPI bootstrap.@lessonkit/cli: Launch Vite via
node …/vite/bin/vite.jssodevandbuildwork on Windows (no.cmdspawn).@lessonkit/lxpack:
loadLessonkitManifestFromFileaccepts optionalprojectRootfor path validation; trim manifestpaths.*values; reject unsafe relativeoutputwithoutprojectRoot.@lessonkit/lxpack: Promote double-failure throws a recovery message listing
.lk-backup-*and.lk-failed-promote-*paths.Docs: Fix staged packaging example in
docs/PACKAGING.mdfor 1.0validatePackageInputsAPI.
Added¶
Library Skills (
library-skills/) — Agent Skills (SKILL.md) for Cursor, Claude Code, and compatible agents:lessonkit-author,lessonkit-packaging,lessonkit-telemetry,lessonkit-migrate;install.shand docs/guides/library-skills.md.Storybook for
@lessonkit/react(npm run storybook) — Course/Lesson layouts, Quiz states, block stories; CIbuild-storybookjob.Docs: Core reference, LXPack bridge reference; updated plugins, packaging, and migration guides.
Changed¶
runtimeVersion: "v2"is the default headless runtime in@lessonkit/react.Monorepo packages bumped to 1.0.0;
lessonkit inittemplate pins^1.0.0.
Removed (breaking)¶
buildTrackEvent/tryBuildTrackEvent— usebuildTelemetryEvent/tryBuildTelemetryEvent.defineLessonkitPlugin/createPluginHost— use segregated plugin helpers andcreatePluginRegistry.setLxpackBridgeMode— bridge mode is per-call via@lessonkit/lxpack/bridge.
[1.0.0-beta.1] - 2026-05-29¶
SOLID monorepo refactor: headless runtime, telemetry pipeline, segregated plugins, LXPack manifest/packaging stages.
Added¶
@lessonkit/core:buildTelemetryEvent,TelemetryPipeline, segregated plugin types (TelemetryPlugin,AssessmentPlugin,LifecyclePlugin),createPluginRegistry,createLessonkitRuntime, sharedports/progress/sessionmodules.@lessonkit/lxpack:parseLessonkitManifest,dispatchBridgeAction,forwardTelemetryToBridge, packaging stagesvalidatePackageInputs,buildStagingPackage,promoteStagingToOutDir.Docs: MIGRATION-0.x-to-1.0.md.
Changed¶
@lessonkit/react:LessonkitProviderdelegates touseLessonkitProviderRuntime;runtimeVersion: "v2"andsinksconfig; bridge via@lessonkit/lxpack/bridge.@lessonkit/cli: Manifest parsing delegates to@lessonkit/lxpack.Monorepo packages bumped to 1.0.0-beta.1.
Deprecated (removed in 1.0.0)¶
defineLessonkitPlugin/createPluginHost— use segregated plugin helpers andcreatePluginRegistry.React-local
buildTrackEvent— usebuildTelemetryEventfrom core.Legacy
tracking/xapisplit config — useTelemetryPipelineSink[].
[0.9.3] - 2026-05-29¶
Changed¶
Monorepo packages bumped to 0.9.3.
Quiz/KnowledgeCheck: OptionalpassingScoreprop (default1) forwarded to telemetry and the LXPack bridge.
Fixed¶
@lessonkit/cli:
lessonkit inituses@lessonkit/coreslugifyId()so numeric or invalid directory names produce validcourseIdvalues (e.g.9th-grade→id-9th-grade).@lessonkit/core:
composeTrackingSinkpreserves stateful wrapper closures across events while still refreshing context whencourseId/ session changes.@lessonkit/react:
wrapTrackingSinkno longer re-composes the sink on every telemetry event (fixes broken stateful analytics wrappers).@lessonkit/react:
Quizresets answer state whencourseIdchanges in-app.@lessonkit/react: Provider unmount captures the xAPI client before async flush (avoids remount race).
@lessonkit/react:
completeCourse()completes the active in-progress lesson before marking the course complete.@lessonkit/lxpack:
per-lesson-spalessonSpaDirspaths are validated underprojectRootwhen set.
[0.9.2] - 2026-05-29¶
Added¶
@lessonkit/integration: Vitest integration workspace (npm run test:integration) — real CLIinit/build/packagepipeline, golden target matrix, descriptor parity guards.E2E: Playwright launch specs for SCORM 2004 (
API_1484_11mock), xAPI, and cmi5 packages; global-setup packages all golden LMS artifacts.CI: Integration (Node 20) job in
.github/workflows/checks.yml.
Changed¶
Monorepo packages bumped to 0.9.2.
examples/lxpack-golden:tracking.xapi.activityIrifor xAPI / cmi5 packaging and export parity.
Fixed¶
@lessonkit/react: Plugin
onTelemetryBatchandwrapTrackingSinkuse freshcourseId/ session context at delivery time (fixes stale context after in-appcourseIdchanges with batched tracking).@lessonkit/react: Flush batched telemetry before emitting
course_startedwhencourseIdchanges.@lessonkit/react:
Quizfeedback reflectsscoreAssessmentresult (not onlyprops.answer).@lessonkit/react:
scoreAssessmentwithout explicitpassedand withmaxScore0 or unset falls back to answer matching (no longer treats anyscore > 0as pass).@lessonkit/react:
course_startedsession dedupe is marked only after a successful emit (sink failures can retry).@lessonkit/cli: Stricter
lessonkit.jsonvalidation (pathstypes,course.lessons/course.assessmentsarrays,course.spaDistDirvspaths.spaDistDirconflict).@lessonkit/cli:
react-vitepackage target usesINVALID_PROJECTwhendistis missing after build.@lessonkit/lxpack: Reject
outputpaths outsideprojectRootwhenprojectRootis set (direct API use).@lessonkit/cli:
lessonkit initresolves bundled template when CLI runs fromdist/bin.js(fixes template path for published CLI).
[0.9.1] - 2026-05-29¶
Added¶
E2E telemetry harness (
e2e/fixtures/telemetry-harness/): Playwright project for telemetry batching and xAPI queue behavior viawindow.__e2e.E2E: Expanded keyboard coverage on golden Vite (lesson nav, knowledge check).
Docs: Conformance matrix table and CI job map in export parity guide; expanded
e2e/README.md; contributing E2E section.PluginHost.deliverTelemetryBatch: batch flush hook for events already filtered at emit time (avoids doubleonTelemetrypasses).
Changed¶
Monorepo packages bumped to 0.9.1; 0.9.x conformance harness milestone complete per ROADMAP.
@lessonkit/core:TrackingClient.flush/disposemay returnPromise<void>; batcheddisposedrains the buffer after in-flight flushes complete.@lessonkit/react: Provider unmount awaits tracking flush/dispose;setActiveLessonflushes batched telemetry after auto-completing the previous lesson.
Fixed¶
@lessonkit/react: Duplicate course-level xAPI
initializedwhen tracking starts disabled and is enabled later with a transport (bootstrap now markscourse_startedin session storage).@lessonkit/react: Plugin
batchSinkno longer re-runsonTelemetryon buffered events (prevents silent drops from stateful plugins).@lessonkit/react:
Quiz/KnowledgeCheckhonorscoreAssessmentplugins fromLessonkitProvider.@lessonkit/react: Dev warning and flush when
courseIdchanges with an injectedconfig.xapi.client.@lessonkit/lxpack: Validate
outDir/outputBaseDirwhenprojectRootis set; allow./dist-style paths; log promote restore failures.@lessonkit/cli: Pass
projectRootinto packaging; map unsafe--outpaths toCliError(INVALID_PROJECT); hardenlessonkit initJSX string escaping.E2E: Telemetry harness batching spec drains startup lifecycle events before asserting quiz batch coalescing.
[0.9.0] - 2026-05-29¶
Added¶
Plugin architecture (v1) in
@lessonkit/core/@lessonkit/react:LessonkitPlugin,createPluginHost,config.pluginsonLessonkitProvider(telemetry hooks, sink wrapping, assessment scoring slot).Docs: plugins reference, plugin cookbook, example
consoleAnalyticsPlugin.Conformance harness (
e2e/): Playwright e2e forexamples/lxpack-goldenon Vite preview, standalone, and SCORM 1.2 (LMS API mock).CI:
@lxpack/conformancepackaging matrix, golden package matrix, andtest:e2ejob (Node 20).Docs: export parity guide,
e2e/README.md, contributor notes for conformance.
Changed¶
Monorepo packages bumped to 0.9.0; focus milestone is export parity before framework 1.0.
Fixed¶
@lessonkit/react: Emit one course-level xAPI
initializedstatement when both tracking and xAPI transport are configured (removed duplicate bootstrap send on provider mount).
[0.8.2] - 2026-05-29¶
Changed¶
@lessonkit/lxpack: Bump
@lxpack/api,@lxpack/spa-bridge,@lxpack/validators, and@lxpack/tracking-schemato ^0.6.0;packageLessonkitCourse()uses LXPackpackageLessonkit()instead of hand-built YAML + separate validate/build.@lessonkit/lxpack:
descriptorToInterchange()includesruntime,assessments, and interchange types from@lxpack/validators;writeLxpackProject()delegates tomaterializeLessonkitProject()(removed local YAML emitters).@lessonkit/lxpack/bridge: Re-export
@lxpack/spa-bridgeandmapLessonkitTelemetryToBridgeActionfrom@lxpack/tracking-schema;telemetryEventToLessonkit()adapts@lessonkit/coreevents.@lessonkit/react: Forward telemetry to the LXPack bridge via the shared tracking map (replacing hand-rolled switch).
@lessonkit/lxpack: Export
materializeLessonkitProject,parseLessonkitInterchange, andlessonkitInterchangeSchemafor advanced tooling.
[0.8.1] - 2026-05-29¶
Fixed¶
@lessonkit/react: Reset progress synchronously on
courseIdchange so child<Lesson>effects cannot emit completions under the wrong course id.@lessonkit/react: Revert to tab/auto
sessionIdwhensession.sessionIdis cleared from config.@lessonkit/react: Skip
course_startedstorage/delivery whiletracking.enabledisfalse; emit when tracking is re-enabled.@lessonkit/react: Reset
Quizstate whenanswerorquestionchanges; cancel pending dispose timers on provider remount.@lessonkit/react: Remove stale
course_startedstorage keys after session id migration.@lessonkit/cli: Validate
lessonkit.jsonpaths.*andpackage --outstay under the project root.@lessonkit/cli:
init --forceonly allowed when the target directory is empty or contains dotfiles only; template uses{{courseId}}/{{courseTitle}}placeholders.@lessonkit/lxpack:
validateProjectPaths,resolveSafePackageOutputOverride; validate custom theme and completion threshold invalidateDescriptor;writeLxpackProjectresolves relativespaDistDirunder optionalprojectRoot.@lessonkit/lxpack/bridge: Scale
passingScoreto 0–1 whenmaxScoreis provided (matchesnormalizeAssessmentScore); clamp normalized scores to 1.@lessonkit/lxpack: Atomic promote of packaged
outDirso a failedrenamedoes not delete the previous course tree.@lessonkit/lxpack: Validate
passingScoreas absolute points (not capped by choice count); remap nestedbuild.outputPath/outputDirafter staging promote.@lessonkit/react: Emit
course_startedbeforelesson_startedwhencourseIdchanges; reset xAPI queue oncourseIdchange.@lessonkit/react: Harden tracking client dispose on provider unmount.
@lessonkit/react: Skip xAPI client creation when no transport/client unless
xapi.enabled: true; flush batched tracking oncompleteCourse; migratecourse_starteddedup whensession.sessionIdchanges.@lessonkit/cli: Honor
--no-buildforreact-vitepackage target; clarifyinit --force(only with--here).Examples:
lessonkit.jsonfor react-vite, data-privacy, and customer-service; goldencourse.descriptor.tssync;examples/lxpack-golden/README.mddocumentssingle-spalesson ids.Docs: README license Apache-2.0; ROADMAP framework status 0.8.1.
@lessonkit/react: Migrate
course_starteddedup whensession.sessionIdis first supplied after a tab auto-id (including from stored tab session).@lessonkit/react: Reset
Quizcompletion state whencheckIdchanges on a mounted instance.@lessonkit/react: Ignore stale xAPI flush work after transport/client/courseId layout effect cleanup.
Examples:
react-vitemanifest theme preset matches App (brand);lxpack-goldenrenames in-SPA lessonsafety-signoff(distinct from assessmentcheckId) and aligns welcome lesson title with the app.Docs: CLI and guide version callouts updated to 0.8.1.
[0.8.0] - 2026-05-28¶
Added¶
@lessonkit/react: Runtime block catalog v1 —
buildBlockCatalog(),getBlockCatalogEntry(),BLOCK_CATALOG,blockCatalogVersion.@lessonkit/react: Machine-readable
@lessonkit/react/block-catalog.v1.jsonand JSON Schema@lessonkit/react/block-contract.v1.json.Docs:
docs/BLOCK_CATALOG.mdand block catalog reference.Examples:
examples/lxpack-goldendemonstrates every catalog block (KnowledgeCheck, optionalblockIdon Scenario/Reflection).
Changed¶
Monorepo packages bumped to 0.8.0.
Docs: Block catalog reference complete; vibe-coding and components guides link to block catalog.
[0.7.0] - 2026-05-28¶
Added¶
@lessonkit/cli: Real
init,dev,build, andpackagecommands with dual export (react-vite+ LMS targets via@lessonkit/lxpack).lessonkit.jsonv1: Canonical project manifest for packaging.CLI: Structured errors, stable exit codes,
--jsonoutput mode,--skip-install/--forcefor automation.Template bundling: Vite + React starter copied into
@lessonkit/cliforlessonkit init.Docs:
docs/CLI.md.CI: CLI packaging smoke step on golden example.
Changed¶
Monorepo packages bumped to 0.7.0.
examples/lxpack-golden: Packaging scripts uselessonkit packageinstead of customtsxscript.templates/vite-reactand golden example includelessonkit.json.Starter template:
ThemeProviderdefaults topreset="default"/mode="light"to matchlessonkit.json.
Fixed¶
@lessonkit/cli:
paths.outputBaseDiris honored when resolving package artifacts;lessonkit buildpasses Vite--outDirwhenpaths.spaDistDiris notdist.@lessonkit/cli: Project discovery requires
schemaVersion: 1(ignores LXPack interchangelessonkit.jsonunder.lxpack/course).@lessonkit/cli:
lessonkit initpatchessrc/App.tsxcourseIdand course title to match the manifest; rejectsper-lesson-spaforlessonkit package.@lessonkit/lxpack: Descriptor validation requires
layoutand validatestheme.preset.@lessonkit/react:
completeLessonclearsactiveLessonId; provider unmount flushes pending lesson completions before disposing the active tracking client;courseIdchanges re-activate mounted lessons.
[0.6.0] - 2026-05-28¶
Added¶
@lessonkit/lxpack: New package —
LessonkitCourseDescriptor,writeLxpackProject,packageLessonkitCourse,validateLessonkitProject,buildLessonkitProject;themeToLxpackRuntime;single-spaandper-lesson-spalayouts; assessment export; browser bridge (@lessonkit/lxpack/bridge).@lessonkit/react: Forwards
lesson_completed,course_completed, andquiz_completedtowindow.parent.lxpackBridge.v1when embedded (config.lxpack.bridge, defaultauto).Examples:
examples/lxpack-golden— build + SCORM 1.2 / standalone packaging scripts.CI: Node 20 packaging smoke job (golden example → SCORM ZIP).
Docs:
docs/PACKAGING.md; LXPack id mapping indocs/IDENTITY.md; theme parity indocs/THEMING.md.
Changed¶
Monorepo packages bumped to 0.6.0.
Root
build:packagesincludes@lessonkit/lxpack(requires Node 20+ for consumers of the adapter).@lessonkit/react: Depends on
@lessonkit/lxpackfor shared LXPack bridge score normalization.
Fixed¶
@lessonkit/lxpack: Reject unsafe
spaPathvalues and verify copy destinations stay inside the project root.@lessonkit/lxpack: Normalize trimmed ids/titles in validated descriptors; validate
spaLessonId, duplicatespaPath, and assessmentpassingScore/ choices.@lessonkit/lxpack: Clear stale SPA output before re-copy; stage packaging in a temp dir so failed runs do not overwrite a good
outDir.@lessonkit/lxpack: Export
normalizeAssessmentScore/normalizeAssessmentPassingScorefrom@lessonkit/lxpack/bridge.@lessonkit/react: LXPack bridge skips
submitAssessmentwhenquiz_completedhas no finite score (no longer defaults to 100%).@lessonkit/react: Lifecycle telemetry uses canonical
lessonIdwhendata.lessonIdconflicts.@lessonkit/react: Reset progress and emit
course_startedwhencourseIdchanges; sendcourse_startedto xAPI when the client is enabled after mount.@lessonkit/xapi: Dev warning when xAPI transport fails and a statement is re-queued.
0.5.0 - 2026-05-28¶
Added¶
@lessonkit/core: Identity v1 —
validateId,slugifyId,deriveId,buildLessonkitUrn; typedTelemetryEventpayloads;TELEMETRY_EVENT_CATALOG/telemetry-catalog.v1.json;identity-contract.v1.json.@lessonkit/xapi:
telemetryEventToXAPIStatement()— canonical mapping from telemetry to xAPI object URNs.Docs:
docs/IDENTITY.md,docs/TELEMETRY.md.
Changed¶
@lessonkit/react: xAPI emission goes through the telemetry mapper after each
track()(single path for lifecycle and quiz events).@lessonkit/xapi:
createXAPIClientusescourseIdand the mapper internally for lifecycle helpers.
Breaking¶
@lessonkit/react:
courseIdrequired onCourseandLessonkitProvider;lessonIdrequired onLesson(removeduseId()lesson fallback);checkIdrequired onQuiz/KnowledgeCheck.@lessonkit/react:
useQuizState().answer/.completerequirecheckIdin their payloads.@lessonkit/react: Removed exported
sanitizeLessonId.@lessonkit/core: All telemetry events require
courseId; eventdatashapes are discriminated by event name.@lessonkit/xapi: Clients without
courseIdno longer emit lifecycle statements; defaulturn:lessonkitbase id removed.
Fixed¶
@lessonkit/react:
setActiveLessoncompletes the previously active lesson when switching ids (tab/programmatic navigation).@lessonkit/react:
<Lesson>defers completion on unmount so React Strict Mode does not emit spuriouslesson_completedevents in development.@lessonkit/react: Progress state uses
createProgressController()(single implementation shared with tests).@lessonkit/react: Dev-only warnings for invalid
courseId/lessonId/checkId; xAPI mapping skips invalid ids with a dev warning instead of throwing.@lessonkit/core: Test asserts
identity-contract.v1.jsonidPatternmatchesID_PATTERN.
Migration¶
See docs/IDENTITY.md: add courseId, lessonId, and checkId to your components; preserve IDs in source when regenerating.
0.4.0 - 2026-05-28¶
Added¶
@lessonkit/themes: Token schema v1 (colors, spacing, typography, radius, shadows),
validateTheme,mergeThemes,themeToCssVariables, presets (default,light,dark,brand),buildThemeCatalog, publishedtheme-contract.v1.json/theme-catalog.v1.json, optionalbase.css.@lessonkit/react:
ThemeProvider,useTheme, and theme types; injects--lk-*CSS variables on:rootor a scoped element.Docs:
docs/THEMING.md— CSS variable contract, merge precedence, generator catalog paths.Examples/templates: Showcase theme toggle (light / dark / system); styles migrated to
--lk-*variables.
Changed¶
@lessonkit/themes:
LessonkitThemeis now an alias for the fullLessonkitThemeV1schema (breaking if you relied on the old partial shape without other token groups).
Fixed¶
@lessonkit/themes / @lessonkit/react:
preset="brand"no longer forces dark palette colors whenmodeislightorsystem(brand mergesbrandThemeOverridesonto the active mode base).@lessonkit/react:
LessonkitProvideruses sharedcreateXapiClientFromConfigfromruntime/xapi(no duplicate factory logic).Docs: Package READMEs and root example updated for 0.4.0;
SPEC.mdimports@lessonkit/react; theming docs clarifypreset="default"vsdefaultTheme.
0.3.1 - 2026-05-28¶
Fixed¶
@lessonkit/react: Use an isomorphic layout effect in
LessonkitProviderto avoid SSRuseLayoutEffectwarnings while preserving client-side lifecycle behavior.Repo: Make
npm run typecheckdeterministic by building workspace package declarations first.@lessonkit/react: Silence expected React error output in the “missing provider” test while keeping the assertion.
@lessonkit/core: Call
unref()on batched telemetry flush timers so Node test runners and CLIs can exit cleanly.
Changed¶
@lessonkit/core, @lessonkit/xapi, @lessonkit/react: Internal module split (types, tracking client, xAPI queue/client, runtime session ports) with no intended public API changes.
@lessonkit/react: Session and course-started persistence now go through a storage port (
runtime/session).
0.3.0 - 2026-05-28¶
Fixed¶
@lessonkit/react: Move tracking and xAPI client lifecycle to
useLayoutEffect(no dispose side effects inuseMemo); stabilize batch config dependencies on primitive fields.@lessonkit/react: Persist tab-scoped
sessionIdviasessionStoragewhensession.sessionIdis omitted; dedupecourse_startedacross React Strict Mode remounts.@lessonkit/react: Flush shared xAPI queue when
xapi.transportchanges so queued statements are not dropped.@lessonkit/react: Flush batched telemetry on provider unmount; idempotent
completeLesson/completeCoursetelemetry.@lessonkit/react:
Quizemitsquiz_completedon first correct answer; fieldset legend uses bundled visually-hidden styles (no.sr-onlyCSS required).
Added¶
@lessonkit/accessibility:
visuallyHiddenStyleexport for screen-reader-only UI without app CSS.@lessonkit/react: Depends on
@lessonkit/accessibilityfor Quiz legend styling.
Changed¶
Root build order builds
@lessonkit/accessibilitybefore@lessonkit/react.Documentation updated for 0.3.0 (ROADMAP status, React README notes on lesson unmount and sessions).
[0.2.0] - (unreleased on npm; included in 0.3.0)¶
Analytics and tracking milestone (shipped in repo before 0.3.0 hardening):
Session-aware telemetry, optional batching (
@lessonkit/core,@lessonkit/react).LessonkitProviderruntime config (tracking sink,xapi.transport, session metadata).xAPI in-memory queue, richer lesson completion results (
@lessonkit/xapi).Vite React example and template with telemetry/xAPI wiring.
[0.1.1] - 2026-05-27¶
Last version published to npm before 0.2.x.
Initial public packages:
@lessonkit/core,@lessonkit/react,@lessonkit/xapi,@lessonkit/accessibility,@lessonkit/themes,@lessonkit/cli.Tag-based publish workflow and CI checks (build, typecheck, test, coverage).