Specification · section 6

Lifecycle

client                                server
  │── initialize ───────────────────────▶│  version + capabilities
  │── device/describe ──────────────────▶│  descriptor into agent context
  │── session/acquire {ttl:600} ────────▶│  optional exclusive control
  │── signals/subscribe ────────────────▶│  optional streaming
  │── settings/write / actions/invoke ──▶│  operate (gated by §7)
  │◀─ notifications/... ─────────────────│
  │── session/renew (< watchdog_s) ─────▶│  keeps the lease and the watchdog fed
  │── session/release ──────────────────▶│

Watchdog. If the descriptor declares safety.watchdog_s, the watchdog is armed whenever a session holds the lease. Any request from the holder renews it; the reference client sends session/renew at a third of the window. If the holder is silent for longer than the window, or its lease expires without release, the server MUST fail safe: enter estop, cancel active jobs, run the stop hook, and drop the lease. Recovery needs a verified safety/reset. The watchdog protects against the controlling process dying or losing its connection; it does not notice a model that is alive but idle. A driver running inside the host process dies with the host, so host power loss is covered only by a device-side or hardware watchdog, which the descriptor should describe in safety.notes.

Versioning. protocolVersion is a date string, as in MCP. A server MUST answer initialize with the highest version it supports that is ≤ the client's; a client that receives an older version MUST either speak it or disconnect. The MCP bridge negotiates MCP versions separately: it answers with the client's version when it supports it, and otherwise with its newest supported version.