Status: Stage 2 result. Date: 2026-06-08. Tag: sim-result-v6.
Reproduce: cd sim && python3 -m experiments.fallback_schemes (writes fallback_schemes.png).

Tests the graceful-degradation / fallback story (synthesis §8.3; hash-slot-assignment-note.md —
Alan's idea): when the INFRA coordinator is present you run TDMA; when it is absent you
fall back to a stateless scheme. Which fallback? Four access disciplines on the same hidden-node
hub (K mutually-hidden clients, 1 msg/min, LongFast):
| K | CSMA flood | hash-static | hash-epoch | TDMA (coordinator) |
|---|---|---|---|---|
| 10 | 0.868 | 0.952 | 0.977 | 0.997 |
| 20 | 0.720 | 0.857 | 0.903 | 0.995 |
| 50 | 0.490 | 0.203 | 0.607 | 0.988 |
slot = H(id, frame) mod S reshuffles
collisions every frame, so blind retransmit recovers them.slot = H(id) mod S gives permanent collisions for
ID pairs that hash equal; retransmit can't help (same slot every frame). It is fine at small K
but collapses below even CSMA at K=50 (0.203 vs 0.490) — precisely the note's prediction.
The lesson: if you hash, hash on the epoch.hash-then-coordinator-refine argument: hashing is the
floor, the INFRA refines the colliding/active nodes up to the ceiling.These four points are one degradation curve: coordinator present ⇒ TDMA (~99%); coordinator lost
⇒ epoch-hash fallback (still ~90% at K=20, and always > CSMA); worst case ⇒ CSMA (the
Meshtastic-grade floor). So the design is never worse than a Meshtastic flood network, and
strictly better wherever a coordinator — or even just a shared epoch — exists (synthesis §5). The
same frame structure carries all three (one TDMA-schedule-plus-contention frame,
mode-and-handoff-note.md); switching between them is the spec's job, not a separate protocol.
S ≈ K is optimal, not "more slots is better": the frame period is S × slot_duration, so
raising S to cut collisions lengthens the frame and starves per-node rate. Measured: epoch at
K=50 drops from 0.607 (S=50) to 0.169 (S=150). Likewise modest retransmit (R≈3) is best; more
retransmits add load to the same scarce slots. This is why a coordinator (unique S=K slots, zero
collision) is worth having — it escapes the collision/frame-length tension hashing is stuck in.mode-and-handoff-note.md), not a sim variable.Bottom line: the coordinator-free fallback should be epoch-hash, not CSMA and never static-hash; it keeps hidden-node delivery well above the CSMA floor, and a coordinator lifts it the rest of the way to ~99%.