@plasius/learning 0.2.2 → 0.2.4

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,8 +63,10 @@ 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
+ PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
66
67
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
67
68
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
69
+ SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
68
70
  assertValidMissionAuthoringBundle,
69
71
  } from "@plasius/learning";
70
72
 
@@ -74,8 +76,16 @@ const roadHopper = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
74
76
  const robotMaze = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
75
77
  (module) => module.slug === "robot-maze-dash",
76
78
  );
79
+ const skywing = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
80
+ (module) => module.slug === "skywing-sprint",
81
+ );
82
+ const paddlePulse = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
83
+ (module) => module.slug === "paddle-pulse",
84
+ );
77
85
 
78
- if (!roadHopper || !robotMaze) throw new Error("Junior Coder module is missing");
86
+ if (!roadHopper || !robotMaze || !skywing || !paddlePulse) {
87
+ throw new Error("Junior Coder module is missing");
88
+ }
79
89
 
80
90
  assertValidMissionAuthoringBundle(
81
91
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
@@ -85,6 +95,14 @@ assertValidMissionAuthoringBundle(
85
95
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
86
96
  robotMaze,
87
97
  );
98
+ assertValidMissionAuthoringBundle(
99
+ SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
100
+ skywing,
101
+ );
102
+ assertValidMissionAuthoringBundle(
103
+ PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
104
+ paddlePulse,
105
+ );
88
106
  ```
89
107
 
90
108
  ## Contract rules
package/dist/index.cjs CHANGED
@@ -26,8 +26,10 @@ __export(index_exports, {
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
28
  MISSION_AUTHORING_CONTRACT_VERSION_V1: () => MISSION_AUTHORING_CONTRACT_VERSION_V1,
29
+ PADDLE_PULSE_MISSION_ONE_AUTHORING_V1: () => PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
29
30
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1: () => ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
30
31
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1: () => ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
32
+ SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1: () => SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
31
33
  assertValidLearningPath: () => assertValidLearningPath,
32
34
  assertValidMissionAuthoringBundle: () => assertValidMissionAuthoringBundle,
33
35
  calculateAssessment: () => calculateAssessment,
@@ -1341,6 +1343,446 @@ var ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1 = {
1341
1343
  ]
1342
1344
  }
1343
1345
  };
1346
+ var SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1 = {
1347
+ version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
1348
+ moduleId: "junior-coder.skywing-sprint",
1349
+ moduleVersion: "1.1.0",
1350
+ missionId: "skywing-sprint-mission-1",
1351
+ learner: {
1352
+ estimatedMinutes: 20,
1353
+ stages: [
1354
+ {
1355
+ kind: "learn",
1356
+ instruction: "Read how lift, gravity and gate-gap functions change Skywing's flight.",
1357
+ artifactIds: ["skywing-sprint-m1-art"]
1358
+ },
1359
+ {
1360
+ kind: "predict",
1361
+ instruction: "Predict whether Skywing will rise or fall after one lift pulse.",
1362
+ artifactIds: []
1363
+ },
1364
+ {
1365
+ kind: "build",
1366
+ instruction: "Adjust the three documented settings in the starter JavaScript.",
1367
+ artifactIds: ["skywing-sprint-m1-code"]
1368
+ },
1369
+ {
1370
+ kind: "run",
1371
+ instruction: "Use the Run action button to start the private flight preview.",
1372
+ artifactIds: ["skywing-sprint-m1-code"]
1373
+ },
1374
+ {
1375
+ kind: "assess",
1376
+ instruction: "Run the visible and protected deterministic flight checks.",
1377
+ artifactIds: []
1378
+ },
1379
+ {
1380
+ kind: "inspect",
1381
+ instruction: "Compare the highlighted setting with the first goal that did not pass.",
1382
+ artifactIds: []
1383
+ },
1384
+ {
1385
+ kind: "fix",
1386
+ instruction: "Change one setting, run again and observe the flight telemetry.",
1387
+ artifactIds: ["skywing-sprint-m1-code"]
1388
+ },
1389
+ {
1390
+ kind: "explain",
1391
+ instruction: "Explain how lift and gravity changed Skywing's vertical speed.",
1392
+ artifactIds: []
1393
+ },
1394
+ {
1395
+ kind: "reward",
1396
+ instruction: "Collect the evidence-bound badge when the score and safety check pass.",
1397
+ artifactIds: []
1398
+ }
1399
+ ],
1400
+ readinessChecks: [
1401
+ {
1402
+ id: "skywing-sprint-m1-predict-velocity",
1403
+ prompt: "Point to the setting that changes Skywing's upward push.",
1404
+ scored: false
1405
+ }
1406
+ ],
1407
+ artifacts: [
1408
+ {
1409
+ id: "skywing-sprint-m1-code",
1410
+ kind: "starter-code",
1411
+ audience: "learner",
1412
+ solutionBearing: false
1413
+ },
1414
+ {
1415
+ id: "skywing-sprint-m1-art",
1416
+ kind: "starter-assets",
1417
+ audience: "learner",
1418
+ solutionBearing: false
1419
+ },
1420
+ {
1421
+ id: "skywing-sprint-m1-printable",
1422
+ kind: "printable",
1423
+ audience: "learner",
1424
+ solutionBearing: false
1425
+ }
1426
+ ],
1427
+ goals: [
1428
+ {
1429
+ id: "skywing-sprint-m1-starts",
1430
+ statement: "The JavaScript settings are valid and the private preview starts.",
1431
+ visibility: "visible",
1432
+ criterionIds: ["skywing-sprint-build"],
1433
+ completionRequired: true,
1434
+ aiRequired: false
1435
+ },
1436
+ {
1437
+ id: "skywing-sprint-m1-safe-flight",
1438
+ statement: "Lift and gravity create a controllable flight through the rescue gate.",
1439
+ visibility: "visible",
1440
+ criterionIds: [
1441
+ "skywing-sprint-goal-one",
1442
+ "skywing-sprint-goal-two"
1443
+ ],
1444
+ completionRequired: true,
1445
+ aiRequired: false
1446
+ },
1447
+ {
1448
+ id: "skywing-sprint-m1-private-runtime",
1449
+ statement: "The game stays inside the private educational preview boundary.",
1450
+ visibility: "visible",
1451
+ criterionIds: ["skywing-sprint-safety"],
1452
+ completionRequired: true,
1453
+ aiRequired: false
1454
+ }
1455
+ ],
1456
+ interactions: [
1457
+ {
1458
+ id: "skywing-sprint-m1-run-control",
1459
+ description: "Start the private flight simulation.",
1460
+ primaryMode: "pointer",
1461
+ alternativeIds: ["skywing-sprint-m1-keyboard-run"]
1462
+ },
1463
+ {
1464
+ id: "skywing-sprint-m1-flight-control",
1465
+ description: "Send a lift pulse while the preview is running.",
1466
+ primaryMode: "keyboard",
1467
+ alternativeIds: []
1468
+ },
1469
+ {
1470
+ id: "skywing-sprint-m1-flight-motion",
1471
+ description: "Observe Skywing moving through the animated gate preview.",
1472
+ primaryMode: "motion",
1473
+ alternativeIds: ["skywing-sprint-m1-reduced-motion"]
1474
+ }
1475
+ ],
1476
+ accessibilityAlternatives: [
1477
+ {
1478
+ id: "skywing-sprint-m1-keyboard-run",
1479
+ modes: ["keyboard"],
1480
+ equivalentOutcome: true,
1481
+ description: "Press Enter or Space on the play-icon Run button to start the same preview."
1482
+ },
1483
+ {
1484
+ id: "skywing-sprint-m1-reduced-motion",
1485
+ modes: ["text"],
1486
+ equivalentOutcome: true,
1487
+ description: "Use the position, velocity and gate-status text instead of animation."
1488
+ }
1489
+ ],
1490
+ evidenceRequirements: [
1491
+ {
1492
+ id: "skywing-sprint-m1-assessment",
1493
+ goalIds: [
1494
+ "skywing-sprint-m1-starts",
1495
+ "skywing-sprint-m1-safe-flight",
1496
+ "skywing-sprint-m1-private-runtime"
1497
+ ],
1498
+ kind: "assessment-result",
1499
+ retention: "entitlement",
1500
+ containsPersonalData: false
1501
+ },
1502
+ {
1503
+ id: "skywing-sprint-m1-explanation",
1504
+ goalIds: ["skywing-sprint-m1-safe-flight"],
1505
+ kind: "learner-explanation",
1506
+ retention: "attempt",
1507
+ containsPersonalData: false
1508
+ }
1509
+ ],
1510
+ sideAdventures: [
1511
+ {
1512
+ id: "skywing-sprint-m1-remix",
1513
+ prompt: "Invent a new gate name and choose one setting to make the flight gentler.",
1514
+ completionRequired: false
1515
+ }
1516
+ ],
1517
+ rewardBindings: [
1518
+ {
1519
+ id: "skywing-sprint-m1-badge",
1520
+ badgeId: "skywing-sprint-mission-complete",
1521
+ goalIds: [
1522
+ "skywing-sprint-m1-starts",
1523
+ "skywing-sprint-m1-safe-flight",
1524
+ "skywing-sprint-m1-private-runtime"
1525
+ ],
1526
+ deterministic: true,
1527
+ random: false,
1528
+ tokenConvertible: false
1529
+ }
1530
+ ]
1531
+ },
1532
+ facilitator: {
1533
+ artifacts: [
1534
+ {
1535
+ id: "skywing-sprint-m1-answer-key",
1536
+ kind: "answer-key",
1537
+ audience: "facilitator",
1538
+ solutionBearing: true
1539
+ },
1540
+ {
1541
+ id: "skywing-sprint-m1-protected-tests",
1542
+ kind: "protected-test",
1543
+ audience: "facilitator",
1544
+ solutionBearing: true
1545
+ }
1546
+ ],
1547
+ protectedGoals: [
1548
+ {
1549
+ id: "skywing-sprint-m1-protected-resilience",
1550
+ statement: "The runtime clamps unsafe values and terminates bounded simulations.",
1551
+ visibility: "protected",
1552
+ criterionIds: [
1553
+ "skywing-sprint-edge-one",
1554
+ "skywing-sprint-edge-two"
1555
+ ],
1556
+ completionRequired: false,
1557
+ aiRequired: false
1558
+ }
1559
+ ],
1560
+ prompts: [
1561
+ "Ask the learner which direction a positive velocity moves Skywing before suggesting a setting change.",
1562
+ "Use the visible telemetry and function reference; never reveal protected numeric targets or expected source fragments."
1563
+ ]
1564
+ }
1565
+ };
1566
+ var PADDLE_PULSE_MISSION_ONE_AUTHORING_V1 = {
1567
+ version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
1568
+ moduleId: "junior-coder.paddle-pulse",
1569
+ moduleVersion: "1.1.0",
1570
+ missionId: "paddle-pulse-mission-1",
1571
+ learner: {
1572
+ estimatedMinutes: 20,
1573
+ stages: [
1574
+ {
1575
+ kind: "learn",
1576
+ instruction: "Read how paddle width, ball speed and bounce angle change an energy-ball rally.",
1577
+ artifactIds: ["paddle-pulse-m1-art"]
1578
+ },
1579
+ {
1580
+ kind: "predict",
1581
+ instruction: "Predict which direction the energy ball will travel after it reaches the paddle.",
1582
+ artifactIds: []
1583
+ },
1584
+ {
1585
+ kind: "build",
1586
+ instruction: "Adjust the three documented settings in the starter JavaScript.",
1587
+ artifactIds: ["paddle-pulse-m1-code"]
1588
+ },
1589
+ {
1590
+ kind: "run",
1591
+ instruction: "Use the Run action button to start the private energy-court preview.",
1592
+ artifactIds: ["paddle-pulse-m1-code"]
1593
+ },
1594
+ {
1595
+ kind: "assess",
1596
+ instruction: "Run the visible and protected deterministic rally checks.",
1597
+ artifactIds: []
1598
+ },
1599
+ {
1600
+ kind: "inspect",
1601
+ instruction: "Compare the highlighted setting with the first goal that did not pass.",
1602
+ artifactIds: []
1603
+ },
1604
+ {
1605
+ kind: "fix",
1606
+ instruction: "Change one setting, run again and observe the bounce telemetry.",
1607
+ artifactIds: ["paddle-pulse-m1-code"]
1608
+ },
1609
+ {
1610
+ kind: "explain",
1611
+ instruction: "Explain how paddle width and bounce angle changed the energy ball path.",
1612
+ artifactIds: []
1613
+ },
1614
+ {
1615
+ kind: "reward",
1616
+ instruction: "Collect the evidence-bound badge when the score and safety check pass.",
1617
+ artifactIds: []
1618
+ }
1619
+ ],
1620
+ readinessChecks: [
1621
+ {
1622
+ id: "paddle-pulse-m1-find-angle",
1623
+ prompt: "Point to the setting that changes the direction of the bounce.",
1624
+ scored: false
1625
+ }
1626
+ ],
1627
+ artifacts: [
1628
+ {
1629
+ id: "paddle-pulse-m1-code",
1630
+ kind: "starter-code",
1631
+ audience: "learner",
1632
+ solutionBearing: false
1633
+ },
1634
+ {
1635
+ id: "paddle-pulse-m1-art",
1636
+ kind: "starter-assets",
1637
+ audience: "learner",
1638
+ solutionBearing: false
1639
+ },
1640
+ {
1641
+ id: "paddle-pulse-m1-printable",
1642
+ kind: "printable",
1643
+ audience: "learner",
1644
+ solutionBearing: false
1645
+ }
1646
+ ],
1647
+ goals: [
1648
+ {
1649
+ id: "paddle-pulse-m1-starts",
1650
+ statement: "The JavaScript settings are valid and the private preview starts.",
1651
+ visibility: "visible",
1652
+ criterionIds: ["paddle-pulse-build"],
1653
+ completionRequired: true,
1654
+ aiRequired: false
1655
+ },
1656
+ {
1657
+ id: "paddle-pulse-m1-controlled-bounce",
1658
+ statement: "The paddle returns the energy ball toward the target wall with a controllable angle.",
1659
+ visibility: "visible",
1660
+ criterionIds: [
1661
+ "paddle-pulse-goal-one",
1662
+ "paddle-pulse-goal-two"
1663
+ ],
1664
+ completionRequired: true,
1665
+ aiRequired: false
1666
+ },
1667
+ {
1668
+ id: "paddle-pulse-m1-private-runtime",
1669
+ statement: "The game stays inside the private educational preview boundary.",
1670
+ visibility: "visible",
1671
+ criterionIds: ["paddle-pulse-safety"],
1672
+ completionRequired: true,
1673
+ aiRequired: false
1674
+ }
1675
+ ],
1676
+ interactions: [
1677
+ {
1678
+ id: "paddle-pulse-m1-run-control",
1679
+ description: "Start the private energy-court simulation.",
1680
+ primaryMode: "pointer",
1681
+ alternativeIds: ["paddle-pulse-m1-keyboard-run"]
1682
+ },
1683
+ {
1684
+ id: "paddle-pulse-m1-paddle-control",
1685
+ description: "Move the paddle left or right during practice.",
1686
+ primaryMode: "keyboard",
1687
+ alternativeIds: []
1688
+ },
1689
+ {
1690
+ id: "paddle-pulse-m1-ball-motion",
1691
+ description: "Observe the energy ball moving and bouncing across the court.",
1692
+ primaryMode: "motion",
1693
+ alternativeIds: ["paddle-pulse-m1-telemetry"]
1694
+ }
1695
+ ],
1696
+ accessibilityAlternatives: [
1697
+ {
1698
+ id: "paddle-pulse-m1-keyboard-run",
1699
+ modes: ["keyboard"],
1700
+ equivalentOutcome: true,
1701
+ description: "Press Enter or Space on the play-icon Run button to start the same preview."
1702
+ },
1703
+ {
1704
+ id: "paddle-pulse-m1-telemetry",
1705
+ modes: ["text", "reduced-motion"],
1706
+ equivalentOutcome: true,
1707
+ description: "Use position, direction and target-status text instead of ball animation."
1708
+ }
1709
+ ],
1710
+ evidenceRequirements: [
1711
+ {
1712
+ id: "paddle-pulse-m1-assessment",
1713
+ goalIds: [
1714
+ "paddle-pulse-m1-starts",
1715
+ "paddle-pulse-m1-controlled-bounce",
1716
+ "paddle-pulse-m1-private-runtime"
1717
+ ],
1718
+ kind: "assessment-result",
1719
+ retention: "entitlement",
1720
+ containsPersonalData: false
1721
+ },
1722
+ {
1723
+ id: "paddle-pulse-m1-explanation",
1724
+ goalIds: ["paddle-pulse-m1-controlled-bounce"],
1725
+ kind: "learner-explanation",
1726
+ retention: "attempt",
1727
+ containsPersonalData: false
1728
+ }
1729
+ ],
1730
+ sideAdventures: [
1731
+ {
1732
+ id: "paddle-pulse-m1-remix",
1733
+ prompt: "Invent an original energy power-up and describe one bounded setting it would change.",
1734
+ completionRequired: false
1735
+ }
1736
+ ],
1737
+ rewardBindings: [
1738
+ {
1739
+ id: "paddle-pulse-m1-badge",
1740
+ badgeId: "paddle-pulse-mission-complete",
1741
+ goalIds: [
1742
+ "paddle-pulse-m1-starts",
1743
+ "paddle-pulse-m1-controlled-bounce",
1744
+ "paddle-pulse-m1-private-runtime"
1745
+ ],
1746
+ deterministic: true,
1747
+ random: false,
1748
+ tokenConvertible: false
1749
+ }
1750
+ ]
1751
+ },
1752
+ facilitator: {
1753
+ artifacts: [
1754
+ {
1755
+ id: "paddle-pulse-m1-answer-key",
1756
+ kind: "answer-key",
1757
+ audience: "facilitator",
1758
+ solutionBearing: true
1759
+ },
1760
+ {
1761
+ id: "paddle-pulse-m1-protected-tests",
1762
+ kind: "protected-test",
1763
+ audience: "facilitator",
1764
+ solutionBearing: true
1765
+ }
1766
+ ],
1767
+ protectedGoals: [
1768
+ {
1769
+ id: "paddle-pulse-m1-protected-resilience",
1770
+ statement: "The runtime clamps unsafe settings and terminates bounded collision simulations.",
1771
+ visibility: "protected",
1772
+ criterionIds: [
1773
+ "paddle-pulse-edge-one",
1774
+ "paddle-pulse-edge-two"
1775
+ ],
1776
+ completionRequired: false,
1777
+ aiRequired: false
1778
+ }
1779
+ ],
1780
+ prompts: [
1781
+ "Ask the learner which setting changes direction before suggesting a code edit.",
1782
+ "Use visible telemetry and the function reference; never reveal protected numeric targets or expected source fragments."
1783
+ ]
1784
+ }
1785
+ };
1344
1786
  var ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1 = {
1345
1787
  version: MISSION_AUTHORING_CONTRACT_VERSION_V1,
1346
1788
  moduleId: "junior-coder.road-hopper-rally",
@@ -1696,8 +2138,10 @@ ${summary}`);
1696
2138
  JUNIOR_CODER_ROBOT_RESCUE_PATH_V1,
1697
2139
  JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
1698
2140
  MISSION_AUTHORING_CONTRACT_VERSION_V1,
2141
+ PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
1699
2142
  ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
1700
2143
  ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
2144
+ SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1,
1701
2145
  assertValidLearningPath,
1702
2146
  assertValidMissionAuthoringBundle,
1703
2147
  calculateAssessment,