{
  "schemaVersion": 1,
  "id": "robot-custom-1793249103515",
  "name": "Spark · Blank-build emoji companion",
  "template": "custom",
  "parts": [
    {
      "id": "emoji-body-e02955",
      "defId": "emoji-body",
      "name": "Emoji enclosure",
      "position": [
        0,
        0.066,
        0
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 1
      }
    },
    {
      "id": "battery-9e3701",
      "defId": "battery",
      "name": "2S battery · 2.2 Ah",
      "position": [
        -0.02,
        0.095,
        0
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "emoji-body-e02955"
    },
    {
      "id": "regulator-2c5ce8",
      "defId": "regulator",
      "name": "5 V buck regulator",
      "position": [
        -0.035,
        0.145,
        -0.025
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "emoji-body-e02955"
    },
    {
      "id": "esp32-devkit-792f52",
      "defId": "esp32-devkit",
      "name": "ESP32 DevKit · virtual controller",
      "position": [
        0,
        0.145,
        0.025
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "emoji-body-e02955"
    },
    {
      "id": "servo-c28db0",
      "defId": "servo",
      "name": "Position servo",
      "position": [
        0,
        0.17,
        0
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0,
        "kinematicJoint": 1,
        "motionAxisX": 0,
        "motionAxisY": 1,
        "motionAxisZ": 0
      },
      "parentId": "emoji-body-e02955"
    },
    {
      "id": "display-3fcdcd",
      "defId": "display",
      "name": "Emoji OLED display",
      "position": [
        0.078,
        0.18,
        0
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "servo-c28db0"
    }
  ],
  "wires": [
    {
      "id": "a9fb817d-5c7d-4dda-bbf6-ba14a9d21a06",
      "from": {
        "part": "battery-9e3701",
        "pin": "POS"
      },
      "to": {
        "part": "regulator-2c5ce8",
        "pin": "VIN"
      }
    },
    {
      "id": "6fb00fff-0581-433c-9e71-ec3ac8adbdf1",
      "from": {
        "part": "battery-9e3701",
        "pin": "GND"
      },
      "to": {
        "part": "regulator-2c5ce8",
        "pin": "GND"
      }
    },
    {
      "id": "450fdec9-f750-41d4-bd2e-154de8004fab",
      "from": {
        "part": "regulator-2c5ce8",
        "pin": "VOUT"
      },
      "to": {
        "part": "esp32-devkit-792f52",
        "pin": "VIN"
      }
    },
    {
      "id": "a3c8cb41-ec72-4e31-b7d9-622eb6d982d6",
      "from": {
        "part": "battery-9e3701",
        "pin": "GND"
      },
      "to": {
        "part": "esp32-devkit-792f52",
        "pin": "GND"
      }
    },
    {
      "id": "2fb2c054-64fe-4949-a593-6bbfb6ef1717",
      "from": {
        "part": "regulator-2c5ce8",
        "pin": "VOUT"
      },
      "to": {
        "part": "servo-c28db0",
        "pin": "VCC"
      }
    },
    {
      "id": "8c9e1370-3aee-470b-b022-3968cb02ee80",
      "from": {
        "part": "battery-9e3701",
        "pin": "GND"
      },
      "to": {
        "part": "servo-c28db0",
        "pin": "GND"
      }
    },
    {
      "id": "2d666095-445b-4b31-a66c-c696d14efb15",
      "from": {
        "part": "regulator-2c5ce8",
        "pin": "VOUT"
      },
      "to": {
        "part": "display-3fcdcd",
        "pin": "VCC"
      }
    },
    {
      "id": "584f9f52-0482-4137-a971-495ecca256e0",
      "from": {
        "part": "battery-9e3701",
        "pin": "GND"
      },
      "to": {
        "part": "display-3fcdcd",
        "pin": "GND"
      }
    },
    {
      "id": "d816311e-1e7d-49bf-b8e6-33605ab02f53",
      "from": {
        "part": "esp32-devkit-792f52",
        "pin": "SDA"
      },
      "to": {
        "part": "display-3fcdcd",
        "pin": "SDA"
      }
    },
    {
      "id": "bb134310-7e32-4990-9ad1-acd1f902844e",
      "from": {
        "part": "esp32-devkit-792f52",
        "pin": "SCL"
      },
      "to": {
        "part": "display-3fcdcd",
        "pin": "SCL"
      }
    },
    {
      "id": "d2074f11-4198-4e6a-8693-3a06da8ecf54",
      "from": {
        "part": "esp32-devkit-792f52",
        "pin": "SERVO_1"
      },
      "to": {
        "part": "servo-c28db0",
        "pin": "PWM"
      }
    }
  ],
  "groups": [],
  "diagramPositions": {
    "battery-9e3701": {
      "x": 40,
      "y": 40
    },
    "regulator-2c5ce8": {
      "x": 40,
      "y": 199
    },
    "esp32-devkit-792f52": {
      "x": 392,
      "y": 40
    },
    "servo-c28db0": {
      "x": 744,
      "y": 40
    },
    "display-3fcdcd": {
      "x": 744,
      "y": 257
    }
  },
  "code": "// Spark: built one component at a time from an empty workbench.\nlet last = -1;\nfunction step(robot) {\n  robot.drive(0, 0);\n  if (robot.brownout) return;\n  const stage = Math.floor(robot.time / 2) % 3;\n  robot.display(['😊', '🤖', '◕ ◕'][stage]);\n  robot.servo('servo-c28db0', Math.sin(robot.time) * 0.35);\n  if (stage !== last) { robot.log('Spark expression', stage); last = stage; }\n}\n",
  "environment": {
    "scenario": "workbench",
    "slope": 0,
    "friction": 0.8,
    "payload": 0,
    "seed": 42,
    "initialSoc": 1,
    "obstacles": []
  },
  "ai": {
    "provider": "replay",
    "endpoint": "",
    "model": "recorded-rover-guide",
    "timeoutMs": 15000,
    "prompt": "You control a simulated robot. Use bounded wheel commands. Stop when sensors are unavailable or battery is low. Describe your intended action briefly.",
    "vision": false
  },
  "createdAt": "2026-10-29T04:45:03.515Z",
  "updatedAt": "2026-10-29T04:48:55.078Z"
}