@plasius/learning 0.2.10 → 0.2.11

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/README.md CHANGED
@@ -63,6 +63,7 @@ the exact catalog module that owns its rubric, mission and badges.
63
63
  ```ts
64
64
  import {
65
65
  BEACON_BOT_MISSION_ONE_AUTHORING_V1,
66
+ DANCE_ROVER_MISSION_ONE_AUTHORING_V1,
66
67
  JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
67
68
  METEOR_SHIELD_MISSION_ONE_AUTHORING_V1,
68
69
  PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
@@ -106,6 +107,9 @@ const beaconBot = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
106
107
  const servoCreature = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
107
108
  (module) => module.slug === "servo-creature",
108
109
  );
110
+ const danceRover = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
111
+ (module) => module.slug === "dance-rover",
112
+ );
109
113
 
110
114
  if (
111
115
  !roadHopper ||
@@ -117,7 +121,8 @@ if (
117
121
  !pixelTrailChallenge ||
118
122
  !starDefenderSquadron ||
119
123
  !beaconBot ||
120
- !servoCreature
124
+ !servoCreature ||
125
+ !danceRover
121
126
  ) {
122
127
  throw new Error("Junior Coder module is missing");
123
128
  }
@@ -162,6 +167,10 @@ assertValidMissionAuthoringBundle(
162
167
  SERVO_CREATURE_MISSION_ONE_AUTHORING_V1,
163
168
  servoCreature,
164
169
  );
170
+ assertValidMissionAuthoringBundle(
171
+ DANCE_ROVER_MISSION_ONE_AUTHORING_V1,
172
+ danceRover,
173
+ );
165
174
  ```
166
175
 
167
176
  ## Contract rules
@@ -193,6 +202,9 @@ assertValidMissionAuthoringBundle(
193
202
  - Servo Creature documents its safe 30–150 degree simulator range while every
194
203
  physical servo, regulated supply and common-ground arrangement remains
195
204
  pending adult bench verification and unavailable to learner code.
205
+ - Dance Rover documents bounded direction, 0–60 percent simulated speed,
206
+ timing, repeat and emergency-stop calls while every driver, motor, chassis
207
+ and switched power arrangement remains pending adult lifted-wheel testing.
196
208
 
197
209
  See [the foundation design](docs/design/junior-coder-catalog-foundation.md),
198
210
  [the uniform pricing design](docs/design/junior-coder-uniform-pricing.md),
@@ -201,7 +213,8 @@ See [the foundation design](docs/design/junior-coder-catalog-foundation.md),
201
213
  [ADR 0002](docs/adrs/adr-0002-immutable-module-repricing-and-admin-test-source.md),
202
214
  [ADR 0003](docs/adrs/adr-0003-mission-authoring-manifests-are-additive-and-separated.md),
203
215
  [ADR 0004](docs/adrs/adr-0004-robot-mission-hardware-disclosures-are-additive-and-fail-closed.md),
204
- and [TDR 0006](docs/tdrs/tdr-0006-servo-creature-safe-movement-and-power-authoring.md).
216
+ [TDR 0006](docs/tdrs/tdr-0006-servo-creature-safe-movement-and-power-authoring.md),
217
+ and [TDR 0007](docs/tdrs/tdr-0007-dance-rover-fail-safe-movement-and-power-authoring.md).
205
218
 
206
219
  ## Development
207
220
 
package/dist/index.cjs CHANGED
@@ -21,6 +21,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
23
  BEACON_BOT_MISSION_ONE_AUTHORING_V1: () => BEACON_BOT_MISSION_ONE_AUTHORING_V1,
24
+ DANCE_ROVER_MISSION_ONE_AUTHORING_V1: () => DANCE_ROVER_MISSION_ONE_AUTHORING_V1,
24
25
  JUNIOR_CODER_MISSION_STAGE_ORDER_V1: () => JUNIOR_CODER_MISSION_STAGE_ORDER_V1,
25
26
  JUNIOR_CODER_MODULE_PRICE_V1_1: () => JUNIOR_CODER_MODULE_PRICE_V1_1,
26
27
  JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT: () => JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT,
@@ -3111,6 +3112,371 @@ var SERVO_CREATURE_MISSION_ONE_AUTHORING_V1 = {
3111
3112
  }
3112
3113
  }
3113
3114
  };
3115
+ var DANCE_ROVER_MISSION_ONE_AUTHORING_V1 = {
3116
+ version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
3117
+ moduleId: "junior-coder.dance-rover",
3118
+ moduleVersion: "1.1.0",
3119
+ missionId: "dance-rover-mission-1",
3120
+ learner: {
3121
+ estimatedMinutes: 20,
3122
+ stages: [
3123
+ {
3124
+ kind: "learn",
3125
+ instruction: "Read what driveRover(), turnRover(), waitMs(), repeatDance() and emergencyStop() do in the private Dance Rover simulator.",
3126
+ artifactIds: ["dance-rover-m1-art"]
3127
+ },
3128
+ {
3129
+ kind: "predict",
3130
+ instruction: "Predict the rover's labelled direction, speed, turn, repeat count and final stopped state before the dance runs.",
3131
+ artifactIds: []
3132
+ },
3133
+ {
3134
+ kind: "build",
3135
+ instruction: "Adjust the five documented C++-style calls to create one bounded rover dance with an emergency stop.",
3136
+ artifactIds: ["dance-rover-m1-code"]
3137
+ },
3138
+ {
3139
+ kind: "run",
3140
+ instruction: "Use the Run action button to start the private Dance Rover simulator.",
3141
+ artifactIds: ["dance-rover-m1-code"]
3142
+ },
3143
+ {
3144
+ kind: "assess",
3145
+ instruction: "Run the visible and protected deterministic direction, speed, sequence and stop checks.",
3146
+ artifactIds: []
3147
+ },
3148
+ {
3149
+ kind: "inspect",
3150
+ instruction: "Compare the highlighted C++-style line with the first dance goal that did not pass.",
3151
+ artifactIds: []
3152
+ },
3153
+ {
3154
+ kind: "fix",
3155
+ instruction: "Change one bounded direction, speed, wait, repeat or stop call, then rerun and inspect the text telemetry.",
3156
+ artifactIds: ["dance-rover-m1-code"]
3157
+ },
3158
+ {
3159
+ kind: "explain",
3160
+ instruction: "Explain how reusable movement calls created the choreography and why every safe dance ends stopped.",
3161
+ artifactIds: []
3162
+ },
3163
+ {
3164
+ kind: "reward",
3165
+ instruction: "Collect the simulated badge when the score and fail-safe stop pass; physical completion remains adult-only.",
3166
+ artifactIds: []
3167
+ }
3168
+ ],
3169
+ readinessChecks: [
3170
+ {
3171
+ id: "dance-rover-m1-find-stop",
3172
+ prompt: "Find the emergencyStop() call and explain why it must finish every physical movement sequence.",
3173
+ scored: false
3174
+ }
3175
+ ],
3176
+ artifacts: [
3177
+ {
3178
+ id: "dance-rover-m1-code",
3179
+ kind: "starter-code",
3180
+ audience: "learner",
3181
+ solutionBearing: false
3182
+ },
3183
+ {
3184
+ id: "dance-rover-m1-art",
3185
+ kind: "starter-assets",
3186
+ audience: "learner",
3187
+ solutionBearing: false
3188
+ },
3189
+ {
3190
+ id: "dance-rover-m1-printable",
3191
+ kind: "printable",
3192
+ audience: "learner",
3193
+ solutionBearing: false
3194
+ }
3195
+ ],
3196
+ goals: [
3197
+ {
3198
+ id: "dance-rover-m1-starts",
3199
+ statement: "The documented C++-style settings are valid and the private simulator starts.",
3200
+ visibility: "visible",
3201
+ criterionIds: ["dance-rover-build"],
3202
+ completionRequired: true,
3203
+ aiRequired: false
3204
+ },
3205
+ {
3206
+ id: "dance-rover-m1-choreography",
3207
+ statement: "The rover completes a bounded direction, speed, turn and repeat sequence before stopping.",
3208
+ visibility: "visible",
3209
+ criterionIds: ["dance-rover-goal-one", "dance-rover-goal-two"],
3210
+ completionRequired: true,
3211
+ aiRequired: false
3212
+ },
3213
+ {
3214
+ id: "dance-rover-m1-private-runtime",
3215
+ statement: "The program stays inside the private simulator and never accesses physical motors, the network or browser storage.",
3216
+ visibility: "visible",
3217
+ criterionIds: ["dance-rover-safety"],
3218
+ completionRequired: true,
3219
+ aiRequired: false
3220
+ }
3221
+ ],
3222
+ interactions: [
3223
+ {
3224
+ id: "dance-rover-m1-run-control",
3225
+ description: "Start the private Dance Rover choreography simulation.",
3226
+ primaryMode: "pointer",
3227
+ alternativeIds: ["dance-rover-m1-keyboard-run"]
3228
+ },
3229
+ {
3230
+ id: "dance-rover-m1-code-control",
3231
+ description: "Edit the documented direction, speed, wait, repeat and stop calls.",
3232
+ primaryMode: "keyboard",
3233
+ alternativeIds: []
3234
+ },
3235
+ {
3236
+ id: "dance-rover-m1-motion-preview",
3237
+ description: "Observe the bounded rover route and stopped state.",
3238
+ primaryMode: "motion",
3239
+ alternativeIds: ["dance-rover-m1-telemetry"]
3240
+ }
3241
+ ],
3242
+ accessibilityAlternatives: [
3243
+ {
3244
+ id: "dance-rover-m1-keyboard-run",
3245
+ modes: ["keyboard"],
3246
+ equivalentOutcome: true,
3247
+ description: "Press Enter or Space on the play-icon Run button to start the same simulator."
3248
+ },
3249
+ {
3250
+ id: "dance-rover-m1-telemetry",
3251
+ modes: ["text", "shape", "symbol", "reduced-motion"],
3252
+ equivalentOutcome: true,
3253
+ description: "Read direction, speed, turn, repeat count, elapsed milliseconds and stopped state without animation."
3254
+ }
3255
+ ],
3256
+ evidenceRequirements: [
3257
+ {
3258
+ id: "dance-rover-m1-assessment",
3259
+ goalIds: [
3260
+ "dance-rover-m1-starts",
3261
+ "dance-rover-m1-choreography",
3262
+ "dance-rover-m1-private-runtime"
3263
+ ],
3264
+ kind: "assessment-result",
3265
+ retention: "entitlement",
3266
+ containsPersonalData: false
3267
+ },
3268
+ {
3269
+ id: "dance-rover-m1-explanation",
3270
+ goalIds: ["dance-rover-m1-choreography"],
3271
+ kind: "learner-explanation",
3272
+ retention: "attempt",
3273
+ containsPersonalData: false
3274
+ }
3275
+ ],
3276
+ sideAdventures: [
3277
+ {
3278
+ id: "dance-rover-m1-remix",
3279
+ prompt: "Invent an original rover dance and add a text or symbol route cue that makes it understandable without motion.",
3280
+ completionRequired: false
3281
+ }
3282
+ ],
3283
+ rewardBindings: [
3284
+ {
3285
+ id: "dance-rover-m1-simulated-badge",
3286
+ badgeId: "dance-rover-mission-complete",
3287
+ goalIds: [
3288
+ "dance-rover-m1-starts",
3289
+ "dance-rover-m1-choreography",
3290
+ "dance-rover-m1-private-runtime"
3291
+ ],
3292
+ deterministic: true,
3293
+ random: false,
3294
+ tokenConvertible: false
3295
+ }
3296
+ ],
3297
+ functionReference: [
3298
+ {
3299
+ id: "dance-rover-function-drive",
3300
+ signature: "driveRover(direction, speed)",
3301
+ summary: "Adds one straight movement to the private simulator route.",
3302
+ parameters: [
3303
+ {
3304
+ name: "direction",
3305
+ type: "string",
3306
+ description: "Use forward or backward."
3307
+ },
3308
+ {
3309
+ name: "speed",
3310
+ type: "whole number",
3311
+ description: "A bounded simulated speed from 0 to 60 percent."
3312
+ }
3313
+ ],
3314
+ effect: "Updates the simulator's labelled route without generating motor PWM or accessing a physical driver.",
3315
+ example: 'driveRover("forward", 40);'
3316
+ },
3317
+ {
3318
+ id: "dance-rover-function-turn",
3319
+ signature: "turnRover(direction, speed)",
3320
+ summary: "Adds one left or right turn to the private simulator route.",
3321
+ parameters: [
3322
+ {
3323
+ name: "direction",
3324
+ type: "string",
3325
+ description: "Use left or right."
3326
+ },
3327
+ {
3328
+ name: "speed",
3329
+ type: "whole number",
3330
+ description: "A bounded simulated turn speed from 0 to 60 percent."
3331
+ }
3332
+ ],
3333
+ effect: "Updates labelled simulator direction without energising motors or a driver.",
3334
+ example: 'turnRover("left", 30);'
3335
+ },
3336
+ {
3337
+ id: "dance-rover-function-wait",
3338
+ signature: "waitMs(duration)",
3339
+ summary: "Adds one bounded wait to the simulated dance timeline.",
3340
+ parameters: [
3341
+ {
3342
+ name: "duration",
3343
+ type: "whole number",
3344
+ description: "A bounded number of milliseconds from 100 to 1000."
3345
+ }
3346
+ ],
3347
+ effect: "Advances simulated elapsed time; it never blocks the website or holds physical motors under load.",
3348
+ example: "waitMs(300);"
3349
+ },
3350
+ {
3351
+ id: "dance-rover-function-repeat",
3352
+ signature: "repeatDance(count)",
3353
+ summary: "Repeats the current simulated dance a safe number of times.",
3354
+ parameters: [
3355
+ {
3356
+ name: "count",
3357
+ type: "whole number",
3358
+ description: "A bounded repeat count from 1 to 4."
3359
+ }
3360
+ ],
3361
+ effect: "Adds a fixed number of labelled route sequences to the private simulator.",
3362
+ example: "repeatDance(3);"
3363
+ },
3364
+ {
3365
+ id: "dance-rover-function-stop",
3366
+ signature: "emergencyStop()",
3367
+ summary: "Ends the simulated dance in a fail-safe stopped state.",
3368
+ parameters: [],
3369
+ effect: "Marks both motors stopped in the simulator; it cannot activate, stop or otherwise control physical hardware.",
3370
+ example: "emergencyStop();"
3371
+ }
3372
+ ]
3373
+ },
3374
+ facilitator: {
3375
+ artifacts: [
3376
+ {
3377
+ id: "dance-rover-m1-answer-key",
3378
+ kind: "answer-key",
3379
+ audience: "facilitator",
3380
+ solutionBearing: true
3381
+ },
3382
+ {
3383
+ id: "dance-rover-m1-protected-tests",
3384
+ kind: "protected-test",
3385
+ audience: "facilitator",
3386
+ solutionBearing: true
3387
+ },
3388
+ {
3389
+ id: "dance-rover-m1-adult-hardware-guide",
3390
+ kind: "facilitator-note",
3391
+ audience: "facilitator",
3392
+ solutionBearing: true
3393
+ }
3394
+ ],
3395
+ protectedGoals: [
3396
+ {
3397
+ id: "dance-rover-m1-protected-resilience",
3398
+ statement: "The simulator rejects unsupported directions, excessive speeds, waits, repeats, missing stop calls and physical-hardware requests.",
3399
+ visibility: "protected",
3400
+ criterionIds: ["dance-rover-edge-one", "dance-rover-edge-two"],
3401
+ completionRequired: false,
3402
+ aiRequired: false
3403
+ }
3404
+ ],
3405
+ prompts: [
3406
+ "Ask the learner to predict the labelled route and final stopped state before suggesting one bounded change.",
3407
+ "Use the function reference and visible telemetry; never provide motor wiring, power or movement advice to a learner.",
3408
+ "Physical export stays unavailable until an adult acknowledges the exact manifest and every driver, motor and power component has verified bench-test evidence."
3409
+ ]
3410
+ },
3411
+ hardware: {
3412
+ requirementsVersion: "1.0.0",
3413
+ hardwareIncluded: false,
3414
+ completePathItemIds: [
3415
+ "pico-2-w",
3416
+ "breadboard",
3417
+ "usb-data-cable",
3418
+ "jumper-wires",
3419
+ "dual-motor-driver",
3420
+ "geared-motors",
3421
+ "rover-chassis",
3422
+ "motor-power"
3423
+ ],
3424
+ incrementalItemIds: [
3425
+ "dual-motor-driver",
3426
+ "geared-motors",
3427
+ "rover-chassis",
3428
+ "motor-power"
3429
+ ],
3430
+ components: [
3431
+ { itemId: "pico-2-w", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
3432
+ { itemId: "breadboard", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
3433
+ { itemId: "usb-data-cable", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
3434
+ { itemId: "jumper-wires", quantity: 12, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
3435
+ { itemId: "dual-motor-driver", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
3436
+ { itemId: "geared-motors", quantity: 2, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
3437
+ { itemId: "rover-chassis", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
3438
+ { itemId: "motor-power", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false }
3439
+ ],
3440
+ safeguards: {
3441
+ adultAssemblyRequired: true,
3442
+ adultAcknowledgementRequiredForExport: true,
3443
+ websiteMayControlHardware: false,
3444
+ simulatorCompletionAvailable: true,
3445
+ simulatedBadgeId: "dance-rover-mission-complete",
3446
+ physicalBadgeId: "dance-rover-physical-builder",
3447
+ physicalBadgeRequiresAdultSignoff: true,
3448
+ adultAssemblySteps: [
3449
+ "Confirm the exact driver, motors, chassis and switched power identities against the requirements manifest.",
3450
+ "Assemble and inspect all wiring with motor power disconnected and secure every moving or pinch-point part.",
3451
+ "Complete the first direction and emergency-stop bench test with the wheels lifted clear of the surface."
3452
+ ],
3453
+ powerRequirements: [
3454
+ "Use a switched protected motor supply within the verified driver and motor ratings; never power motors from a Pico GPIO pin.",
3455
+ "Connect one common signal ground between the verified motor supply, driver and Pico only as shown in the adult guide.",
3456
+ "Keep the power switch accessible and disconnect every source before changing wiring, wheels or chassis parts."
3457
+ ],
3458
+ cableRequirements: [
3459
+ "One known data-capable USB cable compatible with the Pico 2 W.",
3460
+ "Insulated jumper leads and verified motor, driver and power connectors documented by the adult guide."
3461
+ ],
3462
+ softwarePrerequisites: [
3463
+ "Supported Pico SDK toolchain on Raspberry Pi OS or a documented desktop environment.",
3464
+ "Known-good Dance Rover recovery firmware with adult-owned watchdog and emergency-stop behaviour."
3465
+ ],
3466
+ warnings: [
3467
+ "Hardware is not included with the module.",
3468
+ "No listed driver, motor, chassis or power arrangement currently claims compatibility or physical-completion eligibility.",
3469
+ "Moving wheels, pinch points, stalled motors and unsuitable supplies can cause injury or heat; adult assembly and testing are mandatory.",
3470
+ "The simulator and simulated badge remain available without physical equipment."
3471
+ ],
3472
+ unrelatedHardwareNotRequired: [
3473
+ "Camera Module 3 or Raspberry Pi Zero 2 W",
3474
+ "obstacle or colour sensors",
3475
+ "servo, LED or infrared beacon parts"
3476
+ ]
3477
+ }
3478
+ }
3479
+ };
3114
3480
  var RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1 = {
3115
3481
  version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
3116
3482
  moduleId: "junior-coder.rescue-crew-commander",
@@ -3907,6 +4273,7 @@ ${summary}`);
3907
4273
  // Annotate the CommonJS export names for ESM import in node:
3908
4274
  0 && (module.exports = {
3909
4275
  BEACON_BOT_MISSION_ONE_AUTHORING_V1,
4276
+ DANCE_ROVER_MISSION_ONE_AUTHORING_V1,
3910
4277
  JUNIOR_CODER_MISSION_STAGE_ORDER_V1,
3911
4278
  JUNIOR_CODER_MODULE_PRICE_V1_1,
3912
4279
  JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT,