@plasius/learning 0.2.18 → 0.2.19

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
@@ -74,6 +74,7 @@ import {
74
74
  RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1,
75
75
  RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
76
76
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
77
+ ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1,
77
78
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
78
79
  SERVO_CREATURE_MISSION_ONE_AUTHORING_V1,
79
80
  SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
@@ -138,6 +139,9 @@ const adventureMissionPlanner = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find
138
139
  const creatureCareDashboard = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
139
140
  (module) => module.slug === "creature-care-dashboard",
140
141
  );
142
+ const robotMissionControl = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
143
+ (module) => module.slug === "robot-mission-control",
144
+ );
141
145
 
142
146
  if (
143
147
  !roadHopper ||
@@ -157,7 +161,8 @@ if (
157
161
  !vibeBugDetective ||
158
162
  !vibeIdeaStudio ||
159
163
  !adventureMissionPlanner ||
160
- !creatureCareDashboard
164
+ !creatureCareDashboard ||
165
+ !robotMissionControl
161
166
  ) {
162
167
  throw new Error("Junior Coder module is missing");
163
168
  }
@@ -234,6 +239,10 @@ assertValidMissionAuthoringBundle(
234
239
  CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1,
235
240
  creatureCareDashboard,
236
241
  );
242
+ assertValidMissionAuthoringBundle(
243
+ ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1,
244
+ robotMissionControl,
245
+ );
237
246
  ```
238
247
 
239
248
  ## Contract rules
@@ -294,6 +303,10 @@ assertValidMissionAuthoringBundle(
294
303
  displays, responsive layouts and equivalent reduced-motion feedback. The
295
304
  learner controls the exact accessibility diff; no network, real schedule,
296
305
  background task or personal information enters the preview.
306
+ - Robot Mission Control documents commands, a fail-safe state machine, explicit
307
+ confirmation, bounded telemetry and responsive chart/text views. The learner
308
+ controls the exact confirmation diff; Web Serial, physical hardware and
309
+ automatic approval remain outside the simulator.
297
310
 
298
311
  See [the foundation design](docs/design/junior-coder-catalog-foundation.md),
299
312
  [the uniform pricing design](docs/design/junior-coder-uniform-pricing.md),
@@ -310,6 +323,7 @@ See also [TDR 0011](docs/tdrs/tdr-0011-vibe-bug-detective-evidence-led-repair.md
310
323
  See also [TDR 0012](docs/tdrs/tdr-0012-vibe-idea-studio-bounded-goal-prototyping.md).
311
324
  See also [TDR 0013](docs/tdrs/tdr-0013-adventure-mission-planner-private-persistence.md).
312
325
  See also [TDR 0014](docs/tdrs/tdr-0014-creature-care-dashboard-bounded-timers-and-motion.md).
326
+ See also [TDR 0015](docs/tdrs/tdr-0015-robot-mission-control-fail-safe-simulation.md).
313
327
 
314
328
  ## Development
315
329
 
package/dist/index.cjs CHANGED
@@ -38,6 +38,7 @@ __export(index_exports, {
38
38
  RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1: () => RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
39
39
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1: () => ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
40
40
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1: () => ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
41
+ ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1: () => ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1,
41
42
  SERVO_CREATURE_MISSION_ONE_AUTHORING_V1: () => SERVO_CREATURE_MISSION_ONE_AUTHORING_V1,
42
43
  SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1: () => SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
43
44
  STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1: () => STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1,
@@ -5770,6 +5771,287 @@ var CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1 = {
5770
5771
  ]
5771
5772
  }
5772
5773
  };
5774
+ var ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1 = {
5775
+ version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
5776
+ moduleId: "junior-coder.robot-mission-control",
5777
+ moduleVersion: "1.1.0",
5778
+ missionId: "robot-mission-control-mission-1",
5779
+ learner: {
5780
+ estimatedMinutes: 20,
5781
+ stages: [
5782
+ {
5783
+ kind: "learn",
5784
+ instruction: "Read how commands, a fail-safe state machine, confirmations, telemetry charts and the five documented functions build a simulated mission-control panel.",
5785
+ artifactIds: ["robot-mission-control-m1-guide"]
5786
+ },
5787
+ {
5788
+ kind: "predict",
5789
+ instruction: "Predict whether a planned command may leave STOP when the safety confirmation is disabled.",
5790
+ artifactIds: ["robot-mission-control-m1-command-cards"]
5791
+ },
5792
+ {
5793
+ kind: "build",
5794
+ instruction: "Change only the supplied command, confirmation, telemetry rate, chart mode and serial-simulation settings.",
5795
+ artifactIds: ["robot-mission-control-m1-code"]
5796
+ },
5797
+ {
5798
+ kind: "run",
5799
+ instruction: "Use the action-icon Run button to update the private simulated controls, chart and text telemetry.",
5800
+ artifactIds: ["robot-mission-control-m1-code"]
5801
+ },
5802
+ {
5803
+ kind: "assess",
5804
+ instruction: "Run deterministic command, state-machine, safety-confirmation, telemetry and responsive-layout checks.",
5805
+ artifactIds: []
5806
+ },
5807
+ {
5808
+ kind: "inspect",
5809
+ instruction: "Compare the observed STOP state with the planned command and highlighted safety-confirmation setting.",
5810
+ artifactIds: ["robot-mission-control-m1-code"]
5811
+ },
5812
+ {
5813
+ kind: "fix",
5814
+ instruction: "Review and accept or reject the exact safety-confirmation change yourself, then rerun every check.",
5815
+ artifactIds: ["robot-mission-control-m1-code"]
5816
+ },
5817
+ {
5818
+ kind: "explain",
5819
+ instruction: "Explain how confirmation changes the state machine and why the chart and text telemetry must agree.",
5820
+ artifactIds: []
5821
+ },
5822
+ {
5823
+ kind: "reward",
5824
+ instruction: "Collect the evidence-bound mission-control badge after the score reaches 80 and every mandatory STOP test passes.",
5825
+ artifactIds: []
5826
+ }
5827
+ ],
5828
+ readinessChecks: [
5829
+ {
5830
+ id: "robot-mission-control-m1-stop-check",
5831
+ prompt: "Find the planned command, current STOP state, confirmation and text telemetry before running the simulator.",
5832
+ scored: false
5833
+ }
5834
+ ],
5835
+ artifacts: [
5836
+ {
5837
+ id: "robot-mission-control-m1-code",
5838
+ kind: "starter-code",
5839
+ audience: "learner",
5840
+ solutionBearing: false
5841
+ },
5842
+ {
5843
+ id: "robot-mission-control-m1-guide",
5844
+ kind: "starter-assets",
5845
+ audience: "learner",
5846
+ solutionBearing: false
5847
+ },
5848
+ {
5849
+ id: "robot-mission-control-m1-command-cards",
5850
+ kind: "sample-data",
5851
+ audience: "learner",
5852
+ solutionBearing: false
5853
+ }
5854
+ ],
5855
+ goals: [
5856
+ {
5857
+ id: "robot-mission-control-m1-starts",
5858
+ statement: "The responsive control component, chart and text telemetry build with a valid simulated command state machine.",
5859
+ visibility: "visible",
5860
+ criterionIds: ["robot-mission-control-build"],
5861
+ completionRequired: true,
5862
+ aiRequired: false
5863
+ },
5864
+ {
5865
+ id: "robot-mission-control-m1-behaviour",
5866
+ statement: "A confirmed command moves the state machine from STOP and updates the chart and serial simulation with matching bounded telemetry.",
5867
+ visibility: "visible",
5868
+ criterionIds: [
5869
+ "robot-mission-control-goal-one",
5870
+ "robot-mission-control-goal-two",
5871
+ "robot-mission-control-goal-three"
5872
+ ],
5873
+ completionRequired: true,
5874
+ aiRequired: false
5875
+ },
5876
+ {
5877
+ id: "robot-mission-control-m1-safe-private",
5878
+ statement: "Without confirmation the simulator stays in STOP, exposes responsive text telemetry and never opens a real serial port or controls hardware.",
5879
+ visibility: "visible",
5880
+ criterionIds: ["robot-mission-control-safety"],
5881
+ completionRequired: true,
5882
+ aiRequired: false
5883
+ }
5884
+ ],
5885
+ interactions: [
5886
+ {
5887
+ id: "robot-mission-control-m1-editor",
5888
+ description: "Edit the five documented mission-control calls using keyboard or pointer controls.",
5889
+ primaryMode: "keyboard",
5890
+ alternativeIds: []
5891
+ },
5892
+ {
5893
+ id: "robot-mission-control-m1-run",
5894
+ description: "Activate the labelled action-icon Run control.",
5895
+ primaryMode: "pointer",
5896
+ alternativeIds: ["robot-mission-control-m1-keyboard-run"]
5897
+ },
5898
+ {
5899
+ id: "robot-mission-control-m1-review",
5900
+ description: "Review and accept or reject the exact labelled safety diff.",
5901
+ primaryMode: "keyboard",
5902
+ alternativeIds: []
5903
+ }
5904
+ ],
5905
+ accessibilityAlternatives: [
5906
+ {
5907
+ id: "robot-mission-control-m1-keyboard-run",
5908
+ description: "Focus the Run action button and press Enter or Space to produce the same controls, chart and text telemetry.",
5909
+ modes: ["keyboard"],
5910
+ equivalentOutcome: true
5911
+ }
5912
+ ],
5913
+ evidenceRequirements: [
5914
+ {
5915
+ id: "robot-mission-control-m1-assessment",
5916
+ goalIds: [
5917
+ "robot-mission-control-m1-starts",
5918
+ "robot-mission-control-m1-behaviour",
5919
+ "robot-mission-control-m1-safe-private"
5920
+ ],
5921
+ kind: "assessment-result",
5922
+ retention: "entitlement",
5923
+ containsPersonalData: false
5924
+ },
5925
+ {
5926
+ id: "robot-mission-control-m1-explanation",
5927
+ goalIds: ["robot-mission-control-m1-safe-private"],
5928
+ kind: "learner-explanation",
5929
+ retention: "attempt",
5930
+ containsPersonalData: false
5931
+ }
5932
+ ],
5933
+ sideAdventures: [
5934
+ {
5935
+ id: "robot-mission-control-m1-remix",
5936
+ prompt: "Choose another supplied command or chart mode and explain which confirmation and STOP evidence must remain.",
5937
+ completionRequired: false
5938
+ }
5939
+ ],
5940
+ rewardBindings: [
5941
+ {
5942
+ id: "robot-mission-control-m1-badge",
5943
+ badgeId: "robot-mission-control-mission-complete",
5944
+ goalIds: [
5945
+ "robot-mission-control-m1-starts",
5946
+ "robot-mission-control-m1-behaviour",
5947
+ "robot-mission-control-m1-safe-private"
5948
+ ],
5949
+ deterministic: true,
5950
+ random: false,
5951
+ tokenConvertible: false
5952
+ }
5953
+ ],
5954
+ functionReference: [
5955
+ {
5956
+ id: "robot-mission-control-function-command",
5957
+ signature: "planCommand(command)",
5958
+ summary: "Plans one supplied command for the simulated robot state machine.",
5959
+ parameters: [{ name: "command", type: "text", description: "Use scan, hold-position or return-to-base." }],
5960
+ effect: "Updates the planned-command panel but cannot leave STOP without confirmation.",
5961
+ example: 'planCommand("scan");'
5962
+ },
5963
+ {
5964
+ id: "robot-mission-control-function-confirmation",
5965
+ signature: "setSafetyConfirmation(enabled)",
5966
+ summary: "Controls whether the planned simulated command has explicit safety confirmation.",
5967
+ parameters: [{ name: "enabled", type: "Boolean", description: "Use true only after checking the planned command." }],
5968
+ effect: "Allows the simulator state machine to leave STOP; it never approves or controls physical hardware.",
5969
+ example: "setSafetyConfirmation(true);"
5970
+ },
5971
+ {
5972
+ id: "robot-mission-control-function-rate",
5973
+ signature: "setTelemetryRate(samplesPerSecond)",
5974
+ summary: "Sets a bounded simulated telemetry sampling rate.",
5975
+ parameters: [{ name: "samplesPerSecond", type: "number", description: "Use 1, 2 or 4 simulated samples per second." }],
5976
+ effect: "Changes bounded chart and text sample spacing without starting background work.",
5977
+ example: "setTelemetryRate(2);"
5978
+ },
5979
+ {
5980
+ id: "robot-mission-control-function-chart",
5981
+ signature: "setChartMode(mode)",
5982
+ summary: "Chooses one supplied responsive telemetry presentation.",
5983
+ parameters: [{ name: "mode", type: "text", description: "Use line, bars or text-only." }],
5984
+ effect: "Changes the preview chart while preserving equivalent labelled text telemetry.",
5985
+ example: 'setChartMode("line");'
5986
+ },
5987
+ {
5988
+ id: "robot-mission-control-function-serial",
5989
+ signature: "simulateSerial(enabled)",
5990
+ summary: "Turns the bounded serial-message simulator on or off.",
5991
+ parameters: [{ name: "enabled", type: "Boolean", description: "Use true to show simulated messages." }],
5992
+ effect: "Produces labelled local simulator messages; it never opens Web Serial or a physical connection.",
5993
+ example: "simulateSerial(true);"
5994
+ }
5995
+ ],
5996
+ boundedSuggestion: {
5997
+ id: "robot-mission-control-m1-confirmation-diff",
5998
+ source: "authored-fallback",
5999
+ intent: "Confirm the supplied simulated command before the state machine leaves STOP.",
6000
+ constraints: [
6001
+ "Change exactly one documented safety-confirmation setting.",
6002
+ "Preserve the supplied command, telemetry rate, chart mode, serial simulation and text telemetry.",
6003
+ "Do not add Web Serial, network, external scripts, hardware control, personal data or automatic approval."
6004
+ ],
6005
+ permittedArtifactId: "robot-mission-control-m1-code",
6006
+ originalSnippet: "setSafetyConfirmation(false);",
6007
+ replacementSnippet: "setSafetyConfirmation(true);",
6008
+ explanationPrompt: "Which state-machine transition became possible, and what keeps the exercise separate from physical hardware?",
6009
+ aiOptional: false,
6010
+ learnerApprovalRequired: true,
6011
+ alternatives: ["accept", "reject"]
6012
+ }
6013
+ },
6014
+ facilitator: {
6015
+ artifacts: [
6016
+ {
6017
+ id: "robot-mission-control-m1-answer-key",
6018
+ kind: "answer-key",
6019
+ audience: "facilitator",
6020
+ solutionBearing: true
6021
+ },
6022
+ {
6023
+ id: "robot-mission-control-m1-protected-tests",
6024
+ kind: "protected-test",
6025
+ audience: "facilitator",
6026
+ solutionBearing: true
6027
+ },
6028
+ {
6029
+ id: "robot-mission-control-m1-safety-notes",
6030
+ kind: "facilitator-note",
6031
+ audience: "facilitator",
6032
+ solutionBearing: true
6033
+ }
6034
+ ],
6035
+ protectedGoals: [
6036
+ {
6037
+ id: "robot-mission-control-m1-protected-boundary",
6038
+ statement: "The dashboard rejects arbitrary commands, invalid rates, scripts, network access, Web Serial, hardware control, personal data and any unconfirmed transition away from STOP.",
6039
+ visibility: "protected",
6040
+ criterionIds: [
6041
+ "robot-mission-control-edge-one",
6042
+ "robot-mission-control-edge-two"
6043
+ ],
6044
+ completionRequired: false,
6045
+ aiRequired: false
6046
+ }
6047
+ ],
6048
+ prompts: [
6049
+ "Ask the learner to identify the planned command, current state, confirmation and equivalent text telemetry before suggesting a change.",
6050
+ "Keep every command and message inside the simulator; the website never opens serial or controls hardware.",
6051
+ "Reject must preserve source, and provider failure must never block deterministic completion."
6052
+ ]
6053
+ }
6054
+ };
5773
6055
  var ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1 = {
5774
6056
  version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
5775
6057
  moduleId: "junior-coder.adventure-mission-planner",
@@ -6421,6 +6703,7 @@ ${summary}`);
6421
6703
  RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
6422
6704
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
6423
6705
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
6706
+ ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1,
6424
6707
  SERVO_CREATURE_MISSION_ONE_AUTHORING_V1,
6425
6708
  SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
6426
6709
  STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1,