{
  "schema": "amr.rosieos.nats-subjects.v1",
  "docs": "https://advancedmetalresearch.com/docs/reference/nats-subjects",
  "source": "reference/nats-subjects.md",
  "description": "Every NATS subject and JetStream stream RosieOS publishes or subscribes to, from the NATS subjects page (which cites the source files). Tokens in <angle brackets> are deployment values. `authority` says whether a subject carries command authority.",
  "subjects": [
    {
      "subject": "robot/v4/rtcore.<host>.status",
      "publisher": "rt-natspublisher",
      "subscriber": "Displays, archives",
      "payload": "JSON robot.v4.rtcore.status.v1",
      "payload_schema": "robot.v4.rtcore.status.v1",
      "authority": "None"
    },
    {
      "subject": "robot/v4/rtcore.<host>.telemetry.batch",
      "publisher": "rt-natspublisher",
      "subscriber": "Displays, archives",
      "payload": "JSON robot.v4.rtcore.telemetry.batch.v1",
      "payload_schema": "robot.v4.rtcore.telemetry.batch.v1",
      "authority": "None"
    },
    {
      "subject": "rosie/rt-core.<host>.telemetry.v1",
      "publisher": "rt-natspublisher",
      "subscriber": "Archives",
      "payload": "Binary TelemetryBatch",
      "payload_schema": "TelemetryBatch",
      "authority": "None"
    },
    {
      "subject": "robot/v4/robot.<cell>.command",
      "publisher": "Controllers",
      "subscriber": "Cartesian motion server, dense trajectory daemon",
      "payload": "JSON robot.v4.robot-command.v1",
      "payload_schema": "robot.v4.robot-command.v1",
      "authority": "Leader lease commands and motion commands"
    },
    {
      "subject": "NATS reply subject of each command",
      "publisher": "Motion servers",
      "subscriber": "The sender",
      "payload": "JSON robot.v4.command-reply.v1",
      "payload_schema": "robot.v4.command-reply.v1",
      "authority": "None"
    },
    {
      "subject": "robot/v4/motion-server.<peer>.status",
      "publisher": "Cartesian motion server",
      "subscriber": "Controllers, displays",
      "payload": "JSON robot_v4_motion_server_cartesian_live_status_v1",
      "payload_schema": "robot_v4_motion_server_cartesian_live_status_v1",
      "authority": "None"
    },
    {
      "subject": "robot/v4/motion-server.<peer>.plan",
      "publisher": "Cartesian motion server (self-test plan paths)",
      "subscriber": "—",
      "payload": "JSON",
      "payload_schema": null,
      "authority": "None"
    },
    {
      "subject": "rt_core.status_subject, default <command subject>.status",
      "publisher": "Dense trajectory daemon",
      "subscriber": "Controllers",
      "payload": "JSON executor status",
      "payload_schema": null,
      "authority": "None"
    },
    {
      "subject": "--status-publish-subject",
      "publisher": "Dense trajectory daemon",
      "subscriber": "Controllers",
      "payload": "JSON ingest and executor status",
      "payload_schema": null,
      "authority": "None"
    }
  ],
  "streams": [
    {
      "stream": "ROBOT_V4_RTCORE",
      "subjects": "robot/v4/rtcore.>",
      "retention": "limits, file storage, discard old",
      "limits": "250,000 messages, 256 MiB, 10 minutes"
    },
    {
      "stream": "ROSIE_RT_CORE_TELEMETRY",
      "subjects": "rosie/rt-core.*.telemetry.v1",
      "retention": "limits, file storage, discard old",
      "limits": "no message or age limit; --telemetry-max-bytes"
    }
  ],
  "commands": {
    "Lease commands": {
      "cartesian_motion_server": "leader_acquire, leader_renew, leader_release, leader_cancel",
      "dense_trajectory_daemon": "leader_acquire, leader_renew, leader_release"
    },
    "Lease request fields": {
      "cartesian_motion_server": "controller_boot_id, request_id, campaign_generation, ttl_ms, lease_id, fence_epoch",
      "dense_trajectory_daemon": "controller_boot_id, ttl_ms, lease_id, leader_fence_epoch"
    },
    "Motion credential fields": {
      "cartesian_motion_server": "controller_boot_id, leader_lease_id, leader_fence_epoch",
      "dense_trajectory_daemon": "the same, plus motion_intent_seq"
    },
    "Allowed senders": {
      "cartesian_motion_server": "Roles in the manifest's leader_controller_roles (default steamdeck)",
      "dense_trajectory_daemon": "offline-programming:<instance> only"
    },
    "TTL": {
      "cartesian_motion_server": "500–2000 ms",
      "dense_trajectory_daemon": "leader.ttl_min_ms–leader.ttl_max_ms (500–2000 ms by default)"
    },
    "Commands": {
      "cartesian_motion_server": "arm, disarm, home, go_home, position, stop, end_run",
      "dense_trajectory_daemon": "play, pause, go_home, stop"
    }
  },
  "publisher_settings": [
    {
      "flag": "--socket PATH",
      "environment": "—",
      "default": "/run/rosie-rt-core/public/control.sock",
      "description": "The public rt-control socket"
    },
    {
      "flag": "--nats-url URL",
      "environment": "ROSIE_RT_NATS_URL",
      "default": "none",
      "description": "nats://host:port. Credentials, TLS and paths in the URL are refused."
    },
    {
      "flag": "--host NAME",
      "environment": "ROSIE_RT_NATS_HOST",
      "default": "none",
      "description": "The deployment's identity in the subject. Must be concrete: not empty, not unknown, no @ / ? # = , \\ \" ' * > or whitespace."
    },
    {
      "flag": "--cadence D",
      "environment": "ROSIE_RT_NATS_CADENCE",
      "default": "500ms",
      "description": "Status and telemetry-batch interval, whole milliseconds, 1 ms to 5 s"
    },
    {
      "flag": "--telemetry-cadence D",
      "environment": "ROSIE_RT_NATS_TELEMETRY_CADENCE",
      "default": "the status cadence",
      "description": "Binary telemetry polling interval"
    },
    {
      "flag": "--telemetry-max-bytes N",
      "environment": "ROSIE_RT_NATS_TELEMETRY_MAX_BYTES",
      "default": "536870912 (512 MiB)",
      "description": "Byte retention of the binary telemetry stream"
    },
    {
      "flag": "--print-env",
      "environment": "—",
      "default": "—",
      "description": "Validate the settings and print them as a systemd environment file"
    }
  ]
}
