@plasius/learning 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -63,7 +63,9 @@ the exact catalog module that owns its rubric, mission and badges.
63
63
  ```ts
64
64
  import {
65
65
  JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
66
+ METEOR_SHIELD_MISSION_ONE_AUTHORING_V1,
66
67
  PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
68
+ RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
67
69
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
68
70
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
69
71
  SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
@@ -82,8 +84,21 @@ const skywing = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
82
84
  const paddlePulse = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
83
85
  (module) => module.slug === "paddle-pulse",
84
86
  );
87
+ const meteorShield = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
88
+ (module) => module.slug === "meteor-shield",
89
+ );
90
+ const rescueCrewCommander = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
91
+ (module) => module.slug === "rescue-crew-commander",
92
+ );
85
93
 
86
- if (!roadHopper || !robotMaze || !skywing || !paddlePulse) {
94
+ if (
95
+ !roadHopper ||
96
+ !robotMaze ||
97
+ !skywing ||
98
+ !paddlePulse ||
99
+ !meteorShield ||
100
+ !rescueCrewCommander
101
+ ) {
87
102
  throw new Error("Junior Coder module is missing");
88
103
  }
89
104
 
@@ -103,6 +118,14 @@ assertValidMissionAuthoringBundle(
103
118
  PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
104
119
  paddlePulse,
105
120
  );
121
+ assertValidMissionAuthoringBundle(
122
+ METEOR_SHIELD_MISSION_ONE_AUTHORING_V1,
123
+ meteorShield,
124
+ );
125
+ assertValidMissionAuthoringBundle(
126
+ RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
127
+ rescueCrewCommander,
128
+ );
106
129
  ```
107
130
 
108
131
  ## Contract rules
package/dist/index.cjs CHANGED
@@ -25,8 +25,10 @@ __export(index_exports, {
25
25
  JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT: () => JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT,
26
26
  JUNIOR_CODER_ROBOT_RESCUE_PATH_V1: () => JUNIOR_CODER_ROBOT_RESCUE_PATH_V1,
27
27
  JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1: () => JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
28
+ METEOR_SHIELD_MISSION_ONE_AUTHORING_V1: () => METEOR_SHIELD_MISSION_ONE_AUTHORING_V1,
28
29
  MISSION_AUTHORING_CONTRACT_VERSION_V1: () => MISSION_AUTHORING_CONTRACT_VERSION_V1,
29
30
  PADDLE_PULSE_MISSION_ONE_AUTHORING_V1: () => PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
31
+ RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1: () => RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
30
32
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1: () => ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
31
33
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1: () => ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
32
34
  SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1: () => SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
@@ -1783,6 +1785,452 @@ var PADDLE_PULSE_MISSION_ONE_AUTHORING_V1 = {
1783
1785
  ]
1784
1786
  }
1785
1787
  };
1788
+ var RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1 = {
1789
+ version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
1790
+ moduleId: "junior-coder.rescue-crew-commander",
1791
+ moduleVersion: "1.1.0",
1792
+ missionId: "rescue-crew-commander-mission-1",
1793
+ learner: {
1794
+ estimatedMinutes: 20,
1795
+ stages: [
1796
+ {
1797
+ kind: "learn",
1798
+ instruction: "Meet the helper, job, route and priority blocks and read what each block does in the synchronized JavaScript view.",
1799
+ artifactIds: ["rescue-crew-commander-m1-art"]
1800
+ },
1801
+ {
1802
+ kind: "predict",
1803
+ instruction: "Predict which helper will act first and which safe route it will follow.",
1804
+ artifactIds: []
1805
+ },
1806
+ {
1807
+ kind: "build",
1808
+ instruction: "Arrange the visual blocks to give each helper one safe rescue job.",
1809
+ artifactIds: ["rescue-crew-commander-m1-program"]
1810
+ },
1811
+ {
1812
+ kind: "run",
1813
+ instruction: "Use the Run action button to watch the crew follow the typed visual program.",
1814
+ artifactIds: ["rescue-crew-commander-m1-program"]
1815
+ },
1816
+ {
1817
+ kind: "assess",
1818
+ instruction: "Run the visible and protected deterministic crew checks.",
1819
+ artifactIds: []
1820
+ },
1821
+ {
1822
+ kind: "inspect",
1823
+ instruction: "Compare the highlighted block with the first goal that did not pass and inspect the matching JavaScript line.",
1824
+ artifactIds: []
1825
+ },
1826
+ {
1827
+ kind: "fix",
1828
+ instruction: "Move or replace one job, route or priority block, then run the mission again.",
1829
+ artifactIds: ["rescue-crew-commander-m1-program"]
1830
+ },
1831
+ {
1832
+ kind: "explain",
1833
+ instruction: "Explain how job order and priority changed the crew state and rescue result.",
1834
+ artifactIds: []
1835
+ },
1836
+ {
1837
+ kind: "reward",
1838
+ instruction: "Collect the evidence-bound badge when the score and private-simulator safety check pass.",
1839
+ artifactIds: []
1840
+ }
1841
+ ],
1842
+ readinessChecks: [
1843
+ {
1844
+ id: "rescue-crew-commander-m1-find-priority",
1845
+ prompt: "Point to the block that decides which helper acts first.",
1846
+ scored: false
1847
+ }
1848
+ ],
1849
+ artifacts: [
1850
+ {
1851
+ id: "rescue-crew-commander-m1-program",
1852
+ kind: "starter-code",
1853
+ audience: "learner",
1854
+ solutionBearing: false
1855
+ },
1856
+ {
1857
+ id: "rescue-crew-commander-m1-art",
1858
+ kind: "starter-assets",
1859
+ audience: "learner",
1860
+ solutionBearing: false
1861
+ },
1862
+ {
1863
+ id: "rescue-crew-commander-m1-printable",
1864
+ kind: "printable",
1865
+ audience: "learner",
1866
+ solutionBearing: false
1867
+ }
1868
+ ],
1869
+ goals: [
1870
+ {
1871
+ id: "rescue-crew-commander-m1-starts",
1872
+ statement: "The typed visual program is structurally valid and starts.",
1873
+ visibility: "visible",
1874
+ criterionIds: ["rescue-crew-commander-build"],
1875
+ completionRequired: true,
1876
+ aiRequired: false
1877
+ },
1878
+ {
1879
+ id: "rescue-crew-commander-m1-safe-jobs",
1880
+ statement: "Every helper receives one suitable job and the highest-priority rescue starts first.",
1881
+ visibility: "visible",
1882
+ criterionIds: [
1883
+ "rescue-crew-commander-goal-one",
1884
+ "rescue-crew-commander-goal-two"
1885
+ ],
1886
+ completionRequired: true,
1887
+ aiRequired: false
1888
+ },
1889
+ {
1890
+ id: "rescue-crew-commander-m1-private-runtime",
1891
+ statement: "The crew stays inside the private simulator and follows only host-provided actions.",
1892
+ visibility: "visible",
1893
+ criterionIds: ["rescue-crew-commander-safety"],
1894
+ completionRequired: true,
1895
+ aiRequired: false
1896
+ }
1897
+ ],
1898
+ interactions: [
1899
+ {
1900
+ id: "rescue-crew-commander-m1-reorder-blocks",
1901
+ description: "Change the order of typed job, route and priority blocks.",
1902
+ primaryMode: "drag",
1903
+ alternativeIds: ["rescue-crew-commander-m1-button-reorder"]
1904
+ },
1905
+ {
1906
+ id: "rescue-crew-commander-m1-run-control",
1907
+ description: "Start the private rescue-crew simulation.",
1908
+ primaryMode: "pointer",
1909
+ alternativeIds: ["rescue-crew-commander-m1-keyboard-run"]
1910
+ },
1911
+ {
1912
+ id: "rescue-crew-commander-m1-crew-motion",
1913
+ description: "Observe helpers change state and follow their assigned routes.",
1914
+ primaryMode: "motion",
1915
+ alternativeIds: ["rescue-crew-commander-m1-status-view"]
1916
+ }
1917
+ ],
1918
+ accessibilityAlternatives: [
1919
+ {
1920
+ id: "rescue-crew-commander-m1-button-reorder",
1921
+ modes: ["keyboard", "pointer"],
1922
+ equivalentOutcome: true,
1923
+ description: "Use labelled Move up and Move down buttons instead of dragging a visual block."
1924
+ },
1925
+ {
1926
+ id: "rescue-crew-commander-m1-keyboard-run",
1927
+ modes: ["keyboard"],
1928
+ equivalentOutcome: true,
1929
+ description: "Press Enter or Space on the play-icon Run button to start the same preview."
1930
+ },
1931
+ {
1932
+ id: "rescue-crew-commander-m1-status-view",
1933
+ modes: ["text", "symbol", "reduced-motion"],
1934
+ equivalentOutcome: true,
1935
+ description: "Read each helper's job, route, priority and state from the status list without animation or colour dependence."
1936
+ }
1937
+ ],
1938
+ evidenceRequirements: [
1939
+ {
1940
+ id: "rescue-crew-commander-m1-assessment",
1941
+ goalIds: [
1942
+ "rescue-crew-commander-m1-starts",
1943
+ "rescue-crew-commander-m1-safe-jobs",
1944
+ "rescue-crew-commander-m1-private-runtime"
1945
+ ],
1946
+ kind: "assessment-result",
1947
+ retention: "entitlement",
1948
+ containsPersonalData: false
1949
+ },
1950
+ {
1951
+ id: "rescue-crew-commander-m1-explanation",
1952
+ goalIds: ["rescue-crew-commander-m1-safe-jobs"],
1953
+ kind: "learner-explanation",
1954
+ retention: "attempt",
1955
+ containsPersonalData: false
1956
+ }
1957
+ ],
1958
+ sideAdventures: [
1959
+ {
1960
+ id: "rescue-crew-commander-m1-remix",
1961
+ prompt: "Invent an original helper role and explain which safe route and priority it should receive.",
1962
+ completionRequired: false
1963
+ }
1964
+ ],
1965
+ rewardBindings: [
1966
+ {
1967
+ id: "rescue-crew-commander-m1-badge",
1968
+ badgeId: "rescue-crew-commander-mission-complete",
1969
+ goalIds: [
1970
+ "rescue-crew-commander-m1-starts",
1971
+ "rescue-crew-commander-m1-safe-jobs",
1972
+ "rescue-crew-commander-m1-private-runtime"
1973
+ ],
1974
+ deterministic: true,
1975
+ random: false,
1976
+ tokenConvertible: false
1977
+ }
1978
+ ]
1979
+ },
1980
+ facilitator: {
1981
+ artifacts: [
1982
+ {
1983
+ id: "rescue-crew-commander-m1-answer-key",
1984
+ kind: "answer-key",
1985
+ audience: "facilitator",
1986
+ solutionBearing: true
1987
+ },
1988
+ {
1989
+ id: "rescue-crew-commander-m1-protected-tests",
1990
+ kind: "protected-test",
1991
+ audience: "facilitator",
1992
+ solutionBearing: true
1993
+ }
1994
+ ],
1995
+ protectedGoals: [
1996
+ {
1997
+ id: "rescue-crew-commander-m1-protected-resilience",
1998
+ statement: "The interpreter rejects unknown blocks, duplicate assignments and programs over the action limit.",
1999
+ visibility: "protected",
2000
+ criterionIds: [
2001
+ "rescue-crew-commander-edge-one",
2002
+ "rescue-crew-commander-edge-two"
2003
+ ],
2004
+ completionRequired: false,
2005
+ aiRequired: false
2006
+ }
2007
+ ],
2008
+ prompts: [
2009
+ "Ask the learner which helper should act first before suggesting a block change.",
2010
+ "Use the block reference, status list and visible goal; never reveal the protected assignment order or expected block sequence."
2011
+ ]
2012
+ }
2013
+ };
2014
+ var METEOR_SHIELD_MISSION_ONE_AUTHORING_V1 = {
2015
+ version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
2016
+ moduleId: "junior-coder.meteor-shield",
2017
+ moduleVersion: "1.1.0",
2018
+ missionId: "meteor-shield-mission-1",
2019
+ learner: {
2020
+ estimatedMinutes: 20,
2021
+ stages: [
2022
+ {
2023
+ kind: "learn",
2024
+ instruction: "Read how target column, shield energy and launch delay change a rescue defence.",
2025
+ artifactIds: ["meteor-shield-m1-art"]
2026
+ },
2027
+ {
2028
+ kind: "predict",
2029
+ instruction: "Predict which rescue base the shield will protect first.",
2030
+ artifactIds: []
2031
+ },
2032
+ {
2033
+ kind: "build",
2034
+ instruction: "Adjust the three documented settings in the starter JavaScript.",
2035
+ artifactIds: ["meteor-shield-m1-code"]
2036
+ },
2037
+ {
2038
+ kind: "run",
2039
+ instruction: "Use the Run action button to start the private meteor-wave preview.",
2040
+ artifactIds: ["meteor-shield-m1-code"]
2041
+ },
2042
+ {
2043
+ kind: "assess",
2044
+ instruction: "Run the visible and protected deterministic defence checks.",
2045
+ artifactIds: []
2046
+ },
2047
+ {
2048
+ kind: "inspect",
2049
+ instruction: "Compare the highlighted setting with the first goal that did not pass.",
2050
+ artifactIds: []
2051
+ },
2052
+ {
2053
+ kind: "fix",
2054
+ instruction: "Change one setting, run again and observe the energy and target telemetry.",
2055
+ artifactIds: ["meteor-shield-m1-code"]
2056
+ },
2057
+ {
2058
+ kind: "explain",
2059
+ instruction: "Explain how targeting and launch timing affected the remaining shield energy.",
2060
+ artifactIds: []
2061
+ },
2062
+ {
2063
+ kind: "reward",
2064
+ instruction: "Collect the evidence-bound badge when the score and safety check pass.",
2065
+ artifactIds: []
2066
+ }
2067
+ ],
2068
+ readinessChecks: [
2069
+ {
2070
+ id: "meteor-shield-m1-find-energy",
2071
+ prompt: "Point to the setting that limits how many shields can launch.",
2072
+ scored: false
2073
+ }
2074
+ ],
2075
+ artifacts: [
2076
+ {
2077
+ id: "meteor-shield-m1-code",
2078
+ kind: "starter-code",
2079
+ audience: "learner",
2080
+ solutionBearing: false
2081
+ },
2082
+ {
2083
+ id: "meteor-shield-m1-art",
2084
+ kind: "starter-assets",
2085
+ audience: "learner",
2086
+ solutionBearing: false
2087
+ },
2088
+ {
2089
+ id: "meteor-shield-m1-printable",
2090
+ kind: "printable",
2091
+ audience: "learner",
2092
+ solutionBearing: false
2093
+ }
2094
+ ],
2095
+ goals: [
2096
+ {
2097
+ id: "meteor-shield-m1-starts",
2098
+ statement: "The JavaScript settings are valid and the private preview starts.",
2099
+ visibility: "visible",
2100
+ criterionIds: ["meteor-shield-build"],
2101
+ completionRequired: true,
2102
+ aiRequired: false
2103
+ },
2104
+ {
2105
+ id: "meteor-shield-m1-resource-defence",
2106
+ statement: "A shield launches toward the selected meteor while keeping enough energy for the next wave.",
2107
+ visibility: "visible",
2108
+ criterionIds: [
2109
+ "meteor-shield-goal-one",
2110
+ "meteor-shield-goal-two"
2111
+ ],
2112
+ completionRequired: true,
2113
+ aiRequired: false
2114
+ },
2115
+ {
2116
+ id: "meteor-shield-m1-private-runtime",
2117
+ statement: "The game stays inside the private educational preview boundary.",
2118
+ visibility: "visible",
2119
+ criterionIds: ["meteor-shield-safety"],
2120
+ completionRequired: true,
2121
+ aiRequired: false
2122
+ }
2123
+ ],
2124
+ interactions: [
2125
+ {
2126
+ id: "meteor-shield-m1-run-control",
2127
+ description: "Start the private meteor-wave simulation.",
2128
+ primaryMode: "pointer",
2129
+ alternativeIds: ["meteor-shield-m1-keyboard-run"]
2130
+ },
2131
+ {
2132
+ id: "meteor-shield-m1-target-control",
2133
+ description: "Move the targeting reticle between rescue columns and launch a shield.",
2134
+ primaryMode: "keyboard",
2135
+ alternativeIds: []
2136
+ },
2137
+ {
2138
+ id: "meteor-shield-m1-wave-motion",
2139
+ description: "Observe meteors and shield pulses crossing the rescue zone.",
2140
+ primaryMode: "motion",
2141
+ alternativeIds: ["meteor-shield-m1-telemetry"]
2142
+ }
2143
+ ],
2144
+ accessibilityAlternatives: [
2145
+ {
2146
+ id: "meteor-shield-m1-keyboard-run",
2147
+ modes: ["keyboard"],
2148
+ equivalentOutcome: true,
2149
+ description: "Press Enter or Space on the play-icon Run button to start the same preview."
2150
+ },
2151
+ {
2152
+ id: "meteor-shield-m1-telemetry",
2153
+ modes: ["text", "reduced-motion"],
2154
+ equivalentOutcome: true,
2155
+ description: "Use target column, wave, distance and energy text instead of projectile animation."
2156
+ }
2157
+ ],
2158
+ evidenceRequirements: [
2159
+ {
2160
+ id: "meteor-shield-m1-assessment",
2161
+ goalIds: [
2162
+ "meteor-shield-m1-starts",
2163
+ "meteor-shield-m1-resource-defence",
2164
+ "meteor-shield-m1-private-runtime"
2165
+ ],
2166
+ kind: "assessment-result",
2167
+ retention: "entitlement",
2168
+ containsPersonalData: false
2169
+ },
2170
+ {
2171
+ id: "meteor-shield-m1-explanation",
2172
+ goalIds: ["meteor-shield-m1-resource-defence"],
2173
+ kind: "learner-explanation",
2174
+ retention: "attempt",
2175
+ containsPersonalData: false
2176
+ }
2177
+ ],
2178
+ sideAdventures: [
2179
+ {
2180
+ id: "meteor-shield-m1-remix",
2181
+ prompt: "Invent an original rescue-base signal and describe the safe game event that activates it.",
2182
+ completionRequired: false
2183
+ }
2184
+ ],
2185
+ rewardBindings: [
2186
+ {
2187
+ id: "meteor-shield-m1-badge",
2188
+ badgeId: "meteor-shield-mission-complete",
2189
+ goalIds: [
2190
+ "meteor-shield-m1-starts",
2191
+ "meteor-shield-m1-resource-defence",
2192
+ "meteor-shield-m1-private-runtime"
2193
+ ],
2194
+ deterministic: true,
2195
+ random: false,
2196
+ tokenConvertible: false
2197
+ }
2198
+ ]
2199
+ },
2200
+ facilitator: {
2201
+ artifacts: [
2202
+ {
2203
+ id: "meteor-shield-m1-answer-key",
2204
+ kind: "answer-key",
2205
+ audience: "facilitator",
2206
+ solutionBearing: true
2207
+ },
2208
+ {
2209
+ id: "meteor-shield-m1-protected-tests",
2210
+ kind: "protected-test",
2211
+ audience: "facilitator",
2212
+ solutionBearing: true
2213
+ }
2214
+ ],
2215
+ protectedGoals: [
2216
+ {
2217
+ id: "meteor-shield-m1-protected-resilience",
2218
+ statement: "The runtime clamps unsafe resources and terminates bounded projectile simulations.",
2219
+ visibility: "protected",
2220
+ criterionIds: [
2221
+ "meteor-shield-edge-one",
2222
+ "meteor-shield-edge-two"
2223
+ ],
2224
+ completionRequired: false,
2225
+ aiRequired: false
2226
+ }
2227
+ ],
2228
+ prompts: [
2229
+ "Ask the learner which setting controls a limited resource before suggesting a code edit.",
2230
+ "Use visible telemetry and the function reference; never reveal protected numeric targets or expected source fragments."
2231
+ ]
2232
+ }
2233
+ };
1786
2234
  var ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1 = {
1787
2235
  version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
1788
2236
  moduleId: "junior-coder.road-hopper-rally",
@@ -2137,8 +2585,10 @@ ${summary}`);
2137
2585
  JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT,
2138
2586
  JUNIOR_CODER_ROBOT_RESCUE_PATH_V1,
2139
2587
  JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
2588
+ METEOR_SHIELD_MISSION_ONE_AUTHORING_V1,
2140
2589
  MISSION_AUTHORING_CONTRACT_VERSION_V1,
2141
2590
  PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
2591
+ RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
2142
2592
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
2143
2593
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
2144
2594
  SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,