Sentinel

The Sentinel daemon

What sentineld does on the robot host: supervision, config, telemetry, and dataset sync.

sentineld is the host daemon the installer sets up — one systemd service that supervises the runtime container and handles everything that touches the cloud. You interact with it through the sentinel CLI.

What it manages

ResponsibilityBehavior
IdentityEnrolls once with a license key; stores the device identity in /var/lib/sentinel/identity/ and mints short-lived tokens from it
Runtime lifecyclePulls the runtime image for the platform, starts and supervises the container, restarts on crashes, reports stack state
ConfigurationFetches the robot's active config, caches it by content hash, mounts it into the container. Offline, it runs the last known-good config
TelemetryShips runtime and host logs, metrics (CPU, memory, disk, temperature), and lifecycle events
Dataset syncSyncs finalized episodes to configured destinations

sentinel stop stops only the runtime container; the daemon stays up and keeps syncing. See the CLI reference for commands and file locations.

Dataset sync

The daemon discovers each finalized episode on disk, reports its metadata to the platform, then transfers the files:

  • For every episode it requests an upload grant and receives short-lived presigned URLs for the routed destination. It stores no bucket credentials and doesn't choose where data goes.
  • Transfers pause during active teleoperation and resume when the session ends. The decision is local — no cloud round trip.
  • Upload progress is journaled per file part. A crash or power loss mid-transfer resumes where it left off.
  • After upload, the platform checks the reported checksums against the episode's manifest before marking the copy verified. Only verified copies count toward retention.
  • If the disk fills, the daemon reports backlog and free-space pressure. It never deletes unverified episodes to make room.
  • An offline robot catches up on its own: reporting, granting, and uploading retry with backoff, and state reconciles with the platform on boot.
sentinel data status   # per-episode and per-destination sync state, backlog totals
sentinel data push     # trigger a sync pass now instead of waiting for the timer

Sync states progress reported → granted → uploading → synced → verified per destination — the same states the dashboard and the episodes API show as replicas.

Episodes on disk

/var/lib/sentinel/datasets/    # host path — mounted into the runtime container at /datasets

Layout, marker files, and metadata format: Using your data. Reading the directory directly is supported; the daemon uploads the same files unchanged.

Don't move or delete files under datasets/ by hand. The episode stays listed as reported-but-unsynced and shows up in sync health as missing. Let retention policy prune verified episodes instead.

Network posture

Outbound HTTPS only: the daemon calls the platform and uploads to presigned URLs. Nothing connects in. The local control socket (/run/sentinel/) is permissioned to the local user.