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
| Responsibility | Behavior |
|---|---|
| Identity | Enrolls once with a license key; stores the device identity in /var/lib/sentinel/identity/ and mints short-lived tokens from it |
| Runtime lifecycle | Pulls the runtime image for the platform, starts and supervises the container, restarts on crashes, reports stack state |
| Configuration | Fetches the robot's active config, caches it by content hash, mounts it into the container. Offline, it runs the last known-good config |
| Telemetry | Ships runtime and host logs, metrics (CPU, memory, disk, temperature), and lifecycle events |
| Dataset sync | Syncs 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 timerSync 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 /datasetsLayout, 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.