<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Building Infrastructure on Deevnet IoTaaS</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/</link><description>Recent content in Building Infrastructure on Deevnet IoTaaS</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/index.xml" rel="self" type="application/rss+xml"/><item><title>Stage Artifacts</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/online-preparation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/online-preparation/</guid><description>&lt;h1 id="stage-artifacts">
 Stage Artifacts
 &lt;a class="anchor" href="#stage-artifacts">#&lt;/a>
&lt;/h1>
&lt;p>The builder node (with internet access) stages artifacts to the artifact server before any recovery is needed.&lt;/p>
&lt;hr>
&lt;h2 id="what-gets-staged">
 What Gets Staged
 &lt;a class="anchor" href="#what-gets-staged">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Artifact&lt;/th>
 &lt;th>Source&lt;/th>
 &lt;th>Role/Task&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Fedora install tree&lt;/td>
 &lt;td>rsync from Fedora mirrors&lt;/td>
 &lt;td>&lt;code>artifacts&lt;/code> role&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Fedora Server ISO&lt;/td>
 &lt;td>download.fedoraproject.org&lt;/td>
 &lt;td>&lt;code>artifacts&lt;/code> role&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Proxmox VE ISO&lt;/td>
 &lt;td>enterprise.proxmox.com&lt;/td>
 &lt;td>&lt;code>artifacts&lt;/code> role&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>SSH public keys&lt;/td>
 &lt;td>Generated locally&lt;/td>
 &lt;td>&lt;code>artifacts&lt;/code> role&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Container images&lt;/td>
 &lt;td>docker.io, etc.&lt;/td>
 &lt;td>&lt;code>artifacts&lt;/code> role&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="commands">
 Commands
 &lt;a class="anchor" href="#commands">#&lt;/a>
&lt;/h2>
&lt;p>From builder node with internet:&lt;/p></description></item><item><title>Seed Inventory</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/inventory-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/inventory-setup/</guid><description>&lt;h1 id="seed-inventory">
 Seed Inventory
 &lt;a class="anchor" href="#seed-inventory">#&lt;/a>
&lt;/h1>
&lt;p>Before any host can be PXE booted, its definition must exist in the Ansible inventory. MAC addresses, IP assignments, DNS records, and DHCP reservations are all driven from host_vars.&lt;/p>
&lt;p>&lt;strong>Repository:&lt;/strong> &lt;code>ansible-inventory-deevnet&lt;/code>&lt;/p>
&lt;hr>
&lt;h2 id="when-this-is-required">
 When This Is Required
 &lt;a class="anchor" href="#when-this-is-required">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Scenario&lt;/th>
 &lt;th>Action&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Capacity expansion&lt;/td>
 &lt;td>Add host to &lt;code>hosts.yml&lt;/code>, create new &lt;code>host_vars/&amp;lt;hostname&amp;gt;.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Hardware replacement&lt;/td>
 &lt;td>Update MAC address in existing &lt;code>host_vars/&amp;lt;hostname&amp;gt;.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Greenfield build&lt;/td>
 &lt;td>All hosts need both steps&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="inventory-structure">
 Inventory Structure
 &lt;a class="anchor" href="#inventory-structure">#&lt;/a>
&lt;/h2>
&lt;pre tabindex="0">&lt;code>ansible-inventory-deevnet/
└── mobile/
 ├── hosts.yml # Main inventory (hosts and group memberships)
 ├── group_vars/ # Variables by group
 └── host_vars/ # Per-host variables (MAC, IP, DNS, DHCP)
 ├── dv02hyp001p01.yml
 ├── dv02hyp002p02.yml
 └── ...
&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 id="adding-a-new-host-expansion">
 Adding a New Host (Expansion)
 &lt;a class="anchor" href="#adding-a-new-host-expansion">#&lt;/a>
&lt;/h2>
&lt;h3 id="1-add-to-hostsyml">
 1. Add to hosts.yml
 &lt;a class="anchor" href="#1-add-to-hostsyml">#&lt;/a>
&lt;/h3>
&lt;p>Add the hostname to appropriate groups:&lt;/p></description></item><item><title>Build-Time Secrets</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-secrets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-secrets/</guid><description>&lt;h1 id="build-time-secrets">
 Build-Time Secrets
 &lt;a class="anchor" href="#build-time-secrets">#&lt;/a>
&lt;/h1>
&lt;p>Two builds need a live Proxmox API token:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Build&lt;/th>
 &lt;th>Where&lt;/th>
 &lt;th>Needs&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Fedora VM templates (Packer)&lt;/td>
 &lt;td>&lt;code>deevnet-image-factory&lt;/code>: &lt;code>make proxmox-fedora-pve1&lt;/code> / &lt;code>-pve2&lt;/code>&lt;/td>
 &lt;td>the node&amp;rsquo;s API token&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>The tenant fabric (Terraform)&lt;/td>
 &lt;td>&lt;code>deevnet-tenant-fabric&lt;/code>: &lt;code>make fabric-init&lt;/code> / &lt;code>fabric-plan&lt;/code> / &lt;code>fabric-apply&lt;/code>&lt;/td>
 &lt;td>the tenant hypervisor&amp;rsquo;s API token&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>The rule: a build secret is fetched per run into the build&amp;rsquo;s own process environment. It is
never written to a file and never passed on a command line&lt;/strong>
(
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/policies/risk-management/security-controls/#credentials">Security Controls&lt;/a>,

 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/2026/0026-build-secrets/">CHG-0026&lt;/a>). Until CHG-0026, the image factory rendered the
token into &lt;code>build/pve-env/&amp;lt;node&amp;gt;.env&lt;/code>. Those files outlived every build, and one of them, under a
node&amp;rsquo;s old name, was still being read by the fabric weeks later.&lt;/p></description></item><item><title>Vault Operations</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/vault-operations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/vault-operations/</guid><description>&lt;h1 id="vault-operations">
 Vault Operations
 &lt;a class="anchor" href="#vault-operations">#&lt;/a>
&lt;/h1>
&lt;p>Ansible Vault protects sensitive variables (passwords, API keys, certificates) stored in the inventory. Each environment has its own set of &lt;code>vault.yml&lt;/code> files that must be encrypted at rest and decrypted only while editing.&lt;/p>
&lt;p>&lt;strong>Repository:&lt;/strong> &lt;code>ansible-inventory-deevnet&lt;/code>&lt;/p>
&lt;hr>
&lt;h2 id="setup">
 Setup
 &lt;a class="anchor" href="#setup">#&lt;/a>
&lt;/h2>
&lt;p>After cloning the inventory repository, run the one-time hook setup:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-inventory-deevnet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make install-hooks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This runs &lt;code>git config core.hooksPath hooks&lt;/code>, pointing Git at the version-controlled &lt;code>hooks/&lt;/code> directory. The hooks stay in sync with the repo automatically — no copying required. This must be run once per clone.&lt;/p></description></item><item><title>Configure PXE</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-sequence/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-sequence/</guid><description>&lt;h1 id="configure-pxe">
 Configure PXE
 &lt;a class="anchor" href="#configure-pxe">#&lt;/a>
&lt;/h1>
&lt;p>Configure PXE boot authority before provisioning hosts.&lt;/p>
&lt;hr>
&lt;h2 id="greenfield-build-no-core-router">
 Greenfield Build (No Core Router)
 &lt;a class="anchor" href="#greenfield-build-no-core-router">#&lt;/a>
&lt;/h2>
&lt;p>For initial site build or full recovery, the bootstrap node provides DNS/DHCP/TFTP for the management subnet.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ~/home/ansible-collection-deevnet.builder
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make bootstrap-auth
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This:&lt;/p>
&lt;ul>
&lt;li>Discovers the WAN interface from inventory (&lt;code>bootstrap_wan_interface_key&lt;/code>)&lt;/li>
&lt;li>Enables IP forwarding and masquerading on the WAN interface&lt;/li>
&lt;li>Activates dnsmasq for DHCP/DNS/TFTP on the downstream (management) interface&lt;/li>
&lt;li>Populates DNS host records and DHCP static reservations from inventory&lt;/li>
&lt;li>Swaps the management interface IP from the reserved address to the gateway address&lt;/li>
&lt;/ul>
&lt;p>The IP swap is the last step — it drops the SSH connection. All configuration completes first while connectivity is stable. Reconnect at the gateway IP to verify.&lt;/p></description></item><item><title>Build Network</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-network/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-network/</guid><description>&lt;h1 id="build-network">
 Build Network
 &lt;a class="anchor" href="#build-network">#&lt;/a>
&lt;/h1>
&lt;p>Configure network infrastructure: Core Router, VLANs, firewall, DHCP, and wireless access points.&lt;/p>
&lt;p>&lt;strong>Collection:&lt;/strong> &lt;code>deevnet.net&lt;/code>&lt;/p>
&lt;hr>
&lt;h2 id="components">
 Components
 &lt;a class="anchor" href="#components">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Component&lt;/th>
 &lt;th>Role&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Core Router&lt;/td>
 &lt;td>Firewall, DHCP, DNS, routing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Switch/VLANs&lt;/td>
 &lt;td>Network segmentation&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Wireless AP&lt;/td>
 &lt;td>SSIDs, guest networks&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="prerequisites">
 Prerequisites
 &lt;a class="anchor" href="#prerequisites">#&lt;/a>
&lt;/h2>
&lt;p>Before the automated build-network procedures begin, the following manual steps must be completed:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Prerequisite&lt;/th>
 &lt;th>Method&lt;/th>
 &lt;th>Notes&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Core Router&lt;/td>
 &lt;td>Fresh OPNsense install from USB&lt;/td>
 &lt;td>Manual installer; no PXE support&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Access Switch&lt;/td>
 &lt;td>Factory reset to default state&lt;/td>
 &lt;td>Clears any prior VLAN/port config&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Wireless AP&lt;/td>
 &lt;td>Factory reset to default state&lt;/td>
 &lt;td>Clears any prior SSID/network config&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Additionally:&lt;/p></description></item><item><title>Build Management Plane</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-management-plane/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-management-plane/</guid><description>&lt;h1 id="build-management-plane">
 Build Management Plane
 &lt;a class="anchor" href="#build-management-plane">#&lt;/a>
&lt;/h1>
&lt;p>Install and configure a Proxmox VE hypervisor, from bare metal to a node that automation can build
VMs on. It applies to a new node, and to a rebuild of an existing one. The worked example is the
management hypervisor, &lt;code>dv02hyp001p01&lt;/code>.&lt;/p>
&lt;p>This covers the &lt;strong>hypervisors themselves&lt;/strong>. Putting an OS on the VMs that run on top of them is

 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/runbook/substrate/building-recovery/build-management-vm/">Build a Management-Plane VM&lt;/a>.&lt;/p>
&lt;p>Everything below comes from inventory or from code, except three manual steps: booting the ISO,
running the first bootstrap script at the console, and creating the API token.&lt;/p></description></item><item><title>Allocate VM Identity</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/vm-identity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/vm-identity/</guid><description>&lt;h1 id="allocate-vm-identity">
 Allocate VM Identity
 &lt;a class="anchor" href="#allocate-vm-identity">#&lt;/a>
&lt;/h1>
&lt;p>A management-plane VM&amp;rsquo;s inventory entry exists &lt;strong>before&lt;/strong> its MAC does. For bare
metal a MAC is a hardware fact read off a NIC and typed into inventory; for a
cloned VM there is no NIC to read until something creates one. So the MAC is
&lt;strong>derived from the Proxmox VMID&lt;/strong> and written into inventory by a tool, rather
than invented by hand.&lt;/p>
&lt;p>Adding a management VM is therefore one decision: &lt;strong>allocate a VMID&lt;/strong>. The MAC,
the DHCP reservation and the address all follow from it.&lt;/p></description></item><item><title>Build a Management-Plane VM</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-management-vm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-management-vm/</guid><description>&lt;h1 id="build-a-management-plane-vm">
 Build a Management-Plane VM
 &lt;a class="anchor" href="#build-a-management-plane-vm">#&lt;/a>
&lt;/h1>
&lt;p>Two supported ways to put an OS on a management-plane VM. Both produce a host that is
reachable at its reserved address, carries a deterministic MAC, and can be rebuilt from
its declaration.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;strong>Clone from template&lt;/strong>&lt;/th>
 &lt;th>&lt;strong>PXE netboot&lt;/strong>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Source of the OS&lt;/td>
 &lt;td>Packer-built Proxmox template&lt;/td>
 &lt;td>Install tree on the artifact server&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Driven by&lt;/td>
 &lt;td>&lt;code>deevnet.mgmt&lt;/code> &lt;code>roles/proxmox_vm&lt;/code>&lt;/td>
 &lt;td>anaconda + &lt;code>builder-node-&amp;lt;release&amp;gt;.ks&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Firmware&lt;/td>
 &lt;td>SeaBIOS (the template&amp;rsquo;s default)&lt;/td>
 &lt;td>&lt;strong>UEFI/OVMF&lt;/strong> — the kickstart declares an ESP&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Typical time&lt;/td>
 &lt;td>2–5 minutes&lt;/td>
 &lt;td>20–40 minutes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Use it for&lt;/td>
 &lt;td>Anything that just needs the current base image&lt;/td>
 &lt;td>Validating the netboot path, or a host whose disk layout the template cannot produce&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Clone is the default.&lt;/strong> Reach for PXE when the point &lt;em>is&lt;/em> the PXE path — proving a new
Fedora release installs unattended before pinning any auto-installing host to it — or when
the kickstart&amp;rsquo;s layout (a large &lt;code>/srv&lt;/code>, separate &lt;code>/home&lt;/code>) is what you actually want.&lt;/p></description></item><item><title>Verify Site</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-verification/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/build-verification/</guid><description>&lt;h1 id="verify-site">
 Verify Site
 &lt;a class="anchor" href="#verify-site">#&lt;/a>
&lt;/h1>
&lt;p>Validation after the site is built or rebuilt, once every component is up.&lt;/p>
&lt;hr>
&lt;h2 id="overview">
 Overview
 &lt;a class="anchor" href="#overview">#&lt;/a>
&lt;/h2>
&lt;p>Each build phase checks itself: the Ansible roles assert what they deployed, and each change record
carries its own verification. This page is the end-to-end pass: a short list of checks that, together,
say the site is up.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Run it from the Builder&lt;/strong>, on the management segment, which reaches every zone. Tenant-facing
segments are checked from a real client instead: see 
 &lt;a href="#from-the-client-segments">From the client segments&lt;/a>.&lt;/p></description></item><item><title>Authority Transition</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/authority-transition/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/building-recovery/authority-transition/</guid><description>&lt;h1 id="authority-transition-runbook">
 Authority Transition Runbook
 &lt;a class="anchor" href="#authority-transition-runbook">#&lt;/a>
&lt;/h1>
&lt;p>Procedures for transitioning DNS/DHCP authority between the builder and production network infrastructure.&lt;/p>
&lt;p>For the architectural model, see 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/builder/#authority-transition">Builder → Authority Transition&lt;/a>.&lt;/p>
&lt;blockquote class="book-hint info">
 &lt;p>&lt;strong>Build context:&lt;/strong> During a greenfield build, these transitions happen as part of the 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/runbook/substrate/building-recovery/">Building Infrastructure&lt;/a> sequence — 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/runbook/substrate/building-recovery/build-sequence/">Configure PXE&lt;/a> enters bootstrap-authoritative mode, and 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/runbook/substrate/building-recovery/build-network/">Build Network&lt;/a> transitions to core-authoritative mode. This page is the standalone reference for both directions.&lt;/p>

&lt;/blockquote>

&lt;hr>
&lt;h2 id="overview">
 Overview
 &lt;a class="anchor" href="#overview">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Transition&lt;/th>
 &lt;th>From&lt;/th>
 &lt;th>To&lt;/th>
 &lt;th>When&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Promote to production&lt;/strong>&lt;/td>
 &lt;td>Builder-authoritative&lt;/td>
 &lt;td>Router-authoritative&lt;/td>
 &lt;td>After network infrastructure is configured and validated&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Revert to bootstrap&lt;/strong>&lt;/td>
 &lt;td>Router-authoritative&lt;/td>
 &lt;td>Builder-authoritative&lt;/td>
 &lt;td>Before substrate rebuild or recovery&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Both transitions are automated via playbooks in &lt;code>deevnet.builder&lt;/code> and &lt;code>deevnet.net&lt;/code>. The IP swap is the final step in each playbook and drops the SSH connection — reconnect at the new IP to verify.&lt;/p></description></item></channel></rss>