@plasius/learning 0.2.14 → 0.2.16

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
@@ -76,7 +76,9 @@ 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,
79
80
  VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1,
81
+ VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1,
80
82
  assertValidMissionAuthoringBundle,
81
83
  } from "@plasius/learning";
82
84
 
@@ -122,6 +124,12 @@ const rainbowRescueRover = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
122
124
  const vibeGameRemixLab = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
123
125
  (module) => module.slug === "vibe-game-remix-lab",
124
126
  );
127
+ const vibeBugDetective = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
128
+ (module) => module.slug === "vibe-bug-detective",
129
+ );
130
+ const vibeIdeaStudio = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
131
+ (module) => module.slug === "vibe-idea-studio",
132
+ );
125
133
 
126
134
  if (
127
135
  !roadHopper ||
@@ -137,7 +145,9 @@ if (
137
145
  !danceRover ||
138
146
  !obstacleExplorer ||
139
147
  !rainbowRescueRover ||
140
- !vibeGameRemixLab
148
+ !vibeGameRemixLab ||
149
+ !vibeBugDetective ||
150
+ !vibeIdeaStudio
141
151
  ) {
142
152
  throw new Error("Junior Coder module is missing");
143
153
  }
@@ -198,6 +208,14 @@ assertValidMissionAuthoringBundle(
198
208
  VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1,
199
209
  vibeGameRemixLab,
200
210
  );
211
+ assertValidMissionAuthoringBundle(
212
+ VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1,
213
+ vibeBugDetective,
214
+ );
215
+ assertValidMissionAuthoringBundle(
216
+ VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1,
217
+ vibeIdeaStudio,
218
+ );
201
219
  ```
202
220
 
203
221
  ## Contract rules
@@ -244,6 +262,12 @@ assertValidMissionAuthoringBundle(
244
262
  permitted learner artifact. The learner predicts, reviews and explicitly
245
263
  accepts or rejects it; rejection preserves source, deterministic completion
246
264
  never needs AI, and open chat or automatic edits are outside the contract.
265
+ - Vibe Bug Detective starts from visible failing evidence, binds one authored
266
+ repair to the current goal and permitted artifact, and requires learner
267
+ prediction, explicit accept/reject and deterministic regression reruns.
268
+ - Vibe Idea Studio binds supplied child-safe idea, audience and acceptance-test
269
+ cards to one permitted template. The learner predicts, reviews and controls
270
+ the exact prototype diff before deterministic tests decide completion.
247
271
 
248
272
  See [the foundation design](docs/design/junior-coder-catalog-foundation.md),
249
273
  [the uniform pricing design](docs/design/junior-coder-uniform-pricing.md),
@@ -256,6 +280,8 @@ See [the foundation design](docs/design/junior-coder-catalog-foundation.md),
256
280
  [TDR 0007](docs/tdrs/tdr-0007-dance-rover-fail-safe-movement-and-power-authoring.md),
257
281
  and [TDR 0008](docs/tdrs/tdr-0008-obstacle-explorer-sensing-watchdog-and-fail-safe-authoring.md).
258
282
  See also [TDR 0010](docs/tdrs/tdr-0010-vibe-game-remix-bounded-suggestion-authoring.md).
283
+ See also [TDR 0011](docs/tdrs/tdr-0011-vibe-bug-detective-evidence-led-repair.md).
284
+ See also [TDR 0012](docs/tdrs/tdr-0012-vibe-idea-studio-bounded-goal-prototyping.md).
259
285
 
260
286
  ## Development
261
287
 
package/dist/index.cjs CHANGED
@@ -39,7 +39,9 @@ __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,
42
43
  VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1: () => VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1,
44
+ VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1: () => VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1,
43
45
  assertValidLearningPath: () => assertValidLearningPath,
44
46
  assertValidMissionAuthoringBundle: () => assertValidMissionAuthoringBundle,
45
47
  calculateAssessment: () => calculateAssessment,
@@ -4925,6 +4927,566 @@ var VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1 = {
4925
4927
  ]
4926
4928
  }
4927
4929
  };
4930
+ var VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1 = {
4931
+ version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
4932
+ moduleId: "junior-coder.vibe-bug-detective",
4933
+ moduleVersion: "1.1.0",
4934
+ missionId: "vibe-bug-detective-mission-1",
4935
+ learner: {
4936
+ estimatedMinutes: 20,
4937
+ stages: [
4938
+ {
4939
+ kind: "learn",
4940
+ instruction: "Read how setRobotDirection(), setRobotSteps() and placeRescueBeacon() control the supplied mini-game.",
4941
+ artifactIds: ["vibe-bug-detective-m1-guide"]
4942
+ },
4943
+ {
4944
+ kind: "predict",
4945
+ instruction: "Predict why the robot moves away from the beacon before viewing the one-line repair.",
4946
+ artifactIds: ["vibe-bug-detective-m1-evidence-card"]
4947
+ },
4948
+ {
4949
+ kind: "build",
4950
+ instruction: "Open the intentionally broken mini-game without changing files outside its documented settings artifact.",
4951
+ artifactIds: ["vibe-bug-detective-m1-code"]
4952
+ },
4953
+ {
4954
+ kind: "run",
4955
+ instruction: "Use the Run action button to reproduce the bug in the private JavaScript preview.",
4956
+ artifactIds: ["vibe-bug-detective-m1-code"]
4957
+ },
4958
+ {
4959
+ kind: "assess",
4960
+ instruction: "Run deterministic checks to collect failure evidence before reviewing any suggested fix.",
4961
+ artifactIds: []
4962
+ },
4963
+ {
4964
+ kind: "inspect",
4965
+ instruction: "Compare observed leftward movement with the expected right-side beacon goal and the single authored diff.",
4966
+ artifactIds: ["vibe-bug-detective-m1-code"]
4967
+ },
4968
+ {
4969
+ kind: "fix",
4970
+ instruction: "Accept or reject the exact direction repair yourself, then rerun every regression check.",
4971
+ artifactIds: ["vibe-bug-detective-m1-code"]
4972
+ },
4973
+ {
4974
+ kind: "explain",
4975
+ instruction: "Explain which evidence identified the bug and why the minimal change fixed it without changing other behaviour.",
4976
+ artifactIds: []
4977
+ },
4978
+ {
4979
+ kind: "reward",
4980
+ instruction: "Collect the evidence-bound badge after the deterministic score reaches 80 and every safety check passes.",
4981
+ artifactIds: []
4982
+ }
4983
+ ],
4984
+ readinessChecks: [
4985
+ {
4986
+ id: "vibe-bug-detective-m1-read-evidence",
4987
+ prompt: "Point to the observed direction and the beacon position before choosing a repair.",
4988
+ scored: false
4989
+ }
4990
+ ],
4991
+ artifacts: [
4992
+ {
4993
+ id: "vibe-bug-detective-m1-code",
4994
+ kind: "starter-code",
4995
+ audience: "learner",
4996
+ solutionBearing: false
4997
+ },
4998
+ {
4999
+ id: "vibe-bug-detective-m1-guide",
5000
+ kind: "starter-assets",
5001
+ audience: "learner",
5002
+ solutionBearing: false
5003
+ },
5004
+ {
5005
+ id: "vibe-bug-detective-m1-evidence-card",
5006
+ kind: "printable",
5007
+ audience: "learner",
5008
+ solutionBearing: false
5009
+ }
5010
+ ],
5011
+ goals: [
5012
+ {
5013
+ id: "vibe-bug-detective-m1-starts",
5014
+ statement: "The intentionally broken JavaScript mini-game remains structurally valid and starts.",
5015
+ visibility: "visible",
5016
+ criterionIds: ["vibe-bug-detective-build"],
5017
+ completionRequired: true,
5018
+ aiRequired: false
5019
+ },
5020
+ {
5021
+ id: "vibe-bug-detective-m1-repair",
5022
+ statement: "The robot travels three steps toward the right-side rescue beacon after one minimal direction repair.",
5023
+ visibility: "visible",
5024
+ criterionIds: [
5025
+ "vibe-bug-detective-goal-one",
5026
+ "vibe-bug-detective-goal-two",
5027
+ "vibe-bug-detective-goal-three"
5028
+ ],
5029
+ completionRequired: true,
5030
+ aiRequired: false
5031
+ },
5032
+ {
5033
+ id: "vibe-bug-detective-m1-regression-safety",
5034
+ statement: "The repair preserves the bounded step and beacon settings inside the private sandbox.",
5035
+ visibility: "visible",
5036
+ criterionIds: ["vibe-bug-detective-safety"],
5037
+ completionRequired: true,
5038
+ aiRequired: false
5039
+ }
5040
+ ],
5041
+ interactions: [
5042
+ {
5043
+ id: "vibe-bug-detective-m1-run-control",
5044
+ description: "Reproduce the supplied mini-game bug in the private preview.",
5045
+ primaryMode: "pointer",
5046
+ alternativeIds: ["vibe-bug-detective-m1-keyboard-run"]
5047
+ },
5048
+ {
5049
+ id: "vibe-bug-detective-m1-diff-review",
5050
+ description: "Read the labelled removed and added direction lines beside the assessment evidence.",
5051
+ primaryMode: "text",
5052
+ alternativeIds: []
5053
+ },
5054
+ {
5055
+ id: "vibe-bug-detective-m1-accept-control",
5056
+ description: "Approve the exact immutable repair snapshot.",
5057
+ primaryMode: "pointer",
5058
+ alternativeIds: ["vibe-bug-detective-m1-keyboard-review"]
5059
+ },
5060
+ {
5061
+ id: "vibe-bug-detective-m1-reject-control",
5062
+ description: "Reject the repair and preserve the current broken source.",
5063
+ primaryMode: "pointer",
5064
+ alternativeIds: ["vibe-bug-detective-m1-keyboard-review"]
5065
+ }
5066
+ ],
5067
+ accessibilityAlternatives: [
5068
+ {
5069
+ id: "vibe-bug-detective-m1-keyboard-run",
5070
+ modes: ["keyboard"],
5071
+ equivalentOutcome: true,
5072
+ description: "Press Enter or Space on the play-icon Run button to reproduce the same bug."
5073
+ },
5074
+ {
5075
+ id: "vibe-bug-detective-m1-keyboard-review",
5076
+ modes: ["keyboard", "text", "reduced-motion"],
5077
+ equivalentOutcome: true,
5078
+ description: "Read the text evidence and labelled diff, then focus Accept or Reject and press Enter or Space."
5079
+ }
5080
+ ],
5081
+ evidenceRequirements: [
5082
+ {
5083
+ id: "vibe-bug-detective-m1-assessment",
5084
+ goalIds: [
5085
+ "vibe-bug-detective-m1-starts",
5086
+ "vibe-bug-detective-m1-repair",
5087
+ "vibe-bug-detective-m1-regression-safety"
5088
+ ],
5089
+ kind: "assessment-result",
5090
+ retention: "entitlement",
5091
+ containsPersonalData: false
5092
+ },
5093
+ {
5094
+ id: "vibe-bug-detective-m1-explanation",
5095
+ goalIds: ["vibe-bug-detective-m1-repair"],
5096
+ kind: "learner-explanation",
5097
+ retention: "attempt",
5098
+ containsPersonalData: false
5099
+ }
5100
+ ],
5101
+ sideAdventures: [
5102
+ {
5103
+ id: "vibe-bug-detective-m1-regression-inventor",
5104
+ prompt: "Invent one extra regression test that proves the robot still stops at the rescue beacon.",
5105
+ completionRequired: false
5106
+ }
5107
+ ],
5108
+ rewardBindings: [
5109
+ {
5110
+ id: "vibe-bug-detective-m1-badge",
5111
+ badgeId: "vibe-bug-detective-mission-complete",
5112
+ goalIds: [
5113
+ "vibe-bug-detective-m1-starts",
5114
+ "vibe-bug-detective-m1-repair",
5115
+ "vibe-bug-detective-m1-regression-safety"
5116
+ ],
5117
+ deterministic: true,
5118
+ random: false,
5119
+ tokenConvertible: false
5120
+ }
5121
+ ],
5122
+ functionReference: [
5123
+ {
5124
+ id: "vibe-bug-detective-function-direction",
5125
+ signature: "setRobotDirection(direction)",
5126
+ summary: "Chooses the horizontal direction used by the supplied rescue robot.",
5127
+ parameters: [{ name: "direction", type: "text", description: "Use left or right." }],
5128
+ effect: "Changes only the labelled movement direction in the private mini-game.",
5129
+ example: 'setRobotDirection("right");'
5130
+ },
5131
+ {
5132
+ id: "vibe-bug-detective-function-steps",
5133
+ signature: "setRobotSteps(count)",
5134
+ summary: "Chooses how many bounded grid steps the robot attempts.",
5135
+ parameters: [{ name: "count", type: "whole number", description: "A bounded count from 1 to 4." }],
5136
+ effect: "Changes the private preview path length without controlling physical hardware.",
5137
+ example: "setRobotSteps(3);"
5138
+ },
5139
+ {
5140
+ id: "vibe-bug-detective-function-beacon",
5141
+ signature: "placeRescueBeacon(position)",
5142
+ summary: "Places the fictional rescue beacon on one labelled side.",
5143
+ parameters: [{ name: "position", type: "text", description: "Use left or right." }],
5144
+ effect: "Changes only the fictional beacon position in the private preview.",
5145
+ example: 'placeRescueBeacon("right");'
5146
+ }
5147
+ ],
5148
+ boundedSuggestion: {
5149
+ id: "vibe-bug-detective-m1-authored-direction-repair",
5150
+ source: "authored-fallback",
5151
+ intent: "Make the robot move toward the right-side rescue beacon.",
5152
+ constraints: [
5153
+ "Change exactly one documented direction setting.",
5154
+ "Preserve the step count and beacon position.",
5155
+ "Do not add network, storage, DOM, account or physical hardware access."
5156
+ ],
5157
+ permittedArtifactId: "vibe-bug-detective-m1-code",
5158
+ originalSnippet: 'setRobotDirection("left");',
5159
+ replacementSnippet: 'setRobotDirection("right");',
5160
+ explanationPrompt: "Which observed-versus-expected evidence identified the direction bug, and which regression result proves the repair?",
5161
+ aiOptional: false,
5162
+ learnerApprovalRequired: true,
5163
+ alternatives: ["accept", "reject"]
5164
+ }
5165
+ },
5166
+ facilitator: {
5167
+ artifacts: [
5168
+ {
5169
+ id: "vibe-bug-detective-m1-answer-key",
5170
+ kind: "answer-key",
5171
+ audience: "facilitator",
5172
+ solutionBearing: true
5173
+ },
5174
+ {
5175
+ id: "vibe-bug-detective-m1-protected-tests",
5176
+ kind: "protected-test",
5177
+ audience: "facilitator",
5178
+ solutionBearing: true
5179
+ },
5180
+ {
5181
+ id: "vibe-bug-detective-m1-safety-notes",
5182
+ kind: "facilitator-note",
5183
+ audience: "facilitator",
5184
+ solutionBearing: true
5185
+ }
5186
+ ],
5187
+ protectedGoals: [
5188
+ {
5189
+ id: "vibe-bug-detective-m1-protected-regressions",
5190
+ statement: "The repaired sandbox rejects extra statements, disallowed values, prompt injection, answer dumping, network access and changes outside the approved diff.",
5191
+ visibility: "protected",
5192
+ criterionIds: ["vibe-bug-detective-edge-one", "vibe-bug-detective-edge-two"],
5193
+ completionRequired: false,
5194
+ aiRequired: false
5195
+ }
5196
+ ],
5197
+ prompts: [
5198
+ "Ask the learner to describe observed and expected directions before revealing the authored repair.",
5199
+ "Keep every diagnostic choice tied to the current failing goal and permitted artifact; never invite free-form chat.",
5200
+ "A rejection must preserve the broken source, and AI/provider failure must never block deterministic repair or regression checks."
5201
+ ]
5202
+ }
5203
+ };
5204
+ var VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1 = {
5205
+ version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
5206
+ moduleId: "junior-coder.vibe-idea-studio",
5207
+ moduleVersion: "1.1.0",
5208
+ missionId: "vibe-idea-studio-mission-1",
5209
+ learner: {
5210
+ estimatedMinutes: 20,
5211
+ stages: [
5212
+ {
5213
+ kind: "learn",
5214
+ instruction: "Read how choosePrototype(), setStarCount() and setSuccessMessage() shape the bounded rescue-card template.",
5215
+ artifactIds: ["vibe-idea-studio-m1-guide"]
5216
+ },
5217
+ {
5218
+ kind: "predict",
5219
+ instruction: "Choose one idea, audience and acceptance test card, then predict what the one-line prototype change will show.",
5220
+ artifactIds: ["vibe-idea-studio-m1-idea-cards"]
5221
+ },
5222
+ {
5223
+ kind: "build",
5224
+ instruction: "Open the supplied template and keep every change inside its documented prototype settings artifact.",
5225
+ artifactIds: ["vibe-idea-studio-m1-code"]
5226
+ },
5227
+ {
5228
+ kind: "run",
5229
+ instruction: "Use the Run action button to preview the current rescue card in the private JavaScript simulator.",
5230
+ artifactIds: ["vibe-idea-studio-m1-code"]
5231
+ },
5232
+ {
5233
+ kind: "assess",
5234
+ instruction: "Run deterministic checks against the selected goal and acceptance test before viewing a suggestion.",
5235
+ artifactIds: []
5236
+ },
5237
+ {
5238
+ kind: "inspect",
5239
+ instruction: "Compare the exact one-line diff with your prediction, chosen goal and failed acceptance-test evidence.",
5240
+ artifactIds: ["vibe-idea-studio-m1-code"]
5241
+ },
5242
+ {
5243
+ kind: "fix",
5244
+ instruction: "Accept or reject the immutable prototype change yourself, then rerun the preview and tests.",
5245
+ artifactIds: ["vibe-idea-studio-m1-code"]
5246
+ },
5247
+ {
5248
+ kind: "explain",
5249
+ instruction: "Explain how the final evidence proves the prototype meets the selected idea, audience and success test.",
5250
+ artifactIds: []
5251
+ },
5252
+ {
5253
+ kind: "reward",
5254
+ instruction: "Collect the evidence-bound badge after the deterministic score reaches 80 and every safety check passes.",
5255
+ artifactIds: []
5256
+ }
5257
+ ],
5258
+ readinessChecks: [
5259
+ {
5260
+ id: "vibe-idea-studio-m1-match-test",
5261
+ prompt: "Match the three-star acceptance test to the documented setting that controls star count.",
5262
+ scored: false
5263
+ }
5264
+ ],
5265
+ artifacts: [
5266
+ {
5267
+ id: "vibe-idea-studio-m1-code",
5268
+ kind: "starter-code",
5269
+ audience: "learner",
5270
+ solutionBearing: false
5271
+ },
5272
+ {
5273
+ id: "vibe-idea-studio-m1-guide",
5274
+ kind: "starter-assets",
5275
+ audience: "learner",
5276
+ solutionBearing: false
5277
+ },
5278
+ {
5279
+ id: "vibe-idea-studio-m1-idea-cards",
5280
+ kind: "printable",
5281
+ audience: "learner",
5282
+ solutionBearing: false
5283
+ }
5284
+ ],
5285
+ goals: [
5286
+ {
5287
+ id: "vibe-idea-studio-m1-starts",
5288
+ statement: "The supplied JavaScript rescue-card template remains structurally valid and starts.",
5289
+ visibility: "visible",
5290
+ criterionIds: ["vibe-idea-studio-build"],
5291
+ completionRequired: true,
5292
+ aiRequired: false
5293
+ },
5294
+ {
5295
+ id: "vibe-idea-studio-m1-prototype-goal",
5296
+ statement: "The prototype is a space rescue card for a friendly robot crew with three stars and a visible success message.",
5297
+ visibility: "visible",
5298
+ criterionIds: [
5299
+ "vibe-idea-studio-goal-one",
5300
+ "vibe-idea-studio-goal-two",
5301
+ "vibe-idea-studio-goal-three"
5302
+ ],
5303
+ completionRequired: true,
5304
+ aiRequired: false
5305
+ },
5306
+ {
5307
+ id: "vibe-idea-studio-m1-private-boundary",
5308
+ statement: "The prototype stays inside the selected template, permitted artifact and private sandbox.",
5309
+ visibility: "visible",
5310
+ criterionIds: ["vibe-idea-studio-safety"],
5311
+ completionRequired: true,
5312
+ aiRequired: false
5313
+ }
5314
+ ],
5315
+ interactions: [
5316
+ {
5317
+ id: "vibe-idea-studio-m1-idea-cards",
5318
+ description: "Choose one bounded idea, audience and acceptance-test card.",
5319
+ primaryMode: "pointer",
5320
+ alternativeIds: ["vibe-idea-studio-m1-keyboard-cards"]
5321
+ },
5322
+ {
5323
+ id: "vibe-idea-studio-m1-run-control",
5324
+ description: "Start the private rescue-card preview.",
5325
+ primaryMode: "pointer",
5326
+ alternativeIds: ["vibe-idea-studio-m1-keyboard-run"]
5327
+ },
5328
+ {
5329
+ id: "vibe-idea-studio-m1-diff-review",
5330
+ description: "Read the labelled removed and added star-count lines before deciding.",
5331
+ primaryMode: "text",
5332
+ alternativeIds: []
5333
+ },
5334
+ {
5335
+ id: "vibe-idea-studio-m1-accept-control",
5336
+ description: "Approve the exact immutable prototype change.",
5337
+ primaryMode: "pointer",
5338
+ alternativeIds: ["vibe-idea-studio-m1-keyboard-review"]
5339
+ },
5340
+ {
5341
+ id: "vibe-idea-studio-m1-reject-control",
5342
+ description: "Reject the suggestion and preserve the current source.",
5343
+ primaryMode: "pointer",
5344
+ alternativeIds: ["vibe-idea-studio-m1-keyboard-review"]
5345
+ }
5346
+ ],
5347
+ accessibilityAlternatives: [
5348
+ {
5349
+ id: "vibe-idea-studio-m1-keyboard-cards",
5350
+ modes: ["keyboard", "text"],
5351
+ equivalentOutcome: true,
5352
+ description: "Use labelled radio-card controls with arrow keys and Space to choose the same bounded goal."
5353
+ },
5354
+ {
5355
+ id: "vibe-idea-studio-m1-keyboard-run",
5356
+ modes: ["keyboard"],
5357
+ equivalentOutcome: true,
5358
+ description: "Press Enter or Space on the play-icon Run button to start the same preview."
5359
+ },
5360
+ {
5361
+ id: "vibe-idea-studio-m1-keyboard-review",
5362
+ modes: ["keyboard", "text", "reduced-motion"],
5363
+ equivalentOutcome: true,
5364
+ description: "Read the labelled diff and acceptance evidence, then focus Accept or Reject and press Enter or Space."
5365
+ }
5366
+ ],
5367
+ evidenceRequirements: [
5368
+ {
5369
+ id: "vibe-idea-studio-m1-assessment",
5370
+ goalIds: [
5371
+ "vibe-idea-studio-m1-starts",
5372
+ "vibe-idea-studio-m1-prototype-goal",
5373
+ "vibe-idea-studio-m1-private-boundary"
5374
+ ],
5375
+ kind: "assessment-result",
5376
+ retention: "entitlement",
5377
+ containsPersonalData: false
5378
+ },
5379
+ {
5380
+ id: "vibe-idea-studio-m1-explanation",
5381
+ goalIds: ["vibe-idea-studio-m1-prototype-goal"],
5382
+ kind: "learner-explanation",
5383
+ retention: "attempt",
5384
+ containsPersonalData: false
5385
+ }
5386
+ ],
5387
+ sideAdventures: [
5388
+ {
5389
+ id: "vibe-idea-studio-m1-test-inventor",
5390
+ prompt: "Write one new bounded audience card and one matching acceptance test without changing the template boundary.",
5391
+ completionRequired: false
5392
+ }
5393
+ ],
5394
+ rewardBindings: [
5395
+ {
5396
+ id: "vibe-idea-studio-m1-badge",
5397
+ badgeId: "vibe-idea-studio-mission-complete",
5398
+ goalIds: [
5399
+ "vibe-idea-studio-m1-starts",
5400
+ "vibe-idea-studio-m1-prototype-goal",
5401
+ "vibe-idea-studio-m1-private-boundary"
5402
+ ],
5403
+ deterministic: true,
5404
+ random: false,
5405
+ tokenConvertible: false
5406
+ }
5407
+ ],
5408
+ functionReference: [
5409
+ {
5410
+ id: "vibe-idea-studio-function-prototype",
5411
+ signature: "choosePrototype(kind)",
5412
+ summary: "Chooses one supplied, age-appropriate interactive prototype template.",
5413
+ parameters: [{ name: "kind", type: "text", description: "Use rescue-card, creature-card or mission-sign." }],
5414
+ effect: "Changes only the labelled template in the private preview.",
5415
+ example: 'choosePrototype("rescue-card");'
5416
+ },
5417
+ {
5418
+ id: "vibe-idea-studio-function-stars",
5419
+ signature: "setStarCount(count)",
5420
+ summary: "Chooses how many decorative success stars appear on the card.",
5421
+ parameters: [{ name: "count", type: "whole number", description: "A bounded count from 1 to 4." }],
5422
+ effect: "Changes only the visible star count in the private preview.",
5423
+ example: "setStarCount(3);"
5424
+ },
5425
+ {
5426
+ id: "vibe-idea-studio-function-message",
5427
+ signature: "setSuccessMessage(message)",
5428
+ summary: "Chooses one supplied child-safe success message.",
5429
+ parameters: [{ name: "message", type: "text", description: "Use Mission ready!, Great teamwork! or Rescue complete!" }],
5430
+ effect: "Changes only the fictional card message and never sends or stores text.",
5431
+ example: 'setSuccessMessage("Mission ready!");'
5432
+ }
5433
+ ],
5434
+ boundedSuggestion: {
5435
+ id: "vibe-idea-studio-m1-authored-star-diff",
5436
+ source: "authored-fallback",
5437
+ intent: "Meet the selected acceptance test by showing three stars.",
5438
+ constraints: [
5439
+ "Change exactly one documented star-count setting.",
5440
+ "Preserve the selected prototype and supplied success message.",
5441
+ "Do not add free-form content, network, storage, DOM, account or hardware access."
5442
+ ],
5443
+ permittedArtifactId: "vibe-idea-studio-m1-code",
5444
+ originalSnippet: "setStarCount(2);",
5445
+ replacementSnippet: "setStarCount(3);",
5446
+ explanationPrompt: "Did the accepted change satisfy the three-star acceptance test, and which evidence proves it?",
5447
+ aiOptional: false,
5448
+ learnerApprovalRequired: true,
5449
+ alternatives: ["accept", "reject"]
5450
+ }
5451
+ },
5452
+ facilitator: {
5453
+ artifacts: [
5454
+ {
5455
+ id: "vibe-idea-studio-m1-answer-key",
5456
+ kind: "answer-key",
5457
+ audience: "facilitator",
5458
+ solutionBearing: true
5459
+ },
5460
+ {
5461
+ id: "vibe-idea-studio-m1-protected-tests",
5462
+ kind: "protected-test",
5463
+ audience: "facilitator",
5464
+ solutionBearing: true
5465
+ },
5466
+ {
5467
+ id: "vibe-idea-studio-m1-safety-notes",
5468
+ kind: "facilitator-note",
5469
+ audience: "facilitator",
5470
+ solutionBearing: true
5471
+ }
5472
+ ],
5473
+ protectedGoals: [
5474
+ {
5475
+ id: "vibe-idea-studio-m1-protected-boundaries",
5476
+ statement: "The sandbox rejects free-form prompts, personal data, disallowed messages, extra statements, network access and changes outside the approved diff.",
5477
+ visibility: "protected",
5478
+ criterionIds: ["vibe-idea-studio-edge-one", "vibe-idea-studio-edge-two"],
5479
+ completionRequired: false,
5480
+ aiRequired: false
5481
+ }
5482
+ ],
5483
+ prompts: [
5484
+ "Ask the learner to name the idea, audience and acceptance test before revealing the authored diff.",
5485
+ "Keep choices bound to supplied child-safe cards, the current rubric and permitted artifact; never invite free-form chat.",
5486
+ "A rejection must preserve source, and AI/provider failure must never block deterministic prototype completion."
5487
+ ]
5488
+ }
5489
+ };
4928
5490
  var ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1 = {
4929
5491
  version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
4930
5492
  moduleId: "junior-coder.road-hopper-rally",
@@ -5293,7 +5855,9 @@ ${summary}`);
5293
5855
  SERVO_CREATURE_MISSION_ONE_AUTHORING_V1,
5294
5856
  SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
5295
5857
  STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1,
5858
+ VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1,
5296
5859
  VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1,
5860
+ VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1,
5297
5861
  assertValidLearningPath,
5298
5862
  assertValidMissionAuthoringBundle,
5299
5863
  calculateAssessment,