@plasius/learning 0.2.21 → 0.2.23

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/dist/index.d.cts CHANGED
@@ -142,6 +142,20 @@ interface BadgeDefinitionV1 {
142
142
  tradeable: false;
143
143
  tokenConvertible: false;
144
144
  }
145
+ /** Immutable package export selected by the catalog without importing it. */
146
+ declare const EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1: "1";
147
+ interface ExternalLearningContentReferenceV1 {
148
+ /** Exact public package name; ranges and aliases are not permitted. */
149
+ packageName: string;
150
+ /** Exact semantic version without a range operator. */
151
+ packageVersion: string;
152
+ /** Named ESM/CJS export containing the immutable content manifest. */
153
+ exportName: string;
154
+ /** Exact schema version declared by the referenced exported manifest. */
155
+ schemaVersion: string;
156
+ /** Lower-case SHA-256 of the canonical exported manifest JSON. */
157
+ sha256: string;
158
+ }
145
159
  /** One immutable, independently sellable module version. */
146
160
  interface LearningModuleVersionV1 {
147
161
  id: string;
@@ -163,6 +177,8 @@ interface LearningModuleVersionV1 {
163
177
  assessment: AssessmentRubricV1;
164
178
  agents: ModuleAgentDefinitionV1[];
165
179
  badges: BadgeDefinitionV1[];
180
+ /** Optional separately released content implementation pinned by digest. */
181
+ externalContent?: ExternalLearningContentReferenceV1;
166
182
  }
167
183
  /** A versioned path is a recommendation and never a paid prerequisite chain. */
168
184
  interface LearningPathVersionV1 {
@@ -389,7 +405,7 @@ interface MissionAuthoringValidationIssueV1 {
389
405
  path: string;
390
406
  }
391
407
  interface LearningValidationIssueV1 {
392
- code: "duplicate-module-id" | "duplicate-module-slug" | "module-not-self-contained" | "paid-prerequisite" | "missing-materials" | "facilitator-material-leak" | "learner-material-leak" | "invalid-token-subunits" | "invalid-reference-price" | "rubric-total" | "rubric-dimension-total" | "duplicate-criterion-id" | "missing-mandatory-safety" | "missing-hardware-items" | "invalid-agent-authority" | "missing-missions";
408
+ code: "duplicate-module-id" | "duplicate-module-slug" | "module-not-self-contained" | "paid-prerequisite" | "missing-materials" | "facilitator-material-leak" | "learner-material-leak" | "invalid-token-subunits" | "invalid-reference-price" | "rubric-total" | "rubric-dimension-total" | "duplicate-criterion-id" | "missing-mandatory-safety" | "missing-hardware-items" | "invalid-agent-authority" | "missing-missions" | "invalid-external-content-reference";
393
409
  message: string;
394
410
  moduleId?: string;
395
411
  path: string;
@@ -426,6 +442,42 @@ declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1: LearningPathVersionV1;
426
442
  * without altering previously published records.
427
443
  */
428
444
  declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1: LearningPathVersionV1;
445
+ /** Digest-pinned content package for the independently released 54-stage course. */
446
+ declare const ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1: Readonly<{
447
+ packageName: "@plasius/learning-road-hopper-rally";
448
+ packageVersion: "1.0.0";
449
+ exportName: "ROAD_HOPPER_RALLY_COURSE_V2";
450
+ schemaVersion: "2";
451
+ sha256: "1a20741beba028004e0be527d05aae2b2881082d3b578e0d62308a59bf1323f0";
452
+ }>;
453
+ /** Digest-pinned evidence-led successor; the immutable v2 reference remains available. */
454
+ declare const ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V2: Readonly<{
455
+ packageName: "@plasius/learning-road-hopper-rally";
456
+ packageVersion: "1.1.0";
457
+ exportName: "ROAD_HOPPER_RALLY_COURSE_V3";
458
+ schemaVersion: "3";
459
+ sha256: "f73b90f5f0e483b96724f978f2977435a5e6a1333f5f45fd0fc803b55ad21187";
460
+ }>;
461
+ /** Road Hopper Rally 2.0 catalog record; course data stays in the referenced package. */
462
+ declare const JUNIOR_CODER_ROAD_HOPPER_RALLY_V2: LearningModuleVersionV1;
463
+ /** Evidence-led Road Hopper 2.1 record; the executable course remains external. */
464
+ declare const JUNIOR_CODER_ROAD_HOPPER_RALLY_V2_1: LearningModuleVersionV1;
465
+ /** Mixed-version successor: Road Hopper 2.0 plus every other immutable 1.1 module. */
466
+ declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2: LearningPathVersionV1;
467
+ /** Digest-pinned Paddle Pulse 2.0 reference-module content. */
468
+ declare const PADDLE_PULSE_EXTERNAL_CONTENT_V1: Readonly<{
469
+ packageName: "@plasius/learning-paddle-pulse";
470
+ packageVersion: "0.1.0";
471
+ exportName: "PADDLE_PULSE_MODULE_V2";
472
+ schemaVersion: "2";
473
+ sha256: "19f3666bdb523a3faf069341b0bc748996b3db282f89171e3c9f0a373a8c8f7e";
474
+ }>;
475
+ /** Paddle Pulse 2.0 catalog record; executable content stays in its package. */
476
+ declare const JUNIOR_CODER_PADDLE_PULSE_V2: LearningModuleVersionV1;
477
+ /** Mixed-version successor adding Paddle Pulse 2.0 without mutating v1.1. */
478
+ declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3: LearningPathVersionV1;
479
+ /** Mixed-version successor adding evidence-led Road Hopper without mutating v1.3. */
480
+ declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_4: LearningPathVersionV1;
429
481
  /** Current pilot catalog for server adapters that intentionally follow releases. */
430
482
  declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT: LearningPathVersionV1;
431
483
 
@@ -728,9 +780,11 @@ declare const ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1: MissionAuthoringBu
728
780
  declare const ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1: MissionAuthoringBundleV1;
729
781
  declare const ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1: MissionAuthoringBundleV1;
730
782
 
783
+ /** Runtime guard for digest-pinned external learning content references. */
784
+ declare function isExternalLearningContentReferenceV1(value: unknown): value is ExternalLearningContentReferenceV1;
731
785
  /** Return every catalog issue without throwing, suitable for authoring tools. */
732
786
  declare function validateLearningPath(path: LearningPathVersionV1): LearningValidationIssueV1[];
733
787
  /** Fail fast when a path is not safe to publish or consume. */
734
788
  declare function assertValidLearningPath(path: LearningPathVersionV1): void;
735
789
 
736
- export { ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1, type AdventureMissionPlannerSafeRenderV1, type AssessmentCheckResultV1, type AssessmentCriterionV1, type AssessmentDimensionV1, type AssessmentResultV1, type AssessmentRubricV1, type AttemptEvidenceV1, BEACON_BOT_MISSION_ONE_AUTHORING_V1, type BadgeDefinitionV1, CONTEXTUAL_HELP_CONTRACT_VERSION_V1, CONTEXTUAL_HELP_KINDS_V1, CONTEXTUAL_VOICE_INTENTS_V1, CONTEXTUAL_VOICE_SUGGESTED_ACTIONS_V1, CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1, type CanonicalSpokenHelpDescriptorV1, type CommercialStateV1, type ContextualHelpIdentifierV1, type ContextualHelpKindV1, type ContextualVoiceAnswerV1, type ContextualVoiceIntentV1, type ContextualVoiceQuestionMetadataV1, type ContextualVoiceQuestionResultV1, type ContextualVoiceSuggestedActionV1, type CourseMaterialAudienceV1, type CourseMaterialKindV1, type CourseMaterialV1, type CourseMaterialsManifestV1, type CreatureCareDashboardSafeRenderV1, DANCE_ROVER_MISSION_ONE_AUTHORING_V1, type FacilitatorMissionAuthoringV1, type GuardianAiConsentV1, type GuardianVoiceConsentStateV1, type GuardianVoiceConsentV1, type GuardianVoiceProcessingRouteV1, type HardwareItemV1, type HardwareModeV1, type HardwareRequirementManifestV1, type HardwareVerificationStatusV1, JUNIOR_CODER_MISSION_STAGE_ORDER_V1, JUNIOR_CODER_MODULE_PRICE_V1_1, JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1, type LearnerMissionAuthoringV1, type LearningGoalV1, type LearningModuleVersionV1, type LearningPathVersionV1, type LearningValidationIssueV1, METEOR_SHIELD_MISSION_ONE_AUTHORING_V1, MISSION_AUTHORING_CONTRACT_VERSION_V1, type MissionAccessibilityAlternativeV1, type MissionArtifactKindV1, type MissionArtifactReferenceV1, type MissionAuthoringBundleV1, type MissionAuthoringGoalV1, type MissionAuthoringValidationIssueV1, type MissionBoundedSuggestionV1, type MissionEvidenceKindV1, type MissionEvidenceRequirementV1, type MissionEvidenceRetentionV1, type MissionFunctionParameterV1, type MissionFunctionReferenceV1, type MissionHardwareAcquisitionScopeV1, type MissionHardwareComponentDisclosureV1, type MissionHardwareDisclosureV1, type MissionInteractionModeV1, type MissionInteractionRequirementV1, type MissionPhysicalSafeguardsV1, type MissionReadinessCheckV1, type MissionRewardBindingV1, type MissionSideAdventureV1, type MissionStageCardV1, type MissionStageKindV1, type MissionV1, type ModuleAgentDefinitionV1, type ModuleAgentFeedbackV1, type ModuleAgentRoleV1, type ModuleCategoryV1, type ModuleEntitlementV1, type ModulePricingV1, type ModuleReferencePriceV1, OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1, PADDLE_PULSE_MISSION_ONE_AUTHORING_V1, PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1, type PublishedStaticProjectSnapshotV1, RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1, RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1, ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1, ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1, ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1, type RobotMissionControlSafeRenderV1, SERVO_CREATURE_MISSION_ONE_AUTHORING_V1, SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1, STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1, STATIC_PROJECT_APPROVAL_STATEMENT_VERSION_V1, STATIC_PROJECT_DEFAULT_LIFETIME_DAYS_V1, STATIC_PROJECT_MAX_SOURCE_CHARACTERS_V1, STATIC_PROJECT_PUBLISHING_CONTRACT_VERSION_V1, STATIC_PROJECT_SAFETY_CHECK_IDS_V1, STATIC_PROJECT_SCANNER_VERSION_V1, type ScoreBandV1, type StaticProjectContractIssueV1, type StaticProjectGuardianApprovalV1, type StaticProjectModuleSlugV1, type StaticProjectPublicationV1, type StaticProjectSafeRenderV1, type StaticProjectSafetyCheckIdV1, type StaticProjectSafetyCheckV1, type StaticProjectSafetyScanV1, type StaticProjectSnapshotV1, VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1, VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1, VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1, type VoiceHelpAvailabilityReasonV1, type VoiceHelpAvailabilityV1, assertValidCanonicalSpokenHelpDescriptor, assertValidContextualHelpIdentifier, assertValidContextualVoiceQuestionMetadata, assertValidContextualVoiceQuestionResult, assertValidGuardianVoiceConsent, assertValidLearningPath, assertValidMissionAuthoringBundle, assertValidStaticProjectGuardianApproval, assertValidStaticProjectPublication, assertValidStaticProjectSnapshot, assertValidVoiceHelpAvailability, calculateAssessment, validateAssessmentRubric, validateLearningPath, validateMissionAuthoringBundle, validateStaticProjectGuardianApproval, validateStaticProjectPublication, validateStaticProjectSnapshot };
790
+ export { ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1, type AdventureMissionPlannerSafeRenderV1, type AssessmentCheckResultV1, type AssessmentCriterionV1, type AssessmentDimensionV1, type AssessmentResultV1, type AssessmentRubricV1, type AttemptEvidenceV1, BEACON_BOT_MISSION_ONE_AUTHORING_V1, type BadgeDefinitionV1, CONTEXTUAL_HELP_CONTRACT_VERSION_V1, CONTEXTUAL_HELP_KINDS_V1, CONTEXTUAL_VOICE_INTENTS_V1, CONTEXTUAL_VOICE_SUGGESTED_ACTIONS_V1, CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1, type CanonicalSpokenHelpDescriptorV1, type CommercialStateV1, type ContextualHelpIdentifierV1, type ContextualHelpKindV1, type ContextualVoiceAnswerV1, type ContextualVoiceIntentV1, type ContextualVoiceQuestionMetadataV1, type ContextualVoiceQuestionResultV1, type ContextualVoiceSuggestedActionV1, type CourseMaterialAudienceV1, type CourseMaterialKindV1, type CourseMaterialV1, type CourseMaterialsManifestV1, type CreatureCareDashboardSafeRenderV1, DANCE_ROVER_MISSION_ONE_AUTHORING_V1, EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1, type ExternalLearningContentReferenceV1, type FacilitatorMissionAuthoringV1, type GuardianAiConsentV1, type GuardianVoiceConsentStateV1, type GuardianVoiceConsentV1, type GuardianVoiceProcessingRouteV1, type HardwareItemV1, type HardwareModeV1, type HardwareRequirementManifestV1, type HardwareVerificationStatusV1, JUNIOR_CODER_MISSION_STAGE_ORDER_V1, JUNIOR_CODER_MODULE_PRICE_V1_1, JUNIOR_CODER_PADDLE_PULSE_V2, JUNIOR_CODER_ROAD_HOPPER_RALLY_V2, JUNIOR_CODER_ROAD_HOPPER_RALLY_V2_1, JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_4, type LearnerMissionAuthoringV1, type LearningGoalV1, type LearningModuleVersionV1, type LearningPathVersionV1, type LearningValidationIssueV1, METEOR_SHIELD_MISSION_ONE_AUTHORING_V1, MISSION_AUTHORING_CONTRACT_VERSION_V1, type MissionAccessibilityAlternativeV1, type MissionArtifactKindV1, type MissionArtifactReferenceV1, type MissionAuthoringBundleV1, type MissionAuthoringGoalV1, type MissionAuthoringValidationIssueV1, type MissionBoundedSuggestionV1, type MissionEvidenceKindV1, type MissionEvidenceRequirementV1, type MissionEvidenceRetentionV1, type MissionFunctionParameterV1, type MissionFunctionReferenceV1, type MissionHardwareAcquisitionScopeV1, type MissionHardwareComponentDisclosureV1, type MissionHardwareDisclosureV1, type MissionInteractionModeV1, type MissionInteractionRequirementV1, type MissionPhysicalSafeguardsV1, type MissionReadinessCheckV1, type MissionRewardBindingV1, type MissionSideAdventureV1, type MissionStageCardV1, type MissionStageKindV1, type MissionV1, type ModuleAgentDefinitionV1, type ModuleAgentFeedbackV1, type ModuleAgentRoleV1, type ModuleCategoryV1, type ModuleEntitlementV1, type ModulePricingV1, type ModuleReferencePriceV1, OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1, PADDLE_PULSE_EXTERNAL_CONTENT_V1, PADDLE_PULSE_MISSION_ONE_AUTHORING_V1, PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1, type PublishedStaticProjectSnapshotV1, RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1, RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1, ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1, ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V2, ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1, ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1, ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1, type RobotMissionControlSafeRenderV1, SERVO_CREATURE_MISSION_ONE_AUTHORING_V1, SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1, STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1, STATIC_PROJECT_APPROVAL_STATEMENT_VERSION_V1, STATIC_PROJECT_DEFAULT_LIFETIME_DAYS_V1, STATIC_PROJECT_MAX_SOURCE_CHARACTERS_V1, STATIC_PROJECT_PUBLISHING_CONTRACT_VERSION_V1, STATIC_PROJECT_SAFETY_CHECK_IDS_V1, STATIC_PROJECT_SCANNER_VERSION_V1, type ScoreBandV1, type StaticProjectContractIssueV1, type StaticProjectGuardianApprovalV1, type StaticProjectModuleSlugV1, type StaticProjectPublicationV1, type StaticProjectSafeRenderV1, type StaticProjectSafetyCheckIdV1, type StaticProjectSafetyCheckV1, type StaticProjectSafetyScanV1, type StaticProjectSnapshotV1, VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1, VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1, VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1, type VoiceHelpAvailabilityReasonV1, type VoiceHelpAvailabilityV1, assertValidCanonicalSpokenHelpDescriptor, assertValidContextualHelpIdentifier, assertValidContextualVoiceQuestionMetadata, assertValidContextualVoiceQuestionResult, assertValidGuardianVoiceConsent, assertValidLearningPath, assertValidMissionAuthoringBundle, assertValidStaticProjectGuardianApproval, assertValidStaticProjectPublication, assertValidStaticProjectSnapshot, assertValidVoiceHelpAvailability, calculateAssessment, isExternalLearningContentReferenceV1, validateAssessmentRubric, validateLearningPath, validateMissionAuthoringBundle, validateStaticProjectGuardianApproval, validateStaticProjectPublication, validateStaticProjectSnapshot };
package/dist/index.d.ts CHANGED
@@ -142,6 +142,20 @@ interface BadgeDefinitionV1 {
142
142
  tradeable: false;
143
143
  tokenConvertible: false;
144
144
  }
145
+ /** Immutable package export selected by the catalog without importing it. */
146
+ declare const EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1: "1";
147
+ interface ExternalLearningContentReferenceV1 {
148
+ /** Exact public package name; ranges and aliases are not permitted. */
149
+ packageName: string;
150
+ /** Exact semantic version without a range operator. */
151
+ packageVersion: string;
152
+ /** Named ESM/CJS export containing the immutable content manifest. */
153
+ exportName: string;
154
+ /** Exact schema version declared by the referenced exported manifest. */
155
+ schemaVersion: string;
156
+ /** Lower-case SHA-256 of the canonical exported manifest JSON. */
157
+ sha256: string;
158
+ }
145
159
  /** One immutable, independently sellable module version. */
146
160
  interface LearningModuleVersionV1 {
147
161
  id: string;
@@ -163,6 +177,8 @@ interface LearningModuleVersionV1 {
163
177
  assessment: AssessmentRubricV1;
164
178
  agents: ModuleAgentDefinitionV1[];
165
179
  badges: BadgeDefinitionV1[];
180
+ /** Optional separately released content implementation pinned by digest. */
181
+ externalContent?: ExternalLearningContentReferenceV1;
166
182
  }
167
183
  /** A versioned path is a recommendation and never a paid prerequisite chain. */
168
184
  interface LearningPathVersionV1 {
@@ -389,7 +405,7 @@ interface MissionAuthoringValidationIssueV1 {
389
405
  path: string;
390
406
  }
391
407
  interface LearningValidationIssueV1 {
392
- code: "duplicate-module-id" | "duplicate-module-slug" | "module-not-self-contained" | "paid-prerequisite" | "missing-materials" | "facilitator-material-leak" | "learner-material-leak" | "invalid-token-subunits" | "invalid-reference-price" | "rubric-total" | "rubric-dimension-total" | "duplicate-criterion-id" | "missing-mandatory-safety" | "missing-hardware-items" | "invalid-agent-authority" | "missing-missions";
408
+ code: "duplicate-module-id" | "duplicate-module-slug" | "module-not-self-contained" | "paid-prerequisite" | "missing-materials" | "facilitator-material-leak" | "learner-material-leak" | "invalid-token-subunits" | "invalid-reference-price" | "rubric-total" | "rubric-dimension-total" | "duplicate-criterion-id" | "missing-mandatory-safety" | "missing-hardware-items" | "invalid-agent-authority" | "missing-missions" | "invalid-external-content-reference";
393
409
  message: string;
394
410
  moduleId?: string;
395
411
  path: string;
@@ -426,6 +442,42 @@ declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1: LearningPathVersionV1;
426
442
  * without altering previously published records.
427
443
  */
428
444
  declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1: LearningPathVersionV1;
445
+ /** Digest-pinned content package for the independently released 54-stage course. */
446
+ declare const ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1: Readonly<{
447
+ packageName: "@plasius/learning-road-hopper-rally";
448
+ packageVersion: "1.0.0";
449
+ exportName: "ROAD_HOPPER_RALLY_COURSE_V2";
450
+ schemaVersion: "2";
451
+ sha256: "1a20741beba028004e0be527d05aae2b2881082d3b578e0d62308a59bf1323f0";
452
+ }>;
453
+ /** Digest-pinned evidence-led successor; the immutable v2 reference remains available. */
454
+ declare const ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V2: Readonly<{
455
+ packageName: "@plasius/learning-road-hopper-rally";
456
+ packageVersion: "1.1.0";
457
+ exportName: "ROAD_HOPPER_RALLY_COURSE_V3";
458
+ schemaVersion: "3";
459
+ sha256: "f73b90f5f0e483b96724f978f2977435a5e6a1333f5f45fd0fc803b55ad21187";
460
+ }>;
461
+ /** Road Hopper Rally 2.0 catalog record; course data stays in the referenced package. */
462
+ declare const JUNIOR_CODER_ROAD_HOPPER_RALLY_V2: LearningModuleVersionV1;
463
+ /** Evidence-led Road Hopper 2.1 record; the executable course remains external. */
464
+ declare const JUNIOR_CODER_ROAD_HOPPER_RALLY_V2_1: LearningModuleVersionV1;
465
+ /** Mixed-version successor: Road Hopper 2.0 plus every other immutable 1.1 module. */
466
+ declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2: LearningPathVersionV1;
467
+ /** Digest-pinned Paddle Pulse 2.0 reference-module content. */
468
+ declare const PADDLE_PULSE_EXTERNAL_CONTENT_V1: Readonly<{
469
+ packageName: "@plasius/learning-paddle-pulse";
470
+ packageVersion: "0.1.0";
471
+ exportName: "PADDLE_PULSE_MODULE_V2";
472
+ schemaVersion: "2";
473
+ sha256: "19f3666bdb523a3faf069341b0bc748996b3db282f89171e3c9f0a373a8c8f7e";
474
+ }>;
475
+ /** Paddle Pulse 2.0 catalog record; executable content stays in its package. */
476
+ declare const JUNIOR_CODER_PADDLE_PULSE_V2: LearningModuleVersionV1;
477
+ /** Mixed-version successor adding Paddle Pulse 2.0 without mutating v1.1. */
478
+ declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3: LearningPathVersionV1;
479
+ /** Mixed-version successor adding evidence-led Road Hopper without mutating v1.3. */
480
+ declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_4: LearningPathVersionV1;
429
481
  /** Current pilot catalog for server adapters that intentionally follow releases. */
430
482
  declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT: LearningPathVersionV1;
431
483
 
@@ -728,9 +780,11 @@ declare const ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1: MissionAuthoringBu
728
780
  declare const ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1: MissionAuthoringBundleV1;
729
781
  declare const ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1: MissionAuthoringBundleV1;
730
782
 
783
+ /** Runtime guard for digest-pinned external learning content references. */
784
+ declare function isExternalLearningContentReferenceV1(value: unknown): value is ExternalLearningContentReferenceV1;
731
785
  /** Return every catalog issue without throwing, suitable for authoring tools. */
732
786
  declare function validateLearningPath(path: LearningPathVersionV1): LearningValidationIssueV1[];
733
787
  /** Fail fast when a path is not safe to publish or consume. */
734
788
  declare function assertValidLearningPath(path: LearningPathVersionV1): void;
735
789
 
736
- export { ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1, type AdventureMissionPlannerSafeRenderV1, type AssessmentCheckResultV1, type AssessmentCriterionV1, type AssessmentDimensionV1, type AssessmentResultV1, type AssessmentRubricV1, type AttemptEvidenceV1, BEACON_BOT_MISSION_ONE_AUTHORING_V1, type BadgeDefinitionV1, CONTEXTUAL_HELP_CONTRACT_VERSION_V1, CONTEXTUAL_HELP_KINDS_V1, CONTEXTUAL_VOICE_INTENTS_V1, CONTEXTUAL_VOICE_SUGGESTED_ACTIONS_V1, CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1, type CanonicalSpokenHelpDescriptorV1, type CommercialStateV1, type ContextualHelpIdentifierV1, type ContextualHelpKindV1, type ContextualVoiceAnswerV1, type ContextualVoiceIntentV1, type ContextualVoiceQuestionMetadataV1, type ContextualVoiceQuestionResultV1, type ContextualVoiceSuggestedActionV1, type CourseMaterialAudienceV1, type CourseMaterialKindV1, type CourseMaterialV1, type CourseMaterialsManifestV1, type CreatureCareDashboardSafeRenderV1, DANCE_ROVER_MISSION_ONE_AUTHORING_V1, type FacilitatorMissionAuthoringV1, type GuardianAiConsentV1, type GuardianVoiceConsentStateV1, type GuardianVoiceConsentV1, type GuardianVoiceProcessingRouteV1, type HardwareItemV1, type HardwareModeV1, type HardwareRequirementManifestV1, type HardwareVerificationStatusV1, JUNIOR_CODER_MISSION_STAGE_ORDER_V1, JUNIOR_CODER_MODULE_PRICE_V1_1, JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1, type LearnerMissionAuthoringV1, type LearningGoalV1, type LearningModuleVersionV1, type LearningPathVersionV1, type LearningValidationIssueV1, METEOR_SHIELD_MISSION_ONE_AUTHORING_V1, MISSION_AUTHORING_CONTRACT_VERSION_V1, type MissionAccessibilityAlternativeV1, type MissionArtifactKindV1, type MissionArtifactReferenceV1, type MissionAuthoringBundleV1, type MissionAuthoringGoalV1, type MissionAuthoringValidationIssueV1, type MissionBoundedSuggestionV1, type MissionEvidenceKindV1, type MissionEvidenceRequirementV1, type MissionEvidenceRetentionV1, type MissionFunctionParameterV1, type MissionFunctionReferenceV1, type MissionHardwareAcquisitionScopeV1, type MissionHardwareComponentDisclosureV1, type MissionHardwareDisclosureV1, type MissionInteractionModeV1, type MissionInteractionRequirementV1, type MissionPhysicalSafeguardsV1, type MissionReadinessCheckV1, type MissionRewardBindingV1, type MissionSideAdventureV1, type MissionStageCardV1, type MissionStageKindV1, type MissionV1, type ModuleAgentDefinitionV1, type ModuleAgentFeedbackV1, type ModuleAgentRoleV1, type ModuleCategoryV1, type ModuleEntitlementV1, type ModulePricingV1, type ModuleReferencePriceV1, OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1, PADDLE_PULSE_MISSION_ONE_AUTHORING_V1, PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1, type PublishedStaticProjectSnapshotV1, RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1, RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1, ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1, ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1, ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1, type RobotMissionControlSafeRenderV1, SERVO_CREATURE_MISSION_ONE_AUTHORING_V1, SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1, STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1, STATIC_PROJECT_APPROVAL_STATEMENT_VERSION_V1, STATIC_PROJECT_DEFAULT_LIFETIME_DAYS_V1, STATIC_PROJECT_MAX_SOURCE_CHARACTERS_V1, STATIC_PROJECT_PUBLISHING_CONTRACT_VERSION_V1, STATIC_PROJECT_SAFETY_CHECK_IDS_V1, STATIC_PROJECT_SCANNER_VERSION_V1, type ScoreBandV1, type StaticProjectContractIssueV1, type StaticProjectGuardianApprovalV1, type StaticProjectModuleSlugV1, type StaticProjectPublicationV1, type StaticProjectSafeRenderV1, type StaticProjectSafetyCheckIdV1, type StaticProjectSafetyCheckV1, type StaticProjectSafetyScanV1, type StaticProjectSnapshotV1, VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1, VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1, VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1, type VoiceHelpAvailabilityReasonV1, type VoiceHelpAvailabilityV1, assertValidCanonicalSpokenHelpDescriptor, assertValidContextualHelpIdentifier, assertValidContextualVoiceQuestionMetadata, assertValidContextualVoiceQuestionResult, assertValidGuardianVoiceConsent, assertValidLearningPath, assertValidMissionAuthoringBundle, assertValidStaticProjectGuardianApproval, assertValidStaticProjectPublication, assertValidStaticProjectSnapshot, assertValidVoiceHelpAvailability, calculateAssessment, validateAssessmentRubric, validateLearningPath, validateMissionAuthoringBundle, validateStaticProjectGuardianApproval, validateStaticProjectPublication, validateStaticProjectSnapshot };
790
+ export { ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1, type AdventureMissionPlannerSafeRenderV1, type AssessmentCheckResultV1, type AssessmentCriterionV1, type AssessmentDimensionV1, type AssessmentResultV1, type AssessmentRubricV1, type AttemptEvidenceV1, BEACON_BOT_MISSION_ONE_AUTHORING_V1, type BadgeDefinitionV1, CONTEXTUAL_HELP_CONTRACT_VERSION_V1, CONTEXTUAL_HELP_KINDS_V1, CONTEXTUAL_VOICE_INTENTS_V1, CONTEXTUAL_VOICE_SUGGESTED_ACTIONS_V1, CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1, type CanonicalSpokenHelpDescriptorV1, type CommercialStateV1, type ContextualHelpIdentifierV1, type ContextualHelpKindV1, type ContextualVoiceAnswerV1, type ContextualVoiceIntentV1, type ContextualVoiceQuestionMetadataV1, type ContextualVoiceQuestionResultV1, type ContextualVoiceSuggestedActionV1, type CourseMaterialAudienceV1, type CourseMaterialKindV1, type CourseMaterialV1, type CourseMaterialsManifestV1, type CreatureCareDashboardSafeRenderV1, DANCE_ROVER_MISSION_ONE_AUTHORING_V1, EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1, type ExternalLearningContentReferenceV1, type FacilitatorMissionAuthoringV1, type GuardianAiConsentV1, type GuardianVoiceConsentStateV1, type GuardianVoiceConsentV1, type GuardianVoiceProcessingRouteV1, type HardwareItemV1, type HardwareModeV1, type HardwareRequirementManifestV1, type HardwareVerificationStatusV1, JUNIOR_CODER_MISSION_STAGE_ORDER_V1, JUNIOR_CODER_MODULE_PRICE_V1_1, JUNIOR_CODER_PADDLE_PULSE_V2, JUNIOR_CODER_ROAD_HOPPER_RALLY_V2, JUNIOR_CODER_ROAD_HOPPER_RALLY_V2_1, JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_4, type LearnerMissionAuthoringV1, type LearningGoalV1, type LearningModuleVersionV1, type LearningPathVersionV1, type LearningValidationIssueV1, METEOR_SHIELD_MISSION_ONE_AUTHORING_V1, MISSION_AUTHORING_CONTRACT_VERSION_V1, type MissionAccessibilityAlternativeV1, type MissionArtifactKindV1, type MissionArtifactReferenceV1, type MissionAuthoringBundleV1, type MissionAuthoringGoalV1, type MissionAuthoringValidationIssueV1, type MissionBoundedSuggestionV1, type MissionEvidenceKindV1, type MissionEvidenceRequirementV1, type MissionEvidenceRetentionV1, type MissionFunctionParameterV1, type MissionFunctionReferenceV1, type MissionHardwareAcquisitionScopeV1, type MissionHardwareComponentDisclosureV1, type MissionHardwareDisclosureV1, type MissionInteractionModeV1, type MissionInteractionRequirementV1, type MissionPhysicalSafeguardsV1, type MissionReadinessCheckV1, type MissionRewardBindingV1, type MissionSideAdventureV1, type MissionStageCardV1, type MissionStageKindV1, type MissionV1, type ModuleAgentDefinitionV1, type ModuleAgentFeedbackV1, type ModuleAgentRoleV1, type ModuleCategoryV1, type ModuleEntitlementV1, type ModulePricingV1, type ModuleReferencePriceV1, OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1, PADDLE_PULSE_EXTERNAL_CONTENT_V1, PADDLE_PULSE_MISSION_ONE_AUTHORING_V1, PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1, type PublishedStaticProjectSnapshotV1, RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1, RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1, ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1, ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V2, ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1, ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1, ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1, type RobotMissionControlSafeRenderV1, SERVO_CREATURE_MISSION_ONE_AUTHORING_V1, SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1, STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1, STATIC_PROJECT_APPROVAL_STATEMENT_VERSION_V1, STATIC_PROJECT_DEFAULT_LIFETIME_DAYS_V1, STATIC_PROJECT_MAX_SOURCE_CHARACTERS_V1, STATIC_PROJECT_PUBLISHING_CONTRACT_VERSION_V1, STATIC_PROJECT_SAFETY_CHECK_IDS_V1, STATIC_PROJECT_SCANNER_VERSION_V1, type ScoreBandV1, type StaticProjectContractIssueV1, type StaticProjectGuardianApprovalV1, type StaticProjectModuleSlugV1, type StaticProjectPublicationV1, type StaticProjectSafeRenderV1, type StaticProjectSafetyCheckIdV1, type StaticProjectSafetyCheckV1, type StaticProjectSafetyScanV1, type StaticProjectSnapshotV1, VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1, VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1, VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1, type VoiceHelpAvailabilityReasonV1, type VoiceHelpAvailabilityV1, assertValidCanonicalSpokenHelpDescriptor, assertValidContextualHelpIdentifier, assertValidContextualVoiceQuestionMetadata, assertValidContextualVoiceQuestionResult, assertValidGuardianVoiceConsent, assertValidLearningPath, assertValidMissionAuthoringBundle, assertValidStaticProjectGuardianApproval, assertValidStaticProjectPublication, assertValidStaticProjectSnapshot, assertValidVoiceHelpAvailability, calculateAssessment, isExternalLearningContentReferenceV1, validateAssessmentRubric, validateLearningPath, validateMissionAuthoringBundle, validateStaticProjectGuardianApproval, validateStaticProjectPublication, validateStaticProjectSnapshot };
package/dist/index.js CHANGED
@@ -566,9 +566,285 @@ var JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1 = {
566
566
  }
567
567
  }))
568
568
  };
569
- var JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1;
569
+ var ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1 = Object.freeze({
570
+ packageName: "@plasius/learning-road-hopper-rally",
571
+ packageVersion: "1.0.0",
572
+ exportName: "ROAD_HOPPER_RALLY_COURSE_V2",
573
+ schemaVersion: "2",
574
+ sha256: "1a20741beba028004e0be527d05aae2b2881082d3b578e0d62308a59bf1323f0"
575
+ });
576
+ var ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V2 = Object.freeze({
577
+ packageName: "@plasius/learning-road-hopper-rally",
578
+ packageVersion: "1.1.0",
579
+ exportName: "ROAD_HOPPER_RALLY_COURSE_V3",
580
+ schemaVersion: "3",
581
+ sha256: "f73b90f5f0e483b96724f978f2977435a5e6a1333f5f45fd0fc803b55ad21187"
582
+ });
583
+ var roadHopperV1_1 = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
584
+ (entry) => entry.id === "junior-coder.road-hopper-rally"
585
+ );
586
+ var ROAD_HOPPER_RALLY_V2_MISSIONS = [
587
+ {
588
+ id: "board",
589
+ title: "Build the Rally Board",
590
+ concepts: ["coordinate grids", "arrays", "entity state", "rendering"],
591
+ statement: "Create the road, median, river and five distinct home bays in board.js.",
592
+ sideAdventure: "Design an original high-contrast board palette without changing its mechanics."
593
+ },
594
+ {
595
+ id: "hopper",
596
+ title: "Move the Hopper",
597
+ concepts: ["events", "bounded movement", "keyboard input", "touch input", "respawning"],
598
+ statement: "Implement four-direction tile movement, bounds, equivalent inputs and respawning in hopper.js.",
599
+ sideAdventure: "Add an accessible movement status phrase for every successful hop."
600
+ },
601
+ {
602
+ id: "traffic",
603
+ title: "Create Rally Traffic",
604
+ concepts: ["spawning", "fixed-step updates", "wrapping", "collision detection", "difficulty"],
605
+ statement: "Implement five deterministic traffic lanes, collisions, lives and difficulty in traffic.js.",
606
+ sideAdventure: "Invent an original vehicle type while preserving the entity and collision limits."
607
+ },
608
+ {
609
+ id: "river",
610
+ title: "Cross the Moving River",
611
+ concepts: ["moving platforms", "carrying", "hazards", "state machines", "off-screen bounds"],
612
+ statement: "Implement logs, carrying, water deaths, diving platforms and edge hazards in river.js.",
613
+ sideAdventure: "Create an original visual warning for a platform that is about to dive."
614
+ },
615
+ {
616
+ id: "rules",
617
+ title: "Add Rally Rules",
618
+ concepts: ["timers", "lives", "scoring", "bonuses", "levels", "game over"],
619
+ statement: "Implement homes, occupied and blocked bays, timer, scoring, bonuses and level progression in rules.js.",
620
+ sideAdventure: "Tune a practice-speed preset that keeps every rule deterministic."
621
+ },
622
+ {
623
+ id: "game",
624
+ title: "Complete Road Hopper Rally",
625
+ concepts: ["system assembly", "pause and restart", "alternating players", "audio", "accessibility", "testing"],
626
+ statement: "Assemble the systems, accessibility modes and alternating-player finale in game.js, then pass the protected challenge.",
627
+ sideAdventure: "Polish the finished game with original captions, visual cues and reduced-motion feedback."
628
+ }
629
+ ];
630
+ var JUNIOR_CODER_ROAD_HOPPER_RALLY_V2 = {
631
+ ...roadHopperV1_1,
632
+ version: "2.0.0",
633
+ contentRevision: "2026-08-11.1",
634
+ summary: "Recreate the systems behind a classic road-and-river crossing game using original Road Hopper Rally code, art, audio and presentation.",
635
+ estimatedMinutes: 450,
636
+ tools: [
637
+ "JavaScript",
638
+ "QuickJS sandbox",
639
+ "Deterministic 30 Hz engine",
640
+ "Road Hopper renderer"
641
+ ],
642
+ concepts: [
643
+ "coordinates",
644
+ "arrays and entity state",
645
+ "events and input",
646
+ "fixed-step update and render",
647
+ "spawning and movement",
648
+ "collision detection",
649
+ "state machines",
650
+ "timers, lives and scoring",
651
+ "difficulty progression",
652
+ "audio integration",
653
+ "debugging",
654
+ "deterministic testing"
655
+ ],
656
+ missions: ROAD_HOPPER_RALLY_V2_MISSIONS.map((missionDefinition, index) => ({
657
+ id: `road-hopper-rally-mission-${index + 1}-${missionDefinition.id}`,
658
+ title: missionDefinition.title,
659
+ estimatedMinutes: 75,
660
+ concepts: [...missionDefinition.concepts],
661
+ goals: [
662
+ {
663
+ id: `road-hopper-rally-v2-${missionDefinition.id}`,
664
+ statement: missionDefinition.statement,
665
+ evidence: "assessment"
666
+ }
667
+ ],
668
+ sideAdventure: missionDefinition.sideAdventure
669
+ })),
670
+ assessment: {
671
+ version: "2.0.0",
672
+ completionScore: 80,
673
+ criteria: [
674
+ { id: "road-hopper-v2-structure", label: "All six bounded JavaScript files compile and assemble.", dimension: "structure", points: 20, mandatory: true, visibility: "visible" },
675
+ { id: "road-hopper-v2-road", label: "Board, input and traffic behaviours pass deterministic scenarios.", dimension: "behaviour", points: 15, mandatory: true, visibility: "visible" },
676
+ { id: "road-hopper-v2-river", label: "River platforms, carrying and hazards pass deterministic scenarios.", dimension: "behaviour", points: 15, mandatory: true, visibility: "visible" },
677
+ { id: "road-hopper-v2-rules", label: "Homes, timer, lives, scoring, bonuses and levels behave correctly.", dimension: "behaviour", points: 20, mandatory: true, visibility: "visible" },
678
+ { id: "road-hopper-v2-final", label: "The complete game passes the server-only protected final challenge.", dimension: "resilience", points: 20, mandatory: true, visibility: "protected" },
679
+ { id: "road-hopper-v2-safety", label: "The project stays within the sandbox, resource and privacy boundaries.", dimension: "safety", points: 10, mandatory: true, visibility: "visible" }
680
+ ]
681
+ },
682
+ badges: [
683
+ {
684
+ id: "road-hopper-rally-v2-complete",
685
+ title: "Road Hopper Rally Champion",
686
+ evidence: "module-score",
687
+ tradeable: false,
688
+ tokenConvertible: false
689
+ }
690
+ ],
691
+ externalContent: ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1
692
+ };
693
+ var ROAD_HOPPER_RALLY_V2_1_MISSION_TITLES = [
694
+ "Map the Rally Route",
695
+ "Move the Hopper",
696
+ "Build the Traffic Rally",
697
+ "Ride the Rescue River",
698
+ "Score the Rescue",
699
+ "Road Hopper Rally Challenge"
700
+ ];
701
+ var JUNIOR_CODER_ROAD_HOPPER_RALLY_V2_1 = {
702
+ ...JUNIOR_CODER_ROAD_HOPPER_RALLY_V2,
703
+ version: "2.1.0",
704
+ contentRevision: "2026-08-24.1",
705
+ summary: "Build Road Hopper Rally through 54 evidence-led activities: predict, edit, run, inspect, repair, explain and prove each deterministic game system.",
706
+ missions: JUNIOR_CODER_ROAD_HOPPER_RALLY_V2.missions.map((mission2, index) => ({
707
+ ...mission2,
708
+ title: ROAD_HOPPER_RALLY_V2_1_MISSION_TITLES[index]
709
+ })),
710
+ assessment: {
711
+ ...JUNIOR_CODER_ROAD_HOPPER_RALLY_V2.assessment,
712
+ version: "2.1.0"
713
+ },
714
+ externalContent: ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V2
715
+ };
716
+ var JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2 = {
717
+ ...JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
718
+ version: "1.2.0",
719
+ modules: JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.map((entry) => entry.id === JUNIOR_CODER_ROAD_HOPPER_RALLY_V2.id ? JUNIOR_CODER_ROAD_HOPPER_RALLY_V2 : entry)
720
+ };
721
+ var PADDLE_PULSE_EXTERNAL_CONTENT_V1 = Object.freeze({
722
+ packageName: "@plasius/learning-paddle-pulse",
723
+ packageVersion: "0.1.0",
724
+ exportName: "PADDLE_PULSE_MODULE_V2",
725
+ schemaVersion: "2",
726
+ sha256: "19f3666bdb523a3faf069341b0bc748996b3db282f89171e3c9f0a373a8c8f7e"
727
+ });
728
+ var paddlePulseV1_1 = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
729
+ (entry) => entry.id === "junior-coder.paddle-pulse"
730
+ );
731
+ var PADDLE_PULSE_V2_MISSIONS = [
732
+ {
733
+ id: "court-coordinates",
734
+ title: "Court & Coordinates",
735
+ concepts: ["coordinates", "canvas primitives", "game loops", "bounds"],
736
+ statement: "Build a responsive 640 \xD7 480 logical court with a bounded paddle and ball.",
737
+ sideAdventure: "Create an original high-contrast court palette without changing its geometry."
738
+ },
739
+ {
740
+ id: "paddle-controls",
741
+ title: "Paddle Controls",
742
+ concepts: ["input state", "Pointer Events", "keyboard input", "clamping"],
743
+ statement: "Implement equivalent Arrow/A/D and direct horizontal pointer-drag controls.",
744
+ sideAdventure: "Add a semantic movement trace that does not rely on animation."
745
+ },
746
+ {
747
+ id: "ball-motion",
748
+ title: "Ball Motion & Bounces",
749
+ concepts: ["velocity", "fixed timesteps", "reflection", "contact normals", "paddle angles"],
750
+ statement: "Implement deterministic ball motion plus controlled wall and paddle reflections.",
751
+ sideAdventure: "Design a reduced-motion trajectory inspector for one rally."
752
+ },
753
+ {
754
+ id: "bricks-collisions",
755
+ title: "Bricks & Collisions",
756
+ concepts: ["arrays", "loops", "brick grids", "AABB collision", "resolution"],
757
+ statement: "Create an original brick grid whose bricks score once and disappear on impact.",
758
+ sideAdventure: "Invent a new visual brick pattern using the same bounded collision rules."
759
+ },
760
+ {
761
+ id: "score-lives-states",
762
+ title: "Score, Lives & States",
763
+ concepts: ["state machines", "invariants", "scoring", "lives", "HUD state"],
764
+ statement: "Implement serve, pause, life loss, level clear, game over, score and HUD states.",
765
+ sideAdventure: "Add a printable state-transition table for a facilitator or screen-reader user."
766
+ },
767
+ {
768
+ id: "levels-final-game",
769
+ title: "Levels, Sound & Final Game",
770
+ concepts: ["level data", "difficulty", "responsive rendering", "accessible audio", "testing"],
771
+ statement: "Assemble multiple original levels, optional generated cues and the integrated final game.",
772
+ sideAdventure: "After completion, add an optional original power-up without changing core assessment."
773
+ }
774
+ ];
775
+ var JUNIOR_CODER_PADDLE_PULSE_V2 = {
776
+ ...paddlePulseV1_1,
777
+ version: "2.0.0",
778
+ contentRevision: "2026-08-11.1",
779
+ summary: "Build an original Plasius brick-breaker while learning rendering, equivalent input, deterministic physics, collisions, score, lives, states, levels, accessible sound and testing.",
780
+ estimatedMinutes: 360,
781
+ tools: [
782
+ "JavaScript",
783
+ "QuickJS sandbox",
784
+ "Deterministic 60 Hz engine",
785
+ "Responsive Paddle Pulse renderer"
786
+ ],
787
+ concepts: [
788
+ "coordinates and rendering",
789
+ "game loops and fixed timesteps",
790
+ "keyboard and pointer input",
791
+ "velocity and reflection",
792
+ "collision detection and resolution",
793
+ "arrays and brick grids",
794
+ "scoring, lives and state machines",
795
+ "level data and difficulty",
796
+ "accessible generated audio",
797
+ "debugging and deterministic testing"
798
+ ],
799
+ missions: PADDLE_PULSE_V2_MISSIONS.map((missionDefinition, index) => ({
800
+ id: `paddle-pulse-mission-${index + 1}-${missionDefinition.id}`,
801
+ title: missionDefinition.title,
802
+ estimatedMinutes: 60,
803
+ concepts: [...missionDefinition.concepts],
804
+ goals: [{
805
+ id: `paddle-pulse-v2-${missionDefinition.id}`,
806
+ statement: missionDefinition.statement,
807
+ evidence: "assessment"
808
+ }],
809
+ sideAdventure: missionDefinition.sideAdventure
810
+ })),
811
+ assessment: {
812
+ version: "2.0.0",
813
+ completionScore: 80,
814
+ criteria: [
815
+ { id: "paddle-pulse-v2-court", label: "The logical court, paddle and initial scene are finite, responsive and bounded.", dimension: "structure", points: 20, mandatory: false, visibility: "visible" },
816
+ { id: "paddle-pulse-v2-controls", label: "Keyboard and pointer paths produce equivalent clamped paddle input.", dimension: "behaviour", points: 15, mandatory: false, visibility: "visible" },
817
+ { id: "paddle-pulse-v2-motion", label: "Ball motion and wall/paddle reflections pass deterministic trajectories.", dimension: "behaviour", points: 15, mandatory: false, visibility: "visible" },
818
+ { id: "paddle-pulse-v2-bricks", label: "Brick face, corner and adjacent impacts resolve without double-scoring.", dimension: "behaviour", points: 20, mandatory: false, visibility: "visible" },
819
+ { id: "paddle-pulse-v2-states", label: "Score, lives, serve, pause, level-clear and game-over transitions preserve invariants.", dimension: "resilience", points: 10, mandatory: false, visibility: "visible" },
820
+ { id: "paddle-pulse-v2-final", label: "Multiple original levels and the integrated game pass protected deterministic scenarios.", dimension: "resilience", points: 10, mandatory: false, visibility: "protected" },
821
+ { id: "paddle-pulse-v2-safety", label: "Source, commands, runtime resources and assessment remain inside sandbox limits.", dimension: "safety", points: 10, mandatory: true, visibility: "visible" }
822
+ ]
823
+ },
824
+ badges: [
825
+ { id: "paddle-pulse-v2-court-builder", title: "Court Builder", evidence: "mission-score", tradeable: false, tokenConvertible: false },
826
+ { id: "paddle-pulse-v2-paddle-pilot", title: "Paddle Pilot", evidence: "mission-score", tradeable: false, tokenConvertible: false },
827
+ { id: "paddle-pulse-v2-rally-master", title: "Rally Master", evidence: "mission-score", tradeable: false, tokenConvertible: false },
828
+ { id: "paddle-pulse-v2-brick-breaker", title: "Brick Breaker", evidence: "mission-score", tradeable: false, tokenConvertible: false },
829
+ { id: "paddle-pulse-v2-game-keeper", title: "Game Keeper", evidence: "mission-score", tradeable: false, tokenConvertible: false },
830
+ { id: "paddle-pulse-v2-complete", title: "Paddle Pulse Champion", evidence: "module-score", tradeable: false, tokenConvertible: false }
831
+ ],
832
+ externalContent: PADDLE_PULSE_EXTERNAL_CONTENT_V1
833
+ };
834
+ var JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3 = {
835
+ ...JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2,
836
+ version: "1.3.0",
837
+ modules: JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2.modules.map((entry) => entry.id === JUNIOR_CODER_PADDLE_PULSE_V2.id ? JUNIOR_CODER_PADDLE_PULSE_V2 : entry)
838
+ };
839
+ var JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_4 = {
840
+ ...JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3,
841
+ version: "1.4.0",
842
+ modules: JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3.modules.map((entry) => entry.id === JUNIOR_CODER_ROAD_HOPPER_RALLY_V2_1.id ? JUNIOR_CODER_ROAD_HOPPER_RALLY_V2_1 : entry)
843
+ };
844
+ var JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_4;
570
845
 
571
846
  // src/contracts.ts
847
+ var EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1 = "1";
572
848
  var MISSION_AUTHORING_CONTRACT_VERSION_V1 = "1.0.0";
573
849
 
574
850
  // src/contextual-help.ts
@@ -6760,6 +7036,16 @@ var ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1 = {
6760
7036
 
6761
7037
  // src/validation.ts
6762
7038
  var CANONICAL_TOKEN_SUBUNITS = /^(0|[1-9][0-9]*)$/u;
7039
+ var EXACT_PACKAGE_NAME = /^@plasius\/[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/u;
7040
+ var EXACT_SEMVER = /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/u;
7041
+ var EXPORT_NAME = /^[A-Za-z_$][A-Za-z0-9_$]*$/u;
7042
+ var CONTENT_SCHEMA_VERSION = /^(0|[1-9][0-9]*)$/u;
7043
+ var SHA256 = /^[a-f0-9]{64}$/u;
7044
+ function isExternalLearningContentReferenceV1(value) {
7045
+ if (typeof value !== "object" || value === null) return false;
7046
+ const candidate = value;
7047
+ return Object.keys(value).length === 5 && typeof candidate.packageName === "string" && EXACT_PACKAGE_NAME.test(candidate.packageName) && typeof candidate.packageVersion === "string" && EXACT_SEMVER.test(candidate.packageVersion) && typeof candidate.exportName === "string" && EXPORT_NAME.test(candidate.exportName) && typeof candidate.schemaVersion === "string" && CONTENT_SCHEMA_VERSION.test(candidate.schemaVersion) && typeof candidate.sha256 === "string" && SHA256.test(candidate.sha256);
7048
+ }
6763
7049
  function issue(code, message, path, moduleId) {
6764
7050
  return { code, message, path, ...moduleId ? { moduleId } : {} };
6765
7051
  }
@@ -6874,6 +7160,17 @@ function validateModule(module2, moduleIndex) {
6874
7160
  )
6875
7161
  );
6876
7162
  }
7163
+ const externalContent = module2.externalContent;
7164
+ if (externalContent && !isExternalLearningContentReferenceV1(externalContent)) {
7165
+ issues.push(
7166
+ issue(
7167
+ "invalid-external-content-reference",
7168
+ "External content must use an exact @plasius package, stable semantic version, named export, schema version and lower-case SHA-256 digest.",
7169
+ `${base}.externalContent`,
7170
+ module2.id
7171
+ )
7172
+ );
7173
+ }
6877
7174
  return issues;
6878
7175
  }
6879
7176
  function validateLearningPath(path) {
@@ -6923,18 +7220,28 @@ export {
6923
7220
  CONTEXTUAL_VOICE_SUGGESTED_ACTIONS_V1,
6924
7221
  CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1,
6925
7222
  DANCE_ROVER_MISSION_ONE_AUTHORING_V1,
7223
+ EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1,
6926
7224
  JUNIOR_CODER_MISSION_STAGE_ORDER_V1,
6927
7225
  JUNIOR_CODER_MODULE_PRICE_V1_1,
7226
+ JUNIOR_CODER_PADDLE_PULSE_V2,
7227
+ JUNIOR_CODER_ROAD_HOPPER_RALLY_V2,
7228
+ JUNIOR_CODER_ROAD_HOPPER_RALLY_V2_1,
6928
7229
  JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT,
6929
7230
  JUNIOR_CODER_ROBOT_RESCUE_PATH_V1,
6930
7231
  JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
7232
+ JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2,
7233
+ JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3,
7234
+ JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_4,
6931
7235
  METEOR_SHIELD_MISSION_ONE_AUTHORING_V1,
6932
7236
  MISSION_AUTHORING_CONTRACT_VERSION_V1,
6933
7237
  OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1,
7238
+ PADDLE_PULSE_EXTERNAL_CONTENT_V1,
6934
7239
  PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
6935
7240
  PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1,
6936
7241
  RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1,
6937
7242
  RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
7243
+ ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1,
7244
+ ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V2,
6938
7245
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
6939
7246
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
6940
7247
  ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1,
@@ -6962,6 +7269,7 @@ export {
6962
7269
  assertValidStaticProjectSnapshot,
6963
7270
  assertValidVoiceHelpAvailability,
6964
7271
  calculateAssessment,
7272
+ isExternalLearningContentReferenceV1,
6965
7273
  validateAssessmentRubric,
6966
7274
  validateLearningPath,
6967
7275
  validateMissionAuthoringBundle,