RCAN Protocol Specification

Version 1.0.0 | Draft


1. Robot URI (RURI)

Every robot has a globally unique RURI:

rcan://<registry>/<manufacturer>/<model>/<device-id>[:<port>][/<capability>]

Examples

rcan://continuon.cloud/continuon/companion-v1/d3a4b5c6-7890-1234-5678-abcdef012345
rcan://continuon.cloud/continuon/companion-v1/d3a4b5c6/arm
rcan://local.rcan/discovered/192.168.1.42:8080
rcan://my-server.lan/acme/bot-x1/a1b2c3d4:9000/teleop

Components

ComponentDescriptionRequired
registryRoot registry domain (e.g., continuon.cloud, local.rcan)Yes
manufacturerManufacturer namespaceYes
modelRobot model identifierYes
device-idUUID or short-form (8 hex chars)Yes
portCommunication port (default: 8080)No
capabilitySpecific endpoint (e.g., /arm, /vision)No

Validation Regex

^rcan://([a-z0-9][a-z0-9.-]*[a-z0-9])/([a-z0-9][a-z0-9-]*[a-z0-9])/([a-z0-9][a-z0-9-]*[a-z0-9])/([0-9a-f]{8}(?:-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})?)(?::(\d{1,5}))?(/[a-z][a-z0-9/-]*)?$

2. Role-Based Access Control

RCAN defines a five-level role hierarchy:

RoleLevelKey Permissions
CREATOR5Full hardware/software control, OTA push, safety override
OWNER4Configuration, skill installation, user management
LEASEE3Time-bound operational control, cannot change ownership
USER2Operational control within allowed modes
GUEST1Limited interaction, chat, read-only status

Rule: Higher roles inherit all permissions of lower roles.


3. Message Format

All RCAN messages use a common envelope:

message RCANMessage {
  string version = 1;           // "1.0.0"
  string message_id = 2;        // UUID
  string source_ruri = 3;       // Sender RURI
  string target_ruri = 4;       // Recipient RURI (or "broadcast")
  string auth_token = 5;        // JWT session token
  MessageType type = 6;
  bytes payload = 7;            // Type-specific payload
  int64 timestamp_ms = 8;
  int32 ttl_ms = 9;             // Time-to-live (0 = no expiry)
  Priority priority = 10;
  
  enum MessageType {
    DISCOVER = 1;
    STATUS = 2;
    COMMAND = 3;
    STREAM = 4;
    EVENT = 5;
    HANDOFF = 6;
    ACK = 7;
    ERROR = 8;
  }
  
  enum Priority {
    LOW = 1;
    NORMAL = 2;
    HIGH = 3;
    SAFETY = 4;  // Always processed first
  }
}

4. Discovery (mDNS)

For LAN discovery without cloud connectivity:

_rcan._tcp.local.

TXT Records

ruri=rcan://continuon.cloud/continuon/companion-v1/d3a4b5c6
model=companion-v1
caps=arm,vision,chat,teleop
roles=owner,user,guest
version=1.0.0
name=Living Room Companion
status=idle

5. Authentication

RCAN uses JWT tokens for session management:

{
  "sub": "550e8400-e29b-41d4-a716-446655440000",
  "iss": "continuon.cloud",
  "aud": "rcan://continuon.cloud/continuon/companion-v1/*",
  "role": "owner",
  "scope": ["control", "config", "training"],
  "fleet": ["d3a4b5c6", "a1b2c3d4"],
  "exp": 1735689600,
  "iat": 1735603200
}

6. Safety Invariants

These are protocol requirements, not suggestions:

  1. Local safety always wins. No remote command can bypass on-device safety checks.
  2. Graceful degradation. Network loss triggers safe-stop, not undefined behavior.
  3. Audit trail. All commands logged with user, timestamp, and outcome.
  4. Rate limiting. Commands throttled per role (Guest: 10/min, User: 100/min, etc.).
  5. Timeout enforcement. Control sessions expire; explicit renewal required.

7. Federation

RCAN is federated like email, not centralized like a platform:

The Right to Redirect: An Owner (Level 4) can always change the robot's upstream registry.

Local Supremacy: Even if the cloud registry deletes your ID, local discovery (_rcan._tcp.local) always works.


→ Next: Conformance Tests