# Why the cloud can request but never actuate Diyar's cloud and mobile clients can ask an edge device to start a run, but nothing in the protocol lets them force it. This unit covers the shape of a remote-start request, why the cloud holds no actuation primitive at all, and the one config-only exception carved out for the device shadow. ## Where a run can be started An operator starts a run at the kiosk on the LAN, or remotely from a web or mobile client. Both paths reach the same one door: the edge validates every request locally before anything is energized. ## The signed, vetoable remote-start request A remote start is a **signed, device-bound, nonce- and TTL-limited request** that the edge independently validates and **may veto** — heater actuation is not something the cloud protocol can represent directly. Every route is authenticated and tenant-scoped, but authentication only gets a request to the edge's own door; it is the edge, not the cloud, that decides whether the door opens. This holds for automated callers too: any tool that wraps the remote-start path is exactly that — a wrapper over the same signed contract the edge already verifies and can refuse. Adding a caller never adds a second way in. ## Authority is one-directional - No cloud primitive energizes anything: the cloud can request, advise, and mirror state; by design, it holds no primitive that turns heat on. - There is deliberately no broadcast actuation primitive anywhere in the system — mass remote ignition is named as the top threat the architecture defends against, not a capability it offers. - Even a fully compromised cloud component still only reaches the edge's verify-and-veto gate; it cannot skip it. > [!IMPORTANT] > This is a design invariant, not a today's-implementation detail: the accepted architecture blueprint states that the signed, edge-verified, edge-vetoable session start is the *only* path to energy, "for agents too" — nothing added later is allowed to introduce a second one. ## The device shadow: desired state is config-class only Diyar keeps a device shadow with a reported half and a desired half (plus a version, for optimistic concurrency). This is deliberately different from how some other IoT platforms use a device twin's desired state: - **Desired is config-class only** — things like the OTA update channel, the sampling interval, or log verbosity — drawn from an allow-list derived from the device's profile. - Writing a desired value is **never** actuation. The edge treats desired state purely as advisory configuration that it acknowledges back into reported state. - Actuation stays exclusively on the signed session-start path with edge veto, full stop. As of the most recent delivery record, the cloud-to-device half of this is wired for on-prem deployments: a config-class desired value is published to the device over the local broker, and the edge **re-validates every delivered key, fail-closed, against the same config-class allow-list** before applying it — so even a broker an attacker fully controls cannot push anything past config-class. > [!NOTE] > A separate, write-only "advisory commands" path was considered and then removed from the contract rather than kept around unused — one fewer door is safer than a door nobody uses. Delivering desired state onto AWS IoT's shadow mechanism is a documented follow-up, not yet built; the edge side needs no change when it lands, because it already subscribes to that channel. ## Why the boundary is drawn here The recurring theme across the request path and the shadow is the same: every surface that reaches the cloud terminates in something the edge can refuse or ignore, never something the edge is compelled to obey. A signed request can be vetoed. A desired-state write can only ever mean configuration. Authority over energy stays local to the device that has to answer for what it did — which is also why the evidence it produces has to be trustworthy on its own, covered next.