BotRobotManifest bot.robot-manifest@1
Generated at from
openvibe-contracts v0.419.0 and
openvibe-sdk v0.161.0.
- Version
- 1.0.0
- Owner
- bot
- Visibility
- public
- Status
- active
- Compatibility
- backward
- Decision
- ADR-043
- Schema
https://openvibe.network/contracts/bot/robot-manifest.v1.json
bot.robot-manifest@1: what a robot's driver says the robot can do, written and versioned by the driver's maker (a Link plugin's author), so a new control is a version bump of the manifest instead of an OpenVibe release. Each command names its kind, its class (motion moves something and is held to a lifetime and a release; state sets something that stays, like a light; action happens once), its value's fields and ranges, how long it lives, the delivery window Bot gives it, the time it must still have left when the robot reads it, how often it may be sent, what the robot does when no fresh command comes (release), and which control draws it. Each telemetry entry names a reading the driver reports, its fields, its unit and range, where it comes from, and the control that shows it. Bot derives the panel and the ui.surface@1 parts from it, Link forwards only the kinds it declares, and OpenVibe AI reads the same facts when it suggests a layout or writes a control. The manifest is data: no code and no addresses.
Fields
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
id | string | yes | The robot model this manifest describes, e.g. looi. The same id as its Bot profile. |
|
name | string | yes | What people call the robot. |
|
by | string | The maker of the driver that publishes this manifest (an OpenVibe username). |
| |
version | string | yes | The manifest's own version (semver). A new or changed command is a new version; a frozen version is never edited. |
|
frozen | boolean | True once the maker and OpenVibe have checked this version against the driver's real command list: it is the contract both sides hold to. | ||
description | string |
| ||
commands | https://openvibe.network/contracts/bot/robot-manifest.v1.json#/$defs/command | yes |
| |
telemetry | https://openvibe.network/contracts/bot/robot-manifest.v1.json#/$defs/reading |
|
Examples
From the contract's own test fixtures: valid ones validate, rejected ones must fail.
Valid: looi
{
"id": "looi",
"name": "LOOI",
"by": "maticus",
"version": "1.0.0",
"frozen": false,
"description": "LOOI through the P7 tray (Maticus's driver), from the tray's command list of 2026-11-12; frozen once he has checked it.",
"commands": [
{
"kind": "drive",
"class": "motion",
"label": "Drive",
"value": {
"throttle": [
-1,
1
],
"steer": [
-1,
1
]
},
"lifetime_ms": 500,
"delivery_ms": {
"min": 1,
"max": 300
},
"release": "stop",
"control": "stick"
},
{
"kind": "actuator",
"name": "head",
"class": "motion",
"label": "Head",
"value": {
"head": [
-1,
1
]
},
"lifetime_ms": 500,
"delivery_ms": {
"min": 1,
"max": 300
},
"release": "hold",
"control": "slider"
},
{
"kind": "headlight",
"class": "state",
"label": "Headlights",
"value": {
"on": "boolean"
},
"delivery_ms": {
"min": 1,
"max": 250
},
"min_left_ms": 50,
"rate_per_s": 2,
"release": "none",
"latched": true,
"confirm": "p7_headlight",
"control": "toggle"
}
],
"telemetry": [
{
"key": "battery",
"label": "Battery",
"unit": "%",
"range": [
0,
100
],
"source": "poll",
"control": "meter"
},
{
"key": "p7_battery",
"label": "Battery details",
"unit": "%",
"range": [
0,
100
],
"fields": {
"pct": [
0,
100
],
"usb": "boolean",
"raw": "integer",
"at": "ms",
"unverified": "boolean"
},
"source": "poll",
"control": "readout",
"optional": [
"unverified"
]
},
{
"key": "p7_commander",
"label": "Who is driving",
"fields": {
"subject": "string",
"role": [
"owner",
"mod",
"operator"
],
"channel": [
"drive",
"head",
"headlight"
],
"at": "ms"
},
"source": "push",
"control": "badge"
},
{
"key": "p7_headlight",
"label": "Headlights",
"fields": {
"commanded": "boolean",
"pending": "boolean",
"physical_state_verified": "boolean"
},
"source": "push",
"control": "badge"
}
]
}Rejected: actuator-without-name
{
"id": "looi",
"name": "LOOI",
"by": "maticus",
"version": "1.0.0",
"frozen": false,
"description": "LOOI through the P7 tray (Maticus's driver), from the tray's command list of 2026-11-12; frozen once he has checked it.",
"commands": [
{
"kind": "drive",
"class": "motion",
"label": "Drive",
"value": {
"throttle": [
-1,
1
],
"steer": [
-1,
1
]
},
"lifetime_ms": 500,
"delivery_ms": {
"min": 1,
"max": 300
},
"release": "stop",
"control": "stick"
},
{
"kind": "actuator",
"class": "motion",
"label": "Head",
"value": {
"head": [
-1,
1
]
},
"lifetime_ms": 500,
"delivery_ms": {
"min": 1,
"max": 300
},
"release": "hold",
"control": "slider"
},
{
"kind": "headlight",
"class": "state",
"label": "Headlights",
"value": {
"on": "boolean"
},
"delivery_ms": {
"min": 1,
"max": 250
},
"min_left_ms": 50,
"rate_per_s": 2,
"release": "none",
"latched": true,
"confirm": "p7_headlight",
"control": "toggle"
}
],
"telemetry": [
{
"key": "battery",
"label": "Battery",
"unit": "%",
"range": [
0,
100
],
"source": "poll",
"control": "meter"
},
{
"key": "p7_battery",
"label": "Battery details",
"unit": "%",
"range": [
0,
100
],
"fields": {
"pct": [
0,
100
],
"usb": "boolean",
"raw": "integer",
"at": "ms",
"unverified": "boolean"
},
"source": "poll",
"control": "readout",
"optional": [
"unverified"
]
},
{
"key": "p7_commander",
"label": "Who is driving",
"fields": {
"subject": "string",
"role": [
"owner",
"mod",
"operator"
],
"channel": [
"drive",
"head",
"headlight"
],
"at": "ms"
},
"source": "push",
"control": "badge"
},
{
"key": "p7_headlight",
"label": "Headlights",
"fields": {
"commanded": "boolean",
"pending": "boolean",
"physical_state_verified": "boolean"
},
"source": "push",
"control": "badge"
}
]
}Rejected: motion-released-never
{
"id": "looi",
"name": "LOOI",
"by": "maticus",
"version": "1.0.0",
"frozen": false,
"description": "LOOI through the P7 tray (Maticus's driver), from the tray's command list of 2026-11-12; frozen once he has checked it.",
"commands": [
{
"kind": "drive",
"class": "motion",
"label": "Drive",
"value": {
"throttle": [
-1,
1
],
"steer": [
-1,
1
]
},
"lifetime_ms": 500,
"delivery_ms": {
"min": 1,
"max": 300
},
"release": "none",
"control": "stick"
},
{
"kind": "actuator",
"name": "head",
"class": "motion",
"label": "Head",
"value": {
"head": [
-1,
1
]
},
"lifetime_ms": 500,
"delivery_ms": {
"min": 1,
"max": 300
},
"release": "hold",
"control": "slider"
},
{
"kind": "headlight",
"class": "state",
"label": "Headlights",
"value": {
"on": "boolean"
},
"delivery_ms": {
"min": 1,
"max": 250
},
"min_left_ms": 50,
"rate_per_s": 2,
"release": "none",
"latched": true,
"confirm": "p7_headlight",
"control": "toggle"
}
],
"telemetry": [
{
"key": "battery",
"label": "Battery",
"unit": "%",
"range": [
0,
100
],
"source": "poll",
"control": "meter"
},
{
"key": "p7_battery",
"label": "Battery details",
"unit": "%",
"range": [
0,
100
],
"fields": {
"pct": [
0,
100
],
"usb": "boolean",
"raw": "integer",
"at": "ms",
"unverified": "boolean"
},
"source": "poll",
"control": "readout",
"optional": [
"unverified"
]
},
{
"key": "p7_commander",
"label": "Who is driving",
"fields": {
"subject": "string",
"role": [
"owner",
"mod",
"operator"
],
"channel": [
"drive",
"head",
"headlight"
],
"at": "ms"
},
"source": "push",
"control": "badge"
},
{
"key": "p7_headlight",
"label": "Headlights",
"fields": {
"commanded": "boolean",
"pending": "boolean",
"physical_state_verified": "boolean"
},
"source": "push",
"control": "badge"
}
]
}Rejected: motion-without-release
{
"id": "looi",
"name": "LOOI",
"by": "maticus",
"version": "1.0.0",
"frozen": false,
"description": "LOOI through the P7 tray (Maticus's driver), from the tray's command list of 2026-11-12; frozen once he has checked it.",
"commands": [
{
"kind": "drive",
"class": "motion",
"label": "Drive",
"value": {
"throttle": [
-1,
1
],
"steer": [
-1,
1
]
},
"lifetime_ms": 500,
"delivery_ms": {
"min": 1,
"max": 300
},
"control": "stick"
},
{
"kind": "actuator",
"name": "head",
"class": "motion",
"label": "Head",
"value": {
"head": [
-1,
1
]
},
"lifetime_ms": 500,
"delivery_ms": {
"min": 1,
"max": 300
},
"release": "hold",
"control": "slider"
},
{
"kind": "headlight",
"class": "state",
"label": "Headlights",
"value": {
"on": "boolean"
},
"delivery_ms": {
"min": 1,
"max": 250
},
"min_left_ms": 50,
"rate_per_s": 2,
"release": "none",
"latched": true,
"confirm": "p7_headlight",
"control": "toggle"
}
],
"telemetry": [
{
"key": "battery",
"label": "Battery",
"unit": "%",
"range": [
0,
100
],
"source": "poll",
"control": "meter"
},
{
"key": "p7_battery",
"label": "Battery details",
"unit": "%",
"range": [
0,
100
],
"fields": {
"pct": [
0,
100
],
"usb": "boolean",
"raw": "integer",
"at": "ms",
"unverified": "boolean"
},
"source": "poll",
"control": "readout",
"optional": [
"unverified"
]
},
{
"key": "p7_commander",
"label": "Who is driving",
"fields": {
"subject": "string",
"role": [
"owner",
"mod",
"operator"
],
"channel": [
"drive",
"head",
"headlight"
],
"at": "ms"
},
"source": "push",
"control": "badge"
},
{
"key": "p7_headlight",
"label": "Headlights",
"fields": {
"commanded": "boolean",
"pending": "boolean",
"physical_state_verified": "boolean"
},
"source": "push",
"control": "badge"
}
]
}Validate
const contracts = require('openvibe-contracts');
contracts.validate('bot.robot-manifest@1', value); // { valid, errors: [{ path, message }] }