@plasius/learning 0.2.13 → 0.2.15
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 -1
- package/dist/index.cjs +565 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -2
- package/dist/index.d.ts +25 -2
- package/dist/index.js +563 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -76,6 +76,8 @@ import {
|
|
|
76
76
|
SERVO_CREATURE_MISSION_ONE_AUTHORING_V1,
|
|
77
77
|
SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
|
|
78
78
|
STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1,
|
|
79
|
+
VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1,
|
|
80
|
+
VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1,
|
|
79
81
|
assertValidMissionAuthoringBundle,
|
|
80
82
|
} from "@plasius/learning";
|
|
81
83
|
|
|
@@ -118,6 +120,12 @@ const obstacleExplorer = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
|
|
|
118
120
|
const rainbowRescueRover = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
|
|
119
121
|
(module) => module.slug === "rainbow-rescue-rover",
|
|
120
122
|
);
|
|
123
|
+
const vibeGameRemixLab = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
|
|
124
|
+
(module) => module.slug === "vibe-game-remix-lab",
|
|
125
|
+
);
|
|
126
|
+
const vibeBugDetective = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
|
|
127
|
+
(module) => module.slug === "vibe-bug-detective",
|
|
128
|
+
);
|
|
121
129
|
|
|
122
130
|
if (
|
|
123
131
|
!roadHopper ||
|
|
@@ -132,7 +140,9 @@ if (
|
|
|
132
140
|
!servoCreature ||
|
|
133
141
|
!danceRover ||
|
|
134
142
|
!obstacleExplorer ||
|
|
135
|
-
!rainbowRescueRover
|
|
143
|
+
!rainbowRescueRover ||
|
|
144
|
+
!vibeGameRemixLab ||
|
|
145
|
+
!vibeBugDetective
|
|
136
146
|
) {
|
|
137
147
|
throw new Error("Junior Coder module is missing");
|
|
138
148
|
}
|
|
@@ -189,6 +199,14 @@ assertValidMissionAuthoringBundle(
|
|
|
189
199
|
RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1,
|
|
190
200
|
rainbowRescueRover,
|
|
191
201
|
);
|
|
202
|
+
assertValidMissionAuthoringBundle(
|
|
203
|
+
VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1,
|
|
204
|
+
vibeGameRemixLab,
|
|
205
|
+
);
|
|
206
|
+
assertValidMissionAuthoringBundle(
|
|
207
|
+
VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1,
|
|
208
|
+
vibeBugDetective,
|
|
209
|
+
);
|
|
192
210
|
```
|
|
193
211
|
|
|
194
212
|
## Contract rules
|
|
@@ -231,6 +249,13 @@ assertValidMissionAuthoringBundle(
|
|
|
231
249
|
the family Raspberry Pi. The website receives no frames, opens no camera or
|
|
232
250
|
serial port, never activates motors, and every physical component remains
|
|
233
251
|
pending adult bench verification.
|
|
252
|
+
- Vibe Game Remix Lab exposes one authored, evidence-bound diff against one
|
|
253
|
+
permitted learner artifact. The learner predicts, reviews and explicitly
|
|
254
|
+
accepts or rejects it; rejection preserves source, deterministic completion
|
|
255
|
+
never needs AI, and open chat or automatic edits are outside the contract.
|
|
256
|
+
- Vibe Bug Detective starts from visible failing evidence, binds one authored
|
|
257
|
+
repair to the current goal and permitted artifact, and requires learner
|
|
258
|
+
prediction, explicit accept/reject and deterministic regression reruns.
|
|
234
259
|
|
|
235
260
|
See [the foundation design](docs/design/junior-coder-catalog-foundation.md),
|
|
236
261
|
[the uniform pricing design](docs/design/junior-coder-uniform-pricing.md),
|
|
@@ -242,6 +267,8 @@ See [the foundation design](docs/design/junior-coder-catalog-foundation.md),
|
|
|
242
267
|
[TDR 0006](docs/tdrs/tdr-0006-servo-creature-safe-movement-and-power-authoring.md),
|
|
243
268
|
[TDR 0007](docs/tdrs/tdr-0007-dance-rover-fail-safe-movement-and-power-authoring.md),
|
|
244
269
|
and [TDR 0008](docs/tdrs/tdr-0008-obstacle-explorer-sensing-watchdog-and-fail-safe-authoring.md).
|
|
270
|
+
See also [TDR 0010](docs/tdrs/tdr-0010-vibe-game-remix-bounded-suggestion-authoring.md).
|
|
271
|
+
See also [TDR 0011](docs/tdrs/tdr-0011-vibe-bug-detective-evidence-led-repair.md).
|
|
245
272
|
|
|
246
273
|
## Development
|
|
247
274
|
|
package/dist/index.cjs
CHANGED
|
@@ -39,6 +39,8 @@ __export(index_exports, {
|
|
|
39
39
|
SERVO_CREATURE_MISSION_ONE_AUTHORING_V1: () => SERVO_CREATURE_MISSION_ONE_AUTHORING_V1,
|
|
40
40
|
SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1: () => SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
|
|
41
41
|
STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1: () => STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1,
|
|
42
|
+
VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1: () => VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1,
|
|
43
|
+
VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1: () => VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1,
|
|
42
44
|
assertValidLearningPath: () => assertValidLearningPath,
|
|
43
45
|
assertValidMissionAuthoringBundle: () => assertValidMissionAuthoringBundle,
|
|
44
46
|
calculateAssessment: () => calculateAssessment,
|
|
@@ -1151,6 +1153,19 @@ function validateMissionAuthoringBundle(bundle, module3) {
|
|
|
1151
1153
|
);
|
|
1152
1154
|
}
|
|
1153
1155
|
}
|
|
1156
|
+
if (learner.boundedSuggestion) {
|
|
1157
|
+
const suggestion = learner.boundedSuggestion;
|
|
1158
|
+
const invalidBoundedSuggestion = suggestion.id.trim().length === 0 || suggestion.source !== "authored-fallback" || suggestion.intent.trim().length === 0 || suggestion.constraints.length === 0 || suggestion.constraints.some((constraint) => constraint.trim().length === 0) || !learnerArtifactIds.has(suggestion.permittedArtifactId) || suggestion.originalSnippet.trim().length === 0 || suggestion.replacementSnippet.trim().length === 0 || suggestion.originalSnippet === suggestion.replacementSnippet || suggestion.explanationPrompt.trim().length === 0 || suggestion.aiOptional !== false || suggestion.learnerApprovalRequired !== true || suggestion.alternatives.length !== 2 || suggestion.alternatives[0] !== "accept" || suggestion.alternatives[1] !== "reject";
|
|
1159
|
+
if (invalidBoundedSuggestion) {
|
|
1160
|
+
issues.push(
|
|
1161
|
+
authoringIssue(
|
|
1162
|
+
"invalid-bounded-suggestion",
|
|
1163
|
+
"A bounded suggestion requires one learner artifact, authored constraints, a visible diff and explicit accept/reject approval.",
|
|
1164
|
+
"learner.boundedSuggestion"
|
|
1165
|
+
)
|
|
1166
|
+
);
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1154
1169
|
const hardware = bundle.hardware;
|
|
1155
1170
|
if (hardware) {
|
|
1156
1171
|
if (module3.category !== "robot" || module3.hardware.mode !== "physical-first" || !module3.hardware.simulatorAvailable) {
|
|
@@ -4637,6 +4652,554 @@ var METEOR_SHIELD_MISSION_ONE_AUTHORING_V1 = {
|
|
|
4637
4652
|
]
|
|
4638
4653
|
}
|
|
4639
4654
|
};
|
|
4655
|
+
var VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1 = {
|
|
4656
|
+
version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
4657
|
+
moduleId: "junior-coder.vibe-game-remix-lab",
|
|
4658
|
+
moduleVersion: "1.1.0",
|
|
4659
|
+
missionId: "vibe-game-remix-lab-mission-1",
|
|
4660
|
+
learner: {
|
|
4661
|
+
estimatedMinutes: 20,
|
|
4662
|
+
stages: [
|
|
4663
|
+
{
|
|
4664
|
+
kind: "learn",
|
|
4665
|
+
instruction: "Read how setRescueSpeed(), setGateSpacing() and setGoalCount() change the supplied mini-game.",
|
|
4666
|
+
artifactIds: ["vibe-game-remix-lab-m1-guide"]
|
|
4667
|
+
},
|
|
4668
|
+
{
|
|
4669
|
+
kind: "predict",
|
|
4670
|
+
instruction: "Choose one bounded intent card and predict what its one-line diff will change before viewing it.",
|
|
4671
|
+
artifactIds: ["vibe-game-remix-lab-m1-intent-cards"]
|
|
4672
|
+
},
|
|
4673
|
+
{
|
|
4674
|
+
kind: "build",
|
|
4675
|
+
instruction: "Open the supplied mini-game and keep changes inside its documented settings file.",
|
|
4676
|
+
artifactIds: ["vibe-game-remix-lab-m1-code"]
|
|
4677
|
+
},
|
|
4678
|
+
{
|
|
4679
|
+
kind: "run",
|
|
4680
|
+
instruction: "Use the Run action button to start the private JavaScript preview.",
|
|
4681
|
+
artifactIds: ["vibe-game-remix-lab-m1-code"]
|
|
4682
|
+
},
|
|
4683
|
+
{
|
|
4684
|
+
kind: "assess",
|
|
4685
|
+
instruction: "Run deterministic checks before requesting or applying any suggestion.",
|
|
4686
|
+
artifactIds: []
|
|
4687
|
+
},
|
|
4688
|
+
{
|
|
4689
|
+
kind: "inspect",
|
|
4690
|
+
instruction: "Compare the single authored diff with your prediction and the failed goal evidence.",
|
|
4691
|
+
artifactIds: ["vibe-game-remix-lab-m1-code"]
|
|
4692
|
+
},
|
|
4693
|
+
{
|
|
4694
|
+
kind: "fix",
|
|
4695
|
+
instruction: "Accept or reject the proposed change yourself, then rerun the preview and assessment.",
|
|
4696
|
+
artifactIds: ["vibe-game-remix-lab-m1-code"]
|
|
4697
|
+
},
|
|
4698
|
+
{
|
|
4699
|
+
kind: "explain",
|
|
4700
|
+
instruction: "Explain why you accepted or rejected the change and what the new evidence shows.",
|
|
4701
|
+
artifactIds: []
|
|
4702
|
+
},
|
|
4703
|
+
{
|
|
4704
|
+
kind: "reward",
|
|
4705
|
+
instruction: "Collect the evidence-bound badge after the deterministic score reaches 80 and every safety check passes.",
|
|
4706
|
+
artifactIds: []
|
|
4707
|
+
}
|
|
4708
|
+
],
|
|
4709
|
+
readinessChecks: [
|
|
4710
|
+
{
|
|
4711
|
+
id: "vibe-game-remix-lab-m1-find-setting",
|
|
4712
|
+
prompt: "Point to the documented function that changes how many rescue goals appear.",
|
|
4713
|
+
scored: false
|
|
4714
|
+
}
|
|
4715
|
+
],
|
|
4716
|
+
artifacts: [
|
|
4717
|
+
{
|
|
4718
|
+
id: "vibe-game-remix-lab-m1-code",
|
|
4719
|
+
kind: "starter-code",
|
|
4720
|
+
audience: "learner",
|
|
4721
|
+
solutionBearing: false
|
|
4722
|
+
},
|
|
4723
|
+
{
|
|
4724
|
+
id: "vibe-game-remix-lab-m1-guide",
|
|
4725
|
+
kind: "starter-assets",
|
|
4726
|
+
audience: "learner",
|
|
4727
|
+
solutionBearing: false
|
|
4728
|
+
},
|
|
4729
|
+
{
|
|
4730
|
+
id: "vibe-game-remix-lab-m1-intent-cards",
|
|
4731
|
+
kind: "printable",
|
|
4732
|
+
audience: "learner",
|
|
4733
|
+
solutionBearing: false
|
|
4734
|
+
}
|
|
4735
|
+
],
|
|
4736
|
+
goals: [
|
|
4737
|
+
{
|
|
4738
|
+
id: "vibe-game-remix-lab-m1-starts",
|
|
4739
|
+
statement: "The supplied JavaScript mini-game remains structurally valid and starts.",
|
|
4740
|
+
visibility: "visible",
|
|
4741
|
+
criterionIds: ["vibe-game-remix-lab-build"],
|
|
4742
|
+
completionRequired: true,
|
|
4743
|
+
aiRequired: false
|
|
4744
|
+
},
|
|
4745
|
+
{
|
|
4746
|
+
id: "vibe-game-remix-lab-m1-bounded-remix",
|
|
4747
|
+
statement: "The approved one-file change matches the chosen intent and every published behaviour goal.",
|
|
4748
|
+
visibility: "visible",
|
|
4749
|
+
criterionIds: [
|
|
4750
|
+
"vibe-game-remix-lab-goal-one",
|
|
4751
|
+
"vibe-game-remix-lab-goal-two",
|
|
4752
|
+
"vibe-game-remix-lab-goal-three"
|
|
4753
|
+
],
|
|
4754
|
+
completionRequired: true,
|
|
4755
|
+
aiRequired: false
|
|
4756
|
+
},
|
|
4757
|
+
{
|
|
4758
|
+
id: "vibe-game-remix-lab-m1-private-runtime",
|
|
4759
|
+
statement: "The remix stays inside the private sandbox with no network, personal data or automatic code changes.",
|
|
4760
|
+
visibility: "visible",
|
|
4761
|
+
criterionIds: ["vibe-game-remix-lab-safety"],
|
|
4762
|
+
completionRequired: true,
|
|
4763
|
+
aiRequired: false
|
|
4764
|
+
}
|
|
4765
|
+
],
|
|
4766
|
+
interactions: [
|
|
4767
|
+
{
|
|
4768
|
+
id: "vibe-game-remix-lab-m1-run-control",
|
|
4769
|
+
description: "Start the supplied mini-game preview.",
|
|
4770
|
+
primaryMode: "pointer",
|
|
4771
|
+
alternativeIds: ["vibe-game-remix-lab-m1-keyboard-run"]
|
|
4772
|
+
},
|
|
4773
|
+
{
|
|
4774
|
+
id: "vibe-game-remix-lab-m1-diff-review",
|
|
4775
|
+
description: "Read the removed and added source line before choosing what to do.",
|
|
4776
|
+
primaryMode: "text",
|
|
4777
|
+
alternativeIds: []
|
|
4778
|
+
},
|
|
4779
|
+
{
|
|
4780
|
+
id: "vibe-game-remix-lab-m1-accept-control",
|
|
4781
|
+
description: "Approve the exact immutable suggestion snapshot.",
|
|
4782
|
+
primaryMode: "pointer",
|
|
4783
|
+
alternativeIds: ["vibe-game-remix-lab-m1-keyboard-review"]
|
|
4784
|
+
},
|
|
4785
|
+
{
|
|
4786
|
+
id: "vibe-game-remix-lab-m1-reject-control",
|
|
4787
|
+
description: "Reject the suggestion and preserve the current source.",
|
|
4788
|
+
primaryMode: "pointer",
|
|
4789
|
+
alternativeIds: ["vibe-game-remix-lab-m1-keyboard-review"]
|
|
4790
|
+
}
|
|
4791
|
+
],
|
|
4792
|
+
accessibilityAlternatives: [
|
|
4793
|
+
{
|
|
4794
|
+
id: "vibe-game-remix-lab-m1-keyboard-run",
|
|
4795
|
+
modes: ["keyboard"],
|
|
4796
|
+
equivalentOutcome: true,
|
|
4797
|
+
description: "Press Enter or Space on the play-icon Run button to start the same preview."
|
|
4798
|
+
},
|
|
4799
|
+
{
|
|
4800
|
+
id: "vibe-game-remix-lab-m1-keyboard-review",
|
|
4801
|
+
modes: ["keyboard", "text", "reduced-motion"],
|
|
4802
|
+
equivalentOutcome: true,
|
|
4803
|
+
description: "Read the labelled removed and added lines, then focus Accept or Reject and press Enter or Space."
|
|
4804
|
+
}
|
|
4805
|
+
],
|
|
4806
|
+
evidenceRequirements: [
|
|
4807
|
+
{
|
|
4808
|
+
id: "vibe-game-remix-lab-m1-assessment",
|
|
4809
|
+
goalIds: [
|
|
4810
|
+
"vibe-game-remix-lab-m1-starts",
|
|
4811
|
+
"vibe-game-remix-lab-m1-bounded-remix",
|
|
4812
|
+
"vibe-game-remix-lab-m1-private-runtime"
|
|
4813
|
+
],
|
|
4814
|
+
kind: "assessment-result",
|
|
4815
|
+
retention: "entitlement",
|
|
4816
|
+
containsPersonalData: false
|
|
4817
|
+
},
|
|
4818
|
+
{
|
|
4819
|
+
id: "vibe-game-remix-lab-m1-explanation",
|
|
4820
|
+
goalIds: ["vibe-game-remix-lab-m1-bounded-remix"],
|
|
4821
|
+
kind: "learner-explanation",
|
|
4822
|
+
retention: "attempt",
|
|
4823
|
+
containsPersonalData: false
|
|
4824
|
+
}
|
|
4825
|
+
],
|
|
4826
|
+
sideAdventures: [
|
|
4827
|
+
{
|
|
4828
|
+
id: "vibe-game-remix-lab-m1-inventor",
|
|
4829
|
+
prompt: "Write a new bounded remix intent card with one permitted setting, one constraint and one success test.",
|
|
4830
|
+
completionRequired: false
|
|
4831
|
+
}
|
|
4832
|
+
],
|
|
4833
|
+
rewardBindings: [
|
|
4834
|
+
{
|
|
4835
|
+
id: "vibe-game-remix-lab-m1-badge",
|
|
4836
|
+
badgeId: "vibe-game-remix-lab-mission-complete",
|
|
4837
|
+
goalIds: [
|
|
4838
|
+
"vibe-game-remix-lab-m1-starts",
|
|
4839
|
+
"vibe-game-remix-lab-m1-bounded-remix",
|
|
4840
|
+
"vibe-game-remix-lab-m1-private-runtime"
|
|
4841
|
+
],
|
|
4842
|
+
deterministic: true,
|
|
4843
|
+
random: false,
|
|
4844
|
+
tokenConvertible: false
|
|
4845
|
+
}
|
|
4846
|
+
],
|
|
4847
|
+
functionReference: [
|
|
4848
|
+
{
|
|
4849
|
+
id: "vibe-game-remix-lab-function-speed",
|
|
4850
|
+
signature: "setRescueSpeed(speed)",
|
|
4851
|
+
summary: "Sets the supplied rescue robot's bounded movement speed.",
|
|
4852
|
+
parameters: [{ name: "speed", type: "whole number", description: "A safe speed from 1 to 5." }],
|
|
4853
|
+
effect: "Changes only the private mini-game simulation speed.",
|
|
4854
|
+
example: "setRescueSpeed(3);"
|
|
4855
|
+
},
|
|
4856
|
+
{
|
|
4857
|
+
id: "vibe-game-remix-lab-function-spacing",
|
|
4858
|
+
signature: "setGateSpacing(spacing)",
|
|
4859
|
+
summary: "Sets the gap between original rescue gates.",
|
|
4860
|
+
parameters: [{ name: "spacing", type: "whole number", description: "A bounded spacing from 2 to 6." }],
|
|
4861
|
+
effect: "Changes only the generated gate layout in the private preview.",
|
|
4862
|
+
example: "setGateSpacing(4);"
|
|
4863
|
+
},
|
|
4864
|
+
{
|
|
4865
|
+
id: "vibe-game-remix-lab-function-goals",
|
|
4866
|
+
signature: "setGoalCount(count)",
|
|
4867
|
+
summary: "Chooses how many fictional rescue goals the round contains.",
|
|
4868
|
+
parameters: [{ name: "count", type: "whole number", description: "A bounded goal count from 1 to 4." }],
|
|
4869
|
+
effect: "Changes the labelled rescue-goal count without network or account access.",
|
|
4870
|
+
example: "setGoalCount(3);"
|
|
4871
|
+
}
|
|
4872
|
+
],
|
|
4873
|
+
boundedSuggestion: {
|
|
4874
|
+
id: "vibe-game-remix-lab-m1-authored-goal-diff",
|
|
4875
|
+
source: "authored-fallback",
|
|
4876
|
+
intent: "Make the round contain one more rescue goal.",
|
|
4877
|
+
constraints: [
|
|
4878
|
+
"Change exactly one documented setting.",
|
|
4879
|
+
"Keep the goal count inside the published range.",
|
|
4880
|
+
"Do not add network, storage, DOM or account access."
|
|
4881
|
+
],
|
|
4882
|
+
permittedArtifactId: "vibe-game-remix-lab-m1-code",
|
|
4883
|
+
originalSnippet: "setGoalCount(2);",
|
|
4884
|
+
replacementSnippet: "setGoalCount(3);",
|
|
4885
|
+
explanationPrompt: "Did the new goal count match your prediction, and which assessment evidence proves it?",
|
|
4886
|
+
aiOptional: false,
|
|
4887
|
+
learnerApprovalRequired: true,
|
|
4888
|
+
alternatives: ["accept", "reject"]
|
|
4889
|
+
}
|
|
4890
|
+
},
|
|
4891
|
+
facilitator: {
|
|
4892
|
+
artifacts: [
|
|
4893
|
+
{
|
|
4894
|
+
id: "vibe-game-remix-lab-m1-answer-key",
|
|
4895
|
+
kind: "answer-key",
|
|
4896
|
+
audience: "facilitator",
|
|
4897
|
+
solutionBearing: true
|
|
4898
|
+
},
|
|
4899
|
+
{
|
|
4900
|
+
id: "vibe-game-remix-lab-m1-protected-tests",
|
|
4901
|
+
kind: "protected-test",
|
|
4902
|
+
audience: "facilitator",
|
|
4903
|
+
solutionBearing: true
|
|
4904
|
+
},
|
|
4905
|
+
{
|
|
4906
|
+
id: "vibe-game-remix-lab-m1-safety-notes",
|
|
4907
|
+
kind: "facilitator-note",
|
|
4908
|
+
audience: "facilitator",
|
|
4909
|
+
solutionBearing: true
|
|
4910
|
+
}
|
|
4911
|
+
],
|
|
4912
|
+
protectedGoals: [
|
|
4913
|
+
{
|
|
4914
|
+
id: "vibe-game-remix-lab-m1-protected-resilience",
|
|
4915
|
+
statement: "The sandbox rejects prompt injection, answer dumping, disallowed files, network access and changes outside the approved diff.",
|
|
4916
|
+
visibility: "protected",
|
|
4917
|
+
criterionIds: ["vibe-game-remix-lab-edge-one", "vibe-game-remix-lab-edge-two"],
|
|
4918
|
+
completionRequired: false,
|
|
4919
|
+
aiRequired: false
|
|
4920
|
+
}
|
|
4921
|
+
],
|
|
4922
|
+
prompts: [
|
|
4923
|
+
"Ask for the learner's prediction before revealing the authored diff.",
|
|
4924
|
+
"Do not invite free-form chat; keep intent, evidence and suggestions bound to the current project, rubric and permitted artifact.",
|
|
4925
|
+
"A rejection must leave source unchanged, and AI/provider failure must never block deterministic completion."
|
|
4926
|
+
]
|
|
4927
|
+
}
|
|
4928
|
+
};
|
|
4929
|
+
var VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1 = {
|
|
4930
|
+
version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
4931
|
+
moduleId: "junior-coder.vibe-bug-detective",
|
|
4932
|
+
moduleVersion: "1.1.0",
|
|
4933
|
+
missionId: "vibe-bug-detective-mission-1",
|
|
4934
|
+
learner: {
|
|
4935
|
+
estimatedMinutes: 20,
|
|
4936
|
+
stages: [
|
|
4937
|
+
{
|
|
4938
|
+
kind: "learn",
|
|
4939
|
+
instruction: "Read how setRobotDirection(), setRobotSteps() and placeRescueBeacon() control the supplied mini-game.",
|
|
4940
|
+
artifactIds: ["vibe-bug-detective-m1-guide"]
|
|
4941
|
+
},
|
|
4942
|
+
{
|
|
4943
|
+
kind: "predict",
|
|
4944
|
+
instruction: "Predict why the robot moves away from the beacon before viewing the one-line repair.",
|
|
4945
|
+
artifactIds: ["vibe-bug-detective-m1-evidence-card"]
|
|
4946
|
+
},
|
|
4947
|
+
{
|
|
4948
|
+
kind: "build",
|
|
4949
|
+
instruction: "Open the intentionally broken mini-game without changing files outside its documented settings artifact.",
|
|
4950
|
+
artifactIds: ["vibe-bug-detective-m1-code"]
|
|
4951
|
+
},
|
|
4952
|
+
{
|
|
4953
|
+
kind: "run",
|
|
4954
|
+
instruction: "Use the Run action button to reproduce the bug in the private JavaScript preview.",
|
|
4955
|
+
artifactIds: ["vibe-bug-detective-m1-code"]
|
|
4956
|
+
},
|
|
4957
|
+
{
|
|
4958
|
+
kind: "assess",
|
|
4959
|
+
instruction: "Run deterministic checks to collect failure evidence before reviewing any suggested fix.",
|
|
4960
|
+
artifactIds: []
|
|
4961
|
+
},
|
|
4962
|
+
{
|
|
4963
|
+
kind: "inspect",
|
|
4964
|
+
instruction: "Compare observed leftward movement with the expected right-side beacon goal and the single authored diff.",
|
|
4965
|
+
artifactIds: ["vibe-bug-detective-m1-code"]
|
|
4966
|
+
},
|
|
4967
|
+
{
|
|
4968
|
+
kind: "fix",
|
|
4969
|
+
instruction: "Accept or reject the exact direction repair yourself, then rerun every regression check.",
|
|
4970
|
+
artifactIds: ["vibe-bug-detective-m1-code"]
|
|
4971
|
+
},
|
|
4972
|
+
{
|
|
4973
|
+
kind: "explain",
|
|
4974
|
+
instruction: "Explain which evidence identified the bug and why the minimal change fixed it without changing other behaviour.",
|
|
4975
|
+
artifactIds: []
|
|
4976
|
+
},
|
|
4977
|
+
{
|
|
4978
|
+
kind: "reward",
|
|
4979
|
+
instruction: "Collect the evidence-bound badge after the deterministic score reaches 80 and every safety check passes.",
|
|
4980
|
+
artifactIds: []
|
|
4981
|
+
}
|
|
4982
|
+
],
|
|
4983
|
+
readinessChecks: [
|
|
4984
|
+
{
|
|
4985
|
+
id: "vibe-bug-detective-m1-read-evidence",
|
|
4986
|
+
prompt: "Point to the observed direction and the beacon position before choosing a repair.",
|
|
4987
|
+
scored: false
|
|
4988
|
+
}
|
|
4989
|
+
],
|
|
4990
|
+
artifacts: [
|
|
4991
|
+
{
|
|
4992
|
+
id: "vibe-bug-detective-m1-code",
|
|
4993
|
+
kind: "starter-code",
|
|
4994
|
+
audience: "learner",
|
|
4995
|
+
solutionBearing: false
|
|
4996
|
+
},
|
|
4997
|
+
{
|
|
4998
|
+
id: "vibe-bug-detective-m1-guide",
|
|
4999
|
+
kind: "starter-assets",
|
|
5000
|
+
audience: "learner",
|
|
5001
|
+
solutionBearing: false
|
|
5002
|
+
},
|
|
5003
|
+
{
|
|
5004
|
+
id: "vibe-bug-detective-m1-evidence-card",
|
|
5005
|
+
kind: "printable",
|
|
5006
|
+
audience: "learner",
|
|
5007
|
+
solutionBearing: false
|
|
5008
|
+
}
|
|
5009
|
+
],
|
|
5010
|
+
goals: [
|
|
5011
|
+
{
|
|
5012
|
+
id: "vibe-bug-detective-m1-starts",
|
|
5013
|
+
statement: "The intentionally broken JavaScript mini-game remains structurally valid and starts.",
|
|
5014
|
+
visibility: "visible",
|
|
5015
|
+
criterionIds: ["vibe-bug-detective-build"],
|
|
5016
|
+
completionRequired: true,
|
|
5017
|
+
aiRequired: false
|
|
5018
|
+
},
|
|
5019
|
+
{
|
|
5020
|
+
id: "vibe-bug-detective-m1-repair",
|
|
5021
|
+
statement: "The robot travels three steps toward the right-side rescue beacon after one minimal direction repair.",
|
|
5022
|
+
visibility: "visible",
|
|
5023
|
+
criterionIds: [
|
|
5024
|
+
"vibe-bug-detective-goal-one",
|
|
5025
|
+
"vibe-bug-detective-goal-two",
|
|
5026
|
+
"vibe-bug-detective-goal-three"
|
|
5027
|
+
],
|
|
5028
|
+
completionRequired: true,
|
|
5029
|
+
aiRequired: false
|
|
5030
|
+
},
|
|
5031
|
+
{
|
|
5032
|
+
id: "vibe-bug-detective-m1-regression-safety",
|
|
5033
|
+
statement: "The repair preserves the bounded step and beacon settings inside the private sandbox.",
|
|
5034
|
+
visibility: "visible",
|
|
5035
|
+
criterionIds: ["vibe-bug-detective-safety"],
|
|
5036
|
+
completionRequired: true,
|
|
5037
|
+
aiRequired: false
|
|
5038
|
+
}
|
|
5039
|
+
],
|
|
5040
|
+
interactions: [
|
|
5041
|
+
{
|
|
5042
|
+
id: "vibe-bug-detective-m1-run-control",
|
|
5043
|
+
description: "Reproduce the supplied mini-game bug in the private preview.",
|
|
5044
|
+
primaryMode: "pointer",
|
|
5045
|
+
alternativeIds: ["vibe-bug-detective-m1-keyboard-run"]
|
|
5046
|
+
},
|
|
5047
|
+
{
|
|
5048
|
+
id: "vibe-bug-detective-m1-diff-review",
|
|
5049
|
+
description: "Read the labelled removed and added direction lines beside the assessment evidence.",
|
|
5050
|
+
primaryMode: "text",
|
|
5051
|
+
alternativeIds: []
|
|
5052
|
+
},
|
|
5053
|
+
{
|
|
5054
|
+
id: "vibe-bug-detective-m1-accept-control",
|
|
5055
|
+
description: "Approve the exact immutable repair snapshot.",
|
|
5056
|
+
primaryMode: "pointer",
|
|
5057
|
+
alternativeIds: ["vibe-bug-detective-m1-keyboard-review"]
|
|
5058
|
+
},
|
|
5059
|
+
{
|
|
5060
|
+
id: "vibe-bug-detective-m1-reject-control",
|
|
5061
|
+
description: "Reject the repair and preserve the current broken source.",
|
|
5062
|
+
primaryMode: "pointer",
|
|
5063
|
+
alternativeIds: ["vibe-bug-detective-m1-keyboard-review"]
|
|
5064
|
+
}
|
|
5065
|
+
],
|
|
5066
|
+
accessibilityAlternatives: [
|
|
5067
|
+
{
|
|
5068
|
+
id: "vibe-bug-detective-m1-keyboard-run",
|
|
5069
|
+
modes: ["keyboard"],
|
|
5070
|
+
equivalentOutcome: true,
|
|
5071
|
+
description: "Press Enter or Space on the play-icon Run button to reproduce the same bug."
|
|
5072
|
+
},
|
|
5073
|
+
{
|
|
5074
|
+
id: "vibe-bug-detective-m1-keyboard-review",
|
|
5075
|
+
modes: ["keyboard", "text", "reduced-motion"],
|
|
5076
|
+
equivalentOutcome: true,
|
|
5077
|
+
description: "Read the text evidence and labelled diff, then focus Accept or Reject and press Enter or Space."
|
|
5078
|
+
}
|
|
5079
|
+
],
|
|
5080
|
+
evidenceRequirements: [
|
|
5081
|
+
{
|
|
5082
|
+
id: "vibe-bug-detective-m1-assessment",
|
|
5083
|
+
goalIds: [
|
|
5084
|
+
"vibe-bug-detective-m1-starts",
|
|
5085
|
+
"vibe-bug-detective-m1-repair",
|
|
5086
|
+
"vibe-bug-detective-m1-regression-safety"
|
|
5087
|
+
],
|
|
5088
|
+
kind: "assessment-result",
|
|
5089
|
+
retention: "entitlement",
|
|
5090
|
+
containsPersonalData: false
|
|
5091
|
+
},
|
|
5092
|
+
{
|
|
5093
|
+
id: "vibe-bug-detective-m1-explanation",
|
|
5094
|
+
goalIds: ["vibe-bug-detective-m1-repair"],
|
|
5095
|
+
kind: "learner-explanation",
|
|
5096
|
+
retention: "attempt",
|
|
5097
|
+
containsPersonalData: false
|
|
5098
|
+
}
|
|
5099
|
+
],
|
|
5100
|
+
sideAdventures: [
|
|
5101
|
+
{
|
|
5102
|
+
id: "vibe-bug-detective-m1-regression-inventor",
|
|
5103
|
+
prompt: "Invent one extra regression test that proves the robot still stops at the rescue beacon.",
|
|
5104
|
+
completionRequired: false
|
|
5105
|
+
}
|
|
5106
|
+
],
|
|
5107
|
+
rewardBindings: [
|
|
5108
|
+
{
|
|
5109
|
+
id: "vibe-bug-detective-m1-badge",
|
|
5110
|
+
badgeId: "vibe-bug-detective-mission-complete",
|
|
5111
|
+
goalIds: [
|
|
5112
|
+
"vibe-bug-detective-m1-starts",
|
|
5113
|
+
"vibe-bug-detective-m1-repair",
|
|
5114
|
+
"vibe-bug-detective-m1-regression-safety"
|
|
5115
|
+
],
|
|
5116
|
+
deterministic: true,
|
|
5117
|
+
random: false,
|
|
5118
|
+
tokenConvertible: false
|
|
5119
|
+
}
|
|
5120
|
+
],
|
|
5121
|
+
functionReference: [
|
|
5122
|
+
{
|
|
5123
|
+
id: "vibe-bug-detective-function-direction",
|
|
5124
|
+
signature: "setRobotDirection(direction)",
|
|
5125
|
+
summary: "Chooses the horizontal direction used by the supplied rescue robot.",
|
|
5126
|
+
parameters: [{ name: "direction", type: "text", description: "Use left or right." }],
|
|
5127
|
+
effect: "Changes only the labelled movement direction in the private mini-game.",
|
|
5128
|
+
example: 'setRobotDirection("right");'
|
|
5129
|
+
},
|
|
5130
|
+
{
|
|
5131
|
+
id: "vibe-bug-detective-function-steps",
|
|
5132
|
+
signature: "setRobotSteps(count)",
|
|
5133
|
+
summary: "Chooses how many bounded grid steps the robot attempts.",
|
|
5134
|
+
parameters: [{ name: "count", type: "whole number", description: "A bounded count from 1 to 4." }],
|
|
5135
|
+
effect: "Changes the private preview path length without controlling physical hardware.",
|
|
5136
|
+
example: "setRobotSteps(3);"
|
|
5137
|
+
},
|
|
5138
|
+
{
|
|
5139
|
+
id: "vibe-bug-detective-function-beacon",
|
|
5140
|
+
signature: "placeRescueBeacon(position)",
|
|
5141
|
+
summary: "Places the fictional rescue beacon on one labelled side.",
|
|
5142
|
+
parameters: [{ name: "position", type: "text", description: "Use left or right." }],
|
|
5143
|
+
effect: "Changes only the fictional beacon position in the private preview.",
|
|
5144
|
+
example: 'placeRescueBeacon("right");'
|
|
5145
|
+
}
|
|
5146
|
+
],
|
|
5147
|
+
boundedSuggestion: {
|
|
5148
|
+
id: "vibe-bug-detective-m1-authored-direction-repair",
|
|
5149
|
+
source: "authored-fallback",
|
|
5150
|
+
intent: "Make the robot move toward the right-side rescue beacon.",
|
|
5151
|
+
constraints: [
|
|
5152
|
+
"Change exactly one documented direction setting.",
|
|
5153
|
+
"Preserve the step count and beacon position.",
|
|
5154
|
+
"Do not add network, storage, DOM, account or physical hardware access."
|
|
5155
|
+
],
|
|
5156
|
+
permittedArtifactId: "vibe-bug-detective-m1-code",
|
|
5157
|
+
originalSnippet: 'setRobotDirection("left");',
|
|
5158
|
+
replacementSnippet: 'setRobotDirection("right");',
|
|
5159
|
+
explanationPrompt: "Which observed-versus-expected evidence identified the direction bug, and which regression result proves the repair?",
|
|
5160
|
+
aiOptional: false,
|
|
5161
|
+
learnerApprovalRequired: true,
|
|
5162
|
+
alternatives: ["accept", "reject"]
|
|
5163
|
+
}
|
|
5164
|
+
},
|
|
5165
|
+
facilitator: {
|
|
5166
|
+
artifacts: [
|
|
5167
|
+
{
|
|
5168
|
+
id: "vibe-bug-detective-m1-answer-key",
|
|
5169
|
+
kind: "answer-key",
|
|
5170
|
+
audience: "facilitator",
|
|
5171
|
+
solutionBearing: true
|
|
5172
|
+
},
|
|
5173
|
+
{
|
|
5174
|
+
id: "vibe-bug-detective-m1-protected-tests",
|
|
5175
|
+
kind: "protected-test",
|
|
5176
|
+
audience: "facilitator",
|
|
5177
|
+
solutionBearing: true
|
|
5178
|
+
},
|
|
5179
|
+
{
|
|
5180
|
+
id: "vibe-bug-detective-m1-safety-notes",
|
|
5181
|
+
kind: "facilitator-note",
|
|
5182
|
+
audience: "facilitator",
|
|
5183
|
+
solutionBearing: true
|
|
5184
|
+
}
|
|
5185
|
+
],
|
|
5186
|
+
protectedGoals: [
|
|
5187
|
+
{
|
|
5188
|
+
id: "vibe-bug-detective-m1-protected-regressions",
|
|
5189
|
+
statement: "The repaired sandbox rejects extra statements, disallowed values, prompt injection, answer dumping, network access and changes outside the approved diff.",
|
|
5190
|
+
visibility: "protected",
|
|
5191
|
+
criterionIds: ["vibe-bug-detective-edge-one", "vibe-bug-detective-edge-two"],
|
|
5192
|
+
completionRequired: false,
|
|
5193
|
+
aiRequired: false
|
|
5194
|
+
}
|
|
5195
|
+
],
|
|
5196
|
+
prompts: [
|
|
5197
|
+
"Ask the learner to describe observed and expected directions before revealing the authored repair.",
|
|
5198
|
+
"Keep every diagnostic choice tied to the current failing goal and permitted artifact; never invite free-form chat.",
|
|
5199
|
+
"A rejection must preserve the broken source, and AI/provider failure must never block deterministic repair or regression checks."
|
|
5200
|
+
]
|
|
5201
|
+
}
|
|
5202
|
+
};
|
|
4640
5203
|
var ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1 = {
|
|
4641
5204
|
version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
4642
5205
|
moduleId: "junior-coder.road-hopper-rally",
|
|
@@ -5005,6 +5568,8 @@ ${summary}`);
|
|
|
5005
5568
|
SERVO_CREATURE_MISSION_ONE_AUTHORING_V1,
|
|
5006
5569
|
SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
|
|
5007
5570
|
STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1,
|
|
5571
|
+
VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1,
|
|
5572
|
+
VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1,
|
|
5008
5573
|
assertValidLearningPath,
|
|
5009
5574
|
assertValidMissionAuthoringBundle,
|
|
5010
5575
|
calculateAssessment,
|