← RFC

Backbone B1 Results — first INFRA↔INFRA backbone, bench to tower

Date: 2026-06-11 · Code: loomwave repo 6a8e4cd (B1.3 merged coordinator) · Design: backbone-b1-design.md

Summary

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

B1.4 detail (clean run, 2026-06-11)

Bugs found and fixed along the way (B1.3)

  1. Coordinator went anonymous after first client join. The identity advert was gated on 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.
  2. Test-harness stranding: a launcher script re-flashed the T114 mid-demo with discarded output; a partial DFU left the device in its bootloader (USB PID 0x0071) and two demo runs were debugged against a client that was not running. Process rule reaffirmed: never discard the output of a flashing step; assert the device re-enumerates as the application.

Known limitation → B2 backlog

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).

What B1 proves for the design