From architecture review 2026-07-10.
Problem
The main wifi-iface profile (network=lan, mode=ap, ssid/key placeholders, encryption=sae-mixed, ieee80211r=1, ieee80211k=1, bss_transition=1) is written 4 times — router main_2g/main_5g (openwrt/devices/router/config.nix:160-217) + ap main0_2g/main1_5g (openwrt/devices/ap/config.nix:103-149). The usteer block is byte-identical in both files (router:78-82, ap:64-68), and the usteer/wpad package lists (plus the wpad-basic removePackages comment) are duplicated verbatim.
802.11r/k fast roaming + usteer band-steering only work if SSID, encryption, and the r/k/bss_transition flags match on every radio of every device — drift produces no error, just broken handoffs. Adding AP #3 means copying the whole 157-line ap/config.nix and tweaking IP + channels.
Direction
A shared roaming-profile attrset (and a dumb-AP base) under openwrt/ that both device configs import, so the cross-device roaming contract is stated once. This is a shared correctness invariant with two concrete consumers today, not cosmetic boilerplate — it passes the repo's bar for helper extraction (net lines deleted, second consumer exists).
Wins
- the roaming contract has one source
- adding an AP: IP + channels, not a 157-line copy
- silent handoff breakage class removed
From architecture review 2026-07-10.
Problem
The main wifi-iface profile (network=lan, mode=ap, ssid/key placeholders,
encryption=sae-mixed,ieee80211r=1,ieee80211k=1,bss_transition=1) is written 4 times — router main_2g/main_5g (openwrt/devices/router/config.nix:160-217) + ap main0_2g/main1_5g (openwrt/devices/ap/config.nix:103-149). The usteer block is byte-identical in both files (router:78-82, ap:64-68), and the usteer/wpad package lists (plus the wpad-basic removePackages comment) are duplicated verbatim.802.11r/k fast roaming + usteer band-steering only work if SSID, encryption, and the r/k/bss_transition flags match on every radio of every device — drift produces no error, just broken handoffs. Adding AP #3 means copying the whole 157-line ap/config.nix and tweaking IP + channels.
Direction
A shared roaming-profile attrset (and a dumb-AP base) under openwrt/ that both device configs import, so the cross-device roaming contract is stated once. This is a shared correctness invariant with two concrete consumers today, not cosmetic boilerplate — it passes the repo's bar for helper extraction (net lines deleted, second consumer exists).
Wins