<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Edge Devices on Deevnet IoTaaS</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/</link><description>Recent content in Edge Devices on Deevnet IoTaaS</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/index.xml" rel="self" type="application/rss+xml"/><item><title>ADR-0038: Tenants Update Their Own Devices</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/0038-tenants-update-their-own-devices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/0038-tenants-update-their-own-devices/</guid><description>&lt;h1 id="adr-0038-tenants-update-their-own-devices-through-services-they-already-have">
 ADR-0038: Tenants Update Their Own Devices, Through Services They Already Have
 &lt;a class="anchor" href="#adr-0038-tenants-update-their-own-devices-through-services-they-already-have">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>Accepted (2026-10-17): already how the platform works. &lt;code>eds&lt;/code> updates its three devices over the air through the broker, under its own ADR-0035, with no platform service of its own&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-10-17&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>How new firmware reaches a tenant&amp;rsquo;s edge device once the device is in place, and where the image is kept. Not how the firmware is built or signed (
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/">ADR-0011&lt;/a> §4, unchanged), and not how a device reaches a tenant&amp;rsquo;s service in general (
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0020-direct-device-access-to-tenant-services/">ADR-0020&lt;/a>, unchanged).&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Extends&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/">ADR-0011&lt;/a>: answers the hosting bullet of open question 6, &lt;em>&amp;ldquo;where OTA images are hosted so the IoT segment can reach them&amp;rdquo;&lt;/em>. The question&amp;rsquo;s other bullets stay open.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Amends&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0012-iot-platform-api/">ADR-0012&lt;/a> §3: &lt;em>&amp;ldquo;firmware release hosting&amp;rdquo;&lt;/em> and &lt;em>&amp;ldquo;OTA&amp;rdquo;&lt;/em> leave its list of later platform layers. &lt;em>&amp;ldquo;Jobs&amp;rdquo;&lt;/em> stays.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Related&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0032-every-device-belongs-to-a-tenant/">ADR-0032&lt;/a> (every device belongs to a tenant), 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0034-tenants-deliver-their-own-code/">ADR-0034&lt;/a> (the same rule for workloads)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Firmware is already the owner&amp;rsquo;s.&lt;/strong> ADR-0011 §4 has firmware built and released by its owner,
from its owner&amp;rsquo;s repository, and keeps signing keys out of the substrate vault. ADR-0032 makes that
owner always a tenant.&lt;/p></description></item><item><title>ADR-0035: A Fixed Address for a Tenant's Device</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/0035-fixed-address-for-a-tenant-device/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/0035-fixed-address-for-a-tenant-device/</guid><description>&lt;h1 id="adr-0035-a-fixed-address-for-a-tenants-device">
 ADR-0035: A Fixed Address for a Tenant&amp;rsquo;s Device
 &lt;a class="anchor" href="#adr-0035-a-fixed-address-for-a-tenants-device">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>Accepted (2026-10-07), at the close of 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/2026/0044-tenant-device-addresses/">CHG-0044&lt;/a>, which built it.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-10-06&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>How a tenant&amp;rsquo;s device gets the same address every time on the device network, and what its name is. Not what may reach the device (
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0020-direct-device-access-to-tenant-services/">ADR-0020&lt;/a>, unchanged), and not its identity (
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/substrate/0031-deevnet-pki/">ADR-0031&lt;/a> §6).&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Amends&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/">ADR-0011&lt;/a> open question 2 and 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0012-iot-platform-api/">ADR-0012&lt;/a> §3 and open question 3: &amp;ldquo;leases from the IoT pool&amp;rdquo; becomes &amp;ldquo;leases from the pool unless its tenant reserves it an address&amp;rdquo;. &amp;ldquo;No substrate host record&amp;rdquo; stands.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Related&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0032-every-device-belongs-to-a-tenant/">ADR-0032&lt;/a> (every device has a tenant), 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/naming-and-dns/0004-tenant-dns-publication/">ADR-0004&lt;/a> (a tenant&amp;rsquo;s names are in its own zone), 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/substrate/0009-network-device-config-ownership/">ADR-0009&lt;/a> (inventory owns the segment), 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0033-code-is-the-state/">ADR-0033&lt;/a> (a tenant&amp;rsquo;s code restores it)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;p>&lt;strong>A tenant&amp;rsquo;s device leases whatever address the pool gives it.&lt;/strong> ADR-0011 decided that on
2026-09-15: an application-owned device takes no substrate host record, leases from the IoT pool,
and is named in its owner&amp;rsquo;s zone. The reasoning was that a device&amp;rsquo;s identity is its credential, not
its address, and that device churn should never become a substrate commit.&lt;/p></description></item><item><title>ADR-0032: Every Edge Device Belongs to a Tenant</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/0032-every-device-belongs-to-a-tenant/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/0032-every-device-belongs-to-a-tenant/</guid><description>&lt;h1 id="adr-0032-every-edge-device-belongs-to-a-tenant">
 ADR-0032: Every Edge Device Belongs to a Tenant
 &lt;a class="anchor" href="#adr-0032-every-edge-device-belongs-to-a-tenant">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>Accepted (2026-10-03): already how the platform works. The Deevnet API registers devices only under a tenant, and mabell is a tenant with devices and no workload.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-10-03&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>Who may own an edge device. Not where a device attaches, or how it reaches services (
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/">ADR-0011&lt;/a> §1–§4, unchanged).&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Amends&lt;/strong>&lt;/td>
 &lt;td>ADR-0011 §1, the &lt;em>Ownership&lt;/em> row: &amp;ldquo;the application, which may or may not be a tenant&amp;rdquo; becomes &amp;ldquo;the application, through its tenant&amp;rdquo;&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Related&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0012-iot-platform-api/">ADR-0012&lt;/a> (devices registered through the API), 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/substrate/0031-deevnet-pki/">ADR-0031&lt;/a> (tenant device identity)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;p>ADR-0011 split a device&amp;rsquo;s concerns across four owners, and gave &lt;strong>ownership&lt;/strong> to &amp;ldquo;the application,
which may or may not be a tenant&amp;rdquo;. That left room for a device whose owner is something other than a
tenant, without saying what that something would be.&lt;/p></description></item><item><title>ADR-0020: Direct Device Access to Tenant Services</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/0020-direct-device-access-to-tenant-services/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/0020-direct-device-access-to-tenant-services/</guid><description>&lt;h1 id="adr-0020-direct-device-access-to-tenant-services">
 ADR-0020: Direct Device Access to Tenant Services
 &lt;a class="anchor" href="#adr-0020-direct-device-access-to-tenant-services">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>Accepted&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Accepted&lt;/strong>&lt;/td>
 &lt;td>2026-09-19. What is accepted is a &lt;strong>contract&lt;/strong>, not a mechanism: the capability, where authorization lives, and what it must never become. The service that implements it is future work and needs no decision here.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-09-18&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Amended&lt;/strong>&lt;/td>
 &lt;td>2026-09-18 and 2026-09-19, both before acceptance. See 
 &lt;a href="#what-this-record-stopped-saying">What this record stopped saying&lt;/a>.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>How an application-owned device consumes a service belonging to its application when the broker&amp;rsquo;s publish/subscribe semantics do not fit, and where the authorization boundary sits&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Extends&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/">ADR-0011&lt;/a> — answers its &lt;strong>open question 5&lt;/strong>, &lt;em>&amp;ldquo;How does a device reach a service a tenant exposes directly?&amp;rdquo;&lt;/em>. 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0012-iot-platform-api/">ADR-0012&lt;/a> — which built the rendezvous shape for publish/subscribe and, until amended, read as though that were the only shape. Both stay &lt;code>Accepted&lt;/code> and unchanged in substance.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Related&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/substrate/0013-management-services-domain-vms/">ADR-0013&lt;/a> §2, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0019-tenant-l2-at-the-access-edge/">ADR-0019&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/2026/0007-core-router-zone-policy/">CHG-0007&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/standards/network-segmentation/">Network Segmentation&lt;/a> §8–§9&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;p>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/">ADR-0011&lt;/a> settled that an
application owns its devices, the platform attaches them by &lt;strong>trust class&lt;/strong>, and they reach their
application through &lt;strong>scoped platform services&lt;/strong>. It then opened a question it never numbered:&lt;/p></description></item><item><title>ADR-0011: Edge Devices Are Application-Owned and Platform-Attached</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/edge-devices/0011-edge-devices-application-owned/</guid><description>&lt;h1 id="adr-0011-edge-devices-are-application-owned-and-platform-attached">
 ADR-0011: Edge Devices Are Application-Owned and Platform-Attached
 &lt;a class="anchor" href="#adr-0011-edge-devices-are-application-owned-and-platform-attached">#&lt;/a>
&lt;/h1>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Status&lt;/strong>&lt;/td>
 &lt;td>Accepted; §1&amp;rsquo;s &lt;em>Ownership&lt;/em> row &lt;strong>amended by 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0032-every-device-belongs-to-a-tenant/">ADR-0032&lt;/a>&lt;/strong>: every edge device belongs to a tenant, which may have no workloads. Open question 2&amp;rsquo;s &amp;ldquo;leases from the IoT pool&amp;rdquo; &lt;strong>amended by 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0035-fixed-address-for-a-tenant-device/">ADR-0035&lt;/a>&lt;/strong>: a tenant may reserve its device a fixed address.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Accepted&lt;/strong>&lt;/td>
 &lt;td>2026-09-15, once its four open questions were answered. Questions 1–3 were settled by the operator on 2026-09-15 (
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/2026/0008-domain-vms-build-out/">CHG-0008&lt;/a> Step 9&amp;rsquo;s controller work made the platform side real); question 4 was settled on 2026-09-14.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Date&lt;/strong>&lt;/td>
 &lt;td>2026-09-13&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Amended&lt;/strong>&lt;/td>
 &lt;td>2026-09-19, reconciling against ADR-0019 and ADR-0020. An editing error had deleted the heading that numbered two further open questions, leaving them orphaned — they are now &lt;strong>5&lt;/strong> (tenant ingress, answered by ADR-0020) and &lt;strong>6&lt;/strong> (the firmware supply chain, still open). Five statements overtaken by CHG-0013 and by ADR-0012 §8 are corrected in place. The decision is unchanged.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Extended by&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0019-tenant-l2-at-the-access-edge/">ADR-0019: Tenant Layer 2 at the Access Edge&lt;/a> — why a device does not join its tenant&amp;rsquo;s network. 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0020-direct-device-access-to-tenant-services/">ADR-0020: Direct Device Access to Tenant Services&lt;/a> — how it reaches that tenant&amp;rsquo;s services instead, answering open question 5. Both leave this record &lt;code>Accepted&lt;/code> and unchanged in substance. 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/edge-devices/0038-tenants-update-their-own-devices/">ADR-0038: Tenants Update Their Own Devices&lt;/a> — a tenant updates its own devices through services it already has, and the platform hosts no images, answering open question 6&amp;rsquo;s hosting bullet.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Validated&lt;/strong>&lt;/td>
 &lt;td>2026-09-14, read-only, before acceptance. See 
 &lt;a href="#validation-2026-09-14">Validation&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Scope&lt;/strong>&lt;/td>
 &lt;td>Who owns a physical device an application uses, what the platform knows about it, which network it joins, and how it reaches the services it needs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Depends on&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0010-tenants-consume-platform-services/">ADR-0010: Tenants Consume Platform Services&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Related&lt;/strong>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0001-tenant-network-fabric/">ADR-0001: Tenant Network Fabric&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-networking/0003-tenant-egress-single-member-fabric/">ADR-0003: Tenant Egress on a Single-Member Fabric&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/substrate/0009-network-device-config-ownership/">ADR-0009: Network Device Configuration Is Inventory-Owned and Controller-Applied&lt;/a>, 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/tenant-model/0012-iot-platform-api/">ADR-0012: IoT Platform Services Through a Deevnet API and Terraform Provider&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="context">
 Context
 &lt;a class="anchor" href="#context">#&lt;/a>
&lt;/h2>
&lt;p>Physical microcontrollers have been treated as substrate IoT devices. The treatment conflated
concerns that answer to different owners:&lt;/p></description></item></channel></rss>