@plasius/learning 0.2.11 → 0.2.13
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 +29 -2
- package/dist/index.cjs +716 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +714 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3429,6 +3429,718 @@ var DANCE_ROVER_MISSION_ONE_AUTHORING_V1 = {
|
|
|
3429
3429
|
}
|
|
3430
3430
|
}
|
|
3431
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
|
+
};
|
|
3786
|
+
var RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1 = {
|
|
3787
|
+
version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
3788
|
+
moduleId: "junior-coder.rainbow-rescue-rover",
|
|
3789
|
+
moduleVersion: "1.1.0",
|
|
3790
|
+
missionId: "rainbow-rescue-rover-mission-1",
|
|
3791
|
+
learner: {
|
|
3792
|
+
estimatedMinutes: 20,
|
|
3793
|
+
stages: [
|
|
3794
|
+
{
|
|
3795
|
+
kind: "learn",
|
|
3796
|
+
instruction: "Read what detectColour(), locateTarget(), planSerialCommand(), armHeartbeat() and failSafeStop() do in the private Rainbow Rescue Rover simulator.",
|
|
3797
|
+
artifactIds: ["rainbow-rescue-rover-m1-art"]
|
|
3798
|
+
},
|
|
3799
|
+
{
|
|
3800
|
+
kind: "predict",
|
|
3801
|
+
instruction: "Predict the simulated colour, target zone, bounded command, heartbeat time and final stopped state before the rescue plan runs.",
|
|
3802
|
+
artifactIds: []
|
|
3803
|
+
},
|
|
3804
|
+
{
|
|
3805
|
+
kind: "build",
|
|
3806
|
+
instruction: "Adjust the five documented integration calls to recognise one simulated target and plan one safe serial command with a heartbeat and fail-safe stop.",
|
|
3807
|
+
artifactIds: ["rainbow-rescue-rover-m1-code"]
|
|
3808
|
+
},
|
|
3809
|
+
{
|
|
3810
|
+
kind: "run",
|
|
3811
|
+
instruction: "Use the Run action button to start the private Rainbow Rescue Rover integration simulator.",
|
|
3812
|
+
artifactIds: ["rainbow-rescue-rover-m1-code"]
|
|
3813
|
+
},
|
|
3814
|
+
{
|
|
3815
|
+
kind: "assess",
|
|
3816
|
+
instruction: "Run the visible and protected deterministic colour, location, command, heartbeat and stop checks.",
|
|
3817
|
+
artifactIds: []
|
|
3818
|
+
},
|
|
3819
|
+
{
|
|
3820
|
+
kind: "inspect",
|
|
3821
|
+
instruction: "Compare the highlighted integration-plan line with the first rescue goal that did not pass.",
|
|
3822
|
+
artifactIds: []
|
|
3823
|
+
},
|
|
3824
|
+
{
|
|
3825
|
+
kind: "fix",
|
|
3826
|
+
instruction: "Change one bounded colour, target zone, command, heartbeat or stop call, then rerun and inspect the text telemetry.",
|
|
3827
|
+
artifactIds: ["rainbow-rescue-rover-m1-code"]
|
|
3828
|
+
},
|
|
3829
|
+
{
|
|
3830
|
+
kind: "explain",
|
|
3831
|
+
instruction: "Explain how family-local colour evidence became a bounded command plan and why the heartbeat and fail-safe stop protect every uncertain state.",
|
|
3832
|
+
artifactIds: []
|
|
3833
|
+
},
|
|
3834
|
+
{
|
|
3835
|
+
kind: "reward",
|
|
3836
|
+
instruction: "Collect the simulated badge when the score and mandatory privacy and safety checks pass; physical completion remains adult-only.",
|
|
3837
|
+
artifactIds: []
|
|
3838
|
+
}
|
|
3839
|
+
],
|
|
3840
|
+
readinessChecks: [
|
|
3841
|
+
{
|
|
3842
|
+
id: "rainbow-rescue-rover-m1-find-privacy",
|
|
3843
|
+
prompt: "Find the rule that keeps Camera Module 3 frames on the family Raspberry Pi and explain why only bounded command labels may leave it.",
|
|
3844
|
+
scored: false
|
|
3845
|
+
}
|
|
3846
|
+
],
|
|
3847
|
+
artifacts: [
|
|
3848
|
+
{
|
|
3849
|
+
id: "rainbow-rescue-rover-m1-code",
|
|
3850
|
+
kind: "starter-code",
|
|
3851
|
+
audience: "learner",
|
|
3852
|
+
solutionBearing: false
|
|
3853
|
+
},
|
|
3854
|
+
{
|
|
3855
|
+
id: "rainbow-rescue-rover-m1-art",
|
|
3856
|
+
kind: "starter-assets",
|
|
3857
|
+
audience: "learner",
|
|
3858
|
+
solutionBearing: false
|
|
3859
|
+
},
|
|
3860
|
+
{
|
|
3861
|
+
id: "rainbow-rescue-rover-m1-printable",
|
|
3862
|
+
kind: "printable",
|
|
3863
|
+
audience: "learner",
|
|
3864
|
+
solutionBearing: false
|
|
3865
|
+
}
|
|
3866
|
+
],
|
|
3867
|
+
goals: [
|
|
3868
|
+
{
|
|
3869
|
+
id: "rainbow-rescue-rover-m1-starts",
|
|
3870
|
+
statement: "The documented integration-plan settings are valid and the private simulator starts.",
|
|
3871
|
+
visibility: "visible",
|
|
3872
|
+
criterionIds: ["rainbow-rescue-rover-build"],
|
|
3873
|
+
completionRequired: true,
|
|
3874
|
+
aiRequired: false
|
|
3875
|
+
},
|
|
3876
|
+
{
|
|
3877
|
+
id: "rainbow-rescue-rover-m1-target-command",
|
|
3878
|
+
statement: "The rover plan recognises a green simulated target in the centre and selects one bounded forward command.",
|
|
3879
|
+
visibility: "visible",
|
|
3880
|
+
criterionIds: ["rainbow-rescue-rover-goal-one", "rainbow-rescue-rover-goal-two"],
|
|
3881
|
+
completionRequired: true,
|
|
3882
|
+
aiRequired: false
|
|
3883
|
+
},
|
|
3884
|
+
{
|
|
3885
|
+
id: "rainbow-rescue-rover-m1-private-runtime",
|
|
3886
|
+
statement: "The plan arms a heartbeat, ends fail-safe stopped and never accesses a camera, serial port, motor, network or browser storage.",
|
|
3887
|
+
visibility: "visible",
|
|
3888
|
+
criterionIds: ["rainbow-rescue-rover-safety"],
|
|
3889
|
+
completionRequired: true,
|
|
3890
|
+
aiRequired: false
|
|
3891
|
+
}
|
|
3892
|
+
],
|
|
3893
|
+
interactions: [
|
|
3894
|
+
{
|
|
3895
|
+
id: "rainbow-rescue-rover-m1-run-control",
|
|
3896
|
+
description: "Start the private Rainbow Rescue Rover integration simulation.",
|
|
3897
|
+
primaryMode: "pointer",
|
|
3898
|
+
alternativeIds: ["rainbow-rescue-rover-m1-keyboard-run"]
|
|
3899
|
+
},
|
|
3900
|
+
{
|
|
3901
|
+
id: "rainbow-rescue-rover-m1-code-control",
|
|
3902
|
+
description: "Edit the documented colour, target, command, heartbeat and stop calls.",
|
|
3903
|
+
primaryMode: "keyboard",
|
|
3904
|
+
alternativeIds: []
|
|
3905
|
+
},
|
|
3906
|
+
{
|
|
3907
|
+
id: "rainbow-rescue-rover-m1-target-preview",
|
|
3908
|
+
description: "Observe the simulated colour target, command route and stopped state.",
|
|
3909
|
+
primaryMode: "colour",
|
|
3910
|
+
alternativeIds: ["rainbow-rescue-rover-m1-telemetry"]
|
|
3911
|
+
}
|
|
3912
|
+
],
|
|
3913
|
+
accessibilityAlternatives: [
|
|
3914
|
+
{
|
|
3915
|
+
id: "rainbow-rescue-rover-m1-keyboard-run",
|
|
3916
|
+
modes: ["keyboard"],
|
|
3917
|
+
equivalentOutcome: true,
|
|
3918
|
+
description: "Press Enter or Space on the play-icon Run button to start the same simulator."
|
|
3919
|
+
},
|
|
3920
|
+
{
|
|
3921
|
+
id: "rainbow-rescue-rover-m1-telemetry",
|
|
3922
|
+
modes: ["text", "shape", "symbol", "reduced-motion"],
|
|
3923
|
+
equivalentOutcome: true,
|
|
3924
|
+
description: "Read the colour name, target zone, command, heartbeat milliseconds and stopped state without camera access, animation or colour alone."
|
|
3925
|
+
}
|
|
3926
|
+
],
|
|
3927
|
+
evidenceRequirements: [
|
|
3928
|
+
{
|
|
3929
|
+
id: "rainbow-rescue-rover-m1-assessment",
|
|
3930
|
+
goalIds: [
|
|
3931
|
+
"rainbow-rescue-rover-m1-starts",
|
|
3932
|
+
"rainbow-rescue-rover-m1-target-command",
|
|
3933
|
+
"rainbow-rescue-rover-m1-private-runtime"
|
|
3934
|
+
],
|
|
3935
|
+
kind: "assessment-result",
|
|
3936
|
+
retention: "entitlement",
|
|
3937
|
+
containsPersonalData: false
|
|
3938
|
+
},
|
|
3939
|
+
{
|
|
3940
|
+
id: "rainbow-rescue-rover-m1-explanation",
|
|
3941
|
+
goalIds: ["rainbow-rescue-rover-m1-target-command"],
|
|
3942
|
+
kind: "learner-explanation",
|
|
3943
|
+
retention: "attempt",
|
|
3944
|
+
containsPersonalData: false
|
|
3945
|
+
}
|
|
3946
|
+
],
|
|
3947
|
+
sideAdventures: [
|
|
3948
|
+
{
|
|
3949
|
+
id: "rainbow-rescue-rover-m1-remix",
|
|
3950
|
+
prompt: "Invent an original colour rescue rule and add a text, shape or symbol cue that explains the command without camera frames, motion or colour alone.",
|
|
3951
|
+
completionRequired: false
|
|
3952
|
+
}
|
|
3953
|
+
],
|
|
3954
|
+
rewardBindings: [
|
|
3955
|
+
{
|
|
3956
|
+
id: "rainbow-rescue-rover-m1-simulated-badge",
|
|
3957
|
+
badgeId: "rainbow-rescue-rover-mission-complete",
|
|
3958
|
+
goalIds: [
|
|
3959
|
+
"rainbow-rescue-rover-m1-starts",
|
|
3960
|
+
"rainbow-rescue-rover-m1-target-command",
|
|
3961
|
+
"rainbow-rescue-rover-m1-private-runtime"
|
|
3962
|
+
],
|
|
3963
|
+
deterministic: true,
|
|
3964
|
+
random: false,
|
|
3965
|
+
tokenConvertible: false
|
|
3966
|
+
}
|
|
3967
|
+
],
|
|
3968
|
+
functionReference: [
|
|
3969
|
+
{
|
|
3970
|
+
id: "rainbow-rescue-rover-function-detect",
|
|
3971
|
+
signature: "detectColour(colour)",
|
|
3972
|
+
summary: "Selects one labelled colour result in the private simulator.",
|
|
3973
|
+
parameters: [
|
|
3974
|
+
{
|
|
3975
|
+
name: "colour",
|
|
3976
|
+
type: "string",
|
|
3977
|
+
description: "Use red, green, blue or yellow."
|
|
3978
|
+
}
|
|
3979
|
+
],
|
|
3980
|
+
effect: "Returns one simulator colour label and confidence state; it never opens a camera or receives a frame.",
|
|
3981
|
+
example: 'detectColour("green");'
|
|
3982
|
+
},
|
|
3983
|
+
{
|
|
3984
|
+
id: "rainbow-rescue-rover-function-locate",
|
|
3985
|
+
signature: "locateTarget(zone)",
|
|
3986
|
+
summary: "Places the simulated target in one labelled horizontal zone.",
|
|
3987
|
+
parameters: [
|
|
3988
|
+
{
|
|
3989
|
+
name: "zone",
|
|
3990
|
+
type: "string",
|
|
3991
|
+
description: "Use left, centre or right."
|
|
3992
|
+
}
|
|
3993
|
+
],
|
|
3994
|
+
effect: "Updates text, shape and coordinate cues in the simulator without analysing or storing an image.",
|
|
3995
|
+
example: 'locateTarget("centre");'
|
|
3996
|
+
},
|
|
3997
|
+
{
|
|
3998
|
+
id: "rainbow-rescue-rover-function-command",
|
|
3999
|
+
signature: "planSerialCommand(command)",
|
|
4000
|
+
summary: "Plans one bounded command label for the simulated rover link.",
|
|
4001
|
+
parameters: [
|
|
4002
|
+
{
|
|
4003
|
+
name: "command",
|
|
4004
|
+
type: "string",
|
|
4005
|
+
description: "Use forward, turn-left, turn-right or stop."
|
|
4006
|
+
}
|
|
4007
|
+
],
|
|
4008
|
+
effect: "Records a simulator-only command label; it never opens a serial port or activates motors.",
|
|
4009
|
+
example: 'planSerialCommand("forward");'
|
|
4010
|
+
},
|
|
4011
|
+
{
|
|
4012
|
+
id: "rainbow-rescue-rover-function-heartbeat",
|
|
4013
|
+
signature: "armHeartbeat(duration)",
|
|
4014
|
+
summary: "Arms a bounded simulated command heartbeat.",
|
|
4015
|
+
parameters: [
|
|
4016
|
+
{
|
|
4017
|
+
name: "duration",
|
|
4018
|
+
type: "whole number",
|
|
4019
|
+
description: "A bounded heartbeat from 250 to 1000 milliseconds."
|
|
4020
|
+
}
|
|
4021
|
+
],
|
|
4022
|
+
effect: "Records heartbeat telemetry so an uncertain simulator link becomes stopped; it cannot maintain physical movement.",
|
|
4023
|
+
example: "armHeartbeat(500);"
|
|
4024
|
+
},
|
|
4025
|
+
{
|
|
4026
|
+
id: "rainbow-rescue-rover-function-stop",
|
|
4027
|
+
signature: "failSafeStop()",
|
|
4028
|
+
summary: "Ends the integration simulation in a fail-safe stopped state.",
|
|
4029
|
+
parameters: [],
|
|
4030
|
+
effect: "Marks the private simulator stopped after the bounded command plan; it cannot activate, stop or otherwise control physical hardware.",
|
|
4031
|
+
example: "failSafeStop();"
|
|
4032
|
+
}
|
|
4033
|
+
]
|
|
4034
|
+
},
|
|
4035
|
+
facilitator: {
|
|
4036
|
+
artifacts: [
|
|
4037
|
+
{
|
|
4038
|
+
id: "rainbow-rescue-rover-m1-answer-key",
|
|
4039
|
+
kind: "answer-key",
|
|
4040
|
+
audience: "facilitator",
|
|
4041
|
+
solutionBearing: true
|
|
4042
|
+
},
|
|
4043
|
+
{
|
|
4044
|
+
id: "rainbow-rescue-rover-m1-protected-tests",
|
|
4045
|
+
kind: "protected-test",
|
|
4046
|
+
audience: "facilitator",
|
|
4047
|
+
solutionBearing: true
|
|
4048
|
+
},
|
|
4049
|
+
{
|
|
4050
|
+
id: "rainbow-rescue-rover-m1-adult-hardware-guide",
|
|
4051
|
+
kind: "facilitator-note",
|
|
4052
|
+
audience: "facilitator",
|
|
4053
|
+
solutionBearing: true
|
|
4054
|
+
}
|
|
4055
|
+
],
|
|
4056
|
+
protectedGoals: [
|
|
4057
|
+
{
|
|
4058
|
+
id: "rainbow-rescue-rover-m1-protected-resilience",
|
|
4059
|
+
statement: "The simulator rejects unsupported colours, zones, serial commands, invalid heartbeats, missing stop calls and any camera, serial or physical-hardware request.",
|
|
4060
|
+
visibility: "protected",
|
|
4061
|
+
criterionIds: ["rainbow-rescue-rover-edge-one", "rainbow-rescue-rover-edge-two"],
|
|
4062
|
+
completionRequired: false,
|
|
4063
|
+
aiRequired: false
|
|
4064
|
+
}
|
|
4065
|
+
],
|
|
4066
|
+
prompts: [
|
|
4067
|
+
"Ask the learner to predict the labelled target, bounded command and final stopped state before suggesting one change.",
|
|
4068
|
+
"Use only authored function guidance and simulator telemetry; never request camera frames or give learner wiring, power or motor-control advice.",
|
|
4069
|
+
"Physical export stays unavailable until an adult acknowledges the exact manifest and every camera, computer, serial, rover and power component has bench-test evidence."
|
|
4070
|
+
]
|
|
4071
|
+
},
|
|
4072
|
+
hardware: {
|
|
4073
|
+
requirementsVersion: "1.0.0",
|
|
4074
|
+
hardwareIncluded: false,
|
|
4075
|
+
completePathItemIds: [
|
|
4076
|
+
"pico-2-w",
|
|
4077
|
+
"breadboard",
|
|
4078
|
+
"usb-data-cable",
|
|
4079
|
+
"jumper-wires",
|
|
4080
|
+
"verified-explorer",
|
|
4081
|
+
"pi-zero-2-w",
|
|
4082
|
+
"camera-3",
|
|
4083
|
+
"pi-storage-power"
|
|
4084
|
+
],
|
|
4085
|
+
incrementalItemIds: [
|
|
4086
|
+
"verified-explorer",
|
|
4087
|
+
"pi-zero-2-w",
|
|
4088
|
+
"camera-3",
|
|
4089
|
+
"pi-storage-power"
|
|
4090
|
+
],
|
|
4091
|
+
components: [
|
|
4092
|
+
{ itemId: "pico-2-w", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
4093
|
+
{ itemId: "breadboard", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
4094
|
+
{ itemId: "usb-data-cable", quantity: 1, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
4095
|
+
{ itemId: "jumper-wires", quantity: 12, acquisitionScope: "complete-path", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
4096
|
+
{ itemId: "verified-explorer", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
4097
|
+
{ itemId: "pi-zero-2-w", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
4098
|
+
{ itemId: "camera-3", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false },
|
|
4099
|
+
{ itemId: "pi-storage-power", quantity: 1, acquisitionScope: "incremental", verificationStatus: "pending-bench-test", compatibilityClaimed: false, physicalCompletionEligible: false }
|
|
4100
|
+
],
|
|
4101
|
+
safeguards: {
|
|
4102
|
+
adultAssemblyRequired: true,
|
|
4103
|
+
adultAcknowledgementRequiredForExport: true,
|
|
4104
|
+
websiteMayControlHardware: false,
|
|
4105
|
+
simulatorCompletionAvailable: true,
|
|
4106
|
+
simulatedBadgeId: "rainbow-rescue-rover-mission-complete",
|
|
4107
|
+
physicalBadgeId: "rainbow-rescue-rover-physical-builder",
|
|
4108
|
+
physicalBadgeRequiresAdultSignoff: true,
|
|
4109
|
+
adultAssemblySteps: [
|
|
4110
|
+
"Confirm the exact bench-signed rover, Pi Zero 2 W, Camera Module 3 and correct Zero-series camera ribbon identities against the manifest.",
|
|
4111
|
+
"With all power disconnected, fit and inspect the camera ribbon, storage, Pi power, Pico data link and isolated rover assemblies using the adult guide.",
|
|
4112
|
+
"Complete local colour calibration, bounded serial-command, heartbeat, link-loss and fail-safe-stop tests with the wheels lifted clear of the surface."
|
|
4113
|
+
],
|
|
4114
|
+
powerRequirements: [
|
|
4115
|
+
"Use a separate regulated Raspberry Pi power supply for the Pi Zero 2 W and Camera Module 3.",
|
|
4116
|
+
"Use the verified switched protected motor supply for the rover; never power motors, the Pi Zero 2 W or Camera Module 3 from a Pico GPIO pin.",
|
|
4117
|
+
"Keep every power switch accessible and disconnect every source before changing the camera ribbon, storage, wiring, sensors, wheels or chassis parts."
|
|
4118
|
+
],
|
|
4119
|
+
cableRequirements: [
|
|
4120
|
+
"One known data-capable USB cable compatible with the Pico 2 W and Pi Zero 2 W serial plan.",
|
|
4121
|
+
"The correct Zero-series Camera Module 3 ribbon and adult-verified insulated rover and power connectors."
|
|
4122
|
+
],
|
|
4123
|
+
softwarePrerequisites: [
|
|
4124
|
+
"Current Raspberry Pi OS with supported rpicam and Picamera2 software on the family-owned Pi Zero 2 W.",
|
|
4125
|
+
"Supported Pico SDK toolchain and known-good recovery firmware with adult-owned heartbeat, link-loss and emergency-stop behaviour.",
|
|
4126
|
+
"A family-local colour-calibration utility that never uploads, publishes or transmits Camera Module 3 frames."
|
|
4127
|
+
],
|
|
4128
|
+
warnings: [
|
|
4129
|
+
"Hardware is not included with the module.",
|
|
4130
|
+
"No listed camera, computer, rover, serial or power configuration currently claims compatibility or physical-completion eligibility.",
|
|
4131
|
+
"Camera frames remain on the family Raspberry Pi and must never be submitted to Plasius, an agent service or a published project.",
|
|
4132
|
+
"The website never activates motors, opens a camera or serial port, and an uncertain or missing heartbeat must stop the physical rover.",
|
|
4133
|
+
"Moving wheels, pinch points, stalled motors, camera ribbon damage and unsuitable supplies can cause unsafe movement, heat or damage; adult assembly, calibration and testing are mandatory.",
|
|
4134
|
+
"The simulator and simulated badge remain available without physical equipment."
|
|
4135
|
+
],
|
|
4136
|
+
unrelatedHardwareNotRequired: [
|
|
4137
|
+
"cloud camera, object-recognition or face-recognition services",
|
|
4138
|
+
"microphone, speaker, location or biometric sensors",
|
|
4139
|
+
"public hosting, analytics, advertising or external network access"
|
|
4140
|
+
]
|
|
4141
|
+
}
|
|
4142
|
+
}
|
|
4143
|
+
};
|
|
3432
4144
|
var RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1 = {
|
|
3433
4145
|
version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
3434
4146
|
moduleId: "junior-coder.rescue-crew-commander",
|
|
@@ -4232,8 +4944,10 @@ export {
|
|
|
4232
4944
|
JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
|
|
4233
4945
|
METEOR_SHIELD_MISSION_ONE_AUTHORING_V1,
|
|
4234
4946
|
MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
4947
|
+
OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1,
|
|
4235
4948
|
PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
|
|
4236
4949
|
PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1,
|
|
4950
|
+
RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1,
|
|
4237
4951
|
RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
|
|
4238
4952
|
ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
|
|
4239
4953
|
ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
|