@plasius/learning 0.2.9 → 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 +28 -2
- package/dist/index.cjs +758 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -1
- package/dist/index.d.ts +13 -1
- package/dist/index.js +756 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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,
|
|
@@ -33,6 +34,7 @@ __export(index_exports, {
|
|
|
33
34
|
RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1: () => RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
|
|
34
35
|
ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1: () => ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
|
|
35
36
|
ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1: () => ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
|
|
37
|
+
SERVO_CREATURE_MISSION_ONE_AUTHORING_V1: () => SERVO_CREATURE_MISSION_ONE_AUTHORING_V1,
|
|
36
38
|
SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1: () => SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
|
|
37
39
|
STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1: () => STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1,
|
|
38
40
|
assertValidLearningPath: () => assertValidLearningPath,
|
|
@@ -2721,6 +2723,760 @@ var BEACON_BOT_MISSION_ONE_AUTHORING_V1 = {
|
|
|
2721
2723
|
}
|
|
2722
2724
|
}
|
|
2723
2725
|
};
|
|
2726
|
+
var SERVO_CREATURE_MISSION_ONE_AUTHORING_V1 = {
|
|
2727
|
+
version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
2728
|
+
moduleId: "junior-coder.servo-creature",
|
|
2729
|
+
moduleVersion: "1.1.0",
|
|
2730
|
+
missionId: "servo-creature-mission-1",
|
|
2731
|
+
learner: {
|
|
2732
|
+
estimatedMinutes: 20,
|
|
2733
|
+
stages: [
|
|
2734
|
+
{
|
|
2735
|
+
kind: "learn",
|
|
2736
|
+
instruction: "Read what setServoAngle(), waitMs(), repeatMovement(), setCreatureMood() and readTouchSensor() do in the private Servo Creature simulator.",
|
|
2737
|
+
artifactIds: ["servo-creature-m1-art"]
|
|
2738
|
+
},
|
|
2739
|
+
{
|
|
2740
|
+
kind: "predict",
|
|
2741
|
+
instruction: "Predict the creature's labelled angle, mood, repeat count and simulated touch response before the sequence runs.",
|
|
2742
|
+
artifactIds: []
|
|
2743
|
+
},
|
|
2744
|
+
{
|
|
2745
|
+
kind: "build",
|
|
2746
|
+
instruction: "Adjust the five documented C++-style calls to create one bounded creature movement sequence.",
|
|
2747
|
+
artifactIds: ["servo-creature-m1-code"]
|
|
2748
|
+
},
|
|
2749
|
+
{
|
|
2750
|
+
kind: "run",
|
|
2751
|
+
instruction: "Use the Run action button to start the private Servo Creature simulator.",
|
|
2752
|
+
artifactIds: ["servo-creature-m1-code"]
|
|
2753
|
+
},
|
|
2754
|
+
{
|
|
2755
|
+
kind: "assess",
|
|
2756
|
+
instruction: "Run the visible and protected deterministic pose, mood and interaction checks.",
|
|
2757
|
+
artifactIds: []
|
|
2758
|
+
},
|
|
2759
|
+
{
|
|
2760
|
+
kind: "inspect",
|
|
2761
|
+
instruction: "Compare the highlighted C++-style line with the first movement goal that did not pass.",
|
|
2762
|
+
artifactIds: []
|
|
2763
|
+
},
|
|
2764
|
+
{
|
|
2765
|
+
kind: "fix",
|
|
2766
|
+
instruction: "Change one angle, wait, repeat, mood or simulated touch call, then rerun and inspect the text telemetry.",
|
|
2767
|
+
artifactIds: ["servo-creature-m1-code"]
|
|
2768
|
+
},
|
|
2769
|
+
{
|
|
2770
|
+
kind: "explain",
|
|
2771
|
+
instruction: "Explain how the bounded calls created a safe movement and how the simulated interaction changed the creature's response.",
|
|
2772
|
+
artifactIds: []
|
|
2773
|
+
},
|
|
2774
|
+
{
|
|
2775
|
+
kind: "reward",
|
|
2776
|
+
instruction: "Collect the simulated badge when the score and private-runtime safety check pass; physical completion remains adult-only.",
|
|
2777
|
+
artifactIds: []
|
|
2778
|
+
}
|
|
2779
|
+
],
|
|
2780
|
+
readinessChecks: [
|
|
2781
|
+
{
|
|
2782
|
+
id: "servo-creature-m1-find-angle-limit",
|
|
2783
|
+
prompt: "Find the documented safe minimum and maximum angle before changing the creature's pose.",
|
|
2784
|
+
scored: false
|
|
2785
|
+
}
|
|
2786
|
+
],
|
|
2787
|
+
artifacts: [
|
|
2788
|
+
{
|
|
2789
|
+
id: "servo-creature-m1-code",
|
|
2790
|
+
kind: "starter-code",
|
|
2791
|
+
audience: "learner",
|
|
2792
|
+
solutionBearing: false
|
|
2793
|
+
},
|
|
2794
|
+
{
|
|
2795
|
+
id: "servo-creature-m1-art",
|
|
2796
|
+
kind: "starter-assets",
|
|
2797
|
+
audience: "learner",
|
|
2798
|
+
solutionBearing: false
|
|
2799
|
+
},
|
|
2800
|
+
{
|
|
2801
|
+
id: "servo-creature-m1-printable",
|
|
2802
|
+
kind: "printable",
|
|
2803
|
+
audience: "learner",
|
|
2804
|
+
solutionBearing: false
|
|
2805
|
+
}
|
|
2806
|
+
],
|
|
2807
|
+
goals: [
|
|
2808
|
+
{
|
|
2809
|
+
id: "servo-creature-m1-starts",
|
|
2810
|
+
statement: "The documented C++-style settings are valid and the private simulator starts.",
|
|
2811
|
+
visibility: "visible",
|
|
2812
|
+
criterionIds: ["servo-creature-build"],
|
|
2813
|
+
completionRequired: true,
|
|
2814
|
+
aiRequired: false
|
|
2815
|
+
},
|
|
2816
|
+
{
|
|
2817
|
+
id: "servo-creature-m1-movement-sequence",
|
|
2818
|
+
statement: "The creature completes a bounded angle, timing, mood and interaction sequence.",
|
|
2819
|
+
visibility: "visible",
|
|
2820
|
+
criterionIds: ["servo-creature-goal-one", "servo-creature-goal-two"],
|
|
2821
|
+
completionRequired: true,
|
|
2822
|
+
aiRequired: false
|
|
2823
|
+
},
|
|
2824
|
+
{
|
|
2825
|
+
id: "servo-creature-m1-private-runtime",
|
|
2826
|
+
statement: "The program stays inside the private simulator and never accesses physical hardware, the network or browser storage.",
|
|
2827
|
+
visibility: "visible",
|
|
2828
|
+
criterionIds: ["servo-creature-safety"],
|
|
2829
|
+
completionRequired: true,
|
|
2830
|
+
aiRequired: false
|
|
2831
|
+
}
|
|
2832
|
+
],
|
|
2833
|
+
interactions: [
|
|
2834
|
+
{
|
|
2835
|
+
id: "servo-creature-m1-run-control",
|
|
2836
|
+
description: "Start the private Servo Creature movement simulation.",
|
|
2837
|
+
primaryMode: "pointer",
|
|
2838
|
+
alternativeIds: ["servo-creature-m1-keyboard-run"]
|
|
2839
|
+
},
|
|
2840
|
+
{
|
|
2841
|
+
id: "servo-creature-m1-code-control",
|
|
2842
|
+
description: "Edit the documented angle, timing, repeat, mood and interaction calls.",
|
|
2843
|
+
primaryMode: "keyboard",
|
|
2844
|
+
alternativeIds: []
|
|
2845
|
+
},
|
|
2846
|
+
{
|
|
2847
|
+
id: "servo-creature-m1-pose-motion",
|
|
2848
|
+
description: "Observe the bounded creature pose and movement sequence.",
|
|
2849
|
+
primaryMode: "motion",
|
|
2850
|
+
alternativeIds: ["servo-creature-m1-telemetry"]
|
|
2851
|
+
}
|
|
2852
|
+
],
|
|
2853
|
+
accessibilityAlternatives: [
|
|
2854
|
+
{
|
|
2855
|
+
id: "servo-creature-m1-keyboard-run",
|
|
2856
|
+
modes: ["keyboard"],
|
|
2857
|
+
equivalentOutcome: true,
|
|
2858
|
+
description: "Press Enter or Space on the play-icon Run button to start the same simulator."
|
|
2859
|
+
},
|
|
2860
|
+
{
|
|
2861
|
+
id: "servo-creature-m1-telemetry",
|
|
2862
|
+
modes: ["text", "shape", "symbol", "reduced-motion"],
|
|
2863
|
+
equivalentOutcome: true,
|
|
2864
|
+
description: "Read the angle, mood, repeat count, elapsed milliseconds and touch state without animation."
|
|
2865
|
+
}
|
|
2866
|
+
],
|
|
2867
|
+
evidenceRequirements: [
|
|
2868
|
+
{
|
|
2869
|
+
id: "servo-creature-m1-assessment",
|
|
2870
|
+
goalIds: [
|
|
2871
|
+
"servo-creature-m1-starts",
|
|
2872
|
+
"servo-creature-m1-movement-sequence",
|
|
2873
|
+
"servo-creature-m1-private-runtime"
|
|
2874
|
+
],
|
|
2875
|
+
kind: "assessment-result",
|
|
2876
|
+
retention: "entitlement",
|
|
2877
|
+
containsPersonalData: false
|
|
2878
|
+
},
|
|
2879
|
+
{
|
|
2880
|
+
id: "servo-creature-m1-explanation",
|
|
2881
|
+
goalIds: ["servo-creature-m1-movement-sequence"],
|
|
2882
|
+
kind: "learner-explanation",
|
|
2883
|
+
retention: "attempt",
|
|
2884
|
+
containsPersonalData: false
|
|
2885
|
+
}
|
|
2886
|
+
],
|
|
2887
|
+
sideAdventures: [
|
|
2888
|
+
{
|
|
2889
|
+
id: "servo-creature-m1-remix",
|
|
2890
|
+
prompt: "Invent an original creature mood and describe a text or symbol cue that makes its pose understandable without movement.",
|
|
2891
|
+
completionRequired: false
|
|
2892
|
+
}
|
|
2893
|
+
],
|
|
2894
|
+
rewardBindings: [
|
|
2895
|
+
{
|
|
2896
|
+
id: "servo-creature-m1-simulated-badge",
|
|
2897
|
+
badgeId: "servo-creature-mission-complete",
|
|
2898
|
+
goalIds: [
|
|
2899
|
+
"servo-creature-m1-starts",
|
|
2900
|
+
"servo-creature-m1-movement-sequence",
|
|
2901
|
+
"servo-creature-m1-private-runtime"
|
|
2902
|
+
],
|
|
2903
|
+
deterministic: true,
|
|
2904
|
+
random: false,
|
|
2905
|
+
tokenConvertible: false
|
|
2906
|
+
}
|
|
2907
|
+
],
|
|
2908
|
+
functionReference: [
|
|
2909
|
+
{
|
|
2910
|
+
id: "servo-creature-function-angle",
|
|
2911
|
+
signature: "setServoAngle(degrees)",
|
|
2912
|
+
summary: "Chooses one safe labelled creature pose in the private simulator.",
|
|
2913
|
+
parameters: [
|
|
2914
|
+
{
|
|
2915
|
+
name: "degrees",
|
|
2916
|
+
type: "whole number",
|
|
2917
|
+
description: "A bounded angle from 30 to 150 degrees."
|
|
2918
|
+
}
|
|
2919
|
+
],
|
|
2920
|
+
effect: "Updates the simulator's labelled angle and pose cue without generating PWM or accessing a physical servo.",
|
|
2921
|
+
example: "setServoAngle(90);"
|
|
2922
|
+
},
|
|
2923
|
+
{
|
|
2924
|
+
id: "servo-creature-function-wait",
|
|
2925
|
+
signature: "waitMs(duration)",
|
|
2926
|
+
summary: "Adds one safe wait to the simulated movement timeline.",
|
|
2927
|
+
parameters: [
|
|
2928
|
+
{
|
|
2929
|
+
name: "duration",
|
|
2930
|
+
type: "whole number",
|
|
2931
|
+
description: "A bounded number of milliseconds from 100 to 1000."
|
|
2932
|
+
}
|
|
2933
|
+
],
|
|
2934
|
+
effect: "Advances simulated elapsed time; it never blocks the website or holds a physical servo under load.",
|
|
2935
|
+
example: "waitMs(300);"
|
|
2936
|
+
},
|
|
2937
|
+
{
|
|
2938
|
+
id: "servo-creature-function-repeat",
|
|
2939
|
+
signature: "repeatMovement(count)",
|
|
2940
|
+
summary: "Repeats the current simulated pose a safe number of times.",
|
|
2941
|
+
parameters: [
|
|
2942
|
+
{
|
|
2943
|
+
name: "count",
|
|
2944
|
+
type: "whole number",
|
|
2945
|
+
description: "A bounded repeat count from 1 to 4."
|
|
2946
|
+
}
|
|
2947
|
+
],
|
|
2948
|
+
effect: "Adds a fixed number of labelled pose steps to the private simulator timeline.",
|
|
2949
|
+
example: "repeatMovement(3);"
|
|
2950
|
+
},
|
|
2951
|
+
{
|
|
2952
|
+
id: "servo-creature-function-mood",
|
|
2953
|
+
signature: "setCreatureMood(mood)",
|
|
2954
|
+
summary: "Chooses the creature's labelled expression for the simulated pose.",
|
|
2955
|
+
parameters: [
|
|
2956
|
+
{
|
|
2957
|
+
name: "mood",
|
|
2958
|
+
type: "string",
|
|
2959
|
+
description: "Use calm, curious or happy."
|
|
2960
|
+
}
|
|
2961
|
+
],
|
|
2962
|
+
effect: "Updates the simulator's text and symbol mood cue without moving physical parts.",
|
|
2963
|
+
example: 'setCreatureMood("curious");'
|
|
2964
|
+
},
|
|
2965
|
+
{
|
|
2966
|
+
id: "servo-creature-function-touch",
|
|
2967
|
+
signature: "readTouchSensor()",
|
|
2968
|
+
summary: "Reads the simulator's fictional touch state for one interaction response.",
|
|
2969
|
+
parameters: [],
|
|
2970
|
+
effect: "Returns touched or clear from simulator state only; it cannot access a physical sensor.",
|
|
2971
|
+
example: "const touchState = readTouchSensor();"
|
|
2972
|
+
}
|
|
2973
|
+
]
|
|
2974
|
+
},
|
|
2975
|
+
facilitator: {
|
|
2976
|
+
artifacts: [
|
|
2977
|
+
{
|
|
2978
|
+
id: "servo-creature-m1-answer-key",
|
|
2979
|
+
kind: "answer-key",
|
|
2980
|
+
audience: "facilitator",
|
|
2981
|
+
solutionBearing: true
|
|
2982
|
+
},
|
|
2983
|
+
{
|
|
2984
|
+
id: "servo-creature-m1-protected-tests",
|
|
2985
|
+
kind: "protected-test",
|
|
2986
|
+
audience: "facilitator",
|
|
2987
|
+
solutionBearing: true
|
|
2988
|
+
},
|
|
2989
|
+
{
|
|
2990
|
+
id: "servo-creature-m1-adult-hardware-guide",
|
|
2991
|
+
kind: "facilitator-note",
|
|
2992
|
+
audience: "facilitator",
|
|
2993
|
+
solutionBearing: true
|
|
2994
|
+
}
|
|
2995
|
+
],
|
|
2996
|
+
protectedGoals: [
|
|
2997
|
+
{
|
|
2998
|
+
id: "servo-creature-m1-protected-resilience",
|
|
2999
|
+
statement: "The simulator rejects unsupported moods, out-of-range angles, excessive waits or repeats and any physical-hardware request.",
|
|
3000
|
+
visibility: "protected",
|
|
3001
|
+
criterionIds: ["servo-creature-edge-one", "servo-creature-edge-two"],
|
|
3002
|
+
completionRequired: false,
|
|
3003
|
+
aiRequired: false
|
|
3004
|
+
}
|
|
3005
|
+
],
|
|
3006
|
+
prompts: [
|
|
3007
|
+
"Ask the learner to predict the labelled pose timeline before suggesting one bounded change.",
|
|
3008
|
+
"Use the function reference and visible telemetry; never provide servo wiring, power or movement advice to a learner.",
|
|
3009
|
+
"Physical export stays unavailable until an adult acknowledges the exact manifest and every servo power component has verified bench-test evidence."
|
|
3010
|
+
]
|
|
3011
|
+
},
|
|
3012
|
+
hardware: {
|
|
3013
|
+
requirementsVersion: "1.0.0",
|
|
3014
|
+
hardwareIncluded: false,
|
|
3015
|
+
completePathItemIds: [
|
|
3016
|
+
"pico-2-w",
|
|
3017
|
+
"breadboard",
|
|
3018
|
+
"usb-data-cable",
|
|
3019
|
+
"jumper-wires",
|
|
3020
|
+
"micro-servo",
|
|
3021
|
+
"servo-power"
|
|
3022
|
+
],
|
|
3023
|
+
incrementalItemIds: ["micro-servo", "servo-power"],
|
|
3024
|
+
components: [
|
|
3025
|
+
{
|
|
3026
|
+
itemId: "pico-2-w",
|
|
3027
|
+
quantity: 1,
|
|
3028
|
+
acquisitionScope: "complete-path",
|
|
3029
|
+
verificationStatus: "pending-bench-test",
|
|
3030
|
+
compatibilityClaimed: false,
|
|
3031
|
+
physicalCompletionEligible: false
|
|
3032
|
+
},
|
|
3033
|
+
{
|
|
3034
|
+
itemId: "breadboard",
|
|
3035
|
+
quantity: 1,
|
|
3036
|
+
acquisitionScope: "complete-path",
|
|
3037
|
+
verificationStatus: "pending-bench-test",
|
|
3038
|
+
compatibilityClaimed: false,
|
|
3039
|
+
physicalCompletionEligible: false
|
|
3040
|
+
},
|
|
3041
|
+
{
|
|
3042
|
+
itemId: "usb-data-cable",
|
|
3043
|
+
quantity: 1,
|
|
3044
|
+
acquisitionScope: "complete-path",
|
|
3045
|
+
verificationStatus: "pending-bench-test",
|
|
3046
|
+
compatibilityClaimed: false,
|
|
3047
|
+
physicalCompletionEligible: false
|
|
3048
|
+
},
|
|
3049
|
+
{
|
|
3050
|
+
itemId: "jumper-wires",
|
|
3051
|
+
quantity: 12,
|
|
3052
|
+
acquisitionScope: "complete-path",
|
|
3053
|
+
verificationStatus: "pending-bench-test",
|
|
3054
|
+
compatibilityClaimed: false,
|
|
3055
|
+
physicalCompletionEligible: false
|
|
3056
|
+
},
|
|
3057
|
+
{
|
|
3058
|
+
itemId: "micro-servo",
|
|
3059
|
+
quantity: 1,
|
|
3060
|
+
acquisitionScope: "incremental",
|
|
3061
|
+
verificationStatus: "pending-bench-test",
|
|
3062
|
+
compatibilityClaimed: false,
|
|
3063
|
+
physicalCompletionEligible: false
|
|
3064
|
+
},
|
|
3065
|
+
{
|
|
3066
|
+
itemId: "servo-power",
|
|
3067
|
+
quantity: 1,
|
|
3068
|
+
acquisitionScope: "incremental",
|
|
3069
|
+
verificationStatus: "pending-bench-test",
|
|
3070
|
+
compatibilityClaimed: false,
|
|
3071
|
+
physicalCompletionEligible: false
|
|
3072
|
+
}
|
|
3073
|
+
],
|
|
3074
|
+
safeguards: {
|
|
3075
|
+
adultAssemblyRequired: true,
|
|
3076
|
+
adultAcknowledgementRequiredForExport: true,
|
|
3077
|
+
websiteMayControlHardware: false,
|
|
3078
|
+
simulatorCompletionAvailable: true,
|
|
3079
|
+
simulatedBadgeId: "servo-creature-mission-complete",
|
|
3080
|
+
physicalBadgeId: "servo-creature-physical-builder",
|
|
3081
|
+
physicalBadgeRequiresAdultSignoff: true,
|
|
3082
|
+
adultAssemblySteps: [
|
|
3083
|
+
"Confirm the exact servo, external supply and connector identities against the requirements manifest.",
|
|
3084
|
+
"Assemble and inspect the disconnected signal and common-ground wiring before learner use.",
|
|
3085
|
+
"Secure the creature linkage, lift or restrain moving parts and complete the adult bench-test record."
|
|
3086
|
+
],
|
|
3087
|
+
powerRequirements: [
|
|
3088
|
+
"Use an external regulated servo supply sized for the verified servo; do not power the servo from a Pico GPIO pin.",
|
|
3089
|
+
"Connect one common signal ground between the verified servo supply and Pico only as shown in the adult guide.",
|
|
3090
|
+
"Disconnect every power source before changing wiring or creature linkages."
|
|
3091
|
+
],
|
|
3092
|
+
cableRequirements: [
|
|
3093
|
+
"One known data-capable USB cable compatible with the Pico 2 W.",
|
|
3094
|
+
"Insulated jumper leads and a verified servo connector arrangement documented by the adult guide."
|
|
3095
|
+
],
|
|
3096
|
+
softwarePrerequisites: [
|
|
3097
|
+
"Supported Pico SDK toolchain on Raspberry Pi OS or a documented desktop environment.",
|
|
3098
|
+
"Known-good Servo Creature recovery firmware with adult-owned neutral-pose and stop behaviour."
|
|
3099
|
+
],
|
|
3100
|
+
warnings: [
|
|
3101
|
+
"Hardware is not included with the module.",
|
|
3102
|
+
"No listed servo or power arrangement currently claims compatibility or physical-completion eligibility.",
|
|
3103
|
+
"Pinch points, stalled servos and unsuitable power supplies can cause heat or movement; adult assembly and testing are mandatory.",
|
|
3104
|
+
"The simulator and simulated badge remain available without physical equipment."
|
|
3105
|
+
],
|
|
3106
|
+
unrelatedHardwareNotRequired: [
|
|
3107
|
+
"Camera Module 3 or Raspberry Pi Zero 2 W",
|
|
3108
|
+
"motor driver, motors or rover chassis",
|
|
3109
|
+
"physical touch or IR sensor",
|
|
3110
|
+
"LED or infrared beacon parts"
|
|
3111
|
+
]
|
|
3112
|
+
}
|
|
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
|
+
};
|
|
2724
3480
|
var RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1 = {
|
|
2725
3481
|
version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
2726
3482
|
moduleId: "junior-coder.rescue-crew-commander",
|
|
@@ -3517,6 +4273,7 @@ ${summary}`);
|
|
|
3517
4273
|
// Annotate the CommonJS export names for ESM import in node:
|
|
3518
4274
|
0 && (module.exports = {
|
|
3519
4275
|
BEACON_BOT_MISSION_ONE_AUTHORING_V1,
|
|
4276
|
+
DANCE_ROVER_MISSION_ONE_AUTHORING_V1,
|
|
3520
4277
|
JUNIOR_CODER_MISSION_STAGE_ORDER_V1,
|
|
3521
4278
|
JUNIOR_CODER_MODULE_PRICE_V1_1,
|
|
3522
4279
|
JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT,
|
|
@@ -3529,6 +4286,7 @@ ${summary}`);
|
|
|
3529
4286
|
RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
|
|
3530
4287
|
ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
|
|
3531
4288
|
ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
|
|
4289
|
+
SERVO_CREATURE_MISSION_ONE_AUTHORING_V1,
|
|
3532
4290
|
SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
|
|
3533
4291
|
STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1,
|
|
3534
4292
|
assertValidLearningPath,
|