Date: 2026-06-11 · Code: loomwave repo 6a8e4cd (B1.3 merged coordinator) ·
Design: backbone-b1-design.md
The B1 milestone series is complete. Two single-radio coordinators now form a co-channel backbone (half-frame stagger), exchange signed link-state adverts and sealed backbone DATA, and forward client traffic across cells with hop-by-hop re-sealing — first on the bench (B1.2/B1.3), then over a real RF path between the bench and the mid-tower node (B1.4).
| Milestone | Setup | Result |
|---|---|---|
| B1.2 | Bench Duo: SX1262 ↔ LR1121, two processes | Symmetric adjacency, COORD_CLAIM verified, 5×5 LSAs, 5×5 sealed pings |
| B1.3 | B1.2 + T114 client joins one cell | First cross-cell delivery: 27 forwarded client frames verified at the peer |
| B1.4 | Bench SX1262 ↔ mid-tower (Nebra Mesh HAT, full power, 60 ft AGL), T114 client | Backbone over real RF: adjacency held the full 400 s run; 46 cross-cell client position reports delivered to the tower |
758F54 anchored (role A); bench 41F34E heard it during scan-before-claim
and staggered +2600 ms (role B). Roles assigned purely by radio observation.72466B joined the bench cell (sealed
REGISTER → slot 0) and sent 63 sealed DATA frames (live GPS positions, fix
valid). The bench verified each, re-sealed with the tower's epoch/keys, and
forwarded; the tower verified and decoded 46 cross-cell frames arriving at
−59…−63 dBm. A client position report traveled client → cell coordinator →
backbone → second coordinator, with independent AEAD on each hop.members.is_empty(), so the moment a client registered, the
coordinator stopped advertising its keys and peers could never form an
adjacency. Fix: when slot 0 is occupied, the advert rides the contention
window (+1428 ms = beacon ToA 525 + guard 3 + 3×300 ms slots), which
registered clients leave idle; the 670 ms advert ends at 2098 ms, just inside
the +2100 ms control window. Spec implication: identity adverts must never
be suppressed by cell occupancy — recorded for the next spec refresh.Control-window budget accounting. Queued cross-cell forwards drain at the start of the control window, ahead of the LSA/ping; with a client generating one forward per superframe, the cell-owning coordinator's LSA is pushed past the half boundary and dies in the peer's TX half (observed: 1/9 LSAs delivered bench→tower while 46/63 forwards got through). The control window needs airtime budgeting — emit what fits, defer the rest — alongside the existing B2 items (N>2 stagger collision, election action, cell summarization, end-to-end sealing).