@plasius/learning 0.2.10 → 0.2.12
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 +28 -2
- package/dist/index.cjs +723 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -1
- package/dist/index.d.ts +14 -1
- package/dist/index.js +721 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3064,6 +3064,725 @@ var SERVO_CREATURE_MISSION_ONE_AUTHORING_V1 = {
|
|
|
3064
3064
|
}
|
|
3065
3065
|
}
|
|
3066
3066
|
};
|
|
3067
|
+
var DANCE_ROVER_MISSION_ONE_AUTHORING_V1 = {
|
|
3068
|
+
version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
3069
|
+
moduleId: "junior-coder.dance-rover",
|
|
3070
|
+
moduleVersion: "1.1.0",
|
|
3071
|
+
missionId: "dance-rover-mission-1",
|
|
3072
|
+
learner: {
|
|
3073
|
+
estimatedMinutes: 20,
|
|
3074
|
+
stages: [
|
|
3075
|
+
{
|
|
3076
|
+
kind: "learn",
|
|
3077
|
+
instruction: "Read what driveRover(), turnRover(), waitMs(), repeatDance() and emergencyStop() do in the private Dance Rover simulator.",
|
|
3078
|
+
artifactIds: ["dance-rover-m1-art"]
|
|
3079
|
+
},
|
|
3080
|
+
{
|
|
3081
|
+
kind: "predict",
|
|
3082
|
+
instruction: "Predict the rover's labelled direction, speed, turn, repeat count and final stopped state before the dance runs.",
|
|
3083
|
+
artifactIds: []
|
|
3084
|
+
},
|
|
3085
|
+
{
|
|
3086
|
+
kind: "build",
|
|
3087
|
+
instruction: "Adjust the five documented C++-style calls to create one bounded rover dance with an emergency stop.",
|
|
3088
|
+
artifactIds: ["dance-rover-m1-code"]
|
|
3089
|
+
},
|
|
3090
|
+
{
|
|
3091
|
+
kind: "run",
|
|
3092
|
+
instruction: "Use the Run action button to start the private Dance Rover simulator.",
|
|
3093
|
+
artifactIds: ["dance-rover-m1-code"]
|
|
3094
|
+
},
|
|
3095
|
+
{
|
|
3096
|
+
kind: "assess",
|
|
3097
|
+
instruction: "Run the visible and protected deterministic direction, speed, sequence and stop checks.",
|
|
3098
|
+
artifactIds: []
|
|
3099
|
+
},
|
|
3100
|
+
{
|
|
3101
|
+
kind: "inspect",
|
|
3102
|
+
instruction: "Compare the highlighted C++-style line with the first dance goal that did not pass.",
|
|
3103
|
+
artifactIds: []
|
|
3104
|
+
},
|
|
3105
|
+
{
|
|
3106
|
+
kind: "fix",
|
|
3107
|
+
instruction: "Change one bounded direction, speed, wait, repeat or stop call, then rerun and inspect the text telemetry.",
|
|
3108
|
+
artifactIds: ["dance-rover-m1-code"]
|
|
3109
|
+
},
|
|
3110
|
+
{
|
|
3111
|
+
kind: "explain",
|
|
3112
|
+
instruction: "Explain how reusable movement calls created the choreography and why every safe dance ends stopped.",
|
|
3113
|
+
artifactIds: []
|
|
3114
|
+
},
|
|
3115
|
+
{
|
|
3116
|
+
kind: "reward",
|
|
3117
|
+
instruction: "Collect the simulated badge when the score and fail-safe stop pass; physical completion remains adult-only.",
|
|
3118
|
+
artifactIds: []
|
|
3119
|
+
}
|
|
3120
|
+
],
|
|
3121
|
+
readinessChecks: [
|
|
3122
|
+
{
|
|
3123
|
+
id: "dance-rover-m1-find-stop",
|
|
3124
|
+
prompt: "Find the emergencyStop() call and explain why it must finish every physical movement sequence.",
|
|
3125
|
+
scored: false
|
|
3126
|
+
}
|
|
3127
|
+
],
|
|
3128
|
+
artifacts: [
|
|
3129
|
+
{
|
|
3130
|
+
id: "dance-rover-m1-code",
|
|
3131
|
+
kind: "starter-code",
|
|
3132
|
+
audience: "learner",
|
|
3133
|
+
solutionBearing: false
|
|
3134
|
+
},
|
|
3135
|
+
{
|
|
3136
|
+
id: "dance-rover-m1-art",
|
|
3137
|
+
kind: "starter-assets",
|
|
3138
|
+
audience: "learner",
|
|
3139
|
+
solutionBearing: false
|
|
3140
|
+
},
|
|
3141
|
+
{
|
|
3142
|
+
id: "dance-rover-m1-printable",
|
|
3143
|
+
kind: "printable",
|
|
3144
|
+
audience: "learner",
|
|
3145
|
+
solutionBearing: false
|
|
3146
|
+
}
|
|
3147
|
+
],
|
|
3148
|
+
goals: [
|
|
3149
|
+
{
|
|
3150
|
+
id: "dance-rover-m1-starts",
|
|
3151
|
+
statement: "The documented C++-style settings are valid and the private simulator starts.",
|
|
3152
|
+
visibility: "visible",
|
|
3153
|
+
criterionIds: ["dance-rover-build"],
|
|
3154
|
+
completionRequired: true,
|
|
3155
|
+
aiRequired: false
|
|
3156
|
+
},
|
|
3157
|
+
{
|
|
3158
|
+
id: "dance-rover-m1-choreography",
|
|
3159
|
+
statement: "The rover completes a bounded direction, speed, turn and repeat sequence before stopping.",
|
|
3160
|
+
visibility: "visible",
|
|
3161
|
+
criterionIds: ["dance-rover-goal-one", "dance-rover-goal-two"],
|
|
3162
|
+
completionRequired: true,
|
|
3163
|
+
aiRequired: false
|
|
3164
|
+
},
|
|
3165
|
+
{
|
|
3166
|
+
id: "dance-rover-m1-private-runtime",
|
|
3167
|
+
statement: "The program stays inside the private simulator and never accesses physical motors, the network or browser storage.",
|
|
3168
|
+
visibility: "visible",
|
|
3169
|
+
criterionIds: ["dance-rover-safety"],
|
|
3170
|
+
completionRequired: true,
|
|
3171
|
+
aiRequired: false
|
|
3172
|
+
}
|
|
3173
|
+
],
|
|
3174
|
+
interactions: [
|
|
3175
|
+
{
|
|
3176
|
+
id: "dance-rover-m1-run-control",
|
|
3177
|
+
description: "Start the private Dance Rover choreography simulation.",
|
|
3178
|
+
primaryMode: "pointer",
|
|
3179
|
+
alternativeIds: ["dance-rover-m1-keyboard-run"]
|
|
3180
|
+
},
|
|
3181
|
+
{
|
|
3182
|
+
id: "dance-rover-m1-code-control",
|
|
3183
|
+
description: "Edit the documented direction, speed, wait, repeat and stop calls.",
|
|
3184
|
+
primaryMode: "keyboard",
|
|
3185
|
+
alternativeIds: []
|
|
3186
|
+
},
|
|
3187
|
+
{
|
|
3188
|
+
id: "dance-rover-m1-motion-preview",
|
|
3189
|
+
description: "Observe the bounded rover route and stopped state.",
|
|
3190
|
+
primaryMode: "motion",
|
|
3191
|
+
alternativeIds: ["dance-rover-m1-telemetry"]
|
|
3192
|
+
}
|
|
3193
|
+
],
|
|
3194
|
+
accessibilityAlternatives: [
|
|
3195
|
+
{
|
|
3196
|
+
id: "dance-rover-m1-keyboard-run",
|
|
3197
|
+
modes: ["keyboard"],
|
|
3198
|
+
equivalentOutcome: true,
|
|
3199
|
+
description: "Press Enter or Space on the play-icon Run button to start the same simulator."
|
|
3200
|
+
},
|
|
3201
|
+
{
|
|
3202
|
+
id: "dance-rover-m1-telemetry",
|
|
3203
|
+
modes: ["text", "shape", "symbol", "reduced-motion"],
|
|
3204
|
+
equivalentOutcome: true,
|
|
3205
|
+
description: "Read direction, speed, turn, repeat count, elapsed milliseconds and stopped state without animation."
|
|
3206
|
+
}
|
|
3207
|
+
],
|
|
3208
|
+
evidenceRequirements: [
|
|
3209
|
+
{
|
|
3210
|
+
id: "dance-rover-m1-assessment",
|
|
3211
|
+
goalIds: [
|
|
3212
|
+
"dance-rover-m1-starts",
|
|
3213
|
+
"dance-rover-m1-choreography",
|
|
3214
|
+
"dance-rover-m1-private-runtime"
|
|
3215
|
+
],
|
|
3216
|
+
kind: "assessment-result",
|
|
3217
|
+
retention: "entitlement",
|
|
3218
|
+
containsPersonalData: false
|
|
3219
|
+
},
|
|
3220
|
+
{
|
|
3221
|
+
id: "dance-rover-m1-explanation",
|
|
3222
|
+
goalIds: ["dance-rover-m1-choreography"],
|
|
3223
|
+
kind: "learner-explanation",
|
|
3224
|
+
retention: "attempt",
|
|
3225
|
+
containsPersonalData: false
|
|
3226
|
+
}
|
|
3227
|
+
],
|
|
3228
|
+
sideAdventures: [
|
|
3229
|
+
{
|
|
3230
|
+
id: "dance-rover-m1-remix",
|
|
3231
|
+
prompt: "Invent an original rover dance and add a text or symbol route cue that makes it understandable without motion.",
|
|
3232
|
+
completionRequired: false
|
|
3233
|
+
}
|
|
3234
|
+
],
|
|
3235
|
+
rewardBindings: [
|
|
3236
|
+
{
|
|
3237
|
+
id: "dance-rover-m1-simulated-badge",
|
|
3238
|
+
badgeId: "dance-rover-mission-complete",
|
|
3239
|
+
goalIds: [
|
|
3240
|
+
"dance-rover-m1-starts",
|
|
3241
|
+
"dance-rover-m1-choreography",
|
|
3242
|
+
"dance-rover-m1-private-runtime"
|
|
3243
|
+
],
|
|
3244
|
+
deterministic: true,
|
|
3245
|
+
random: false,
|
|
3246
|
+
tokenConvertible: false
|
|
3247
|
+
}
|
|
3248
|
+
],
|
|
3249
|
+
functionReference: [
|
|
3250
|
+
{
|
|
3251
|
+
id: "dance-rover-function-drive",
|
|
3252
|
+
signature: "driveRover(direction, speed)",
|
|
3253
|
+
summary: "Adds one straight movement to the private simulator route.",
|
|
3254
|
+
parameters: [
|
|
3255
|
+
{
|
|
3256
|
+
name: "direction",
|
|
3257
|
+
type: "string",
|
|
3258
|
+
description: "Use forward or backward."
|
|
3259
|
+
},
|
|
3260
|
+
{
|
|
3261
|
+
name: "speed",
|
|
3262
|
+
type: "whole number",
|
|
3263
|
+
description: "A bounded simulated speed from 0 to 60 percent."
|
|
3264
|
+
}
|
|
3265
|
+
],
|
|
3266
|
+
effect: "Updates the simulator's labelled route without generating motor PWM or accessing a physical driver.",
|
|
3267
|
+
example: 'driveRover("forward", 40);'
|
|
3268
|
+
},
|
|
3269
|
+
{
|
|
3270
|
+
id: "dance-rover-function-turn",
|
|
3271
|
+
signature: "turnRover(direction, speed)",
|
|
3272
|
+
summary: "Adds one left or right turn to the private simulator route.",
|
|
3273
|
+
parameters: [
|
|
3274
|
+
{
|
|
3275
|
+
name: "direction",
|
|
3276
|
+
type: "string",
|
|
3277
|
+
description: "Use left or right."
|
|
3278
|
+
},
|
|
3279
|
+
{
|
|
3280
|
+
name: "speed",
|
|
3281
|
+
type: "whole number",
|
|
3282
|
+
description: "A bounded simulated turn speed from 0 to 60 percent."
|
|
3283
|
+
}
|
|
3284
|
+
],
|
|
3285
|
+
effect: "Updates labelled simulator direction without energising motors or a driver.",
|
|
3286
|
+
example: 'turnRover("left", 30);'
|
|
3287
|
+
},
|
|
3288
|
+
{
|
|
3289
|
+
id: "dance-rover-function-wait",
|
|
3290
|
+
signature: "waitMs(duration)",
|
|
3291
|
+
summary: "Adds one bounded wait to the simulated dance timeline.",
|
|
3292
|
+
parameters: [
|
|
3293
|
+
{
|
|
3294
|
+
name: "duration",
|
|
3295
|
+
type: "whole number",
|
|
3296
|
+
description: "A bounded number of milliseconds from 100 to 1000."
|
|
3297
|
+
}
|
|
3298
|
+
],
|
|
3299
|
+
effect: "Advances simulated elapsed time; it never blocks the website or holds physical motors under load.",
|
|
3300
|
+
example: "waitMs(300);"
|
|
3301
|
+
},
|
|
3302
|
+
{
|
|
3303
|
+
id: "dance-rover-function-repeat",
|
|
3304
|
+
signature: "repeatDance(count)",
|
|
3305
|
+
summary: "Repeats the current simulated dance a safe number of times.",
|
|
3306
|
+
parameters: [
|
|
3307
|
+
{
|
|
3308
|
+
name: "count",
|
|
3309
|
+
type: "whole number",
|
|
3310
|
+
description: "A bounded repeat count from 1 to 4."
|
|
3311
|
+
}
|
|
3312
|
+
],
|
|
3313
|
+
effect: "Adds a fixed number of labelled route sequences to the private simulator.",
|
|
3314
|
+
example: "repeatDance(3);"
|
|
3315
|
+
},
|
|
3316
|
+
{
|
|
3317
|
+
id: "dance-rover-function-stop",
|
|
3318
|
+
signature: "emergencyStop()",
|
|
3319
|
+
summary: "Ends the simulated dance in a fail-safe stopped state.",
|
|
3320
|
+
parameters: [],
|
|
3321
|
+
effect: "Marks both motors stopped in the simulator; it cannot activate, stop or otherwise control physical hardware.",
|
|
3322
|
+
example: "emergencyStop();"
|
|
3323
|
+
}
|
|
3324
|
+
]
|
|
3325
|
+
},
|
|
3326
|
+
facilitator: {
|
|
3327
|
+
artifacts: [
|
|
3328
|
+
{
|
|
3329
|
+
id: "dance-rover-m1-answer-key",
|
|
3330
|
+
kind: "answer-key",
|
|
3331
|
+
audience: "facilitator",
|
|
3332
|
+
solutionBearing: true
|
|
3333
|
+
},
|
|
3334
|
+
{
|
|
3335
|
+
id: "dance-rover-m1-protected-tests",
|
|
3336
|
+
kind: "protected-test",
|
|
3337
|
+
audience: "facilitator",
|
|
3338
|
+
solutionBearing: true
|
|
3339
|
+
},
|
|
3340
|
+
{
|
|
3341
|
+
id: "dance-rover-m1-adult-hardware-guide",
|
|
3342
|
+
kind: "facilitator-note",
|
|
3343
|
+
audience: "facilitator",
|
|
3344
|
+
solutionBearing: true
|
|
3345
|
+
}
|
|
3346
|
+
],
|
|
3347
|
+
protectedGoals: [
|
|
3348
|
+
{
|
|
3349
|
+
id: "dance-rover-m1-protected-resilience",
|
|
3350
|
+
statement: "The simulator rejects unsupported directions, excessive speeds, waits, repeats, missing stop calls and physical-hardware requests.",
|
|
3351
|
+
visibility: "protected",
|
|
3352
|
+
criterionIds: ["dance-rover-edge-one", "dance-rover-edge-two"],
|
|
3353
|
+
completionRequired: false,
|
|
3354
|
+
aiRequired: false
|
|
3355
|
+
}
|
|
3356
|
+
],
|
|
3357
|
+
prompts: [
|
|
3358
|
+
"Ask the learner to predict the labelled route and final stopped state before suggesting one bounded change.",
|
|
3359
|
+
"Use the function reference and visible telemetry; never provide motor wiring, power or movement advice to a learner.",
|
|
3360
|
+
"Physical export stays unavailable until an adult acknowledges the exact manifest and every driver, motor and power component has verified bench-test evidence."
|
|
3361
|
+
]
|
|
3362
|
+
},
|
|
3363
|
+
hardware: {
|
|
3364
|
+
requirementsVersion: "1.0.0",
|
|
3365
|
+
hardwareIncluded: false,
|
|
3366
|
+
completePathItemIds: [
|
|
3367
|
+
"pico-2-w",
|
|
3368
|
+
"breadboard",
|
|
3369
|
+
"usb-data-cable",
|
|
3370
|
+
"jumper-wires",
|
|
3371
|
+
"dual-motor-driver",
|
|
3372
|
+
"geared-motors",
|
|
3373
|
+
"rover-chassis",
|
|
3374
|
+
"motor-power"
|
|
3375
|
+
],
|
|
3376
|
+
incrementalItemIds: [
|
|
3377
|
+
"dual-motor-driver",
|
|
3378
|
+
"geared-motors",
|
|
3379
|
+
"rover-chassis",
|
|
3380
|
+
"motor-power"
|
|
3381
|
+
],
|
|
3382
|
+
components: [
|
|
3383
|
+
{ itemId: "pico-2-w", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3384
|
+
{ itemId: "breadboard", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3385
|
+
{ itemId: "usb-data-cable", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3386
|
+
{ itemId: "jumper-wires", quantity: 12, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3387
|
+
{ itemId: "dual-motor-driver", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3388
|
+
{ itemId: "geared-motors", quantity: 2, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3389
|
+
{ itemId: "rover-chassis", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3390
|
+
{ itemId: "motor-power", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false }
|
|
3391
|
+
],
|
|
3392
|
+
safeguards: {
|
|
3393
|
+
adultAssemblyRequired: true,
|
|
3394
|
+
adultAcknowledgementRequiredForExport: true,
|
|
3395
|
+
websiteMayControlHardware: false,
|
|
3396
|
+
simulatorCompletionAvailable: true,
|
|
3397
|
+
simulatedBadgeId: "dance-rover-mission-complete",
|
|
3398
|
+
physicalBadgeId: "dance-rover-physical-builder",
|
|
3399
|
+
physicalBadgeRequiresAdultSignoff: true,
|
|
3400
|
+
adultAssemblySteps: [
|
|
3401
|
+
"Confirm the exact driver, motors, chassis and switched power identities against the requirements manifest.",
|
|
3402
|
+
"Assemble and inspect all wiring with motor power disconnected and secure every moving or pinch-point part.",
|
|
3403
|
+
"Complete the first direction and emergency-stop bench test with the wheels lifted clear of the surface."
|
|
3404
|
+
],
|
|
3405
|
+
powerRequirements: [
|
|
3406
|
+
"Use a switched protected motor supply within the verified driver and motor ratings; never power motors from a Pico GPIO pin.",
|
|
3407
|
+
"Connect one common signal ground between the verified motor supply, driver and Pico only as shown in the adult guide.",
|
|
3408
|
+
"Keep the power switch accessible and disconnect every source before changing wiring, wheels or chassis parts."
|
|
3409
|
+
],
|
|
3410
|
+
cableRequirements: [
|
|
3411
|
+
"One known data-capable USB cable compatible with the Pico 2 W.",
|
|
3412
|
+
"Insulated jumper leads and verified motor, driver and power connectors documented by the adult guide."
|
|
3413
|
+
],
|
|
3414
|
+
softwarePrerequisites: [
|
|
3415
|
+
"Supported Pico SDK toolchain on Raspberry Pi OS or a documented desktop environment.",
|
|
3416
|
+
"Known-good Dance Rover recovery firmware with adult-owned watchdog and emergency-stop behaviour."
|
|
3417
|
+
],
|
|
3418
|
+
warnings: [
|
|
3419
|
+
"Hardware is not included with the module.",
|
|
3420
|
+
"No listed driver, motor, chassis or power arrangement currently claims compatibility or physical-completion eligibility.",
|
|
3421
|
+
"Moving wheels, pinch points, stalled motors and unsuitable supplies can cause injury or heat; adult assembly and testing are mandatory.",
|
|
3422
|
+
"The simulator and simulated badge remain available without physical equipment."
|
|
3423
|
+
],
|
|
3424
|
+
unrelatedHardwareNotRequired: [
|
|
3425
|
+
"Camera Module 3 or Raspberry Pi Zero 2 W",
|
|
3426
|
+
"obstacle or colour sensors",
|
|
3427
|
+
"servo, LED or infrared beacon parts"
|
|
3428
|
+
]
|
|
3429
|
+
}
|
|
3430
|
+
}
|
|
3431
|
+
};
|
|
3432
|
+
var OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1 = {
|
|
3433
|
+
version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
3434
|
+
moduleId: "junior-coder.obstacle-explorer",
|
|
3435
|
+
moduleVersion: "1.1.0",
|
|
3436
|
+
missionId: "obstacle-explorer-mission-1",
|
|
3437
|
+
learner: {
|
|
3438
|
+
estimatedMinutes: 20,
|
|
3439
|
+
stages: [
|
|
3440
|
+
{
|
|
3441
|
+
kind: "learn",
|
|
3442
|
+
instruction: "Read what readObstacle(), chooseSafeRoute(), setRecoveryAttempts(), armWatchdog() and failSafeStop() do in the private Obstacle Explorer simulator.",
|
|
3443
|
+
artifactIds: ["obstacle-explorer-m1-art"]
|
|
3444
|
+
},
|
|
3445
|
+
{
|
|
3446
|
+
kind: "predict",
|
|
3447
|
+
instruction: "Predict the simulated obstacle reading, safe route, recovery count, watchdog time and final stopped state before the explorer runs.",
|
|
3448
|
+
artifactIds: []
|
|
3449
|
+
},
|
|
3450
|
+
{
|
|
3451
|
+
kind: "build",
|
|
3452
|
+
instruction: "Adjust the five documented C++-style calls to make one bounded obstacle decision with a watchdog and fail-safe stop.",
|
|
3453
|
+
artifactIds: ["obstacle-explorer-m1-code"]
|
|
3454
|
+
},
|
|
3455
|
+
{
|
|
3456
|
+
kind: "run",
|
|
3457
|
+
instruction: "Use the Run action button to start the private Obstacle Explorer simulator.",
|
|
3458
|
+
artifactIds: ["obstacle-explorer-m1-code"]
|
|
3459
|
+
},
|
|
3460
|
+
{
|
|
3461
|
+
kind: "assess",
|
|
3462
|
+
instruction: "Run the visible and protected deterministic sensor, route, recovery, watchdog and stop checks.",
|
|
3463
|
+
artifactIds: []
|
|
3464
|
+
},
|
|
3465
|
+
{
|
|
3466
|
+
kind: "inspect",
|
|
3467
|
+
instruction: "Compare the highlighted C++-style line with the first explorer goal that did not pass.",
|
|
3468
|
+
artifactIds: []
|
|
3469
|
+
},
|
|
3470
|
+
{
|
|
3471
|
+
kind: "fix",
|
|
3472
|
+
instruction: "Change one bounded sensor side, route, recovery count, watchdog or stop call, then rerun and inspect the text telemetry.",
|
|
3473
|
+
artifactIds: ["obstacle-explorer-m1-code"]
|
|
3474
|
+
},
|
|
3475
|
+
{
|
|
3476
|
+
kind: "explain",
|
|
3477
|
+
instruction: "Explain how a Boolean obstacle reading selected a route and why the watchdog and fail-safe stop protect every explorer state.",
|
|
3478
|
+
artifactIds: []
|
|
3479
|
+
},
|
|
3480
|
+
{
|
|
3481
|
+
kind: "reward",
|
|
3482
|
+
instruction: "Collect the simulated badge when the score and mandatory safety checks pass; physical completion remains adult-only.",
|
|
3483
|
+
artifactIds: []
|
|
3484
|
+
}
|
|
3485
|
+
],
|
|
3486
|
+
readinessChecks: [
|
|
3487
|
+
{
|
|
3488
|
+
id: "obstacle-explorer-m1-find-stop",
|
|
3489
|
+
prompt: "Find failSafeStop() and explain why the explorer must stop when a sensor or watchdog result is uncertain.",
|
|
3490
|
+
scored: false
|
|
3491
|
+
}
|
|
3492
|
+
],
|
|
3493
|
+
artifacts: [
|
|
3494
|
+
{
|
|
3495
|
+
id: "obstacle-explorer-m1-code",
|
|
3496
|
+
kind: "starter-code",
|
|
3497
|
+
audience: "learner",
|
|
3498
|
+
solutionBearing: false
|
|
3499
|
+
},
|
|
3500
|
+
{
|
|
3501
|
+
id: "obstacle-explorer-m1-art",
|
|
3502
|
+
kind: "starter-assets",
|
|
3503
|
+
audience: "learner",
|
|
3504
|
+
solutionBearing: false
|
|
3505
|
+
},
|
|
3506
|
+
{
|
|
3507
|
+
id: "obstacle-explorer-m1-printable",
|
|
3508
|
+
kind: "printable",
|
|
3509
|
+
audience: "learner",
|
|
3510
|
+
solutionBearing: false
|
|
3511
|
+
}
|
|
3512
|
+
],
|
|
3513
|
+
goals: [
|
|
3514
|
+
{
|
|
3515
|
+
id: "obstacle-explorer-m1-starts",
|
|
3516
|
+
statement: "The documented C++-style settings are valid and the private simulator starts.",
|
|
3517
|
+
visibility: "visible",
|
|
3518
|
+
criterionIds: ["obstacle-explorer-build"],
|
|
3519
|
+
completionRequired: true,
|
|
3520
|
+
aiRequired: false
|
|
3521
|
+
},
|
|
3522
|
+
{
|
|
3523
|
+
id: "obstacle-explorer-m1-navigation",
|
|
3524
|
+
statement: "The explorer reads one simulated obstacle and chooses a bounded route with three recovery attempts.",
|
|
3525
|
+
visibility: "visible",
|
|
3526
|
+
criterionIds: ["obstacle-explorer-goal-one", "obstacle-explorer-goal-two"],
|
|
3527
|
+
completionRequired: true,
|
|
3528
|
+
aiRequired: false
|
|
3529
|
+
},
|
|
3530
|
+
{
|
|
3531
|
+
id: "obstacle-explorer-m1-private-runtime",
|
|
3532
|
+
statement: "The program arms a watchdog, ends fail-safe stopped and never accesses sensors, motors, the network or browser storage.",
|
|
3533
|
+
visibility: "visible",
|
|
3534
|
+
criterionIds: ["obstacle-explorer-safety"],
|
|
3535
|
+
completionRequired: true,
|
|
3536
|
+
aiRequired: false
|
|
3537
|
+
}
|
|
3538
|
+
],
|
|
3539
|
+
interactions: [
|
|
3540
|
+
{
|
|
3541
|
+
id: "obstacle-explorer-m1-run-control",
|
|
3542
|
+
description: "Start the private Obstacle Explorer navigation simulation.",
|
|
3543
|
+
primaryMode: "pointer",
|
|
3544
|
+
alternativeIds: ["obstacle-explorer-m1-keyboard-run"]
|
|
3545
|
+
},
|
|
3546
|
+
{
|
|
3547
|
+
id: "obstacle-explorer-m1-code-control",
|
|
3548
|
+
description: "Edit the documented sensor, route, recovery, watchdog and stop calls.",
|
|
3549
|
+
primaryMode: "keyboard",
|
|
3550
|
+
alternativeIds: []
|
|
3551
|
+
},
|
|
3552
|
+
{
|
|
3553
|
+
id: "obstacle-explorer-m1-route-preview",
|
|
3554
|
+
description: "Observe the bounded obstacle decision, route and stopped state.",
|
|
3555
|
+
primaryMode: "motion",
|
|
3556
|
+
alternativeIds: ["obstacle-explorer-m1-telemetry"]
|
|
3557
|
+
}
|
|
3558
|
+
],
|
|
3559
|
+
accessibilityAlternatives: [
|
|
3560
|
+
{
|
|
3561
|
+
id: "obstacle-explorer-m1-keyboard-run",
|
|
3562
|
+
modes: ["keyboard"],
|
|
3563
|
+
equivalentOutcome: true,
|
|
3564
|
+
description: "Press Enter or Space on the play-icon Run button to start the same simulator."
|
|
3565
|
+
},
|
|
3566
|
+
{
|
|
3567
|
+
id: "obstacle-explorer-m1-telemetry",
|
|
3568
|
+
modes: ["text", "shape", "symbol", "reduced-motion"],
|
|
3569
|
+
equivalentOutcome: true,
|
|
3570
|
+
description: "Read sensor side, blocked state, route, recovery count, watchdog milliseconds and stopped state without animation or colour alone."
|
|
3571
|
+
}
|
|
3572
|
+
],
|
|
3573
|
+
evidenceRequirements: [
|
|
3574
|
+
{
|
|
3575
|
+
id: "obstacle-explorer-m1-assessment",
|
|
3576
|
+
goalIds: [
|
|
3577
|
+
"obstacle-explorer-m1-starts",
|
|
3578
|
+
"obstacle-explorer-m1-navigation",
|
|
3579
|
+
"obstacle-explorer-m1-private-runtime"
|
|
3580
|
+
],
|
|
3581
|
+
kind: "assessment-result",
|
|
3582
|
+
retention: "entitlement",
|
|
3583
|
+
containsPersonalData: false
|
|
3584
|
+
},
|
|
3585
|
+
{
|
|
3586
|
+
id: "obstacle-explorer-m1-explanation",
|
|
3587
|
+
goalIds: ["obstacle-explorer-m1-navigation"],
|
|
3588
|
+
kind: "learner-explanation",
|
|
3589
|
+
retention: "attempt",
|
|
3590
|
+
containsPersonalData: false
|
|
3591
|
+
}
|
|
3592
|
+
],
|
|
3593
|
+
sideAdventures: [
|
|
3594
|
+
{
|
|
3595
|
+
id: "obstacle-explorer-m1-remix",
|
|
3596
|
+
prompt: "Invent an original maze response and add a text or symbol cue that explains the Boolean decision without motion or colour alone.",
|
|
3597
|
+
completionRequired: false
|
|
3598
|
+
}
|
|
3599
|
+
],
|
|
3600
|
+
rewardBindings: [
|
|
3601
|
+
{
|
|
3602
|
+
id: "obstacle-explorer-m1-simulated-badge",
|
|
3603
|
+
badgeId: "obstacle-explorer-mission-complete",
|
|
3604
|
+
goalIds: [
|
|
3605
|
+
"obstacle-explorer-m1-starts",
|
|
3606
|
+
"obstacle-explorer-m1-navigation",
|
|
3607
|
+
"obstacle-explorer-m1-private-runtime"
|
|
3608
|
+
],
|
|
3609
|
+
deterministic: true,
|
|
3610
|
+
random: false,
|
|
3611
|
+
tokenConvertible: false
|
|
3612
|
+
}
|
|
3613
|
+
],
|
|
3614
|
+
functionReference: [
|
|
3615
|
+
{
|
|
3616
|
+
id: "obstacle-explorer-function-read",
|
|
3617
|
+
signature: "readObstacle(side)",
|
|
3618
|
+
summary: "Reads one labelled obstacle state from the private simulator.",
|
|
3619
|
+
parameters: [
|
|
3620
|
+
{
|
|
3621
|
+
name: "side",
|
|
3622
|
+
type: "string",
|
|
3623
|
+
description: "Use front, left or right."
|
|
3624
|
+
}
|
|
3625
|
+
],
|
|
3626
|
+
effect: "Returns a simulator Boolean blocked or clear reading and never accesses an IR sensor or GPIO pin.",
|
|
3627
|
+
example: 'readObstacle("front");'
|
|
3628
|
+
},
|
|
3629
|
+
{
|
|
3630
|
+
id: "obstacle-explorer-function-route",
|
|
3631
|
+
signature: "chooseSafeRoute(blockedAction, clearAction)",
|
|
3632
|
+
summary: "Chooses one bounded route for blocked and clear simulated states.",
|
|
3633
|
+
parameters: [
|
|
3634
|
+
{
|
|
3635
|
+
name: "blockedAction",
|
|
3636
|
+
type: "string",
|
|
3637
|
+
description: "Use turn-left, turn-right, back-up or stop."
|
|
3638
|
+
},
|
|
3639
|
+
{
|
|
3640
|
+
name: "clearAction",
|
|
3641
|
+
type: "string",
|
|
3642
|
+
description: "Use forward or stop."
|
|
3643
|
+
}
|
|
3644
|
+
],
|
|
3645
|
+
effect: "Updates labelled simulator navigation state without energising motors or a driver.",
|
|
3646
|
+
example: 'chooseSafeRoute("turn-left", "forward");'
|
|
3647
|
+
},
|
|
3648
|
+
{
|
|
3649
|
+
id: "obstacle-explorer-function-recovery",
|
|
3650
|
+
signature: "setRecoveryAttempts(count)",
|
|
3651
|
+
summary: "Sets a bounded number of simulated recovery attempts.",
|
|
3652
|
+
parameters: [
|
|
3653
|
+
{
|
|
3654
|
+
name: "count",
|
|
3655
|
+
type: "whole number",
|
|
3656
|
+
description: "A bounded recovery count from 1 to 3."
|
|
3657
|
+
}
|
|
3658
|
+
],
|
|
3659
|
+
effect: "Limits the private simulator recovery state so an uncertain route cannot loop forever.",
|
|
3660
|
+
example: "setRecoveryAttempts(3);"
|
|
3661
|
+
},
|
|
3662
|
+
{
|
|
3663
|
+
id: "obstacle-explorer-function-watchdog",
|
|
3664
|
+
signature: "armWatchdog(duration)",
|
|
3665
|
+
summary: "Arms a bounded simulated watchdog timer.",
|
|
3666
|
+
parameters: [
|
|
3667
|
+
{
|
|
3668
|
+
name: "duration",
|
|
3669
|
+
type: "whole number",
|
|
3670
|
+
description: "A bounded timeout from 250 to 1000 milliseconds."
|
|
3671
|
+
}
|
|
3672
|
+
],
|
|
3673
|
+
effect: "Records simulator timeout telemetry and cannot hold or control physical movement.",
|
|
3674
|
+
example: "armWatchdog(500);"
|
|
3675
|
+
},
|
|
3676
|
+
{
|
|
3677
|
+
id: "obstacle-explorer-function-stop",
|
|
3678
|
+
signature: "failSafeStop()",
|
|
3679
|
+
summary: "Ends the navigation simulation in a fail-safe stopped state.",
|
|
3680
|
+
parameters: [],
|
|
3681
|
+
effect: "Marks the private simulator stopped on completion or uncertainty; it cannot activate, stop or otherwise control physical hardware.",
|
|
3682
|
+
example: "failSafeStop();"
|
|
3683
|
+
}
|
|
3684
|
+
]
|
|
3685
|
+
},
|
|
3686
|
+
facilitator: {
|
|
3687
|
+
artifacts: [
|
|
3688
|
+
{
|
|
3689
|
+
id: "obstacle-explorer-m1-answer-key",
|
|
3690
|
+
kind: "answer-key",
|
|
3691
|
+
audience: "facilitator",
|
|
3692
|
+
solutionBearing: true
|
|
3693
|
+
},
|
|
3694
|
+
{
|
|
3695
|
+
id: "obstacle-explorer-m1-protected-tests",
|
|
3696
|
+
kind: "protected-test",
|
|
3697
|
+
audience: "facilitator",
|
|
3698
|
+
solutionBearing: true
|
|
3699
|
+
},
|
|
3700
|
+
{
|
|
3701
|
+
id: "obstacle-explorer-m1-adult-hardware-guide",
|
|
3702
|
+
kind: "facilitator-note",
|
|
3703
|
+
audience: "facilitator",
|
|
3704
|
+
solutionBearing: true
|
|
3705
|
+
}
|
|
3706
|
+
],
|
|
3707
|
+
protectedGoals: [
|
|
3708
|
+
{
|
|
3709
|
+
id: "obstacle-explorer-m1-protected-resilience",
|
|
3710
|
+
statement: "The simulator rejects unsupported sensor sides, unsafe routes, excessive recovery attempts, invalid watchdogs, missing stop calls and physical-hardware requests.",
|
|
3711
|
+
visibility: "protected",
|
|
3712
|
+
criterionIds: ["obstacle-explorer-edge-one", "obstacle-explorer-edge-two"],
|
|
3713
|
+
completionRequired: false,
|
|
3714
|
+
aiRequired: false
|
|
3715
|
+
}
|
|
3716
|
+
],
|
|
3717
|
+
prompts: [
|
|
3718
|
+
"Ask the learner to predict the Boolean blocked state, labelled route and final stopped state before suggesting one bounded change.",
|
|
3719
|
+
"Use the function reference and visible telemetry; never provide sensor wiring, motor power or movement advice to a learner.",
|
|
3720
|
+
"Physical export stays unavailable until an adult acknowledges the exact manifest and every rover and sensor component has calibration and bench-test evidence."
|
|
3721
|
+
]
|
|
3722
|
+
},
|
|
3723
|
+
hardware: {
|
|
3724
|
+
requirementsVersion: "1.0.0",
|
|
3725
|
+
hardwareIncluded: false,
|
|
3726
|
+
completePathItemIds: [
|
|
3727
|
+
"pico-2-w",
|
|
3728
|
+
"breadboard",
|
|
3729
|
+
"usb-data-cable",
|
|
3730
|
+
"jumper-wires",
|
|
3731
|
+
"verified-rover",
|
|
3732
|
+
"obstacle-sensors"
|
|
3733
|
+
],
|
|
3734
|
+
incrementalItemIds: [
|
|
3735
|
+
"verified-rover",
|
|
3736
|
+
"obstacle-sensors"
|
|
3737
|
+
],
|
|
3738
|
+
components: [
|
|
3739
|
+
{ itemId: "pico-2-w", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3740
|
+
{ itemId: "breadboard", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3741
|
+
{ itemId: "usb-data-cable", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3742
|
+
{ itemId: "jumper-wires", quantity: 12, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3743
|
+
{ itemId: "verified-rover", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
3744
|
+
{ itemId: "obstacle-sensors", quantity: 2, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false }
|
|
3745
|
+
],
|
|
3746
|
+
safeguards: {
|
|
3747
|
+
adultAssemblyRequired: true,
|
|
3748
|
+
adultAcknowledgementRequiredForExport: true,
|
|
3749
|
+
websiteMayControlHardware: false,
|
|
3750
|
+
simulatorCompletionAvailable: true,
|
|
3751
|
+
simulatedBadgeId: "obstacle-explorer-mission-complete",
|
|
3752
|
+
physicalBadgeId: "obstacle-explorer-physical-builder",
|
|
3753
|
+
physicalBadgeRequiresAdultSignoff: true,
|
|
3754
|
+
adultAssemblySteps: [
|
|
3755
|
+
"Confirm the exact bench-signed rover and IR sensor identities against the requirements manifest.",
|
|
3756
|
+
"Assemble and inspect all disconnected sensor wiring, then complete the adult sensor calibration record for clear and blocked surfaces.",
|
|
3757
|
+
"Complete direction, obstacle recovery, watchdog and fail-safe-stop tests with the wheels lifted clear of the surface."
|
|
3758
|
+
],
|
|
3759
|
+
powerRequirements: [
|
|
3760
|
+
"Use the verified switched protected motor supply and sensor voltage; never power motors or unsuitable sensors from a Pico GPIO pin.",
|
|
3761
|
+
"Connect one common signal ground between the verified sensor, motor supply, driver and Pico only as shown in the adult guide.",
|
|
3762
|
+
"Keep the power switch accessible and disconnect every source before changing wiring, sensors, wheels or chassis parts."
|
|
3763
|
+
],
|
|
3764
|
+
cableRequirements: [
|
|
3765
|
+
"One known data-capable USB cable compatible with the Pico 2 W.",
|
|
3766
|
+
"Insulated jumper leads and verified sensor, motor, driver and power connectors documented by the adult guide."
|
|
3767
|
+
],
|
|
3768
|
+
softwarePrerequisites: [
|
|
3769
|
+
"Supported Pico SDK toolchain on Raspberry Pi OS or a documented desktop environment.",
|
|
3770
|
+
"Known-good Obstacle Explorer recovery firmware with adult-owned watchdog, sensor-failure and emergency-stop behaviour."
|
|
3771
|
+
],
|
|
3772
|
+
warnings: [
|
|
3773
|
+
"Hardware is not included with the module.",
|
|
3774
|
+
"No listed rover or sensor currently claims compatibility or physical-completion eligibility for this module.",
|
|
3775
|
+
"Moving wheels, pinch points, stalled motors, reflective sensor errors and unsuitable supplies can cause unsafe movement or heat; adult assembly, calibration and testing are mandatory.",
|
|
3776
|
+
"The simulator and simulated badge remain available without physical equipment."
|
|
3777
|
+
],
|
|
3778
|
+
unrelatedHardwareNotRequired: [
|
|
3779
|
+
"Camera Module 3 or Raspberry Pi Zero 2 W",
|
|
3780
|
+
"colour targets or camera ribbon",
|
|
3781
|
+
"servo, LED or infrared beacon parts"
|
|
3782
|
+
]
|
|
3783
|
+
}
|
|
3784
|
+
}
|
|
3785
|
+
};
|
|
3067
3786
|
var RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1 = {
|
|
3068
3787
|
version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
3069
3788
|
moduleId: "junior-coder.rescue-crew-commander",
|
|
@@ -3859,6 +4578,7 @@ ${summary}`);
|
|
|
3859
4578
|
}
|
|
3860
4579
|
export {
|
|
3861
4580
|
BEACON_BOT_MISSION_ONE_AUTHORING_V1,
|
|
4581
|
+
DANCE_ROVER_MISSION_ONE_AUTHORING_V1,
|
|
3862
4582
|
JUNIOR_CODER_MISSION_STAGE_ORDER_V1,
|
|
3863
4583
|
JUNIOR_CODER_MODULE_PRICE_V1_1,
|
|
3864
4584
|
JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT,
|
|
@@ -3866,6 +4586,7 @@ export {
|
|
|
3866
4586
|
JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
|
|
3867
4587
|
METEOR_SHIELD_MISSION_ONE_AUTHORING_V1,
|
|
3868
4588
|
MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
4589
|
+
OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1,
|
|
3869
4590
|
PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
|
|
3870
4591
|
PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1,
|
|
3871
4592
|
RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
|